/* * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.eclipse.lambda.project.listener; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import com.amazonaws.eclipse.lambda.LambdaPlugin; /** * Responsible for tracking local changes to all the projects in the current * workspace */ public class LambdaProjectChangeTracker { private final ConcurrentHashMap<IProject, Boolean> projectDirtyMap = new ConcurrentHashMap<IProject, Boolean>(); private final IElementChangedListener projectChangeListener = new LambdaProjectElementChangeListener(); public void start() { JavaCore.addElementChangedListener(projectChangeListener, ElementChangedEvent.POST_CHANGE); } public void stop() { JavaCore.removeElementChangedListener(projectChangeListener); } public void clearDirtyFlags() { projectDirtyMap.clear(); } public boolean isProjectDirty(IJavaProject project) { return isProjectDirty(project.getProject()); } /** * @return true if the project is marked as dirty or if the dirty flag is * never set for this project. */ public boolean isProjectDirty(IProject project) { Boolean dirtyFlag = projectDirtyMap.get(project); if (dirtyFlag == null) { return true; } return dirtyFlag; } public void markProjectAsNotDirty(IProject project) { updateProjectDirtyFlag(project, false); } private void markProjectAsDirty(IProject project) { updateProjectDirtyFlag(project, true); } private void markProjectAsDirty(IJavaProject project) { markProjectAsDirty(project.getProject()); } private void updateProjectDirtyFlag(IProject project, boolean dirty) { projectDirtyMap.put(project, dirty); LambdaPlugin.getDefault().trace( "Project [" + project.getName() + "] dirty flag set to " + dirty); } /** * A JDT element change listener implementation that marks a project (and * its upstream dependencies) as dirty whenever an element change is * detected in the project. */ private class LambdaProjectElementChangeListener implements IElementChangedListener { public void elementChanged(ElementChangedEvent event) { JavaElementDeltaAcceptor.accept(event.getDelta(), new JavaElementDeltaAcceptor.Visitor() { @Override protected boolean visit(IJavaProject project) { markProjectAsDirty(project); for (IProject dependent : project.getProject() .getReferencingProjects()) { markProjectAsDirty(dependent); } return true; } }); } } }