package gov.nasa.jpl.mbee.mdk.systems_reasoner.actions; import com.nomagic.magicdraw.core.Project; import com.nomagic.magicdraw.openapi.uml.SessionManager; import com.nomagic.magicdraw.ui.dialogs.MDDialogParentProvider; import com.nomagic.magicdraw.ui.dialogs.SelectElementInfo; import com.nomagic.magicdraw.ui.dialogs.SelectElementTypes; import com.nomagic.magicdraw.ui.dialogs.selection.ElementSelectionDlg; import com.nomagic.magicdraw.ui.dialogs.selection.ElementSelectionDlgFactory; import com.nomagic.magicdraw.ui.dialogs.selection.SelectionMode; import com.nomagic.magicdraw.uml.BaseElement; import com.nomagic.uml2.ext.jmi.helpers.ModelHelper; import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper; import com.nomagic.uml2.ext.magicdraw.actions.mdbasicactions.CallBehaviorAction; import com.nomagic.uml2.ext.magicdraw.classes.mddependencies.Dependency; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*; import com.nomagic.uml2.ext.magicdraw.commonbehaviors.mdbasicbehaviors.Behavior; import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype; import gov.nasa.jpl.mbee.mdk.util.Utils; import gov.nasa.jpl.mbee.mdk.util.Utils2; import java.awt.*; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; public class AspectAction extends SRAction { /** * */ private static final long serialVersionUID = 1L; public static final String DEFAULT_ID = "Add Aspect"; private List<Classifier> classifiers; private Project project; private static Generalization createdGeneralization; public AspectAction(Classifier classifier) { this(Utils2.newList(classifier)); } public AspectAction(List<Classifier> classifiers) { super(DEFAULT_ID); this.classifiers = classifiers; this.project = Project.getProject(classifiers.iterator().next()); } @Override public void actionPerformed(ActionEvent e) { final List<java.lang.Class<?>> types = new ArrayList<java.lang.Class<?>>(); types.add(com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class.class); final Frame dialogParent = MDDialogParentProvider.getProvider().getDialogParent(); final ElementSelectionDlg dlg = ElementSelectionDlgFactory.create(dialogParent); SessionManager.getInstance().createSession("Creating aspect."); final SelectElementTypes set = new SelectElementTypes(types, types, null, null); final SelectElementInfo sei = new SelectElementInfo(true, false, project.getPrimaryModel().getOwner(), true); boolean aspectDefinitionFound = false; for (Classifier aspected : classifiers) { for (Dependency d : aspected.getClientDependency()) { boolean aspectFound = false; Classifier aspect = null; Stereotype s = StereotypesHelper.getAppliedStereotypeByString(d, "aspect"); if (s != null) { aspectDefinitionFound = true; for (Element el : d.getTarget()) { if (el instanceof Classifier) { aspect = (Classifier) el; for (Element ownedElement : aspected.getOwnedElement()) { if (ownedElement instanceof Property) { Type type = ((TypedElement) ownedElement).getType(); if (type instanceof Classifier) { if ((hasInheritanceFromTo((Classifier) type, aspect))) { aspectFound = true; } } } else if (ownedElement instanceof CallBehaviorAction) { Behavior b = ((CallBehaviorAction) ownedElement).getBehavior(); if (b.getGeneral().contains(el)) { aspectFound = true; } } } } } if (!aspectFound) { AspectRemedyAction ara = new AspectRemedyAction(aspected, aspect); ara.run(); } } } } if (!aspectDefinitionFound) { ElementSelectionDlgFactory.initMultiple(dlg, set, sei, new ArrayList<Object>()); dlg.setSelectionMode(SelectionMode.MULTIPLE_MODE); if (dlg != null) { dlg.setVisible(true); if (dlg.isOkClicked() && dlg.getSelectedElements() != null && !dlg.getSelectedElements().isEmpty()) { final List<Classifier> aspectedClasses = new ArrayList<>(); for (final BaseElement be : dlg.getSelectedElements()) { if (be instanceof Classifier) { final Classifier aspect = (Classifier) be; for (final Classifier aspected : classifiers) { Stereotype aspectSt = Utils.getStereotype(project, "aspect"); Utils.createDependencyWithStereotype(aspected, aspect, aspectSt); aspectedClasses.add(aspected); AspectRemedyAction ara = new AspectRemedyAction(aspected, aspect); ara.run(); } } } ValidateAction.validate(aspectedClasses); } } } SessionManager.getInstance().closeSession(); } private boolean hasInheritanceFromTo(Classifier classifier, Classifier general) { if (classifier != null) { return ModelHelper.getGeneralClassifiersRecursivelly(classifier).contains(general); } else { return false; } } }