Copyright (c) 2000, 2015 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
James Blackburn (Broadcom Corp.) - ongoing development
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* James Blackburn (Broadcom Corp.) - ongoing development
*******************************************************************************/
package org.eclipse.core.internal.resources;
import java.util.Map;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IPath;
See Also: - IMarkerDelta
/**
* @see IMarkerDelta
*/
public class MarkerDelta implements IMarkerDelta, IMarkerSetElement {
protected int kind;
protected IResource resource;
protected MarkerInfo info;
Creates a new marker delta.
/**
* Creates a new marker delta.
*/
public MarkerDelta(int kind, IResource resource, MarkerInfo info) {
this.kind = kind;
this.resource = resource;
this.info = info;
}
@Override
public Object getAttribute(String attributeName) {
return info.getAttribute(attributeName);
}
@Override
public int getAttribute(String attributeName, int defaultValue) {
Object value = info.getAttribute(attributeName);
if (value instanceof Integer)
return ((Integer) value).intValue();
return defaultValue;
}
@Override
public String getAttribute(String attributeName, String defaultValue) {
Object value = info.getAttribute(attributeName);
if (value instanceof String)
return (String) value;
return defaultValue;
}
@Override
public boolean getAttribute(String attributeName, boolean defaultValue) {
Object value = info.getAttribute(attributeName);
if (value instanceof Boolean)
return ((Boolean) value).booleanValue();
return defaultValue;
}
@Override
public Map<String, Object> getAttributes() {
return info.getAttributes();
}
@Override
public Object[] getAttributes(String[] attributeNames) {
return info.getAttributes(attributeNames);
}
@Override
public long getId() {
return info.getId();
}
@Override
public int getKind() {
return kind;
}
@Override
public IMarker getMarker() {
return new Marker(resource, getId());
}
@Override
public IResource getResource() {
return resource;
}
@Override
public String getType() {
return info.getType();
}
@Override
public boolean isSubtypeOf(String superType) {
return ((Workspace) getResource().getWorkspace()).getMarkerManager().isSubtype(getType(), superType);
}
Merge two Maps of (IPath->MarkerSet) representing changes. Use the old map
to store the result so we don't have to build a new map to return.
/**
* Merge two Maps of (IPath->MarkerSet) representing changes. Use the old map
* to store the result so we don't have to build a new map to return.
*/
public static Map<IPath, MarkerSet> merge(Map<IPath, MarkerSet> oldChanges, Map<IPath, MarkerSet> newChanges) {
if (oldChanges == null)
//don't worry about copying since the new changes are no longer used
return newChanges;
if (newChanges == null)
return oldChanges;
for (Map.Entry<IPath, MarkerSet> newEntry : newChanges.entrySet()) {
IPath key = newEntry.getKey();
MarkerSet oldSet = oldChanges.get(key);
MarkerSet newSet = newEntry.getValue();
if (oldSet == null)
oldChanges.put(key, newSet);
else
merge(oldSet, newSet.elements());
}
return oldChanges;
}
Merge two sets of marker changes. Both sets must be on the same resource. Use the original set
of changes to store the result so we don't have to build a completely different set to return.
add + add = N/A
add + remove = nothing (no delta)
add + change = add
remove + add = N/A
remove + remove = N/A
remove + change = N/A
change + add = N/A
change + change = change (note: info held onto by the marker delta should be that of the oldest change, and not replaced when composed)
change + remove = remove (note: info held onto by the marker delta should be that of the oldest change, and not replaced when changed to a remove)
/**
* Merge two sets of marker changes. Both sets must be on the same resource. Use the original set
* of changes to store the result so we don't have to build a completely different set to return.
*
* <pre>
* add + add = N/A
* add + remove = nothing (no delta)
* add + change = add
* remove + add = N/A
* remove + remove = N/A
* remove + change = N/A
* change + add = N/A
* change + change = change (note: info held onto by the marker delta should be that of the oldest change, and not replaced when composed)
* change + remove = remove (note: info held onto by the marker delta should be that of the oldest change, and not replaced when changed to a remove)
* </pre>
*/
protected static MarkerSet merge(MarkerSet oldChanges, IMarkerSetElement[] newChanges) {
if (oldChanges == null) {
MarkerSet result = new MarkerSet(newChanges.length);
for (IMarkerSetElement newChange : newChanges)
result.add(newChange);
return result;
}
if (newChanges == null)
return oldChanges;
for (IMarkerSetElement newChange : newChanges) {
MarkerDelta newDelta = (MarkerDelta) newChange;
MarkerDelta oldDelta = (MarkerDelta) oldChanges.get(newDelta.getId());
if (oldDelta == null) {
oldChanges.add(newDelta);
continue;
}
switch (oldDelta.getKind()) {
case IResourceDelta.ADDED :
switch (newDelta.getKind()) {
case IResourceDelta.ADDED :
// add + add = N/A
break;
case IResourceDelta.REMOVED :
// add + remove = nothing
// Remove the original ADD delta.
oldChanges.remove(oldDelta);
break;
case IResourceDelta.CHANGED :
// add + change = add
break;
}
break;
case IResourceDelta.REMOVED :
switch (newDelta.getKind()) {
case IResourceDelta.ADDED :
// remove + add = N/A
break;
case IResourceDelta.REMOVED :
// remove + remove = N/A
break;
case IResourceDelta.CHANGED :
// remove + change = N/A
break;
}
break;
case IResourceDelta.CHANGED :
switch (newDelta.getKind()) {
case IResourceDelta.ADDED :
// change + add = N/A
break;
case IResourceDelta.REMOVED :
// change + remove = remove
// Change the delta kind.
oldDelta.setKind(IResourceDelta.REMOVED);
break;
case IResourceDelta.CHANGED :
// change + change = change
break;
}
break;
}
}
return oldChanges;
}
private void setKind(int kind) {
this.kind = kind;
}
}