package org.xtest.runner; import static org.eclipse.jdt.core.IJavaElementDelta.F_ADDED_TO_CLASSPATH; import static org.eclipse.jdt.core.IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED; import static org.eclipse.jdt.core.IJavaElementDelta.F_CLASSPATH_CHANGED; import static org.eclipse.jdt.core.IJavaElementDelta.F_REMOVED_FROM_CLASSPATH; import static org.eclipse.jdt.core.IJavaElementDelta.F_REORDER; import static org.eclipse.jdt.core.IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaElementDelta; import org.xtest.runner.util.ClasspathUtils; import com.google.common.collect.Sets; /** * Wrapper for an {@link ElementChangedEvent} in the workspace * * @author Michael Barry */ public class JavaModelEvent { /** * Wraps the event provided * * @param event * The event to wrap * @return A wrapper for {@code event} */ public static JavaModelEvent wrap(ElementChangedEvent event) { return new JavaModelEvent(event); } private final ElementChangedEvent event; private JavaModelEvent(ElementChangedEvent event) { this.event = event; } /** * Returns the jar files that have been changed on the classpath * * @return Set of jar files that have been changed on the classpath */ public Set<IFile> getClasspathChanges() { IJavaElementDelta delta = event.getDelta(); return process(delta); } private Set<IFile> process(IJavaElementDelta delta) { Set<IFile> paths = Sets.newHashSet(); int flags = delta.getFlags(); if ((flags & (F_CLASSPATH_CHANGED | F_RESOLVED_CLASSPATH_CHANGED)) > 0) { // TODO Is it necessary to pick up on changes to imported projects? } else if ((flags & (F_ADDED_TO_CLASSPATH | F_ARCHIVE_CONTENT_CHANGED | F_REMOVED_FROM_CLASSPATH | F_REORDER)) > 0) { IJavaElement element = delta.getElement(); IPath path = element.getPath(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IPath normalizePath = ClasspathUtils.normalizePath(root, path); IFile file; file = root.getFileForLocation(normalizePath); if (file == null) { file = root.getFile(normalizePath); } if (file != null) { paths.add(file); } } for (IJavaElementDelta delta2 : delta.getAffectedChildren()) { paths.addAll(process(delta2)); } return paths; } }