package gov.nasa.jpl.mbee.mdk.model; import com.nomagic.magicdraw.actions.MDAction; import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.ApplicationEnvironment; import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper; import com.nomagic.uml2.ext.magicdraw.actions.mdbasicactions.CallBehaviorAction; 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.docgen.DocGenProfile; import gov.nasa.jpl.mbee.mdk.docgen.DocGenUtils; import gov.nasa.jpl.mbee.mdk.docgen.docbook.DBText; import gov.nasa.jpl.mbee.mdk.docgen.docbook.DocumentElement; import gov.nasa.jpl.mbee.mdk.docgen.validation.Suite; import gov.nasa.jpl.mbee.mdk.docgen.view.ViewElement; import gov.nasa.jpl.mbee.mdk.util.ScriptRunner; import gov.nasa.jpl.mbee.mdk.model.actions.RunUserEditableTableAction; import gov.nasa.jpl.mbee.mdk.model.actions.RunUserScriptAction; import gov.nasa.jpl.mbee.mdk.model.actions.RunUserValidationScriptAction; import gov.nasa.jpl.mbee.mdk.validation.ValidationSuite; import javax.script.ScriptException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class UserScript extends Query { public String getStereotypeName() { Element e = this.dgElement; if (!StereotypesHelper.hasStereotypeOrDerived(this.dgElement, DocGenProfile.userScriptStereotype)) { if (this.dgElement instanceof CallBehaviorAction && ((CallBehaviorAction) this.dgElement).getBehavior() != null && StereotypesHelper.hasStereotypeOrDerived( ((CallBehaviorAction) this.dgElement).getBehavior(), DocGenProfile.userScriptStereotype)) { e = ((CallBehaviorAction) this.dgElement).getBehavior(); } } Stereotype s = StereotypesHelper.checkForDerivedStereotype(e, DocGenProfile.userScriptStereotype); return s.getName(); } public Map<?, ?> getScriptOutput(Map<String, Object> inputs) { try { Map<String, Object> inputs2 = new HashMap<String, Object>(); if (this.targets != null) { inputs2.put("DocGenTargets", this.targets); } else { inputs2.put("DocGenTargets", new ArrayList<Element>()); } if (inputs != null) { inputs2.putAll(inputs); } if (!inputs2.containsKey("md_install_dir")) { inputs2.put("md_install_dir", ApplicationEnvironment.getInstallRoot()); } if (!inputs2.containsKey("docgen_output_dir")) { inputs2.put("docgen_output_dir", ApplicationEnvironment.getInstallRoot()); } if (!inputs2.containsKey("ForViewEditor")) { inputs2.put("ForViewEditor", false); } Element e = this.dgElement; if (!StereotypesHelper.hasStereotypeOrDerived(e, DocGenProfile.userScriptStereotype)) { if (e instanceof CallBehaviorAction && ((CallBehaviorAction) e).getBehavior() != null && StereotypesHelper.hasStereotypeOrDerived(((CallBehaviorAction) e).getBehavior(), DocGenProfile.userScriptStereotype)) { e = ((CallBehaviorAction) e).getBehavior(); } } Object o = ScriptRunner.runScriptFromStereotype(e, StereotypesHelper.checkForDerivedStereotype(e, DocGenProfile.userScriptStereotype), inputs2); if (o != null && o instanceof Map) { return (Map<?, ?>) o; } } catch (ScriptException e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); Application.getInstance().getGUILog().log(sw.toString()); } return null; } @Override public List<DocumentElement> visit(boolean forViewEditor, String outputDir) { List<DocumentElement> res = new ArrayList<DocumentElement>(); if (getIgnore()) { return res; } Map<String, Object> inputs = new HashMap<String, Object>(); inputs.put("FixMode", "FixNone"); inputs.put("ForViewEditor", forViewEditor); inputs.put("DocGenTitles", getTitles()); if (outputDir != null) { inputs.put("docgen_output_dir", outputDir); } inputs.put("md_install_dir", ApplicationEnvironment.getInstallRoot()); Map<?, ?> o = getScriptOutput(inputs); if (o != null && o.containsKey("DocGenOutput")) { Object l = o.get("DocGenOutput"); if (l instanceof List) { for (Object oo : (List<?>) l) { if (oo instanceof DocumentElement) { res.add((DocumentElement) oo); } } } } if (o != null && o.containsKey("docgenOutput")) { Object result = o.get("docgenOutput"); if (result instanceof List) { for (Object r : (List<?>) result) { if (r instanceof NamedElement) { res.add(new DBText(((NamedElement) r).getName())); } else if (r instanceof ViewElement) { res.add(DocGenUtils.ecoreTranslateView((ViewElement) r, forViewEditor)); } } } } if (o != null && o.containsKey("DocGenValidationOutput")) { Object l = o.get("DocGenValidationOutput"); if (l instanceof List) { for (Object oo : (List<?>) l) { if (oo instanceof ValidationSuite) { res.addAll(((ValidationSuite) oo).getDocBook()); } } } } if (o != null && o.containsKey("docgenValidationOutput")) { Object l = o.get("docgenValidationOutput"); if (l instanceof List) { DocGenValidationDBSwitch s = new DocGenValidationDBSwitch(); for (Object object : (List<?>) l) { if (object instanceof Suite) { res.addAll(((ValidationSuite) s.doSwitch((Suite) object)).getDocBook()); } } } } return res; } @Override public List<MDAction> getActions() { List<MDAction> res = new ArrayList<MDAction>(); Element action = getDgElement(); boolean added = false; if (StereotypesHelper.hasStereotypeOrDerived(action, DocGenProfile.editableTableStereotype) || ((action instanceof CallBehaviorAction) && ((CallBehaviorAction) action).getBehavior() != null && StereotypesHelper .hasStereotypeOrDerived(((CallBehaviorAction) action).getBehavior(), DocGenProfile.editableTableStereotype))) { res.add(new RunUserEditableTableAction(this)); added = true; } if (StereotypesHelper.hasStereotypeOrDerived(action, DocGenProfile.validationScriptStereotype) || ((action instanceof CallBehaviorAction) && ((CallBehaviorAction) action).getBehavior() != null && StereotypesHelper .hasStereotypeOrDerived(((CallBehaviorAction) action).getBehavior(), DocGenProfile.validationScriptStereotype))) { res.add(new RunUserValidationScriptAction(this)); added = true; } if (!added) { res.add(new RunUserScriptAction(this)); } return res; } }