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