blob: e3fd44c35d49ad6c1ef796fe1ad728e1519533a9 [file] [log] [blame]
/*******************************************************************************
* 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 v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* 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;
}
}