Copyright (c) 2000, 2010 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.jdt.internal.core; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; /* * Abstract class for operations that change the classpath */ public abstract class ChangeClasspathOperation extends JavaModelOperation { protected boolean canChangeResources; public ChangeClasspathOperation(IJavaElement[] elements, boolean canChangeResources) { super(elements); this.canChangeResources = canChangeResources; } @Override protected boolean canModifyRoots() { // changing the classpath can modify roots return true; } /* * The resolved classpath of the given project may have changed: * - generate a delta * - trigger indexing * - update project references * - create resolved classpath markers */ protected void classpathChanged(ClasspathChange change, boolean refreshExternalFolder) throws JavaModelException { // reset the project's caches early since some clients rely on the project's caches being up-to-date when run inside an IWorkspaceRunnable // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=212769#c5 ) JavaProject project = change.project; project.resetCaches(); if (this.canChangeResources) { // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=177922 if (isTopLevelOperation() && !ResourcesPlugin.getWorkspace().isTreeLocked()) { new ClasspathValidation(project).validate(); } // delta, indexing and classpath markers are going to be created by the delta processor // while handling the resource change (either .classpath change, or project touched) project.getProject().clearCachedDynamicReferences(); // and ensure that external folders are updated as well new ExternalFolderChange(project, change.oldResolvedClasspath).updateExternalFoldersIfNecessary(refreshExternalFolder, null); } else { DeltaProcessingState state = JavaModelManager.getDeltaState(); JavaElementDelta delta = new JavaElementDelta(getJavaModel()); int result = change.generateDelta(delta, true/*add classpath change*/); if ((result & ClasspathChange.HAS_DELTA) != 0) { // create delta addDelta(delta); // need to recompute root infos state.rootsAreStale = true; // ensure indexes are updated change.requestIndexing(); // ensure classpath is validated on next build state.addClasspathValidation(project); } if ((result & ClasspathChange.HAS_PROJECT_CHANGE) != 0) { // ensure project references are updated on next build project.getProject().clearCachedDynamicReferences(); state.addProjectReferenceChange(project); } if ((result & ClasspathChange.HAS_LIBRARY_CHANGE) != 0) { // ensure external folders are updated on next build state.addExternalFolderChange(project, change.oldResolvedClasspath); } } } @Override protected ISchedulingRule getSchedulingRule() { return null; // no lock taken while changing classpath } @Override public boolean isReadOnly() { return !this.canChangeResources; } }