package gov.nasa.jpl.mbee.mdk.mms.actions; import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.Project; import com.nomagic.ui.ProgressStatusRunner; import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.NamedElement; import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype; import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters; import gov.nasa.jpl.mbee.mdk.generator.ViewPresentationGenerator; import gov.nasa.jpl.mbee.mdk.util.Utils; import gov.nasa.jpl.mbee.mdk.validation.ValidationSuite; import java.awt.event.ActionEvent; import java.util.*; public class GenerateViewPresentationAction extends MMSAction { private static final long serialVersionUID = 1L; public static final String DEFAULT_ID = "GenerateViewPresentation"; public static final String RECURSE_DEFAULT_ID = "GenerateViewPresentationR"; private List<ValidationSuite> vss = new ArrayList<>(); private Set<Element> elements; private Project project; private boolean recurse; public GenerateViewPresentationAction(Set<Element> elements, boolean recurse) { super(recurse ? RECURSE_DEFAULT_ID : DEFAULT_ID, "Generate View" + (recurse ? "s Recursively" : ""), null, null); this.elements = elements; this.project = Project.getProject(elements.iterator().next()); this.recurse = recurse; } @Override public void actionPerformed(ActionEvent e) { Utils.recommendUpdateFromRemote(Application.getInstance().getProject()); updateAction(); } public List<ValidationSuite> updateAction() { Stereotype viewStereotype = Utils.getViewStereotype(project), elementGroupStereotype = Utils.getElementGroupStereotype(project); Set<Element> processedElements = new HashSet<>(elements.size()); Queue<Element> queuedElements = new LinkedList<>(elements); Set<Element> views = new LinkedHashSet<>(elements.size()); while (!queuedElements.isEmpty()) { Element element = queuedElements.remove(); if (processedElements.contains(element)) { Application.getInstance().getGUILog().log("Detected duplicate element reference. Skipping generation for " + Converters.getElementToIdConverter().apply(element) + "."); continue; } if (StereotypesHelper.hasStereotypeOrDerived(element, viewStereotype)) { views.add(element); } else if (StereotypesHelper.hasStereotypeOrDerived(element, elementGroupStereotype)) { List members = StereotypesHelper.getStereotypePropertyValue(element, elementGroupStereotype, "member", true); for (Object o : members) { if (o instanceof Element) { queuedElements.add((Element) o); } } processedElements.add(element); } } ViewPresentationGenerator vg = new ViewPresentationGenerator(views, project, recurse, null, processedElements); ProgressStatusRunner.runWithProgressStatus(vg, "Generating View" + (recurse ? "s" : ""), true, 0); vss.addAll(vg.getValidations()); return vss; } public List<ValidationSuite> getValidations() { return vss; } }