/*******************************************************************************
 * Copyright (c) 2000, 2009 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.jdt.internal.core;

import java.util.ArrayList;

import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IInitializer;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;

/**
 * @see IJavaElementRequestor
 */

public class JavaElementRequestor implements IJavaElementRequestor {
	/**
	 * True if this requestor no longer wants to receive
	 * results from its <code>IRequestorNameLookup</code>.
	 */
	protected boolean canceled= false;

	/**
	 * A collection of the resulting fields, or <code>null</code>
	 * if no field results have been received.
	 */
	protected ArrayList fields= null;

	/**
	 * A collection of the resulting initializers, or <code>null</code>
	 * if no initializer results have been received.
	 */
	protected ArrayList initializers= null;

	/**
	 * A collection of the resulting member types, or <code>null</code>
	 * if no member type results have been received.
	 */
	protected ArrayList memberTypes= null;

	/**
	 * A collection of the resulting methods, or <code>null</code>
	 * if no method results have been received.
	 */
	protected ArrayList methods= null;

	/**
	 * A collection of the resulting package fragments, or <code>null</code>
	 * if no package fragment results have been received.
	 */
	protected ArrayList packageFragments= null;

	/**
	 * A collection of the resulting types, or <code>null</code>
	 * if no type results have been received.
	 */
	protected ArrayList types= null;

	/**
	 * Empty arrays used for efficiency
	 */
	protected static final IField[] EMPTY_FIELD_ARRAY= new IField[0];
	protected static final IInitializer[] EMPTY_INITIALIZER_ARRAY= new IInitializer[0];
	protected static final IType[] EMPTY_TYPE_ARRAY= new IType[0];
	protected static final IPackageFragment[] EMPTY_PACKAGE_FRAGMENT_ARRAY= new IPackageFragment[0];
	protected static final IMethod[] EMPTY_METHOD_ARRAY= new IMethod[0];
/**
 * @see IJavaElementRequestor
 */
public void acceptField(IField field) {
	if (this.fields == null) {
		this.fields= new ArrayList();
	}
	this.fields.add(field);
}
/**
 * @see IJavaElementRequestor
 */
public void acceptInitializer(IInitializer initializer) {
	if (this.initializers == null) {
		this.initializers= new ArrayList();
	}
	this.initializers.add(initializer);
}
/**
 * @see IJavaElementRequestor
 */
public void acceptMemberType(IType type) {
	if (this.memberTypes == null) {
		this.memberTypes= new ArrayList();
	}
	this.memberTypes.add(type);
}
/**
 * @see IJavaElementRequestor
 */
public void acceptMethod(IMethod method) {
	if (this.methods == null) {
		this.methods = new ArrayList();
	}
	this.methods.add(method);
}
/**
 * @see IJavaElementRequestor
 */
public void acceptPackageFragment(IPackageFragment packageFragment) {
	if (this.packageFragments== null) {
		this.packageFragments= new ArrayList();
	}
	this.packageFragments.add(packageFragment);
}
/**
 * @see IJavaElementRequestor
 */
public void acceptType(IType type) {
	if (this.types == null) {
		this.types= new ArrayList();
	}
	this.types.add(type);
}
/**
 * @see IJavaElementRequestor
 */
public IField[] getFields() {
	if (this.fields == null) {
		return EMPTY_FIELD_ARRAY;
	}
	int size = this.fields.size();
	IField[] results = new IField[size];
	this.fields.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public IInitializer[] getInitializers() {
	if (this.initializers == null) {
		return EMPTY_INITIALIZER_ARRAY;
	}
	int size = this.initializers.size();
	IInitializer[] results = new IInitializer[size];
	this.initializers.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public IType[] getMemberTypes() {
	if (this.memberTypes == null) {
		return EMPTY_TYPE_ARRAY;
	}
	int size = this.memberTypes.size();
	IType[] results = new IType[size];
	this.memberTypes.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public IMethod[] getMethods() {
	if (this.methods == null) {
		return EMPTY_METHOD_ARRAY;
	}
	int size = this.methods.size();
	IMethod[] results = new IMethod[size];
	this.methods.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public IPackageFragment[] getPackageFragments() {
	if (this.packageFragments== null) {
		return EMPTY_PACKAGE_FRAGMENT_ARRAY;
	}
	int size = this.packageFragments.size();
	IPackageFragment[] results = new IPackageFragment[size];
	this.packageFragments.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public IType[] getTypes() {
	if (this.types== null) {
		return EMPTY_TYPE_ARRAY;
	}
	int size = this.types.size();
	IType[] results = new IType[size];
	this.types.toArray(results);
	return results;
}
/**
 * @see IJavaElementRequestor
 */
public boolean isCanceled() {
	return this.canceled;
}
/**
 * Reset the state of this requestor.
 */
public void reset() {
	this.canceled = false;
	this.fields = null;
	this.initializers = null;
	this.memberTypes = null;
	this.methods = null;
	this.packageFragments = null;
	this.types = null;
}
/**
 * Sets the #isCanceled state of this requestor to true or false.
 */
public void setCanceled(boolean b) {
	this.canceled= b;
}
}
