1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17package org.apache.commons.io.input;
18
19import java.io.IOException;
20import java.io.InputStream;
21import java.io.ObjectInputStream;
22import java.io.ObjectStreamClass;
23import java.io.StreamCorruptedException;
24
25/**
26 * A special ObjectInputStream that loads a class based on a specified
27 * <code>ClassLoader</code> rather than the system default.
28 * <p>
29 * This is useful in dynamic container environments.
30 *
31 * @author Paul Hammant
32 * @version $Id: ClassLoaderObjectInputStream.java 437567 2006-08-28 06:39:07Z bayard $
33 * @since Commons IO 1.1
34 */
35public class ClassLoaderObjectInputStream extends ObjectInputStream {
36
37    /** The class loader to use. */
38    private ClassLoader classLoader;
39
40    /**
41     * Constructs a new ClassLoaderObjectInputStream.
42     *
43     * @param classLoader  the ClassLoader from which classes should be loaded
44     * @param inputStream  the InputStream to work on
45     * @throws IOException in case of an I/O error
46     * @throws StreamCorruptedException if the stream is corrupted
47     */
48    public ClassLoaderObjectInputStream(
49            ClassLoader classLoader, InputStream inputStream)
50            throws IOException, StreamCorruptedException {
51        super(inputStream);
52        this.classLoader = classLoader;
53    }
54
55    /**
56     * Resolve a class specified by the descriptor using the
57     * specified ClassLoader or the super ClassLoader.
58     *
59     * @param objectStreamClass  descriptor of the class
60     * @return the Class object described by the ObjectStreamClass
61     * @throws IOException in case of an I/O error
62     * @throws ClassNotFoundException if the Class cannot be found
63     */
64    protected Class resolveClass(ObjectStreamClass objectStreamClass)
65            throws IOException, ClassNotFoundException {
66
67        Class clazz = Class.forName(objectStreamClass.getName(), false, classLoader);
68
69        if (clazz != null) {
70            // the classloader knows of the class
71            return clazz;
72        } else {
73            // classloader knows not of class, let the super classloader do it
74            return super.resolveClass(objectStreamClass);
75        }
76    }
77}
78