/*******************************************************************************
 * 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.core;
/*


 */


/**
 * 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.
 *
 * NOTE: Since everything in here just proxies, there is
 *       no need to have them separated by VM. That is why
 *       this in the Proxy package.
 *
 * 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 JavaStandardBeanProxyConstants {
	public static final Object REGISTRY_KEY = new Object();
		
	final IBeanTypeProxy fCollectionType;
	final IBeanTypeProxy fListType;
	final IBeanTypeProxy fIteratorType;
	final IBeanTypeProxy fListIteratorType;
	final IBeanTypeProxy fEnumerationType;	
	final IBeanTypeProxy fSystemType;
	final IBeanTypeProxy fStringType;
	
	IMethodProxy fCollectionAdd, fCollectionAddAll, fCollectionClear, fCollectionContains,
		fCollectionContainsAll, fCollectionIsEmpty, fCollectionIterator, fCollectionRemove,
		fCollectionRemoveAll, fCollectionRetainAll, fCollectionSize, fCollectionToArray,
		fCollectionToArrayWithArray;
		
	IMethodProxy fListAddWithInt, fListAddAllWithInt, fListGet, fListIndexOf, fListLastIndexOf,
		fListListIterator, fListListIteratorWithInt, fListRemoveInt, 
		fListSet, fListSubList;
		
	IMethodProxy fIteratorHasNext, fIteratorNext, fIteratorRemove;

	IMethodProxy fListIteratorAdd, fListIteratorHasPrevious, fListIteratorNextIndex, fListIteratorPrevious,
		fListIteratorPreviousIndex, fListIteratorRemove, fListIteratorSet;
		
	IMethodProxy fEnumerationHasMoreElements, fEnumerationNextElement;
	
	IMethodProxy fSystemArraycopy;

/**
 * Get the constants instance for the specified registry.
 */
public static JavaStandardBeanProxyConstants getConstants(ProxyFactoryRegistry registry) {
	JavaStandardBeanProxyConstants constants = (JavaStandardBeanProxyConstants) registry.getConstants(REGISTRY_KEY);
	if (constants == null)
		registry.registerConstants(REGISTRY_KEY, constants = new JavaStandardBeanProxyConstants(registry));	
	return constants;
}


/**
 * IDEJavaBeanConstants constructor comment.
 */
private JavaStandardBeanProxyConstants(ProxyFactoryRegistry registry) {
	super();
	
	IStandardBeanTypeProxyFactory typeFactory = registry.getBeanTypeProxyFactory();
	fCollectionType = typeFactory.getBeanTypeProxy("java.util.Collection");//$NON-NLS-1$
	fListType = typeFactory.getBeanTypeProxy("java.util.List"); //$NON-NLS-1$
	fIteratorType = typeFactory.getBeanTypeProxy("java.util.Iterator"); //$NON-NLS-1$
	fListIteratorType = typeFactory.getBeanTypeProxy("java.util.ListIterator"); //$NON-NLS-1$
	fEnumerationType = typeFactory.getBeanTypeProxy("java.util.Enumeration");	 //$NON-NLS-1$
	fSystemType = typeFactory.getBeanTypeProxy("java.lang.System"); //$NON-NLS-1$
	fStringType = typeFactory.getBeanTypeProxy("java.lang.String"); //$NON-NLS-1$
}

public IBeanTypeProxy getStringType() {
	return fStringType;
}

/**
 * Collection method accessors
 */
