/*******************************************************************************
 * Copyright (c) 2007, 2008 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.wst.validation;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.validation.Validator.V2;

/**
 * The class that all Validators that wish to use version two of the validation framework must subclass.
 * <p>
 * <b>Provisional API:</b> This class/interface is part of an interim API that is still under development and expected to 
 * change significantly before reaching stability. It is being made available at this early stage to solicit feedback 
 * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
 * (repeatedly) as the API evolves.
 * </p>
 * @author karasiuk
 *
 */
public abstract class AbstractValidator {
	
	private V2 _parent;
	
	/**
	 * Validate the resource. The validator is called from a WorkspaceJob, so
	 * the validator itself does not need to establish it's own IWorkspaceRunnable.
	 * <p>
	 * If you override this method then you should not override the other validate method.
	 * </p>
	 * 
	 * @param resource
	 * 		The resource to be validated.
	 * 
	 * @param kind
	 * 		The way the resource changed. It uses the same values as the kind
	 * 		parameter in IResourceDelta.
	 * 
	 * @param state
	 * 		A way to pass arbitrary, validator specific, data from one
	 * 		invocation of a validator to the next, during the validation phase.
	 * 		At the end of the validation phase, this object will be cleared,
	 * 		thereby allowing any of this state information to be garbaged
	 * 		collected.
	 * 
	 * @param monitor
	 * 		A monitor that you can use to report your progress. To be a well
	 * 		behaved validator you need to check the isCancelled() method at
	 * 		appropriate times.
	 * 
	 * @return the result of the validation. This may be, but usually isn't, null.
	 */
	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor){
		return null;
	}
	
	/**
	 * Validate the resource. The validator is called from a WorkspaceJob, so
	 * the validator itself does not need to establish it's own
	 * IWorkspaceRunnable.
	 * <p>
	 * If you override this method then you should not override the other
	 * validate method.
	 * </p>
	 * 
	 * @param event
	 *            An object that describes the resource to be validated and why
	 *            it should be validated.
	 * 
	 * @param state
	 *            A way to pass arbitrary, validator specific, data from one
	 *            invocation of a validator to the next, during the validation
	 *            phase. At the end of the validation phase, this object will be
	 *            cleared, thereby allowing any of this state information to be
	 *            garbaged collected.
	 * 
	 * @param monitor
	 *            A monitor that you can use to report your progress. To be a
	 *            well behaved validator you need to check the isCancelled()
	 *            method at appropriate times.
	 * 
	 * @return the result of the validation. Null should never be returned. If
	 *         null is returned then the other validate method will be called as
	 *         well.
	 */
	public ValidationResult validate(ValidationEvent event, ValidationState state, IProgressMonitor monitor){
		return null;
	}
	
	
	/**
	 * A call back method that lets the validator know that the project is being
	 * cleaned. This method gives the validator a chance to do any special
	 * cleanup. The default is to do nothing.
	 * <p>
	 * If the entire workspace is being cleaned, then the first call will have a
	 * null project, and then there will be subsequent calls for each open
	 * project in the workspace.</p>
	 * 
	 * @param project
	 * 		The project being cleaned. This may be null, which is an indication
	 * 		that the workspace is being cleaned.
	 * 
	 * @param state
	 * 		A way to pass arbitrary, validator specific, data from one
	 * 		invocation of a validator to the next, during the validation phase.
	 * 
	 * @param monitor
	 * 		The monitor that should be used for reporting progress if the clean
	 * 		takes a long time.
	 */
	public void clean(IProject project, ValidationState state, IProgressMonitor monitor){		
	}
		
	/**
	 * This method is called before any validation takes place. It allows
	 * validators to perform any initialization that they might need.
	 * 
	 * @param project
	 * 		The project that is being validated. For the very first call in the
	 * 		validation phase, this will be null. A null project is the signal
	 * 		that a top level validation is starting. Subsequently, the project
	 * 		will be set, as each of the individual projects are validated.
	 * 
	 * @param state
	 * 		A way to pass arbitrary, validator specific, data from one
	 * 		invocation of a validator to the next, during the validation phase.
	 * 
	 * @param monitor
	 * 		The monitor that should be used for reporting progress if the initialization
	 * 		takes a long time.
	 */
	public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor){		
	}
	
	/**
	 * This method will be called when validation is complete. It allows
	 * validators to perform any cleanup that they might need to do.
	 * 
	 * @param project
	 * 		The project that was validated. The very last call in the validation
	 * 		sets this to null so that the validator knows that all the
	 * 		projects have now been validated.
	 * 
	 * @param state
	 * 		A way to pass arbitrary, validator specific, data from one
	 * 		invocation of a validator to the next, during the validation phase.
	 * 
	 * @param monitor
	 * 		The monitor that should be used for reporting progress if the cleanup
	 * 		takes a long time.
	 */
	public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor){		
	}
	
	/**
	 * Should the validation framework first clear the markers that this
	 * validator has placed on this resource? This method can be overridden by
	 * validator implementors to provide a validator specific behavior.
	 * 
	 * @param event
	 *            The validation event that triggered the validation.
	 * @return true if the validation framework should first clear all the
	 *         markers that this validator produced. This is the default
	 *         behavior. Return false to leave the markers unchanged. It then
	 *         becomes the responsibility of the validator to manage it's own
	 *         markers for this resource, for this validation event.
	 */
	public boolean shouldClearMarkers(ValidationEvent event){
		return true;
	}
		
	/**
	 * Answer the validator that you belong to. The validator controls the
	 * filters and various other settings.
	 * 
	 * @nooverride
	 */
	public V2 getParent(){
		return _parent;
	}
	
	void setParent(V2 parent){
		_parent = parent;
	}
}
