package gov.nasa.jpl.mbee.mdk; import com.nomagic.actions.ActionsCategory; import com.nomagic.actions.ActionsManager; import com.nomagic.actions.NMAction; import com.nomagic.magicdraw.actions.ActionsConfiguratorsManager; import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.options.EnvironmentOptions; import com.nomagic.magicdraw.evaluation.EvaluationConfigurator; import com.nomagic.magicdraw.plugins.Plugin; import com.nomagic.magicdraw.plugins.PluginDescriptor; import com.nomagic.magicdraw.plugins.PluginUtils; import com.nomagic.magicdraw.properties.Property; import com.nomagic.magicdraw.uml.DiagramTypeConstants; import gov.nasa.jpl.mbee.mdk.mms.sync.queue.OutputQueueStatusConfigurator; import gov.nasa.jpl.mbee.mdk.mms.sync.queue.OutputSyncRunner; import gov.nasa.jpl.mbee.mdk.mms.sync.status.SyncStatusConfigurator; import gov.nasa.jpl.mbee.mdk.ocl.OclQueryConfigurator; import gov.nasa.jpl.mbee.mdk.options.MDKOptionsGroup; import gov.nasa.jpl.mbee.mdk.systems_reasoner.SRConfigurator; import gov.nasa.jpl.mbee.mdk.util.MDUtils; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; public class MDKPlugin extends Plugin { public static final String MAIN_TOOLBAR_CATEGORY_NAME = "MDK"; private static String VERSION; public static ClassLoader extensionsClassloader; public static ActionsManager MAIN_TOOLBAR_ACTIONS_MANAGER; public MDKPlugin() { super(); } public static String getVersion() { if (VERSION == null) { VERSION = PluginUtils.getPlugins().stream().map(Plugin::getDescriptor).filter(descriptor -> descriptor.getName().equals("Model Development Kit")).map(PluginDescriptor::getVersion).findAny().orElse(null); } return VERSION; } public static void updateMainToolbarCategory() { if (MAIN_TOOLBAR_ACTIONS_MANAGER == null) { return; } ActionsCategory category = MAIN_TOOLBAR_ACTIONS_MANAGER.getCategory(MAIN_TOOLBAR_CATEGORY_NAME); if (category == null) { return; } List<NMAction> actions = new ArrayList<>(category.getActions()); for (NMAction action : actions) { category.removeAction(action); } for (NMAction action : actions) { category.addAction(action); } } @Override public boolean close() { return true; } @Override public void init() { ActionsConfiguratorsManager acm = ActionsConfiguratorsManager.getInstance(); System.setProperty("jsse.enableSNIExtension", "false"); if (MDUtils.isDeveloperMode()) { System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.SimpleLog"); System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.wire", "INFO"); } // This somehow allows things to be loaded to evaluate opaque expressions or something. EvaluationConfigurator.getInstance().registerBinaryImplementers(this.getClass().getClassLoader()); MDKConfigurator mdkConfigurator = new MDKConfigurator(); acm.addContainmentBrowserContextConfigurator(mdkConfigurator); acm.addSearchBrowserContextConfigurator(mdkConfigurator); acm.addBaseDiagramContextConfigurator(DiagramTypeConstants.UML_ANY_DIAGRAM, mdkConfigurator); OclQueryConfigurator oclQueryConfigurator = new OclQueryConfigurator(); acm.addMainMenuConfigurator(oclQueryConfigurator); acm.addSearchBrowserContextConfigurator(oclQueryConfigurator); acm.addContainmentBrowserContextConfigurator(oclQueryConfigurator); acm.addBaseDiagramContextConfigurator(DiagramTypeConstants.UML_ANY_DIAGRAM, oclQueryConfigurator); acm.addMainMenuConfigurator(new MMSConfigurator()); EvaluationConfigurator.getInstance().registerBinaryImplementers(MDKPlugin.class.getClassLoader()); SRConfigurator srConfigurator = new SRConfigurator(); acm.addSearchBrowserContextConfigurator(srConfigurator); acm.addContainmentBrowserContextConfigurator(srConfigurator); acm.addBaseDiagramContextConfigurator(DiagramTypeConstants.UML_ANY_DIAGRAM, srConfigurator); acm.addMainToolbarConfigurator(new OutputQueueStatusConfigurator()); acm.addMainToolbarConfigurator(new SyncStatusConfigurator()); MMSSyncPlugin.getInstance().init(); (new Thread(new OutputSyncRunner())).start(); loadExtensionJars(); configureEnvironmentOptions(); } @Override public boolean isSupported() { return true; } private void loadExtensionJars() { File extensionDir = new File(getDescriptor().getPluginDirectory(), "extensions"); if (!extensionDir.exists()) { extensionsClassloader = MDKPlugin.class.getClassLoader(); return; } List<URL> extensions = new ArrayList<URL>(); try { extensions.add(extensionDir.toURI().toURL()); } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } File[] files = extensionDir.listFiles(); if (files == null) { return; } for (File file : files) { try { extensions.add(file.toURI().toURL()); } catch (MalformedURLException e) { e.printStackTrace(); } } extensionsClassloader = new URLClassLoader(extensions.toArray(new URL[]{}), MDKPlugin.class.getClassLoader()); } private void configureEnvironmentOptions() { EnvironmentOptions mdkOptions = Application.getInstance().getEnvironmentOptions(); mdkOptions.addGroup(new MDKOptionsGroup()); EnvironmentOptions.EnvironmentChangeListener mdkEnvOptionsListener = list -> { Property advancedOptions = MDKOptionsGroup.getMDKOptions().getProperty(MDKOptionsGroup.SHOW_ADVANCED_OPTIONS_ID); for (Property p : list) { if (p.equals(advancedOptions) && MDKOptionsGroup.getMDKOptions().isMDKAdvancedOptions()) { Application.getInstance().getGUILog().log("[INFO] You must restart MagicDraw to show advanced MDK options."); } } }; mdkOptions.addEnvironmentChangeListener(mdkEnvOptionsListener); } }