package gov.nasa.jpl.mbee.mdk.actions;
import com.nomagic.magicdraw.actions.MDAction;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.core.GUILog;
import com.nomagic.magicdraw.core.Project;
import com.nomagic.magicdraw.openapi.uml.SessionManager;
import com.nomagic.uml2.ext.jmi.helpers.ModelHelper;
import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package;
import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype;
import com.nomagic.uml2.impl.ElementsFactory;
import gov.nasa.jpl.mbee.mdk.util.Utils;
import java.awt.event.ActionEvent;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/**
* given a viewpoint composition hierarchy, makes the views, and have them
* conform to the respective viewpoints
*
* @author dlam
*/
public class InstanceViewpointAction extends MDAction {
private static final long serialVersionUID = 1L;
private Element viewpoint;
private Project project;
private Stereotype sysmlView;
private ElementsFactory ef;
private Stereotype sysmlViewpoint;
public static final String DEFAULT_ID = "InstanceViewpoint";
public InstanceViewpointAction(Element e) {
super(DEFAULT_ID, "Instance Viewpoint", null, null);
this.viewpoint = e;
this.project = Project.getProject(e);
}
@Override
public void actionPerformed(ActionEvent e) {
GUILog gl = Application.getInstance().getGUILog();
sysmlView = Utils.getViewClassStereotype(project);
sysmlViewpoint = Utils.getViewpointStereotype(project);
ef = Project.getProject(viewpoint).getElementsFactory();
if (sysmlView == null) {
gl.log("The view stereotype cannot be found");
return;
}
if (sysmlViewpoint == null) {
gl.log("The sysml viewpoint stereotype cannot be found");
return;
}
List<java.lang.Class<?>> types = new ArrayList<>();
types.add(Package.class);
Element pack = (Element) Utils.getUserSelection(types, "Choose where the instanced views should go");
if (pack == null || !(pack instanceof Package)) {
gl.log("you didn't select a package");
return;
}
try {
SessionManager.getInstance().createSession("instance viewpoint");
instance(pack, (Class) viewpoint, ((Class) viewpoint).getName());
SessionManager.getInstance().closeSession();
} catch (Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
gl.log(sw.toString()); // stack trace as a string
ex.printStackTrace();
}
}
private Class instance(Element owner, Class vp, String name) {
Class view = ef.createClassInstance();
view.setOwner(owner);
view.setName(name);
StereotypesHelper.addStereotype(view, sysmlView);
Generalization conforms = ef.createGeneralizationInstance();
StereotypesHelper.addStereotype(conforms, Utils.getSysML14ConformsStereotype(project));
ModelHelper.setClientElement(conforms, view);
ModelHelper.setSupplierElement(conforms, vp);
conforms.setOwner(view);
for (Property p : vp.getOwnedAttribute()) {
Type type = p.getType();
if (type instanceof Class && StereotypesHelper.hasStereotypeOrDerived(type, sysmlViewpoint)) {
Class child = null;
if (p.getName().isEmpty()) {
child = instance(view, (Class) type, type.getName());
}
else {
child = instance(view, (Class) type, p.getName());
}
Association asso = ef.createAssociationInstance();
asso.getMemberEnd().get(0).setOwner(view);
asso.getMemberEnd().get(0).setType(child);
asso.getMemberEnd().get(0).setAggregation(p.getAggregation());
asso.getMemberEnd().get(1).setType(view);
asso.getMemberEnd().get(1).setOwner(asso);
asso.setOwner(owner);
}
}
return view;
}
}