/*******************************************************************************
 * Copyright (c) 2000, 2007 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
 *
 
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import org.eclipse.core.resources.IProject;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IModelStatus;
import org.eclipse.dltk.core.IModelStatusConstants;
import org.eclipse.dltk.core.ModelException;


/*
 * Validates the raw buildpath format and the resolved buildpath of this project,
 * updating markers if necessary.
 */
public class BuildpathValidation {
	
	private ScriptProject project;
	
	public BuildpathValidation(ScriptProject project) {
		this.project = project;
	}
	
	public void validate() {
		ModelManager.PerProjectInfo perProjectInfo;		
		try {
			perProjectInfo = this.project.getPerProjectInfo();
		} catch (ModelException e) {
			// project doesn't exist
			IProject resource = this.project.getProject();
			if (resource.isAccessible()) {
				this.project.flushBuildpathProblemMarkers(true/*flush cycle markers*/, true/*flush buildpath format markers*/);				
					
				// remove problems and tasks created  by the builder
				if (DLTKCore.DEBUG) {
					System.err.println("TODO: BuildpathValidation.java remove problems and tasks created  by the builder"); //$NON-NLS-1$
				}
				//ScriptBuilder.removeProblemsAndTasksFor(resource);
			}
			return;
		}
		
		// use synchronized block to ensure consistency
		IBuildpathEntry[] rawBuildpath;		
		IModelStatus status;
		synchronized (perProjectInfo) {
			rawBuildpath = perProjectInfo.rawBuildpath;						
			status = perProjectInfo.rawBuildpathStatus; // status has been set during POST_CHANGE
		}
		
		// update buildpath format problems
		this.project.flushBuildpathProblemMarkers(false/*cycle*/, true/*format*/);
		if (status != null && !status.isOK())
			this.project.createBuildpathProblemMarker(status);	
		
		// update resolved buildpath problems
		this.project.flushBuildpathProblemMarkers(false/*cycle*/, false/*format*/);
		
		if (rawBuildpath != ScriptProject.INVALID_BUILDPATH
				&& rawBuildpath != null) {
		 	for (int i = 0; i < rawBuildpath.length; i++) {
				status = BuildpathEntry.validateBuildpathEntry(this.project, rawBuildpath[i],  true /*recurse in container*/);
				if (!status.isOK()) {
					if (status.getCode() == IModelStatusConstants.INVALID_BUILDPATH && ((BuildpathEntry) rawBuildpath[i]).isOptional() )
						continue; // ignore this entry
					this.project.createBuildpathProblemMarker(status);	
				}
			 }
			status = BuildpathEntry.validateBuildpath(this.project, rawBuildpath);
			if (!status.isOK()) 
				this.project.createBuildpathProblemMarker(status);
		 }
	}

}
