Alon Bar-Lev has uploaded a new change for review.

Change subject: extmgr: use extension class loader when calling extension
......................................................................

extmgr: use extension class loader when calling extension

currently the context class loader is set to the jboss module that is at
top level. this does not allow the extension to use extra dependencies
it may have in its module.xml.

to solve this we set the context class loader of the extension module
before calling the extension, in this case the extension finds all its
dependencies.

Change-Id: I38031776f1d740da8f8f07f0d4a52b640534bcff
Signed-off-by: Alon Bar-Lev <[email protected]>
---
M 
backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionProxy.java
M 
backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionsManager.java
2 files changed, 59 insertions(+), 52 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/27875/1

diff --git 
a/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionProxy.java
 
b/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionProxy.java
index 87ed5d5..bb596c6 100644
--- 
a/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionProxy.java
+++ 
b/backend/manager/modules/extensions-manager/src/main/java/org/ovirt/engine/core/extensions/mgr/ExtensionProxy.java
@@ -8,8 +8,9 @@
 
 public class ExtensionProxy implements Extension {
 
-    private Extension proxied;
-    private ExtMap context;
+    private final ClassLoader classLoader;
+    private final Extension proxied;
+    private final ExtMap context;
 
     private void dumpMap(String prefix, ExtMap map) {
         Logger logger = 
context.<Logger>get(ExtensionsManager.TRACE_LOG_CONTEXT_KEY);
@@ -20,9 +21,14 @@
         }
     }
 
-    public ExtensionProxy(Extension proxied, ExtMap context) {
+    public ExtensionProxy(ClassLoader classLoader, Extension proxied) {
+        this.classLoader = classLoader;
         this.proxied = proxied;
-        this.context = context;
+        this.context = new ExtMap();
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
     }
 
     public Extension getExtension() {
@@ -38,7 +44,9 @@
         input.putIfAbsent(Base.InvokeKeys.CONTEXT, context);
 
         dumpMap("Invoke Input", input);
+        ClassLoader savedClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             proxied.invoke(input, output);
         } catch (Throwable e) {
             output.mput(
@@ -55,6 +63,8 @@
                 ExtensionsManager.CAUSE_OUTPUT_KEY,
                 e
             );
+        } finally {
+            Thread.currentThread().setContextClassLoader(savedClassLoader);
         }
         dumpMap("Invoke Output", output);
     }
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 3fa1aee..9191a5ab 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
@@ -37,7 +37,7 @@
     public static final ExtKey CAUSE_OUTPUT_KEY = new 
ExtKey("EXTENSION_MANAGER_CAUSE_OUTPUT_KEY", Throwable.class, 
"894e1c86-518b-40a2-a92b-29ea1eb0403d");
 
     private static interface BindingsLoader {
-        Extension load(Properties props) throws Exception;
+        ExtensionProxy load(Properties props) throws Exception;
     }
 
     private static class JBossBindingsLoader implements BindingsLoader {
@@ -63,14 +63,11 @@
             }
         }
 
