blob: 3a8c445eeb29ca563f85348721e7735dca800e5d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
*******************************************************************************/
package org.eclipse.core.tests.resources;
import java.util.Hashtable;
import java.util.Vector;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* A support class for the marker tests.
*/
public class MarkersChangeListener implements IResourceChangeListener {
protected Hashtable<IPath, Vector<IMarkerDelta>> changes;
public MarkersChangeListener() {
reset();
}
/**
* Returns whether the changes for the given resource (or null for the workspace)
* are exactly the added, removed and changed markers given. The arrays may be null.
*/
public boolean checkChanges(IResource resource, IMarker[] added, IMarker[] removed, IMarker[] changed) {
IPath path = resource == null ? Path.ROOT : resource.getFullPath();
Vector<IMarkerDelta> v = changes.get(path);
if (v == null) {
v = new Vector<>();
}
int numChanges = (added == null ? 0 : added.length) + (removed == null ? 0 : removed.length) + (changed == null ? 0 : changed.length);
if (numChanges != v.size()) {
return false;
}
for (int i = 0; i < v.size(); ++i) {
IMarkerDelta delta = v.elementAt(i);
switch (delta.getKind()) {
case IResourceDelta.ADDED :
if (!contains(added, delta.getMarker())) {
return false;
}
break;
case IResourceDelta.REMOVED :
if (!contains(removed, delta.getMarker())) {
return false;
}
break;
case IResourceDelta.CHANGED :
if (!contains(changed, delta.getMarker())) {
return false;
}
break;
default :
throw new Error();
}
}
return true;
}
/**
* Returns whether the given marker is contained in the given list of markers.
*/
protected boolean contains(IMarker[] markers, IMarker marker) {
if (markers != null) {
for (IMarker marker2 : markers) {
if (marker2.equals(marker)) {
return true;
}
}
}
return false;
}
/**
* Returns the number of resources (or the workspace) which have had marker changes since last reset.
*/
public int numAffectedResources() {
return changes.size();
}
public void reset() {
changes = new Hashtable<>(11);
}
/**
* Notification from the workspace. Extract the marker changes.
*/
@Override
public void resourceChanged(IResourceChangeEvent event) {
resourceChanged(event.getDelta());
}
/**
* Recurse over the delta, extracting marker changes.
*/
protected void resourceChanged(IResourceDelta delta) {
if (delta == null) {
return;
}
if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) {
IPath path = delta.getFullPath();
Vector<IMarkerDelta> v = changes.get(path);
if (v == null) {
v = new Vector<>();
changes.put(path, v);
}
IMarkerDelta[] markerDeltas = delta.getMarkerDeltas();
for (IMarkerDelta markerDelta : markerDeltas) {
v.addElement(markerDelta);
}
}
IResourceDelta[] children = delta.getAffectedChildren();
for (IResourceDelta element : children) {
resourceChanged(element);
}
}
}