/*******************************************************************************
 * Copyright (c) 2000, 2011 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.corext.refactoring;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.search.SearchMatch;

import org.eclipse.jdt.internal.corext.refactoring.base.ReferencesInBinaryContext;
import org.eclipse.jdt.internal.corext.util.SearchUtils;

/**
 * Collects the results returned by a <code>SearchEngine</code>.
 * Only collects matches in CUs ands offers a scanner to trim match ranges.
 * If a {@link ReferencesInBinaryContext} is passed, matches that are
 * inside a binary element are not collected (but added to the context if they are accurate).
 */
public class CuCollectingSearchRequestor extends CollectingSearchRequestor {

	private IJavaProject fProjectCache;
	private IScanner fScannerCache;

	public CuCollectingSearchRequestor() {
		this(null);
	}

	public CuCollectingSearchRequestor(ReferencesInBinaryContext binaryRefs) {
		super(binaryRefs);
	}

	protected IScanner getScanner(ICompilationUnit unit) {
		IJavaProject project= unit.getJavaProject();
		if (project.equals(fProjectCache))
			return fScannerCache;

		fProjectCache= project;
		String sourceLevel= project.getOption(JavaCore.COMPILER_SOURCE, true);
		String complianceLevel= project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
		fScannerCache= ToolFactory.createScanner(false, false, false, sourceLevel, complianceLevel);
		return fScannerCache;
	}

	/**
	 * This is an internal method. Do not call from subclasses!
	 * Use {@link #collectMatch(SearchMatch)} instead.
	 * @param match
	 * @throws CoreException
	 * @deprecated
	 */
	@Override
	public final void acceptSearchMatch(SearchMatch match) throws CoreException {
		if (filterMatch(match))
			return;

		ICompilationUnit unit= SearchUtils.getCompilationUnit(match);
		if (unit != null) {
			acceptSearchMatch(unit, match);
		}
	}

	/**
	 * Handles the given match in the given compilation unit.
	 * The default implementation accepts all matches.
	 * Subclasses can override and call {@link #collectMatch(SearchMatch)} to collect matches.
	 *
	 * @param unit the enclosing CU of the match, never <code>null</code>
	 * @param match the match
	 * @throws CoreException if something bad happens
	 */
	protected void acceptSearchMatch(ICompilationUnit unit, SearchMatch match) throws CoreException {
		collectMatch(match);
	}

	@Override
	public void endReporting() {
		fProjectCache= null;
		fScannerCache= null;
	}
}


