/******************************************************************************* * 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.core; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaModelStatus; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.builder.JavaBuilder; /* * Validates the raw classpath format and the resolved classpath of this project, * updating markers if necessary. */ public class ClasspathValidation { private JavaProject project; public ClasspathValidation(JavaProject project) { this.project = project; } public void validate() { JavaModelManager.PerProjectInfo perProjectInfo; try { perProjectInfo = this.project.getPerProjectInfo(); } catch (JavaModelException e) { // project doesn't exist IProject resource = this.project.getProject(); if (resource.isAccessible()) { this.project.flushClasspathProblemMarkers(true/*flush cycle markers*/, true/*flush classpath format markers*/, true /*flush overlapping output markers*/); // remove problems and tasks created by the builder JavaBuilder.removeProblemsAndTasksFor(resource); } return; } // use synchronized block to ensure consistency IClasspathEntry[] rawClasspath; IPath outputLocation; IJavaModelStatus status; synchronized (perProjectInfo) { rawClasspath = perProjectInfo.rawClasspath; outputLocation = perProjectInfo.outputLocation; status = perProjectInfo.rawClasspathStatus; // status has been set during POST_CHANGE } // update classpath format problems this.project.flushClasspathProblemMarkers(false/*cycle*/, true/*format*/, false/*overlapping*/); if (!status.isOK()) this.project.createClasspathProblemMarker(status); // update overlapping output problem markers this.project.flushClasspathProblemMarkers(false/*cycle*/, false/*format*/, true/*overlapping*/); // update resolved classpath problems this.project.flushClasspathProblemMarkers(false/*cycle*/, false/*format*/, false/*overlapping*/); if (rawClasspath != JavaProject.INVALID_CLASSPATH && outputLocation != null) { for (int i = 0; i < rawClasspath.length; i++) { status = ClasspathEntry.validateClasspathEntry(this.project, rawClasspath[i], false/*src attach*/, false /*not referred by a container*/); if (!status.isOK()) { this.project.createClasspathProblemMarker(status); } } status = ClasspathEntry.validateClasspath(this.project, rawClasspath, outputLocation); if (status.getCode() != IStatus.OK) this.project.createClasspathProblemMarker(status); } } }