/*
 * 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);
	}
}