Alon Bar-Lev has uploaded a new change for review. Change subject: aaa: extension-manager: support javascript extensions ......................................................................
aaa: extension-manager: support javascript extensions Change-Id: I6d9dee411f5b0bf5019a35810f5f43b53ca3f3ce Signed-off-by: Alon Bar-Lev <[email protected]> --- M backend/manager/modules/extensions-api-root/extensions-api/src/main/java/org/ovirt/engine/api/extensions/Base.java M backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java 2 files changed, 114 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/81/27281/1 diff --git a/backend/manager/modules/extensions-api-root/extensions-api/src/main/java/org/ovirt/engine/api/extensions/Base.java b/backend/manager/modules/extensions-api-root/extensions-api/src/main/java/org/ovirt/engine/api/extensions/Base.java index f5b2763..5836c3a 100644 --- a/backend/manager/modules/extensions-api-root/extensions-api/src/main/java/org/ovirt/engine/api/extensions/Base.java +++ b/backend/manager/modules/extensions-api-root/extensions-api/src/main/java/org/ovirt/engine/api/extensions/Base.java @@ -46,6 +46,7 @@ * Bindings method to use. * <ul> * <li>{@link ConfigBindingsMethods#JBOSSMODULE}</li> + * <li>{@link ConfigBindingsMethods#SCRIPTENGINE}</li> * </ul> * Mandatory if binding method is Jboss module. * @see ConfigBindingsMethods @@ -64,6 +65,18 @@ * Mandatory if binding method is Jboss module. */ public static final String BINDINGS_JBOSSMODULE_CLASS = "ovirt.engine.extension.binding.jbossmodule.class"; + /** + * Scripte Engine binding method engine. + * <br> + * Mandatory if binding method is script engine. + */ + public static final String BINDINGS_SCRIPTENGINE_ENGINE = "ovirt.engine.extension.binding.scriptengine.engine"; + /** + * Scripte Engine binding method script file. + * <br> + * Mandatory if binding method is script engine. + */ + public static final String BINDINGS_SCRIPTENGINE_SCRIPT = "ovirt.engine.extension.binding.scriptengine.script"; /** * Sensitive keys of configuration. * These will should not appear in debugging. @@ -123,6 +136,68 @@ * }</pre> */ public static final String JBOSSMODULE = "jbossmodule"; + /** + * Script engine binding method. + * Use script file loading method and Java script engine bindings. + * <br/> + * Example: + * <br/> + * <pre> + * {@code + * Base = Packages.org.ovirt.engine.api.extensions.Base; + * function MyExtension() {} + * MyExtension.prototype = { + * _doInit: function(input, output) { + * input.get(Base.InvokeKeys.CONTEXT).mput( + * Base.ContextKeys.EXTENSION_NAME, + * "Extension JavaScript example" + * ).mput( + * Base.ContextKeys.LICENSE, + * "ASL 2.0" + * ).mput( + * Base.ContextKeys.HOME_URL, + * "http://www.ovirt.org" + * ).mput( + * Base.ContextKeys.VERSION, + * "0.0.0" + * ).mput( + * Base.ContextKeys.BUILD_INTERFACE_VERSION, + * java.lang.Integer.valueOf(Base.INTERFACE_VERSION_CURRENT) + * ); + * }, + * invoke: function(input, output) { + * try { + * var command = input.get(Base.InvokeKeys.COMMAND); + * if (command == Base.InvokeCommands.INITIALIZE) { + * this._doInit(input, output); + * } else { + * output.put( + * Base.InvokeKeys.RESULT, + * java.lang.Integer.valueOf(Base.InvokeResult.UNSUPPORTED) + * ); + * } + * output.put( + * Base.InvokeKeys.RESULT, + * java.lang.Integer.valueOf(Base.InvokeResult.SUCCESS) + * ); + * } catch(e) { + * output.mput( + * Base.InvokeKeys.RESULT, + * java.lang.Integer.valueOf(Base.InvokeResult.FAILED) + * ).mput( + * Base.InvokeKeys.MESSAGE, + * e.message + * ); + * } + * }, + * }; + * function create() { + * return new MyExtension(); + * } + * } + * </pre> + */ + public static final String SCRIPTENGINE = "scriptengine"; } /** diff --git a/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java b/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java index 1558134..b98b9f6 100644 --- a/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java +++ b/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java @@ -5,6 +5,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -13,6 +16,10 @@ import java.util.Map; import java.util.Properties; import java.util.ServiceLoader; +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.SimpleScriptContext; import org.jboss.modules.Module; import org.jboss.modules.ModuleIdentifier; @@ -91,6 +98,37 @@ } } + private static class ScriptEngineBindingsLoader implements BindingsLoader { + public Extension load(Properties props) throws Exception { + try( + InputStream in = new FileInputStream( + props.getProperty(Base.ConfigKeys.BINDINGS_SCRIPTENGINE_SCRIPT)); + Reader reader = new InputStreamReader(in); + ) { + ScriptEngine engine = new ScriptEngineManager().getEngineByName( + props.getProperty(Base.ConfigKeys.BINDINGS_SCRIPTENGINE_ENGINE)); + if (engine == null) { + throw new ConfigurationException(String.format("Script engine '%1$s' cannot be loaded.", + props.getProperty(Base.ConfigKeys.BINDINGS_SCRIPTENGINE_ENGINE))); + } + + engine.setContext(new SimpleScriptContext()); + engine.put(engine.FILENAME, props.getProperty(Base.ConfigKeys.BINDINGS_SCRIPTENGINE_SCRIPT)); + engine.eval(reader); + if (!Invocable.class.isAssignableFrom(engine.getClass())) { + throw new ConfigurationException(String.format("Script engine '%1$s' does not support Invocable interface.", + props.getProperty(Base.ConfigKeys.BINDINGS_SCRIPTENGINE_ENGINE))); + } + Invocable invocable = (Invocable)engine; + Object extensionImpl = invocable.invokeFunction("create"); + if (extensionImpl == null) { + throw new ConfigurationException("Cannot initialize extension instance, create returned null."); + } + return invocable.getInterface(extensionImpl, Extension.class); + } + } + } + private static class ExtensionEntry { private static int extensionNameIndex = 0; @@ -155,6 +193,7 @@ private ExtensionsManager() { bindingsLoaders.put(Base.ConfigBindingsMethods.JBOSSMODULE, new JBossBindingsLoader()); + bindingsLoaders.put(Base.ConfigBindingsMethods.SCRIPTENGINE, new ScriptEngineBindingsLoader()); for (File directory : EngineLocalConfig.getInstance().getExtensionsDirectories()) { if (!directory.exists()) { -- To view, visit http://gerrit.ovirt.org/27281 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6d9dee411f5b0bf5019a35810f5f43b53ca3f3ce Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alon Bar-Lev <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
