/*******************************************************************************
 * 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;
/*
 *  $RCSfile: JavaStandardBeanProxyConstants.java,v $
 *  $Revision: 1.4 $  $Date: 2005/08/24 20:39:06 $ 
 */


/**
 * 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);
}
}
