/******************************************************************************* * 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.jem.internal.proxy.ide; /* */ import org.eclipse.jem.internal.proxy.core.*; import java.lang.reflect.*; /** * Array Type Proxy for the IDE VM. * * The class is final because array's are special and shouldn't have any subclasses since the factory would never call it. */ public final class IDEArrayBeanTypeProxy extends IDEBeanTypeProxy implements IArrayBeanTypeProxy { IBeanTypeProxy fFinalComponentType; IBeanTypeProxy fComponentType; String fTypeName; /** * Create with a registry and a class. It is package so that only the factory with this IDE package can call it. */ IDEArrayBeanTypeProxy(IDEProxyFactoryRegistry aRegistry, String aTypeName, Class aClass) { // The class of an Array is always Object super(aRegistry, aClass); fTypeName = aTypeName; } /** * This is an array type! */ public boolean isArray() { return true; } public String getTypeName() { return fTypeName; } /** * Return the final component type. */ public IBeanTypeProxy getFinalComponentType() { if (fFinalComponentType == null) { // Component type is strip off all '[' and return class name (if we ever add classLoader support, this won't work). // However, if the type is a primitive we need to go through the change table). int typeStart = getTypeName().lastIndexOf('[') + 1; if (getTypeName().charAt(typeStart) == 'L') { // It is a class. // Strip off up to the 'L', and the trailing ';'. That is the class name. fFinalComponentType = fProxyFactoryRegistry.getBeanTypeProxyFactory().getBeanTypeProxy( getTypeName().substring(typeStart + 1, getTypeName().length() - 1)); } else { // It is a type. Need to map it. Class aType = (Class) IDEStandardBeanTypeProxyFactory.MAP_SHORTSIG_TO_TYPE.get(getTypeName().substring(typeStart, typeStart + 1)); fFinalComponentType = aType != null ? fProxyFactoryRegistry.getBeanTypeProxyFactory().getBeanTypeProxy(aType.getName()) : null; } } return fFinalComponentType; } /** * Return the component type. */ public IBeanTypeProxy getComponentType() { if (fComponentType == null) { // Component type is strip off first '[' and return class name (if we ever add classLoader support, this won't work). // However, if the type is a primitive we need to go through the change table). if (getTypeName().charAt(1) != '[') { // It is a one dimensional array, just send to getFinalComponentType to figure out the type. fComponentType = getFinalComponentType(); } else { // It is a multi-dimensional array. Just strip off one '[' and send that to the bean type factory. fComponentType = fProxyFactoryRegistry.getBeanTypeProxyFactory().getBeanTypeProxy(getTypeName().substring(1)); } } return fComponentType; } /** * Return the number of dimensions. */ public int getDimensions() { return getTypeName().lastIndexOf('[') + 1; } /** * Return the null ctor proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IConstructorProxy getNullConstructorProxy() { throw new UnsupportedOperationException(); } /** * Return a proxy to the constructor for the target VM being the same as the REM For all of the array types, this is an invalid operation. */ public IConstructorProxy getConstructorProxy(String[] argumentClassNames) { throw new UnsupportedOperationException(); } /** * Return a proxy to the constructor for the target VM being the same as the REM For all of the array types, this is an invalid operation. */ public IConstructorProxy getConstructorProxy(IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IConstructorProxy[] getConstructors() { throw new UnsupportedOperationException(); } /** * Return a proxy to the constructor for the target VM being the same as the REM For all of the array types, this is an invalid operation. */ public IConstructorProxy getDeclaredConstructorProxy(String[] argumentClassNames) { throw new UnsupportedOperationException(); } /** * Return a proxy to the constructor for the target VM being the same as the REM For all of the array types, this is an invalid operation. */ public IConstructorProxy getDeclaredConstructorProxy(IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IConstructorProxy[] getDeclaredConstructors() { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IFieldProxy[] getFields() { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getCompatibleConstructor(org.eclipse.jem.internal.proxy.core.IBeanTypeProxy[]) */ public IConstructorProxy getCompatibleConstructor(IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getCompatibleMethod(java.lang.String, * org.eclipse.jem.internal.proxy.core.IBeanTypeProxy[]) */ public IMethodProxy getCompatibleMethod(String methodName, IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IFieldProxy[] getDeclaredFields() { throw new UnsupportedOperationException(); } /** * Return a proxy to the field for the target VM being the same as the REM For all of the array types, this is an invalid operation. */ public IFieldProxy getFieldProxy(String fieldName) { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getMethodProxy(String methodName, IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getMethodProxy(String methodName, String[] argumentClassNames) { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getMethodProxy(String methodName, String argumentQualifiedTypeName) { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getMethodProxy(String methodName) { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IMethodProxy[] getMethods() { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.eclipse.jem.internal.proxy.core.IBeanTypeProxy#getConstructors() For all of the array types, this is an invalid operation. */ public IMethodProxy[] getDeclaredMethods() { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getDeclaredMethodProxy(String methodName, IBeanTypeProxy[] argumentTypes) { throw new UnsupportedOperationException(); } /** * Return the method proxy for this method with these arguments. For all of the array types, this is an invalid operation. */ public IMethodProxy getDeclaredMethodProxy(String methodName, String[] argumentClassNames) { throw new UnsupportedOperationException(); } /** * Create an array bean proxy. * - (int, new int[2] {3, 4}) will create: int [3] [4] * - (int[], new int[1] {1}) int [1] * - (int[], new int[2] {2,3}) int [2] [3] * * - (int[], null) or (int[], new int[0]) or (int, null) or (int, new int[0]) int [0] (int[][], null) or (int[][], new int[0]) int[0][] This is * because an array instance with no dimensions specified is not valid. * - (int[][], new int[1] {3}) int[3][] * * It is package protected so that only the REM Factory can call it. */ IDEArrayBeanProxy createBeanProxyWith(int[] dimensions) throws ThrowableProxy { // If the dimensions is null or zero length, then create the // array as a 0 sized array one dimensional array. if (dimensions == null || dimensions.length == 0) return createBeanProxyWith(new int[] { 0}); // Remove from this type the number of dimensions specified // coming in, up to but no further than the final component. // From here we can then use the appropriate java.lang.reflect.Array // method to create the array. IBeanTypeProxy compType = null; // The type of array to create (it may be different number of dimensions). int numDims = getDimensions(); if (numDims <= dimensions.length) compType = getFinalComponentType(); // There are the same or more requested dimensions, so use final component type else { // There are fewer requested dimensions, so strip off that many String compClass = getTypeName().substring(dimensions.length); compType = fProxyFactoryRegistry.getBeanTypeProxyFactory().getBeanTypeProxy(compClass); } if (dimensions.length == 1) { // Use the one dimension call Object array = Array.newInstance(((IDEBeanTypeProxy) compType).fClass, dimensions[0]); return new IDEArrayBeanProxy(fProxyFactoryRegistry, array, null); } else { // Use the multi dimension call Object array = Array.newInstance(((IDEBeanTypeProxy) compType).fClass, dimensions); return new IDEArrayBeanProxy(fProxyFactoryRegistry, array, null); } } /** * Create a new bean proxy with the specified object */ protected IIDEBeanProxy newBeanProxy(Object anObject) { return new IDEArrayBeanProxy(fProxyFactoryRegistry, anObject, this); } /** * @see IBeanTypeProxy#getFormalTypeName() */ public String getFormalTypeName() { String name = getTypeName(); int dims = name.lastIndexOf('[') + 1; String type = getFinalComponentType().getTypeName(); StringBuffer formalType = new StringBuffer(type.length() + ("[]".length() * dims)); //$NON-NLS-1$ formalType.append(type); for (int i = 0; i < dims; i++) formalType.append("[]"); //$NON-NLS-1$ return formalType.toString(); } }