/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jem.internal.proxy.remote;
/*
 *  $RCSfile: REMStandardBeanProxyConstants.java,v $
 *  $Revision: 1.3.2.1 $  $Date: 2004/06/24 18:19:03 $ 
 */


import org.eclipse.jem.internal.proxy.core.*;
/**
 * REM Standard Proxy constants.
 *
 * Use the static accessor method (getConstants()) to get the appropriate 
 * constants instance for the registry. This is done so that until the
 * the constants are needed, they aren't registered.
 *
 * There are some standard utility functions too.
 *
 * This is final because this can't be extended. This specific one
 * will be registered with the factory for this key. Any extensions
 * must be done in their own constants and registry key.
 *
 * Creation date: (4/7/00 4:47:48 PM)
 * @author: Administrator
 */
public final class REMStandardBeanProxyConstants {
	public static final String REGISTRY_KEY = "REMSTANDARDPROXYCONSTANTS:"; //$NON-NLS-1$
		
	private final ProxyFactoryRegistry fRegistry;
	
	private IMethodProxy fClassNewInstance;
	private IMethodProxy fClassGetField;
	private IMethodProxy fClassGetDeclaredField;	
	private IMethodProxy fClassGetConstructor;
	private IMethodProxy fClassIsAssignableFrom;
	
	private IMethodProxy fObjectToString;
	private IMethodProxy fObjectEquals;
	
	private IMethodProxy fThrowableLocalizedMessage;
	private IMethodProxy fThrowableMessage;
	
	private IMethodProxy fMethodDeclaringClassMessage;
	private IMethodProxy fMethodMethodNameMessage;
	private IMethodProxy fMethodParameterTypesMessage;
	private IMethodProxy fMethodReturnTypeMessage;
	
	private IMethodProxy fAccessibleIsAccessible;
	private IMethodProxy fAccessibleSetAccessible;
	
	private IMethodProxy fFieldGet;
	private IMethodProxy fFieldGetType;
	private IMethodProxy fFieldGetByte;
	private IMethodProxy fFieldGetBoolean;
	private IMethodProxy fFieldGetChar;
	private IMethodProxy fFieldGetDouble;
	private IMethodProxy fFieldGetFloat;
	private IMethodProxy fFieldGetInt;
	private IMethodProxy fFieldGetShort;
	private IMethodProxy fFieldGetLong;	
	private IMethodProxy fFieldSet;
	
	private IMethodProxy fConstructorNewInstance;	
	
	private IMethodProxy fArrayNewInstanceOneDimension;
	private IMethodProxy fArrayNewInstanceMultiDimensions;
	private IMethodProxy fArrayGetLength;
	private IMethodProxy fArrayGet;
	private IMethodProxy fArrayGetByte;
	private IMethodProxy fArrayGetBoolean;
	private IMethodProxy fArrayGetChar;
	private IMethodProxy fArrayGetDouble;
	private IMethodProxy fArrayGetFloat;
	private IMethodProxy fArrayGetInt;
	private IMethodProxy fArrayGetShort;
	private IMethodProxy fArrayGetLong;	
	private IMethodProxy fArraySet;	
	
