001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.util.stream;
023:
024: import java.io.InputStream;
025: import java.io.IOException;
026: import java.io.ObjectInputStream;
027: import java.io.ObjectStreamClass;
028:
029: import java.lang.reflect.Proxy;
030:
031: /**
032: * Customized object input stream that
033: * <ul>
034: * <li> redefines <code>readClassDescriptor()</code> in order to read a short
035: * class descriptor (just the class name) when deserializing an
036: * object</li>
037: * <li> takes a class loader in its constructor and uses it to retrieve
038: * the class definitions.</li>
039: * </ul>
040: *
041: * @author <a href="mailto:rickard@dreambean.com">Rickard Oberg</a>
042: * @author <a href="mailto:reverbel@ime.usp.br">Francisco Reverbel</a>
043: * @version $Revision: 57194 $
044: */
045: public class CustomObjectInputStreamWithClassloader extends
046: ObjectInputStream {
047:
048: /**
049: * The classloader to use when the default classloader cannot find
050: * the classes in the stream.
051: */
052: ClassLoader cl;
053:
054: /**
055: * Constructs a new instance with the given classloader and input stream.
056: *
057: * @param in stream to read objects from
058: * @param cl classloader to use
059: */
060: public CustomObjectInputStreamWithClassloader(InputStream in,
061: ClassLoader cl) throws IOException {
062: super (in);
063: this .cl = cl;
064: }
065:
066: /**
067: * Reads just the class name from this input stream.
068: *
069: * @return a class description object
070: */
071: protected ObjectStreamClass readClassDescriptor()
072: throws IOException, ClassNotFoundException {
073: return ObjectStreamClass.lookup(cl.loadClass(readUTF()));
074: }
075:
076: /**
077: * Resolves the class described in the classdesc parameter. First, try the
078: * default classloader (implemented by the super class). If it cannot
079: * load the class, try the classloader given to this instance.
080: *
081: * @param classdesc class description object
082: * @return the Class corresponding to class description
083: * @exception IOException if an I/O error occurs
084: * @exception ClassNotFoundException if the class cannot be found
085: * by the classloader
086: */
087: protected Class resolveClass(ObjectStreamClass classdesc)
088: throws IOException, ClassNotFoundException {
089: return cl.loadClass(classdesc.getName());
090: }
091:
092: /**
093: * Resolves the proxy class for the specified array of interfaces.
094: *
095: * @param interfaces an array of interfaces
096: * @return the proxy class
097: * @exception IOException if an I/O error occurs
098: * @exception ClassNotFoundException if the class cannot be found
099: * by the classloader
100: */
101: protected Class resolveProxyClass(String[] interfaces)
102: throws IOException, ClassNotFoundException {
103:
104: Class[] interfacesClass = new Class[interfaces.length];
105: for (int i = 0; i < interfaces.length; i++) {
106: interfacesClass[i] = Class
107: .forName(interfaces[i], false, cl);
108: }
109: return Proxy.getProxyClass(cl, interfacesClass);
110: }
111: }
|