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

Reply via email to