package gov.nasa.jpl.mbee.mdk.model;
import com.nomagic.magicdraw.core.Project;
import com.nomagic.uml2.ext.jmi.helpers.ModelHelper;
import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper;
import com.nomagic.uml2.ext.magicdraw.classes.mddependencies.Dependency;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class;
import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype;
import com.nomagic.uml2.impl.ElementsFactory;
import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters;
import gov.nasa.jpl.mbee.mdk.util.Utils;
import java.util.List;
import java.util.Stack;
public class HierarchyMigrationVisitor extends AbstractModelVisitor {
private Element owner;
private Project project;
private Stack<Class> parentView;
private ElementsFactory ef;
private Stereotype ourExpose,
docS,
viewS,
conformS;
private boolean preserveId = false;
private boolean cannotChangeId = false;
public HierarchyMigrationVisitor(Element owner, boolean id) {
this.owner = owner;
this.project = Project.getProject(owner);
this.ourExpose = Utils.getExposeStereotype(project);
this.docS = Utils.getDocumentStereotype(project);
this.viewS = Utils.getViewClassStereotype(project);
this.conformS = Utils.getConformsStereotype(project);
this.parentView = new Stack<Class>();
this.ef = project.getElementsFactory();
project.getCounter().setCanResetIDForObject(true);
this.preserveId = id;
}
public boolean changeIdFailed() {
return cannotChangeId;
}
@Override
public void visit(Document doc) {
if (doc.getDgElement() != null) {
Element d = doc.getDgElement();
Class newDoc = ef.createClassInstance();
if (preserveId) {
setId(d, newDoc);
}
newDoc.setName(((NamedElement) d).getName());
ModelHelper.setComment(newDoc, ModelHelper.getComment(d));
newDoc.setOwner(owner);
StereotypesHelper.addStereotype(newDoc, docS);
parentView.push(newDoc);
visitChildren(doc);
setExposeAndConforms(null, d, newDoc);
}
}
@Override
public void visit(Section sec) {
if (sec.isView()) {// && !sec.isNoSection()) {
Element v = sec.getDgElement();
Class newView = ef.createClassInstance();
if (preserveId) {
setId(v, newView);
}
newView.setName(((NamedElement) v).getName());
ModelHelper.setComment(newView, ModelHelper.getComment(v));
newView.setOwner(parentView.peek());
Association a = ef.createAssociationInstance();
a.setOwner(owner);
a.getMemberEnd().get(0).setOwner(parentView.peek());
a.getMemberEnd().get(1).setOwner(a);
a.getMemberEnd().get(0).setName(newView.getName().toLowerCase());
a.getMemberEnd().get(0).setType(newView);
a.getMemberEnd().get(1).setType(parentView.peek());
a.getMemberEnd().get(0).setAggregation(AggregationKindEnum.COMPOSITE);
setExposeAndConforms(sec, v, newView);
StereotypesHelper.addStereotype(newView, viewS);
parentView.push(newView);
visitChildren(sec);
parentView.pop();
}
}
private void setId(Element old, Element neww) {
if (old.isEditable()) {
if (!(old instanceof Diagram)) {
String oldId = Converters.getElementToIdConverter().apply(old);
String newId = Converters.getElementToIdConverter().apply(neww);
neww.setID(oldId);
old.setID(newId);
}
}
else {
cannotChangeId = true;
}
}
private void setExposeAndConforms(Section sec, Element old, Class neww) {
if (sec == null) {
return;
}
List<Element> expose = sec.getExposes();
Element viewpoint = sec.getViewpoint();
if (viewpoint != null) {
Generalization g = ef.createGeneralizationInstance();
g.setOwner(neww);
g.setGeneral((Classifier) viewpoint);
g.setSpecific(neww);
StereotypesHelper.addStereotype(g, conformS);
}
if (old instanceof Diagram) {
Dependency dep = ef.createDependencyInstance();
dep.setOwner(owner);
dep.getTarget().add(old);
dep.getSource().add(neww);
StereotypesHelper.addStereotype(dep, ourExpose);
}
else if (expose != null) {
for (Element e : expose) {
Dependency dep = ef.createDependencyInstance();
dep.setOwner(owner);
dep.getTarget().add(e);
dep.getSource().add(neww);
StereotypesHelper.addStereotype(dep, ourExpose);
}
}
}
}