package org.archstudio.xadl.bna.utils; import java.io.IOException; import java.io.Serializable; import java.util.Collection; import java.util.List; import javax.xml.xpath.XPathException; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.IXArchADTPackageMetadata; import org.archstudio.xarchadt.IXArchADTSubstitutionHint; import org.archstudio.xarchadt.IXArchADTTypeMetadata; import org.archstudio.xarchadt.ObjRef; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.operations.AbstractOperation; import org.eclipse.core.commands.operations.IOperationHistory; import org.eclipse.core.commands.operations.IUndoContext; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ui.PlatformUI; import org.xml.sax.SAXException; import com.google.common.collect.Lists; public class XArchADTOperations implements IXArchADT { public static <V> void remove(String label, final IXArchADT xarch, final ObjRef objRef, final String name, final Serializable value) { xarch.remove(objRef, name, value); IUndoContext undoContext = PlatformUI.getWorkbench().getOperationSupport().getUndoContext(); IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); AbstractOperation operation = new AbstractOperation(label) { @Override public IStatus execute(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { return Status.OK_STATUS; } @Override public IStatus undo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { xarch.add(objRef, name, value); return Status.OK_STATUS; } @Override public IStatus redo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { xarch.remove(objRef, name, value); return Status.OK_STATUS; } }; operation.addContext(undoContext); operationHistory.add(operation); } public static <V> void add(String label, final IXArchADT xarch, final ObjRef objRef, final String name, final Serializable value) { xarch.add(objRef, name, value); IUndoContext undoContext = PlatformUI.getWorkbench().getOperationSupport().getUndoContext(); IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); AbstractOperation operation = new AbstractOperation(label) { @Override public IStatus execute(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { return Status.OK_STATUS; } @Override public IStatus undo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { xarch.remove(objRef, name, value); return Status.OK_STATUS; } @Override public IStatus redo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { xarch.add(objRef, name, value); return Status.OK_STATUS; } }; operation.addContext(undoContext); operationHistory.add(operation); } public static <V> void set(String label, final IXArchADT xarch, final ObjRef objRef, final String name, @Nullable final Serializable newValue) { final Serializable oldValue = xarch.get(objRef, name); xarch.set(objRef, name, newValue); IUndoContext undoContext = PlatformUI.getWorkbench().getOperationSupport().getUndoContext(); IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); AbstractOperation operation = new AbstractOperation(label) { @Override public IStatus execute(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { return Status.OK_STATUS; } @Override public IStatus undo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { if (oldValue == null) { xarch.clear(objRef, name); } else { xarch.set(objRef, name, oldValue); } return Status.OK_STATUS; } @Override public IStatus redo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { if (newValue == null) { xarch.clear(objRef, name); } else { xarch.set(objRef, name, newValue); } return Status.OK_STATUS; } }; operation.addContext(undoContext); operationHistory.add(operation); } IXArchADT xarch; List<Runnable> undo = Lists.newArrayList(); List<Runnable> redo = Lists.newArrayList(); public XArchADTOperations(IXArchADT xarch) { super(); this.xarch = xarch; } @Override public boolean isValidObjRef(ObjRef ref) { return xarch.isValidObjRef(ref); } @Override public ObjRef createDocument(URI uri) { return xarch.createDocument(uri); } @Override public ObjRef createDocument(URI uri, String nsURI) { return xarch.createDocument(uri, nsURI); } @Override @Nullable public Serializable get(ObjRef baseObjRef, String typeOfThing) { return xarch.get(baseObjRef, typeOfThing); } @Override public ObjRef load(URI uri) throws SAXException, IOException { return xarch.load(uri); } @Override public ObjRef load(URI uri, byte[] content) throws SAXException, IOException { return xarch.load(uri, content); } @Override public void save(URI uri) throws IOException { xarch.save(uri); } @Override public void close(URI uri) { xarch.close(uri); } @Override public void add(final ObjRef baseObjRef, final String typeOfThing, final Serializable thingToAddRef) { xarch.add(baseObjRef, typeOfThing, thingToAddRef); undo.add(new Runnable() { @Override public void run() { xarch.remove(baseObjRef, typeOfThing, thingToAddRef); } }); redo.add(new Runnable() { @Override public void run() { xarch.add(baseObjRef, typeOfThing, thingToAddRef); } }); } @Override public void add(final ObjRef baseObjRef, final String typeOfThing, final Collection<? extends Serializable> thingsToAddRefs) { final List<? extends Serializable> fThingsToAddRefs = Lists.newArrayList(thingsToAddRefs); xarch.add(baseObjRef, typeOfThing, fThingsToAddRefs); undo.add(new Runnable() { @Override public void run() { xarch.remove(baseObjRef, typeOfThing, fThingsToAddRefs); } }); redo.add(new Runnable() { @Override public void run() { xarch.add(baseObjRef, typeOfThing, fThingsToAddRefs); } }); } @Override public void clear(final ObjRef baseObjRef, final String typeOfThing) { final Serializable oldValue = xarch.get(baseObjRef, typeOfThing); xarch.clear(baseObjRef, typeOfThing); undo.add(new Runnable() { @Override public void run() { xarch.set(baseObjRef, typeOfThing, oldValue); } }); redo.add(new Runnable() { @Override public void run() { xarch.clear(baseObjRef, typeOfThing); } }); } @Override public void remove(final ObjRef baseObjRef, final String typeOfThing, final Serializable valueToRemove) { xarch.remove(baseObjRef, typeOfThing, valueToRemove); undo.add(new Runnable() { @Override public void run() { xarch.add(baseObjRef, typeOfThing, valueToRemove); } }); redo.add(new Runnable() { @Override public void run() { xarch.remove(baseObjRef, typeOfThing, valueToRemove); } }); } @Override @Nullable public Serializable resolve(ObjRef objRef) { return xarch.resolve(objRef); } @Override public List<Serializable> getAll(ObjRef baseObjRef, String typeOfThing) { return xarch.getAll(baseObjRef, typeOfThing); } @Override public void remove(final ObjRef baseObjRef, final String typeOfThing, Collection<? extends Serializable> thingsToRemove) { final List<? extends Serializable> fThingsToRemove = Lists.newArrayList(thingsToRemove); xarch.remove(baseObjRef, typeOfThing, fThingsToRemove); undo.add(new Runnable() { @Override public void run() { xarch.add(baseObjRef, typeOfThing, fThingsToRemove); } }); redo.add(new Runnable() { @Override public void run() { xarch.remove(baseObjRef, typeOfThing, fThingsToRemove); } }); } @Override public boolean hasAncestor(ObjRef childRef, ObjRef ancestorRef) { return xarch.hasAncestor(childRef, ancestorRef); } @Override public boolean isAttached(ObjRef childRef) { return xarch.isAttached(childRef); } @Override public List<ObjRef> getAllAncestors(ObjRef targetObjRef) { return xarch.getAllAncestors(targetObjRef); } @Override public void set(final ObjRef baseObjRef, final String typeOfThing, @Nullable final Serializable value) { final Serializable oldValue = xarch.get(baseObjRef, typeOfThing); xarch.set(baseObjRef, typeOfThing, value); undo.add(new Runnable() { @Override public void run() { xarch.set(baseObjRef, typeOfThing, oldValue); } }); redo.add(new Runnable() { @Override public void run() { xarch.set(baseObjRef, typeOfThing, value); } }); } @Override public List<ObjRef> getLineage(ObjRef targetObjRef) { return xarch.getLineage(targetObjRef); } @Override @Nullable public ObjRef getParent(ObjRef targetObjRef) { return xarch.getParent(targetObjRef); } @Override @Nullable public ObjRef getByID(ObjRef documentRootRef, String id) { return xarch.getByID(documentRootRef, id); } @Override public ObjRef create(String nsURI, String typeOfThing) { return xarch.create(nsURI, typeOfThing); } @Override public void renameXArch(String oldURI, String newURI) { xarch.renameXArch(oldURI, newURI); } @Override @Nullable public ObjRef getByID(String id) { return xarch.getByID(id); } @Override @Nullable public ObjRef resolveHref(ObjRef documentRootRef, String href) { return xarch.resolveHref(documentRootRef, href); } @Override @Nullable public ObjRef getDocumentRootRef(ObjRef ref) { return xarch.getDocumentRootRef(ref); } @Override @Nullable public String getTagName(ObjRef ref) { return xarch.getTagName(ref); } @Override @Nullable public String getContainingFeatureName(ObjRef ref) { return xarch.getContainingFeatureName(ref); } @Override public String getTagsOnlyPathString(ObjRef ref) { return xarch.getTagsOnlyPathString(ref); } @Override public IXArchADTPackageMetadata getPackageMetadata(String nsURI) { return xarch.getPackageMetadata(nsURI); } @Override public Collection<IXArchADTPackageMetadata> getAvailablePackageMetadata() { return xarch.getAvailablePackageMetadata(); } @Override public IXArchADTTypeMetadata getTypeMetadata(String nsURI, String typeName) { return xarch.getTypeMetadata(nsURI, typeName); } @Override public IXArchADTTypeMetadata getTypeMetadata(ObjRef objRef) { return xarch.getTypeMetadata(objRef); } @Override public boolean isInstanceOf(@Nullable Serializable object, String sourceNsURI, String sourceTypeName) { return xarch.isInstanceOf(object, sourceNsURI, sourceTypeName); } @Override public boolean isAssignable(String sourceNsURI, String sourceTypeName, String targetNsURI, String targetTypeName) { return xarch.isAssignable(sourceNsURI, sourceTypeName, targetNsURI, targetTypeName); } @Override public List<IXArchADTSubstitutionHint> getAllSubstitutionHints() { return xarch.getAllSubstitutionHints(); } @Override public List<IXArchADTSubstitutionHint> getSubstitutionHintsForSource(String sourceNsURI, String sourceTypeName) { return xarch.getSubstitutionHintsForSource(sourceNsURI, sourceTypeName); } @Override public List<IXArchADTSubstitutionHint> getSubstitutionHintsForTarget(String targetNsURI, String targetTypeName) { return xarch.getSubstitutionHintsForTarget(targetNsURI, targetTypeName); } @Override @Nullable public ObjRef getDocumentRootRef(URI uri) { return xarch.getDocumentRootRef(uri); } @Override public Collection<URI> getOpenURIs() { return xarch.getOpenURIs(); } @Override @Nullable public URI getURI(ObjRef ref) { return xarch.getURI(ref); } @Override public byte[] serialize(URI uri) { return xarch.serialize(uri); } @Override public List<ObjRef> resolveObjRefs(ObjRef contextObjRef, String xPath) throws XPathException { return xarch.resolveObjRefs(contextObjRef, xPath); } @Override public List<Serializable> resolveSerializables(ObjRef contextObjRef, String xPath) throws XPathException { return xarch.resolveSerializables(contextObjRef, xPath); } @Override public String getXPath(ObjRef toObjRef) { return xarch.getXPath(toObjRef); } public void done(String label) { IUndoContext undoContext = PlatformUI.getWorkbench().getOperationSupport().getUndoContext(); IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); AbstractOperation operation = new AbstractOperation(label) { @Override public IStatus execute(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { return Status.OK_STATUS; } @Override public IStatus undo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { for (Runnable r : undo) { r.run(); } return Status.OK_STATUS; } @Override public IStatus redo(@Nullable IProgressMonitor monitor, @Nullable IAdaptable info) throws ExecutionException { for (Runnable r : redo) { r.run(); } return Status.OK_STATUS; } }; operation.addContext(undoContext); operationHistory.add(operation); } }