blob: 17597762c8b68dcb4466e7ed8ca17ed130053ce9 [file] [log] [blame]
/**
*
*/
package org.eclipse.epf.diagramming.base.commands;
import java.util.Collections;
import java.util.HashMap;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
import org.eclipse.emf.edit.command.CopyCommand.Helper;
import org.eclipse.emf.transaction.Transaction;
import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagramming.base.util.UmaUmlUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.ObjectNode;
import org.eclipse.uml2.uml.StructuredActivityNode;
/**
* @author Shashidhar Kannoori
*
*/
public class DiagramCopyCommand extends AbstractCommand {
private Diagram diagram;
private InternalTransactionalEditingDomain domain;
private Resource resource;
private Diagram copyDiagram;
private Activity origAct;
private Activity copyAct;
private Helper copiedHelper;
/**
*
*/
public DiagramCopyCommand(InternalTransactionalEditingDomain domain, Diagram diagram,
Activity origAct, Activity copyAct, Resource resource, Helper copiedHelper) {
this.domain = domain;
this.diagram = diagram;
this.copyAct = copyAct;
this.origAct = origAct;
this.resource = resource;
this.copiedHelper = copiedHelper;
}
/**
* @param label
*/
public DiagramCopyCommand(String label) {
super(label);
// TODO Auto-generated constructor stub
}
/**
* @param label
* @param description
*/
public DiagramCopyCommand(String label, String description) {
super(label, description);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.Command#execute()
*/
public void execute() {
try{
Transaction t = domain.startTransaction(false, new HashMap());
copyDiagram = copyDiagram(diagram, copyAct);
UmaUmlUtil.updateEAnnotationForUml((NamedElement)copyDiagram.getElement(),
copyAct.getGuid());
resource.getContents().add(copyDiagram.getElement());
resource.getContents().add(copyDiagram);
// TODO: should not save until, save action performed.
resource.save(Collections.EMPTY_MAP);
t.commit();
}catch(Exception e){
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.Command#redo()
*/
public void redo() {
execute();
}
public void undo() {
if(copyDiagram != null){
try{
Transaction t = domain.startTransaction(false, new HashMap());
resource.getContents().remove(copyDiagram);
resource.getContents().remove(copyDiagram.getElement());
resource.save(Collections.EMPTY_MAP);
t.commit();
}catch(Exception e){
e.printStackTrace();
}
}
super.undo();
}
public boolean canExecute() {
// TODO Auto-generated method stub
return diagram != null;
}
/**
* Returns a copy of Diagram. Also copies the references and also copies the umlObject.
* @param sourceDiagram
* @param act
* @return
*/
public Diagram copyDiagram(Diagram sourceDiagram, Activity act){
Diagram copy = copy(sourceDiagram);
EObject umlCopy = copy.getElement();
if(act != null){
//BridgeHelper.addEAnnotation((NamedElement)umlCopy, act);
UmaUmlUtil.updateEAnnotationForUml((NamedElement)umlCopy, act.getGuid());
}
if(copy != null){
return copy;
}
return null;
}
private Diagram copy(Diagram sourceObject){
Copier copier = new Copier() {
/**
*
*/
private static final long serialVersionUID = 1L;
public EObject copy(EObject eObject) {
// TODO Auto-generated method stub
EObject copy = super.copy(eObject);
if(copy instanceof StructuredActivityNode || copy instanceof ObjectNode){
MethodElement orig = getMethodElementFromAnnotation((EModelElement)eObject);
EObject copyelement = (EObject)copiedHelper.get(orig);
BridgeHelper.addEAnnotation((EModelElement)copy, (MethodElement)copyelement);
}
return copy;
}
};
EObject umlCopy = copier.copy(sourceObject.getElement());
Diagram result = (Diagram)copier.copy(sourceObject);
result.setElement(umlCopy);
copier.copyReferences();
return result;
}
public MethodElement getMethodElementFromAnnotation(EModelElement node) {
org.eclipse.epf.uma.Process p = TngUtil.getOwningProcess(origAct);
Resource resource = p.eResource();
if (resource != null && resource.getResourceSet() != null) {
EAnnotation eAnnotation = node.getEAnnotation(BridgeHelper.UMA_ELEMENT);
if (eAnnotation != null) {
String uri = (String) eAnnotation.getDetails().get(BridgeHelper.UMA_URI);
if (uri != null) {
EObject o = resource.getResourceSet().getEObject(
URI.createURI(uri), false);
if (o instanceof MethodElement) {
return (MethodElement) o;
} else {
// TODO: log error
System.err.println("Not a method element: " + o); //$NON-NLS-1$
}
}
}
}
return null;
}
}