package org.async.rmi.server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
/**
* Created by Barak Bar Orion
* 11/4/14.
*/
public class MarshalInputStream extends ObjectInputStream {
@SuppressWarnings("UnusedDeclaration")
private static final Logger logger = LoggerFactory.getLogger(MarshalInputStream.class);
public MarshalInputStream(InputStream in) throws IOException {
super(in);
}
@Override
protected Class<?> resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
Object annotation = readLocation();
String className = classDesc.getName();
ClassLoader defaultLoader = Thread.currentThread().getContextClassLoader();
String codebase = null;
if (annotation instanceof String) {
codebase = (String) annotation;
}
// logger.info("class {}, classAnnotation {}", className, codebase);
try {
return LoaderHandler.loadClass(codebase, className, defaultLoader);
} catch (ClassNotFoundException e) {
try {
if (Character.isLowerCase(className.charAt(0)) && className.indexOf('.') == -1) {
return super.resolveClass(classDesc);
}
} catch (ClassNotFoundException ignored) {
}
throw e;
}
}
private Object readLocation() throws IOException, ClassNotFoundException {
return readObject();
}
}