/**
* Kandata
* Copyright (C) 2003. Yoshinori Watanabe
* 
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* 
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* 
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
package kandata.client.http;

import java.io.*;
import kandata.client.*;

/**
 * Http経由でクラスをシリアライズするとき、そのクラス解決に独自クラスローダを使う.
 * サーバとクライアント間でクラスをシリアライズすることが可能です。
 * 標準のクラスならば、問題なくシリアライズすることができます。
 * しかし、独自のクラスをシリアライズする際、クライアントはそのクラスを知りません。
 * クライアントがそのクラスを認識し、正しくシリアライズさせるためには、
 * このストリームを使う必要があります。
 * すなわち、そのクラスを読み込むことができるクラスローダを持っているストリームです。
 */
class HttpObjectInputStream extends ObjectInputStream {
	/** クラス解決に使う、クラスローダ. */
	protected ClassLoader classLoader;	// 実際には HttpClassLoader

	/** 指定されたクラスローダから読み込むことのできる、オブジェクトストリームを作成する. */
	public HttpObjectInputStream(InputStream in, ClassLoader classLoader)
								throws IOException {
		super(in);
		this.classLoader = classLoader;
	}

	/** クラスを解決する. */
	public Class resolveClass(ObjectStreamClass desc)
                      throws IOException, ClassNotFoundException {
		try {
			// 親を使って探す。
			return super.resolveClass(desc);
		}
		catch (ClassNotFoundException ex) {
			// 親が見つからなかったときは、自分で見つける。
			return Class.forName(desc.getName(), true, classLoader);
			// もしそれでも見つからなければ、例外をそのまま上にスルーさせる。
		}
		// それ以外の例外もスルーさせる。
	}
}
