/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.dubbo.common.serialize.support.java;

import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.StreamCorruptedException;

import com.alibaba.dubbo.common.utils.ClassHelper;

/**
 * Compacted java object input stream.
 * 
 * @author qianlei
 */

public class CompactedObjectInputStream extends ObjectInputStream
{
	private ClassLoader mClassLoader;

	public CompactedObjectInputStream(InputStream in) throws IOException
	{
		this(in, Thread.currentThread().getContextClassLoader());
	}

	public CompactedObjectInputStream(InputStream in, ClassLoader cl) throws IOException
	{
		super(in);
		mClassLoader = cl == null ? ClassHelper.getClassLoader() : cl;
	}

	@Override
	protected ObjectStreamClass readClassDescriptor() throws IOException,ClassNotFoundException
	{
		int type = read();
		if( type < 0 )
			throw new EOFException();
		switch( type )
		{
			case 0:
				return super.readClassDescriptor();
			case 1:
				Class<?> clazz = loadClass(readUTF());
				return ObjectStreamClass.lookup(clazz);
			default:
				throw new StreamCorruptedException("Unexpected class descriptor type: " + type);
		}
	}

	private Class<?> loadClass(String className) throws ClassNotFoundException
	{
		return mClassLoader.loadClass(className);
	}
}