	private IMethodProxy fArrayHelperGet;
	private IMethodProxy fArrayHelperGetByte;
	private IMethodProxy fArrayHelperGetBoolean;
	private IMethodProxy fArrayHelperGetChar;
	private IMethodProxy fArrayHelperGetDouble;
	private IMethodProxy fArrayHelperGetFloat;
	private IMethodProxy fArrayHelperGetInt;
	private IMethodProxy fArrayHelperGetShort;
	private IMethodProxy fArrayHelperGetLong;	
	private IMethodProxy fArrayHelperSet;			
	
/**
 * Get the constants instance for the specified registry.
 */
public static REMStandardBeanProxyConstants getConstants(ProxyFactoryRegistry registry) {
	REMStandardBeanProxyConstants constants = (REMStandardBeanProxyConstants) registry.getConstants(REGISTRY_KEY);
	if (constants == null)
		registry.registerConstants(REGISTRY_KEY, constants = new REMStandardBeanProxyConstants(registry));	
	return constants;
}


private REMStandardBeanProxyConstants(ProxyFactoryRegistry registry) {
	super();
	fRegistry = registry;
}

public IMethodProxy getClassNewInstance() {
	// We actually need a special new instance because we want to be able to access outside of security. For our purposes security doesn't matter for construction.
	if (fClassNewInstance == null)
		fClassNewInstance = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ClassHelper", "newInstance", new String[] {"java.lang.Class"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fClassNewInstance;
}

public IMethodProxy getClassGetField() {
	if (fClassGetField == null)
		fClassGetField = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Class", "getField", new String[] {"java.lang.String"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fClassGetField;
}

public IMethodProxy getClassConstructor() {
	if (fClassGetConstructor == null)
		fClassGetConstructor = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Class", "getConstructor", new String[] {"[Ljava.lang.Class;"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fClassGetConstructor;
}

public IMethodProxy getClassIsAssignableFrom() {
	if (fClassIsAssignableFrom == null)
		fClassIsAssignableFrom = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Class", "isAssignableFrom", new String[] {"java.lang.Class"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fClassIsAssignableFrom;
}

public IMethodProxy getObjectToString() {
	if (fObjectToString == null)
		fObjectToString = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Object", "toString", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fObjectToString;
}

public IMethodProxy getObjectEquals() {
	if (fObjectEquals == null)
		fObjectEquals = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Object", "equals", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fObjectEquals;
}
public IMethodProxy getThrowableLocalizedMessage() {
	if (fThrowableLocalizedMessage == null)
		fThrowableLocalizedMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Throwable", "getLocalizedMessage", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fThrowableLocalizedMessage;
}

public IMethodProxy getThrowableMessage() {
	if (fThrowableMessage == null)
		fThrowableMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Throwable", "getMessage", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fThrowableMessage;
}

public IMethodProxy getMethodDeclaringClassMessage() {
	if (fMethodDeclaringClassMessage == null)
		fMethodDeclaringClassMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Method", "getDeclaringClass", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fMethodDeclaringClassMessage;
}

public IMethodProxy getMethodMethodNameMessage() {
	if (fMethodMethodNameMessage == null)
		fMethodMethodNameMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Method", "getName", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fMethodMethodNameMessage;
}	

public IMethodProxy getMethodParameterTypesMessage() {
	if (fMethodParameterTypesMessage == null)
		fMethodParameterTypesMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Method", "getParameterTypes", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fMethodParameterTypesMessage;
}

public IMethodProxy getMethodReturnTypeMessage() {
	if (fMethodReturnTypeMessage == null)
		fMethodReturnTypeMessage = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Method", "getReturnType", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fMethodReturnTypeMessage;
}

public IMethodProxy getAccessibleIsAccessible() {
	if (fAccessibleIsAccessible == null)
		fAccessibleIsAccessible = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.AccessibleObject", "isAccessible", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fAccessibleIsAccessible;
}

public IMethodProxy getAccessibleSetAccessible() {
	if (fAccessibleSetAccessible == null)
		fAccessibleSetAccessible = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.AccessibleObject", "setAccessible", new String[] {"boolean"}); //$NON-NLS-1$ //$NON-NLS-2$
	return fAccessibleSetAccessible;
}

public IMethodProxy getFieldGetType() {
	if (fFieldGetType == null)
		fFieldGetType = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getType", null); //$NON-NLS-1$ //$NON-NLS-2$
	return fFieldGetType;
}

public IMethodProxy getFieldGet() {
	if (fFieldGet == null)
		fFieldGet = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "get", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGet;
}

public IMethodProxy getFieldGetByte() {
	if (fFieldGetByte == null)
		fFieldGetByte = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getByte", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetByte;
}

public IMethodProxy getFieldGetBoolean() {
	if (fFieldGetBoolean == null)
		fFieldGetBoolean = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getBoolean", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetBoolean;
}

public IMethodProxy getFieldGetChar() {
	if (fFieldGetChar == null)
		fFieldGetChar = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getChar", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetChar;
}

public IMethodProxy getFieldGetDouble() {
	if (fFieldGetDouble == null)
		fFieldGetDouble = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getDouble", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetDouble;
}

public IMethodProxy getFieldGetFloat() {
	if (fFieldGetFloat == null)
		fFieldGetFloat = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getFloat", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetFloat;
}

public IMethodProxy getFieldGetInt() {
	if (fFieldGetInt == null)
		fFieldGetInt = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getInt", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetInt;
}

public IMethodProxy getFieldGetLong() {
	if (fFieldGetLong == null)
		fFieldGetLong = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getLong", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetLong;
}

public IMethodProxy getFieldGetShort() {
	if (fFieldGetShort == null)
		fFieldGetShort = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "getShort", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fFieldGetShort;
}

public IMethodProxy getFieldSet() {
	if (fFieldSet == null)
		fFieldSet = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Field", "set", new String[] {"java.lang.Object", "java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fFieldSet;
}

public IMethodProxy getConstructorNewInstance() {
	if (fConstructorNewInstance == null)
		fConstructorNewInstance = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Constructor", "newInstance", new String[] {"[Ljava.lang.Object;"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fConstructorNewInstance;
}

public IMethodProxy getArrayNewInstanceOneDimension() {
	if (fArrayNewInstanceOneDimension == null)
		fArrayNewInstanceOneDimension = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "newInstance", new String[] {"java.lang.Class", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayNewInstanceOneDimension;
}

public IMethodProxy getArrayNewInstanceMultiDimension() {
	if (fArrayNewInstanceMultiDimensions == null)
		fArrayNewInstanceMultiDimensions = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "newInstance", new String[] {"java.lang.Class", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayNewInstanceMultiDimensions;
}

public IMethodProxy getArrayGetLength() {
	if (fArrayGetLength == null)
		fArrayGetLength = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getLength", new String[] {"java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fArrayGetLength;
}

public IMethodProxy getArrayGet() {
	if (fArrayGet == null)
		fArrayGet = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "get", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGet;
}

public IMethodProxy getArrayGetByte() {
	if (fArrayGetByte == null)
		fArrayGetByte = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getByte", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetByte;
}

public IMethodProxy getArrayGetBoolean() {
	if (fArrayGetBoolean == null)
		fArrayGetBoolean = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getBoolean", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetBoolean;
}

public IMethodProxy getArrayGetChar() {
	if (fArrayGetChar == null)
		fArrayGetChar = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getChar", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetChar;
}

public IMethodProxy getArrayGetDouble() {
	if (fArrayGetDouble == null)
		fArrayGetDouble = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getDouble", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetDouble;
}

public IMethodProxy getArrayGetFloat() {
	if (fArrayGetFloat == null)
		fArrayGetFloat = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getFloat", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetFloat;
}

public IMethodProxy getArrayGetInt() {
	if (fArrayGetInt == null)
		fArrayGetInt = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getInt", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetInt;
}

public IMethodProxy getArrayGetLong() {
	if (fArrayGetLong == null)
		fArrayGetLong = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getLong", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetLong;
}

public IMethodProxy getArrayGetShort() {
	if (fArrayGetShort == null)
		fArrayGetShort = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "getShort", new String[] {"java.lang.Object", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayGetShort;
}

public IMethodProxy getArraySet() {
	if (fArraySet == null)
		fArraySet = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.reflect.Array", "set", new String[] {"java.lang.Object", "int", "java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
	return fArraySet;
}

public IMethodProxy getArrayHelperGet() {
	if (fArrayHelperGet == null)
		fArrayHelperGet = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "get", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGet;
}

public IMethodProxy getArrayHelperGetByte() {
	if (fArrayHelperGetByte == null)
		fArrayHelperGetByte = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getByte", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetByte;
}

public IMethodProxy getArrayHelperGetBoolean() {
	if (fArrayHelperGetBoolean == null)
		fArrayHelperGetBoolean = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getBoolean", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetBoolean;
}

public IMethodProxy getArrayHelperGetChar() {
	if (fArrayHelperGetChar == null)
		fArrayHelperGetChar = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getChar", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetChar;
}

public IMethodProxy getArrayHelperGetDouble() {
	if (fArrayHelperGetDouble == null)
		fArrayHelperGetDouble = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getDouble", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetDouble;
}

public IMethodProxy getArrayHelperGetFloat() {
	if (fArrayHelperGetFloat == null)
		fArrayHelperGetFloat = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getFloat", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetFloat;
}

public IMethodProxy getArrayHelperGetInt() {
	if (fArrayHelperGetInt == null)
		fArrayHelperGetInt = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getInt", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetInt;
}

public IMethodProxy getArrayHelperGetLong() {
	if (fArrayHelperGetLong == null)
		fArrayHelperGetLong = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getLong", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetLong;
}

public IMethodProxy getArrayHelperGetShort() {
	if (fArrayHelperGetShort == null)
		fArrayHelperGetShort = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "getShort", new String[] {"java.lang.Object", "[I"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	return fArrayHelperGetShort;
}

public IMethodProxy getArrayHelperSet() {
	if (fArrayHelperSet == null)
		fArrayHelperSet = fRegistry.getMethodProxyFactory().getMethodProxy("org.eclipse.jem.internal.proxy.vm.remote.ArrayHelper", "set", new String[] {"java.lang.Object", "[I", "java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
	return fArrayHelperSet;
}


public IMethodProxy getClassGetDeclaredField() {

	if (fClassGetDeclaredField == null)
			fClassGetDeclaredField = fRegistry.getMethodProxyFactory().getMethodProxy("java.lang.Class", "getDeclaredField", new String[] {"java.lang.String"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		return fClassGetDeclaredField;
	}

}
