package fr.ens.biologie.genomique.eoulsan.util; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; /** * This class allow to use ObjectInputStream with a ClassLoader that is not the * default bootstrap ClassLoader. This is very useful is Hadoop mode. * @author Laurent Jourdren * @since 2.0 */ public class ClassLoaderObjectInputStream extends ObjectInputStream { private ClassLoader classLoader; @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { try { String name = desc.getName(); return Class.forName(name, false, classLoader); } catch (ClassNotFoundException e) { return super.resolveClass(desc); } } // // Constructors // /** * Constructor, use the thread ClassLoader to load classes of objects to * instantiate. * @param in input stream * @throws IOException if an I/O error occurs while reading stream header */ public ClassLoaderObjectInputStream(final InputStream in) throws IOException { this(Thread.currentThread().getContextClassLoader(), in); } /** * Constructor. * @param classLoader ClassLoader to use to load classes of objects to * instantiate. * @param in input stream * @throws IOException if an I/O error occurs while reading stream header */ public ClassLoaderObjectInputStream(final ClassLoader classLoader, final InputStream in) throws IOException { super(in); if (classLoader == null) { throw new NullPointerException("classLoader argument cannot be null"); } this.classLoader = classLoader; } }