diff --git a/plugins/howto b/plugins/howto index a4e2751530381b4be9a0fe31ce1985b7889f9640..7779572b3c3f284b717facde9af36224f71b6b4b 100644 --- a/plugins/howto +++ b/plugins/howto @@ -1,4 +1,21 @@ -1) Create your plugin and put it in this directory (preferably) +# To test plugins: +If you want to test plugins: +$cd testPluginCodeGeneration +$make + +Then, edit the configuration file of TTool (default: TTool/bin/config.xml) and add: +<PLUGIN_JAVA_CODE_GENERATOR data="../plugins/CustomizerAvatarCodeGeneration.jar" /> + +Then, start TTool, and generated Java code from an avatar model. + + +# To create a new plugin +1) Create your plugin and put it in this directory (preferably) under a jar file + 2) Add the plugin reference in config.xml -3) Load the configuration information in ConfigurationTTool +For example: +<PLUGIN_JAVA_CODE_GENERATOR data="../plugins/CustomizerAvatarCodeGeneration.jar" /> + +3) Load the configuration information in ConfigurationTTool.java + 4) Use the plugin facility as shown in src/avatartranslator/toexecutable/MainFile.java diff --git a/src/avatartranslator/toexecutable/MainFile.java b/src/avatartranslator/toexecutable/MainFile.java index 230e497006c9933b821fcaa1034b3c20cc9dc915..cdd7ee4b9d5535bea72ca18a934da5dfe0b3c768 100755 --- a/src/avatartranslator/toexecutable/MainFile.java +++ b/src/avatartranslator/toexecutable/MainFile.java @@ -109,8 +109,10 @@ public class MainFile { String mainDec = MAIN_DEC; - try { + + try { + //mainDec = MainGUI.pluginManager.execute(plugin, CustomizerAvatarJavaCodeGeneration, getMainDeclaration) File file = new File(plugin); TraceManager.addDev("Loading plugin=" + plugin); URL[] urls = new URL[] { file.toURI().toURL() }; diff --git a/src/myutil/Plugin.java b/src/myutil/Plugin.java new file mode 100755 index 0000000000000000000000000000000000000000..749b306bb9928f4da658aa5dc9232ca292bfcdf8 --- /dev/null +++ b/src/myutil/Plugin.java @@ -0,0 +1,94 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + + ludovic.apvrille AT enst.fr + + This software is a computer program whose purpose is to allow the + edition of TURTLE analysis, design and deployment diagrams, to + allow the generation of RT-LOTOS or Java code from this diagram, + and at last to allow the analysis of formal validation traces + obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + from INRIA Rhone-Alpes. + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited + liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + /** + * Class Plugin + * Creation: 24/05/2017 + * Version 1.0 24/05/2017 + * @author Ludovic APVRILLE + * @see + */ + +package myutil; + +import java.util.*; +import java.io.*; +import java.lang.reflect.*; +import java.net.*; + +public class Plugin { + private String name; + private File file; + private HashMap<String, Class> listOfClasses; + + public Plugin(String _name) { + name = _name; + listOfClasses = new HashMap<String, Class>(); + } + + public String getName() { + return name; + } + + public Method getMethod(String _className, String _methodName) { + Class c = listOfClasses.get(_className); + + try { + if (c == null) { + file = new File(name); + TraceManager.addDev("Loading plugin=" + name); + URL[] urls = new URL[] { file.toURI().toURL() }; + ClassLoader loader = new URLClassLoader(urls); + TraceManager.addDev("Loader created"); + c = loader.loadClass(_className); + if (c == null) { + return null; + } + listOfClasses.put(_className, c); + } + + Method method = c.getMethod(_methodName); + return method; + } catch (Exception e) { + TraceManager.addDev("Exception when using plugin " + name + " with className=" + _className + " and method " + _methodName); + return null; + } + + } + + +} diff --git a/src/myutil/PluginManager.java b/src/myutil/PluginManager.java new file mode 100755 index 0000000000000000000000000000000000000000..af95e50750594c7b1bb0a3e76c6fbfed3c191770 --- /dev/null +++ b/src/myutil/PluginManager.java @@ -0,0 +1,101 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + + ludovic.apvrille AT enst.fr + + This software is a computer program whose purpose is to allow the + edition of TURTLE analysis, design and deployment diagrams, to + allow the generation of RT-LOTOS or Java code from this diagram, + and at last to allow the analysis of formal validation traces + obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + from INRIA Rhone-Alpes. + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited + liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + /** + * Class PluginManager + * Creation: 24/05/2017 + * Version 1.0 24/05/2017 + * @author Ludovic APVRILLE + * @see + */ + +package myutil; + +import java.util.*; +import java.lang.reflect.*; + +public class PluginManager { + public ArrayList<Plugin> plugins; + + public PluginManager() { + plugins = new ArrayList<Plugin>(); + } + + public void addPlugin(Plugin _plugin) { + plugins.add(_plugin); + } + + public Plugin getPlugin(String _name) { + for(Plugin plugin: plugins) { + if (plugin.getName().compareTo(_name) == 0) { + return plugin; + } + } + return null; + } + + public Plugin createPlugin(String _name) { + Plugin plugin = new Plugin(_name); + addPlugin(plugin); + return plugin; + } + + public String executeString(String _pluginName, String _className, String _methodName) { + Plugin plugin = getPlugin(_pluginName); + if (plugin == null) { + plugin = createPlugin(_pluginName); + if (plugin == null) { + return null; + } + } + + // We have a valid plugin. We now need to get the Method + Method m = plugin.getMethod(_className, _methodName); + if (m == null) { + return null; + } + + try { + return (String)(m.invoke(null)); + } catch (Exception e) { + TraceManager.addDev("Exception occured when executing method " + _methodName); + return null; + } + } + + +} diff --git a/src/ui/MainGUI.java b/src/ui/MainGUI.java index 66803074ab65188ea1890b3f8225eb6a6dcf85d3..d183de2c72ad92aabd0eb96c824f25121a5db8a7 100644 --- a/src/ui/MainGUI.java +++ b/src/ui/MainGUI.java @@ -105,13 +105,7 @@ import ddtranslatorSoclib.AvatarddSpecification; import ddtranslatorSoclib.toSoclib.TasksAndMainGenerator; import launcher.RemoteExecutionThread; import launcher.RshClient; -import myutil.BrowserControl; -import myutil.FileException; -import myutil.FileUtils; -import myutil.GraphicLib; -import myutil.PeriodicBehavior; -import myutil.PeriodicBehaviorThread; -import myutil.TraceManager; +import myutil.*; import proverifspec.ProVerifOutputAnalyzer; import translator.MasterGateManager; import ui.ad.TActivityDiagramPanel; @@ -362,11 +356,15 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Pe // Invariants Invariant currentInvariant; - // Thread fof autosave + // Thread for autosave PeriodicBehaviorThread pbt; private TMLArchiPanel tmlap; // USed to retrieve the currently opened architecture panel + // Plugin management + public static PluginManager pluginManager; + + public MainGUI(boolean _turtleOn, boolean _systemcOn, boolean _lotosOn, boolean _proactiveOn, boolean _tpnOn, boolean _osOn, boolean _uppaalOn, boolean _ncOn, boolean _avatarOn, boolean _proverifOn, boolean _avatarOnly, boolean _experimental) { turtleOn = _turtleOn; @@ -386,6 +384,8 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Pe pbt = new PeriodicBehaviorThread(this, 120000); // save every two minutes + pluginManager = new PluginManager(); + } public void setKey(String _sk) {