/******************************************************************************* * 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.remote; /* */ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jem.internal.proxy.common.remote.Commands; import org.eclipse.jem.internal.proxy.common.remote.TransmitableArray; import org.eclipse.jem.internal.proxy.core.*; /** * Proxy for a constructor. */ final class REMConstructorProxy extends REMAccessibleObjectProxy implements IConstructorProxy { REMConstructorProxy(REMProxyFactoryRegistry aRegistry, Integer anID) { super(aRegistry, anID); } /** * Using this constructor (assuming it takes no arguments) create a new instance. * Exception will be raised if this constructor takes arguments. */ public IBeanProxy newInstance() throws ThrowableProxy { return newInstance(null); } /** * The type proxy is constant proxy out of the method factory. */ public IBeanTypeProxy getTypeProxy() { return ((REMMethodProxyFactory) fFactory.getMethodProxyFactory()).ctorType; } /** * Using this constructor (with the arguments) create a new instance. * Exception will be raised if arguments don't match the constructor. */ public IBeanProxy newInstance(IBeanProxy[] creationArguments) throws ThrowableProxy { IREMMethodProxy newInstanceMethod = (IREMMethodProxy) REMStandardBeanProxyConstants.getConstants(fFactory).getConstructorNewInstance(); // Constructor.newInstance takes one parm (Object[]) where [0] is an Object[] of the arguments to the constructor. Object[] parms = null; if (creationArguments != null) parms = new Object[] { new TransmitableArray(Commands.OBJECT_CLASS, creationArguments)}; return newInstanceMethod.invokeWithParms(this, parms); } public IBeanProxy newInstanceCatchThrowableExceptions() { try { return newInstance(); } catch (ThrowableProxy e) { ProxyPlugin.getPlugin().getLogger().log(new Status(IStatus.WARNING, ProxyPlugin.getPlugin().getBundle().getSymbolicName(), 0, "", e)); //$NON-NLS-1$ fFactory.releaseProxy(e); // Since it's no longer needed, get rid of now instead of GC time. return null; } } public IBeanProxy newInstanceCatchThrowableExceptions(IBeanProxy[] args) { try { return newInstance(args); } catch (ThrowableProxy e) { ProxyPlugin.getPlugin().getLogger().log(new Status(IStatus.WARNING, ProxyPlugin.getPlugin().getBundle().getSymbolicName(), 0, "", e)); //$NON-NLS-1$ fFactory.releaseProxy(e); // Since it's no longer needed, get rid of now instead of GC time. return null; } } private IBeanTypeProxy[] fParameterTypes; /* * (non-Javadoc) * @see org.eclipse.jem.internal.proxy.core.IConstructorProxy#getParameterTypes() */ public synchronized IBeanTypeProxy[] getParameterTypes() { if (fParameterTypes == null) { IArrayBeanProxy parmTypes = (IArrayBeanProxy) REMStandardBeanProxyConstants.getConstants(fFactory) .getConstructorParameterTypesMessage().invokeCatchThrowableExceptions(this); if (parmTypes == null) fParameterTypes = new IBeanTypeProxy[0]; // There was some error, only way null is returned else { int len = parmTypes.getLength(); fParameterTypes = new IBeanTypeProxy[len]; for (int i = 0; i < len; i++) try { fParameterTypes[i] = (IBeanTypeProxy) parmTypes.get(i); } catch (ThrowableProxy e) { } fFactory.releaseProxy(parmTypes); // Don't need the array on the server anymore. } } return fParameterTypes; } }