196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership.
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License.  You may obtain a copy of the License at
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io.input;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.ObjectInputStream;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.ObjectStreamClass;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.StreamCorruptedException;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * A special ObjectInputStream that loads a class based on a specified
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <code>ClassLoader</code> rather than the system default.
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This is useful in dynamic container environments.
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Paul Hammant
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: ClassLoaderObjectInputStream.java 437567 2006-08-28 06:39:07Z bayard $
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.1
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class ClassLoaderObjectInputStream extends ObjectInputStream {
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /** The class loader to use. */
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private ClassLoader classLoader;
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Constructs a new ClassLoaderObjectInputStream.
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param classLoader  the ClassLoader from which classes should be loaded
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param inputStream  the InputStream to work on
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O error
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws StreamCorruptedException if the stream is corrupted
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public ClassLoaderObjectInputStream(
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ClassLoader classLoader, InputStream inputStream)
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throws IOException, StreamCorruptedException {
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super(inputStream);
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.classLoader = classLoader;
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Resolve a class specified by the descriptor using the
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * specified ClassLoader or the super ClassLoader.
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param objectStreamClass  descriptor of the class
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the Class object described by the ObjectStreamClass
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O error
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws ClassNotFoundException if the Class cannot be found
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected Class resolveClass(ObjectStreamClass objectStreamClass)
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throws IOException, ClassNotFoundException {
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Class clazz = Class.forName(objectStreamClass.getName(), false, classLoader);
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (clazz != null) {
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // the classloader knows of the class
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return clazz;
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } else {
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            // classloader knows not of class, let the super classloader do it
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            return super.resolveClass(objectStreamClass);
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
78