package org.eclipse.wst.jsdt.web.core.internal.java;

/**
 * @author pavery
 */

import java.util.ArrayList;
import java.util.List;

import org.eclipse.wst.jsdt.core.IProblemRequestor;
import org.eclipse.wst.jsdt.core.compiler.IProblem;

class JSPProblemRequestor implements IProblemRequestor {
	
	private List	fCollectedProblems;
	
	private boolean fIsActive  = false;
	
	private boolean fIsRunning = false;
	
	public void acceptProblem(IProblem problem) {
		
		if (isActive()) {
			fCollectedProblems.add(problem);
		}
	}
	
	public void beginReporting() {
		
		fIsRunning = true;
		fCollectedProblems = new ArrayList();
	}
	
	public void endReporting() {
		
		fIsRunning = false;
	}
	
	/**
	 * @return the list of collected problems
	 */
	public List getCollectedProblems() {
		
		return fCollectedProblems;
	}
	
	public boolean isActive() {
		
		return fIsActive && fCollectedProblems != null;
	}
	
	public boolean isRunning() {
		
		return fIsRunning;
	}
	
	/**
	 * Sets the active state of this problem requestor.
	 * 
	 * @param isActive
	 *            the state of this problem requestor
	 */
	public void setIsActive(boolean isActive) {
		
		if (fIsActive != isActive) {
			fIsActive = isActive;
			if (fIsActive) {
				startCollectingProblems();
			} else {
				stopCollectingProblems();
			}
		}
	}
	
	/**
	 * Tells this annotation model to collect temporary problems from now on.
	 */
	private void startCollectingProblems() {
		
		fCollectedProblems = new ArrayList();
	}
	
	/**
	 * Tells this annotation model to no longer collect temporary problems.
	 */
	private void stopCollectingProblems() {
		
		// do nothing
	}
}