-        private Class<?> lookupService(Class<?> serviceInterface, String 
serviceClassName, String moduleName) {
-            // Iterate over the service classes, and find the one that should
-            // be instantiated and initialized.
-            Module module = loadModule(moduleName);
-            Class<?> serviceClass = null;
+        private <T extends Class> T lookupService(Module module, T 
serviceInterface, String serviceClassName) {
+            T serviceClass = null;
             for (Object service : module.loadService(serviceInterface)) {
                 if (service.getClass().getName().equals(serviceClassName)) {
-                    serviceClass = service.getClass();
+                    serviceClass = (T)service.getClass();
                     break;
                 }
             }
@@ -82,12 +79,19 @@
             return serviceClass;
         }
 
-        public Extension load(Properties props) throws Exception {
-            return (Extension) lookupService(
-                Extension.class,
-                props.getProperty(Base.ConfigKeys.BINDINGS_JBOSSMODULE_CLASS),
+        public ExtensionProxy load(Properties props) throws Exception {
+            Module module = loadModule(
                 props.getProperty(Base.ConfigKeys.BINDINGS_JBOSSMODULE_MODULE)
-            ).newInstance();
+            );
+
+            return new ExtensionProxy(
+                module.getClassLoader(),
+                lookupService(
+                    module,
+                    Extension.class,
+                    
props.getProperty(Base.ConfigKeys.BINDINGS_JBOSSMODULE_CLASS)
+                ).newInstance()
+            );
         }
     }
 
@@ -238,38 +242,34 @@
         //Activate the extension
         if (entry.enabled && entry.extension == null) {
             try {
-                entry.extension = new ExtensionProxy(
-                    loadExtension(props),
-                    (
-                        new ExtMap().mput(
-                            Base.ContextKeys.GLOBAL_CONTEXT,
-                            globalContext
-                        ).mput(
-                            TRACE_LOG_CONTEXT_KEY,
-                            traceLog
-                        ).mput(
-                            Base.ContextKeys.INTERFACE_VERSION_MIN,
-                            0
-                        ).mput(
-                            Base.ContextKeys.INTERFACE_VERSION_MAX,
-                            Base.INTERFACE_VERSION_CURRENT
-                        ).mput(
-                            Base.ContextKeys.LOCALE,
-                            Locale.getDefault().toString()
-                        ).mput(
-                            Base.ContextKeys.CONFIGURATION,
-                            props
-                        ).mput(
-                            Base.ContextKeys.CONFIGURATION_SENSITIVE_KEYS,
-                            
splitString(props.getProperty(Base.ConfigKeys.SENSITIVE_KEYS, ""))
-                        ).mput(
-                            Base.ContextKeys.INSTANCE_NAME,
-                            entry.name
-                        ).mput(
-                            Base.ContextKeys.PROVIDES,
-                            
splitString(props.getProperty(Base.ConfigKeys.PROVIDES, ""))
-                        )
-                    )
+                entry.extension = loadExtension(props);
+                entry.extension.getContext().mput(
+                    Base.ContextKeys.GLOBAL_CONTEXT,
+                    globalContext
+                ).mput(
+                    TRACE_LOG_CONTEXT_KEY,
+                    traceLog
+                ).mput(
+                    Base.ContextKeys.INTERFACE_VERSION_MIN,
+                    0
+                ).mput(
+                    Base.ContextKeys.INTERFACE_VERSION_MAX,
+                    Base.INTERFACE_VERSION_CURRENT
+                ).mput(
+                    Base.ContextKeys.LOCALE,
+                    Locale.getDefault().toString()
+                ).mput(
+                    Base.ContextKeys.CONFIGURATION,
+                    props
+                ).mput(
+                    Base.ContextKeys.CONFIGURATION_SENSITIVE_KEYS,
+                    
splitString(props.getProperty(Base.ConfigKeys.SENSITIVE_KEYS, ""))
+                ).mput(
+                    Base.ContextKeys.INSTANCE_NAME,
+                    entry.name
+                ).mput(
+                    Base.ContextKeys.PROVIDES,
+                    splitString(props.getProperty(Base.ConfigKeys.PROVIDES, 
""))
                 );
 
                 ExtMap output = entry.extension.invoke(
@@ -326,15 +326,12 @@
         notifyObservers();
     }
 
-    private Extension loadExtension(Properties props) throws Exception {
-        Extension extension;
-
+    private ExtensionProxy loadExtension(Properties props) throws Exception {
         BindingsLoader loader = 
bindingsLoaders.get(props.getProperty(Base.ConfigKeys.BINDINGS_METHOD));
         if (loader == null) {
             throw new ConfigurationException(String.format("Invalid binding 
method '%1$s'.",
                     props.getProperty(Base.ConfigKeys.BINDINGS_METHOD)));
         }
-
         return loader.load(props);
     }
 


-- 
To view, visit http://gerrit.ovirt.org/27875
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I38031776f1d740da8f8f07f0d4a52b640534bcff
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