| SerializableUnMarshaller.java |
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.remoting.marshal.serializable;
import org.jboss.remoting.loading.ObjectInputStreamWithClassLoader;
import org.jboss.remoting.marshal.UnMarshaller;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.Map;
/**
* Will perform the deserialization of objects off the wire.
*
* @author <a href="mailto:tom@jboss.org">Tom Elrod</a>
*/
public class SerializableUnMarshaller implements UnMarshaller
{
public final static String DATATYPE = "serializable";
private ClassLoader customClassLoader = null;
/**
* Reads the data from the input stream and converts to an Object.
* <p/>
* If the inputStream passed is an ObjectInputStream (which would prefer it not be), it will just
* use it as given. If the input stream is not an instance of ObjectInputStream, will wrap it with a
* custom ObjectInputStream (ObjectInputStreamWithClassLoader) and use it. The ObjectInputStreamWithClassLoader
* will use the custom class loader set in order to ensure that any classes not found within the local classloader
* can be loaded from the server and used within the client VM. If the inpustream is of type ObjectInputStreamWithClassLoader,
* then will just set the classloader to the custom classloader and proceed.<p>
*
* @param inputStream
* @param metadata
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public Object read(InputStream inputStream, Map metadata) throws IOException, ClassNotFoundException
{
ObjectInputStream objInputStream = null;
Object obj = null;
if(inputStream instanceof ObjectInputStreamWithClassLoader)
{
if(((ObjectInputStreamWithClassLoader) inputStream).getClassLoader() == null)
{
((ObjectInputStreamWithClassLoader) inputStream).setClassLoader(customClassLoader);
}
objInputStream = (ObjectInputStream) inputStream;
}
else if(inputStream instanceof ObjectInputStream)
{
objInputStream = (ObjectInputStream) inputStream;
}
else
{
if(customClassLoader != null)
{
objInputStream = new ObjectInputStreamWithClassLoader(inputStream, customClassLoader);
}
else
{
objInputStream = new ObjectInputStream(inputStream);
}
}
obj = objInputStream.readObject();
objInputStream.readObject(); // for stupid ObjectInputStream reset
return obj;
}
/**
* Sets the classloader to be used when deserializing objects off the wire. This will ONLY be used in the
* when the input stream passed to the read() method is NOT an instance of ObjectInputStream.<p>
*
* @param classloader
*/
public void setClassLoader(ClassLoader classloader)
{
this.customClassLoader = classloader;
}
}| SerializableUnMarshaller.java |