package org.jboss.invocation;
import java.io.InputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.lang.reflect.Proxy;
import org.jboss.util.collection.WeakValueHashMap;
import org.jboss.logging.Logger;
public class MarshalledValueInputStream
extends ObjectInputStream
{
private static Logger log = Logger.getLogger(MarshalledValueInputStream.class);
private static WeakValueHashMap classCache;
public static void useClassCache(boolean flag)
{
if( flag == true )
classCache = new WeakValueHashMap();
else
classCache = null;
}
public static void flushClassCache()
{
classCache.clear();
}
public MarshalledValueInputStream(InputStream is) throws IOException
{
super(is);
}
protected Class resolveClass(ObjectStreamClass v)
throws IOException, ClassNotFoundException
{
String className = v.getName();
Class resolvedClass = null;
if( classCache != null )
{
synchronized( classCache )
{
resolvedClass = (Class) classCache.get(className);
}
}
if( resolvedClass == null )
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try
{
resolvedClass = loader.loadClass(className);
}
catch(ClassNotFoundException e)
{
resolvedClass = super.resolveClass(v);
}
if( classCache != null )
{
synchronized( classCache )
{
classCache.put(className, resolvedClass);
}
}
}
return resolvedClass;
}
protected Class resolveProxyClass(String[] interfaces)
throws IOException, ClassNotFoundException
{
if( log.isTraceEnabled() )
{
StringBuffer tmp = new StringBuffer("[");
for(int i = 0; i < interfaces.length; i ++)
{
if( i > 0 )
tmp.append(',');
tmp.append(interfaces[i]);
}
tmp.append(']');
log.trace("resolveProxyClass called, ifaces="+tmp.toString());
}
ClassLoader loader = null;
Class[] ifaceClasses = new Class[interfaces.length];
for (int i = 0; i < interfaces.length; i++)
{
Class iface = null;
String className = interfaces[i];
if( classCache != null )
{
synchronized( classCache )
{
iface = (Class) classCache.get(className);
}
}
if( iface == null )
{
if( loader == null )
loader = Thread.currentThread().getContextClassLoader();
iface = loader.loadClass(className);
if( classCache != null )
{
synchronized( classCache )
{
classCache.put(className, iface);
}
}
}
ifaceClasses[i] = iface;
}
return Proxy.getProxyClass(loader, ifaceClasses);
}
}