/******************************************************************************* * Copyright (c) 2001, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.j2ee.commonarchivecore.internal.util; import java.io.IOException; import java.io.InputStream; import java.io.ObjectStreamClass; import java.io.StreamCorruptedException; import java.lang.reflect.Array; public class ObjectInputStreamCustomResolver extends java.io.ObjectInputStream { private ClassLoader cl; /** * Constructor */ public ObjectInputStreamCustomResolver(InputStream is, ClassLoader loader) throws IOException, StreamCorruptedException { super(is); if (loader != null) cl = loader; } /** * Gets the java type class given a signature letter. */ private Class getType(char type) { switch (type) { case 'B' : return byte.class; case 'C' : return char.class; case 'D' : return double.class; case 'F' : return float.class; case 'I' : return int.class; case 'J' : return long.class; case 'S' : return short.class; case 'Z' : return boolean.class; default : return null; } } /** * This overrides the default resolveClass() method to use a custom class loader. */ @Override protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { String className = classDesc.getName(); //UtilsTrace.trace(" ObjectInputStreamCustomResolver: Resolving " + className); // Handle arrays of classes differently if (className.startsWith("[")) {//$NON-NLS-1$ Class component = null; int dimNum; for (dimNum = 1; className.charAt(dimNum) == '['; dimNum++) if (className.charAt(dimNum) == 'L') { component = cl.loadClass(className.substring(dimNum + 1, className.length() - 1)); } else { if (className.length() != dimNum + 1) throw new ClassNotFoundException(className); // malformed component = getType(className.charAt(dimNum)); } int dimensions[] = new int[dimNum]; for (int i = 0; i < dimNum; i++) dimensions[i] = 0; return Array.newInstance(component, dimensions).getClass(); } return cl.loadClass(className); } }