blob: 6b6a6023705ee4246189483d52aff39b6957c60a [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}