package org.xtest.runner; import static org.eclipse.core.resources.IResourceDelta.ADDED; import static org.eclipse.core.resources.IResourceDelta.CONTENT; import static org.eclipse.core.resources.IResourceDelta.LOCAL_CHANGED; import static org.eclipse.core.resources.IResourceDelta.REMOVED; import static org.eclipse.core.resources.IResourceDelta.REPLACED; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import com.google.common.collect.Sets; /** * Wrapper for an {@link IResourceChangeEvent} in the workspace * * @author Michael Barry */ public class WorkspaceEvent { /** * Wraps the event provided * * @param event * The event to wrap * @return A wrapper for {@code event} */ public static WorkspaceEvent wrap(IResourceChangeEvent event) { return new WorkspaceEvent(event); } private final IResourceChangeEvent event; private WorkspaceEvent(IResourceChangeEvent event) { this.event = event; } /** * Returns a set of test files that have been deleted in this event * * @param extensions * Extensions that tell us if test types care about each delta * @return The set of test files that have been deleted in this event */ public Set<IFile> getDeletedTests(final Extensions extensions) { final Set<IFile> deltas = Sets.newHashSet(); try { event.getDelta().accept(new IResourceDeltaVisitor() { @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource instanceof IFile && extensions.supports((IFile) resource) && (delta.getKind() & REMOVED) > 0) { deltas.add((IFile) resource); } return true; } }); } catch (CoreException e) { } return deltas; } /** * Returns the files that are affected by this delta * * @param extensions * Extensions that tell us if test types care about each delta * * @return The files that are affected by this delta */ public Set<IFile> getDeltas(final Extensions extensions) { final Set<IFile> deltas = Sets.newHashSet(); try { event.getDelta().accept(new IResourceDeltaVisitor() { @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); // Only care about specific events if (resource instanceof IFile && extensions.careAboutDelta((IFile) resource) && ((delta.getKind() & (ADDED | REMOVED)) > 0 || (delta.getFlags() & (CONTENT | REPLACED | LOCAL_CHANGED)) > 0)) { deltas.add((IFile) resource); } return true; } }); } catch (CoreException e) { } return deltas; } /** * Returns the projects affected by this event * * @return The projects affected by this event */ public Set<IProject> getProjects() { IResourceDelta delta = event.getDelta(); final Set<IProject> projects = Sets.newHashSet(); try { delta.accept(new IResourceDeltaVisitor() { @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); boolean deeper = true; if (resource instanceof IProject) { projects.add((IProject) resource); deeper = false; } return deeper; } }); } catch (CoreException e) { } return projects; } /** * Returns true if this event has been triggered due to a build finishing * * @return True if this event has been triggered due to a build finishing */ public boolean isBuild() { return event.getBuildKind() != IncrementalProjectBuilder.CLEAN_BUILD && (event.getType() & IResourceChangeEvent.POST_CHANGE) > 0; } /** * Returns true if this event has been triggered due to a clean event * * @return True if this event has been triggered due to a clean event */ public boolean isClean() { return event.getBuildKind() == IncrementalProjectBuilder.CLEAN_BUILD && (event.getType() & IResourceChangeEvent.POST_BUILD) > 0; } }