public IMethodProxy getCollectionAdd() {
	if (fCollectionAdd == null)
		fCollectionAdd = fCollectionType.getMethodProxy("add", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionAdd;
}
	
public IMethodProxy getCollectionAddAll(){
	if (fCollectionAddAll == null)
		fCollectionAddAll = fCollectionType.getMethodProxy("addAll", "java.util.Collection"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionAddAll;
}

public IMethodProxy getCollectionClear() {
	if (fCollectionClear == null)
		fCollectionClear = fCollectionType.getMethodProxy("clear"); //$NON-NLS-1$
	return fCollectionClear;
}

public IMethodProxy getCollectionContains() {
	if (fCollectionContains == null)
		fCollectionContains = fCollectionType.getMethodProxy("contains", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionContains;
}
	
public IMethodProxy getCollectionContainsAll() {
	if (fCollectionContainsAll == null)
		fCollectionContainsAll = fCollectionType.getMethodProxy("containsAll", "java.util.Collection"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionContainsAll;
}

public IMethodProxy getCollectionIsEmpty() {
	if (fCollectionIsEmpty == null)
		fCollectionIsEmpty = fCollectionType.getMethodProxy("isEmpty"); //$NON-NLS-1$
	return fCollectionIsEmpty;
}

public IMethodProxy getCollectionIterator() {
	if (fCollectionIterator == null)
		fCollectionIterator = fCollectionType.getMethodProxy("iterator"); //$NON-NLS-1$
	return fCollectionIterator;
}

public IMethodProxy getCollectionRemove() {
	if (fCollectionRemove == null)
		fCollectionRemove = fCollectionType.getMethodProxy("remove", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionRemove;
}

public IMethodProxy getCollectionRemoveAll() {
	if (fCollectionRemoveAll == null)
		fCollectionRemoveAll = fCollectionType.getMethodProxy("removeAll", "java.util.Collection"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionRemoveAll;
}

public IMethodProxy getCollectionRetainAll() {
	if (fCollectionRetainAll == null)
		fCollectionRetainAll = fCollectionType.getMethodProxy("retainAll", "java.util.Collection"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionRetainAll;
}

public IMethodProxy getCollectionSize()  {
	if (fCollectionSize == null)
		fCollectionSize = fCollectionType.getMethodProxy("size"); //$NON-NLS-1$
	return fCollectionSize;
}

public IMethodProxy getCollectionToArray() {
	if (fCollectionToArray == null)
		fCollectionToArray = fCollectionType.getMethodProxy("toArray"); //$NON-NLS-1$
	return fCollectionToArray;
}

public IMethodProxy getCollectionToArrayWithArray() {
	if (fCollectionToArrayWithArray == null)
		fCollectionToArrayWithArray = fCollectionType.getMethodProxy("toArray", "[Ljava.lang.Object;"); //$NON-NLS-1$ //$NON-NLS-2$
	return fCollectionToArrayWithArray;
}

/**
 * Iterator accessors
 */

public IMethodProxy getIteratorHasNext() {
	if (fIteratorHasNext == null)
		fIteratorHasNext = fIteratorType.getMethodProxy("hasNext"); //$NON-NLS-1$
	return fIteratorHasNext;
}

public IMethodProxy getIteratorNext() {
	if (fIteratorNext == null)
		fIteratorNext = fIteratorType.getMethodProxy("next"); //$NON-NLS-1$
	return fIteratorNext;
}

public IMethodProxy getIteratorRemove() {
	if (fIteratorRemove == null)
		fIteratorRemove = fIteratorType.getMethodProxy("remove"); //$NON-NLS-1$
	return fIteratorRemove;
}

/**
 * Listaccessors
 */

public IMethodProxy getListAddWithInt() {
	if (fListAddWithInt == null)
		fListAddWithInt = fListType.getMethodProxy("add", new String[] {"int", "java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fListAddWithInt;
}

public IMethodProxy getListAddAllWithInt() {
	if (fListAddAllWithInt == null)
		fListAddAllWithInt = fListType.getMethodProxy("addAll", new String[] {"int", "java.util.Collection"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fListAddAllWithInt;
}

public IMethodProxy getListGet() {
	if (fListGet == null)
		fListGet = fListType.getMethodProxy("get", "int"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListGet;
}

public IMethodProxy getListIndexOf() {
	if (fListIndexOf == null)
		fListIndexOf = fListType.getMethodProxy("indexOf", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListIndexOf;
}

public IMethodProxy getListLastIndexOf() {
	if (fListLastIndexOf == null)
		fListLastIndexOf = fListType.getMethodProxy("lastIndexOf", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListLastIndexOf;
}

public IMethodProxy getListListIterator() {
	if (fListListIterator == null)
		fListListIterator = fListType.getMethodProxy("listIterator"); //$NON-NLS-1$
	return fListListIterator;
}

public IMethodProxy getListListIteratorWithInt() {
	if (fListListIteratorWithInt == null)
		fListListIteratorWithInt = fListType.getMethodProxy("listIterator", "int"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListListIteratorWithInt;
}

public IMethodProxy getListRemoveInt() {
	if (fListRemoveInt == null)
		fListRemoveInt = fListType.getMethodProxy("remove", "int"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListRemoveInt;
}

public IMethodProxy getListSet() {
	if (fListSet == null)
		fListSet = fListType.getMethodProxy("set", new String[] {"int", "java.lang.Object"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fListSet;
}

public IMethodProxy getListSubList() {
	if (fListSubList == null)
		fListSubList = fListType.getMethodProxy("subList", new String[] {"int", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	return fListSubList;
}

/**
 * ListIterator accessors
 */
 
public IMethodProxy getListIteratorAdd() {
	if (fListIteratorAdd == null)
		fListIteratorAdd = fListIteratorType.getMethodProxy("add", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListIteratorAdd;
}

public IMethodProxy getListIteratorHasPrevious() {
	if (fListIteratorHasPrevious == null)
		fListIteratorHasPrevious = fListIteratorType.getMethodProxy("hasPrevious"); //$NON-NLS-1$
	return fListIteratorHasPrevious;
}

public IMethodProxy getListIteratorNextIndex() {
	if (fListIteratorNextIndex == null)
		fListIteratorNextIndex = fListIteratorType.getMethodProxy("nextIndex"); //$NON-NLS-1$
	return fListIteratorNextIndex;
}

public IMethodProxy getListIteratorPrevious() {
	if (fListIteratorPrevious == null)
		fListIteratorPrevious = fListIteratorType.getMethodProxy("previous"); //$NON-NLS-1$
	return fListIteratorPrevious;
}

public IMethodProxy getListIteratorPreviousIndex() {
	if (fListIteratorPreviousIndex == null)
		fListIteratorPreviousIndex = fListIteratorType.getMethodProxy("previousIndex"); //$NON-NLS-1$
	return fListIteratorPreviousIndex;
}

public IMethodProxy getListIteratorSet() {
	if (fListIteratorSet == null)
		fListIteratorSet = fListIteratorType.getMethodProxy("set", "java.lang.Object"); //$NON-NLS-1$ //$NON-NLS-2$
	return fListIteratorSet;
}

public IMethodProxy getListIteratorRemove() {
	if (fListIteratorRemove == null)
		fListIteratorRemove = fListIteratorType.getMethodProxy("remove"); //$NON-NLS-1$
	return fListIteratorRemove;
}

protected IMethodProxy getSystemArraycopy() {
	if (fSystemArraycopy == null)
		fSystemArraycopy = fSystemType.getMethodProxy("arraycopy", new String[] {"java.lang.Object", "int", "java.lang.Object", "int", "int"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
	return fSystemArraycopy;
}

/**
 * Enumeration accessors
 */
public IMethodProxy getEnumerationHasMoreElements() {
	if (fEnumerationHasMoreElements == null)
		fEnumerationHasMoreElements = fEnumerationType.getMethodProxy("hasMoreElements"); //$NON-NLS-1$
	return fEnumerationHasMoreElements;
}

public IMethodProxy getEnumerationNextElement() {
	if (fEnumerationNextElement == null)
		fEnumerationNextElement = fEnumerationType.getMethodProxy("nextElement"); //$NON-NLS-1$
	return fEnumerationNextElement;
}

/**
 * Utility function to copy an array.
 */
public void arraycopy(IBeanProxy src, int srcPosition, IBeanProxy dest, int destPosition, int length) throws ThrowableProxy {
	IStandardBeanProxyFactory factory = src.getProxyFactoryRegistry().getBeanProxyFactory();
	IBeanProxy[] args = new IBeanProxy[] {
		src,
		factory.createBeanProxyWith(srcPosition),
		dest,
		factory.createBeanProxyWith(destPosition),
		factory.createBeanProxyWith(length)		
	};
	
	getSystemArraycopy().invoke(null, args);
}
}
