You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/08/01 01:04:03 UTC

svn commit: r681537 - in /servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi: EndpointExporter.java EndpointTracker.java EndpointWrapper.java EndpointWrapperImpl.java

Author: gnodet
Date: Thu Jul 31 16:04:02 2008
New Revision: 681537

URL: http://svn.apache.org/viewvc?rev=681537&view=rev
Log:
Use a fake ServiceUnit when deploying an endpoint in OSGi so that we are able to reuse the classloader used by spring when creating the spring context

Modified:
    servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointExporter.java
    servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointTracker.java
    servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapper.java
    servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapperImpl.java

Modified: servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointExporter.java
URL: http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointExporter.java?rev=681537&r1=681536&r2=681537&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointExporter.java (original)
+++ servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointExporter.java Thu Jul 31 16:04:02 2008
@@ -51,7 +51,7 @@
             eps = this.applicationContext.getBeansOfType(Endpoint.class).values();
         }
         for (Endpoint ep : eps) {
-            EndpointWrapper wrapper = new EndpointWrapperImpl(ep);
+            EndpointWrapper wrapper = new EndpointWrapperImpl(ep, applicationContext.getClassLoader());
             Dictionary props = new Properties();
             bundleContext.registerService(EndpointWrapper.class.getName(), wrapper, props);
         }

Modified: servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointTracker.java
URL: http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointTracker.java?rev=681537&r1=681536&r2=681537&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointTracker.java (original)
+++ servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointTracker.java Thu Jul 31 16:04:02 2008
@@ -19,8 +19,12 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.jbi.management.DeploymentException;
+
 import org.apache.servicemix.common.Endpoint;
 import org.apache.servicemix.common.DefaultComponent;
+import org.apache.servicemix.common.ServiceUnit;
+import org.apache.servicemix.id.IdGenerator;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -29,7 +33,7 @@
     private static final Log LOGGER = LogFactory.getLog(EndpointTracker.class);
 
     protected DefaultComponent component;
-    protected Map<EndpointWrapper, Endpoint> endpoints = new ConcurrentHashMap<EndpointWrapper, Endpoint>();
+    protected Map<EndpointWrapper, OsgiServiceUnit> endpoints = new ConcurrentHashMap<EndpointWrapper, OsgiServiceUnit>();
 
     public DefaultComponent getComponent() {
         return component;
@@ -48,8 +52,19 @@
             if (LOGGER.isDebugEnabled()) {
     	        LOGGER.debug("[" + component.getComponentName() + "] Endpoint recognized");
             }
-            endpoints.put(wrapper, endpoint);
-            component.addEndpoint(endpoint);
+            OsgiServiceUnit su = new OsgiServiceUnit(component, endpoint, wrapper.getClassLoader());
+            endpoints.put(wrapper, su);
+            component.getRegistry().registerServiceUnit(su);
+            if (component.isStarted()) {
+                ClassLoader cl = Thread.currentThread().getContextClassLoader();
+                try {
+                    Thread.currentThread().setContextClassLoader(su.getConfigurationClassLoader());
+                    su.start();
+                } finally {
+                    Thread.currentThread().setContextClassLoader(cl);
+                }
+            }
+
         }
     }
 
@@ -58,12 +73,47 @@
             LOGGER.debug("[" + component.getComponentName() + "] Endpoint unregistered with properties: " + properties);
         }
         // Do not access the wrapper using wrapper.getEndpoint(), has the osgi context may already be shut down
-        Endpoint endpoint = endpoints.remove(wrapper);
-        if (endpoint != null && component.isKnownEndpoint(endpoint)) {
+        OsgiServiceUnit su = endpoints.remove(wrapper);
+        if (su != null && component.isKnownEndpoint(su.getEndpoint())) {
             if (LOGGER.isDebugEnabled()) {
     	        LOGGER.debug("[" + component.getComponentName() + "] Endpoint recognized");
             }
-            component.removeEndpoint(endpoint);
+            try {
+                ClassLoader cl = Thread.currentThread().getContextClassLoader();
+                try {
+                    Thread.currentThread().setContextClassLoader(su.getConfigurationClassLoader());
+                    su.stop();
+                } finally {
+                    Thread.currentThread().setContextClassLoader(cl);
+                }
+            } finally {
+                component.getRegistry().unregisterServiceUnit(su);
+            }
+        }
+    }
+
+    public static class OsgiServiceUnit extends ServiceUnit {
+        private static final IdGenerator idGenerator = new IdGenerator();
+        private final Endpoint endpoint;
+        private final ClassLoader classLoader;
+        public OsgiServiceUnit(DefaultComponent component, Endpoint endpoint, ClassLoader classLoader) throws DeploymentException {
+            this.component = component;
+            this.name = idGenerator.generateSanitizedId();
+            this.endpoint = endpoint;
+            this.classLoader = classLoader;
+            this.endpoint.setServiceUnit(this);
+            this.endpoint.validate();
+            addEndpoint(this.endpoint);
+        }
+        public Endpoint getEndpoint() {
+            return endpoint;
+        }
+        public ClassLoader  getConfigurationClassLoader() {
+            if (classLoader != null) {
+                return classLoader;
+            } else {
+                return super.getConfigurationClassLoader();
+            }
         }
     }
 

Modified: servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapper.java
URL: http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapper.java?rev=681537&r1=681536&r2=681537&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapper.java (original)
+++ servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapper.java Thu Jul 31 16:04:02 2008
@@ -29,4 +29,6 @@
 
     Endpoint getEndpoint();
 
+    ClassLoader getClassLoader();
+
 }

Modified: servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapperImpl.java
URL: http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapperImpl.java?rev=681537&r1=681536&r2=681537&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapperImpl.java (original)
+++ servicemix/components/shared-libraries/trunk/servicemix-common/src/main/java/org/apache/servicemix/common/osgi/EndpointWrapperImpl.java Thu Jul 31 16:04:02 2008
@@ -21,12 +21,19 @@
 public class EndpointWrapperImpl implements EndpointWrapper {
 
     private final Endpoint endpoint;
+    private final ClassLoader classLoader;
 
-    public EndpointWrapperImpl(Endpoint endpoint) {
+    public EndpointWrapperImpl(Endpoint endpoint, ClassLoader classLoader) {
         this.endpoint = endpoint;
+        this.classLoader = classLoader;
     }
 
     public Endpoint getEndpoint() {
         return endpoint;
     }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
 }