/******************************************************************************* * Copyright (c) 2010, 2011 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.docs.intent.client.ui.ide.generatedelementlistener; import java.util.ArrayList; import java.util.Collection; import java.util.Set; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.emf.common.util.URI; /** * Visits a resource delta and detects the listened changed or removed resources. * * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a> */ public class IDEGeneratedElementListenerDeltaVisitor implements IResourceDeltaVisitor { /** * All the EMF resource of the WorkspaceRepository that have changed. */ protected Collection<URI> changedResources; /** * All the EMF resource of the WorkspaceRepository that have been removed of this repository. */ protected Collection<URI> removedResources; /** * {@link URI}s of the listened elements. */ protected Set<URI> listenedElementsURIs; /** * IDEGeneratedElementListenerDeltaVisitor constructor. * * @param listenedElementsURIs * the list of listened element's URIs */ public IDEGeneratedElementListenerDeltaVisitor(Set<URI> listenedElementsURIs) { this.listenedElementsURIs = listenedElementsURIs; changedResources = new ArrayList<URI>(); removedResources = new ArrayList<URI>(); } /** * {@inheritDoc} * * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) */ public boolean visit(IResourceDelta delta) { if (delta.getResource().getType() != IResource.FILE) { return true; } if (isRelevantModification(delta)) { // We first calculate the repository relative path for this resource String uri = delta.getFullPath().toString(); URI changedResourceURI = URI.createPlatformResourceURI(uri, false); if ((changedResourceURI != null) && (listenedElementsURIs.contains(changedResourceURI))) { switch (delta.getKind()) { case IResourceDelta.REMOVED: removedResources.add(changedResourceURI); break; case IResourceDelta.ADDED: case IResourceDelta.CHANGED: changedResources.add(changedResourceURI); break; default: break; } } } return true; } /** * Indicates if the given delta describes a relevant modification. * * @param delta * the visited delta * @return true if the given delta describes a relevant modification false otherwise */ protected boolean isRelevantModification(IResourceDelta delta) { // First of all, we test if this delta describes an deletion, an addition or a modification boolean isRelevantModification = (delta.getKind() == IResourceDelta.REMOVED) || (delta.getKind() == IResourceDelta.CHANGED) || delta.getKind() == IResourceDelta.ADDED; // The we ensure that this delta isn't a touch or a marker modification isRelevantModification = isRelevantModification && (delta.getFlags() != IResourceDelta.MARKERS); return isRelevantModification; } /** * Returns the list of changed Resources's URIs. * * @return the list of changed Resources 's URIs */ public Collection<URI> getChangedResources() { return changedResources; } /** * Returns the list of removed Resources's URIs. * * @return the list of removed Resources 's URIs */ public Collection<URI> getRemovedResources() { return removedResources; } }