You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ve...@apache.org on 2008/06/26 09:56:53 UTC

svn commit: r671819 - /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java

Author: veithen
Date: Thu Jun 26 00:56:52 2008
New Revision: 671819

URL: http://svn.apache.org/viewvc?rev=671819&view=rev
Log:
SYNAPSE-377: Modified MediatorDeployer to allow embedded JARs and to register Starup implementations provided by the extension.

Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java?rev=671819&r1=671818&r2=671819&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/MediatorDeployer.java Thu Jun 26 00:56:52 2008
@@ -19,6 +19,18 @@
 
 package org.apache.synapse.core.axis2;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axis2.Constants;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.deployment.Deployer;
 import org.apache.axis2.deployment.DeploymentClassLoader;
@@ -30,11 +42,8 @@
 import org.apache.synapse.config.xml.MediatorFactoryFinder;
 import org.apache.synapse.config.xml.MediatorSerializer;
 import org.apache.synapse.config.xml.MediatorSerializerFinder;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
+import org.apache.synapse.config.xml.StartupFactory;
+import org.apache.synapse.config.xml.StartupFinder;
 
 /**
  * This will support the hot deployment and hot update of the mediators at runtime using the
@@ -72,83 +81,50 @@
      */
     public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
 
-        log.info("Loading mediator from: " + deploymentFileData.getAbsolutePath());
+        log.info("Loading extensions from: " + deploymentFileData.getAbsolutePath());
 
         // get the context class loader for the later restore of the context class loader
         ClassLoader prevCl = Thread.currentThread().getContextClassLoader();
 
         try {
+            boolean isDirectory = deploymentFileData.getFile().isDirectory();
+            deploymentFileData.setClassLoader(isDirectory, getClass().getClassLoader(),
+                    (File)cfgCtx.getAxisConfiguration().getParameterValue(
+                            Constants.Configuration.ARTIFACTS_TEMP_DIR));
 
-            DeploymentClassLoader urlCl = new DeploymentClassLoader(
-                    new URL[]{deploymentFileData.getFile().toURL()}, null, prevCl);
+            DeploymentClassLoader urlCl
+                = (DeploymentClassLoader)deploymentFileData.getClassLoader();
             Thread.currentThread().setContextClassLoader(urlCl);
 
-            // MediatorFactory registration
-            URL facURL = urlCl.findResource(
-                    "META-INF/services/org.apache.synapse.config.xml.MediatorFactory");
-            if (facURL != null) {
-                InputStream facStream = facURL.openStream();
-                InputStreamReader facreader = new InputStreamReader(facStream);
-
-                StringBuffer facSB = new StringBuffer();
-                int c;
-                while ((c = facreader.read()) != -1) {
-                    facSB.append((char) c);
-                }
+            // StartupFactory registration
+            for (StartupFactory factory : getProviders(StartupFactory.class, urlCl)) {
+                QName tagQName = factory.getTagQName();
+                Class<? extends StartupFactory> clazz = factory.getClass();
+                StartupFinder finder = StartupFinder.getInstance();
+                finder.getFactoryMap().put(tagQName, clazz);
+                finder.getSerializerMap().put(tagQName, factory.getSerializerClass());
+                log.info("Registered startup factory and serializer for " + tagQName);
+            }
 
-                String[] facClassNames = facSB.toString().split("\n");
-                for (String facClassName : facClassNames) {
-                    log.info("Registering the Mediator factory: " + facClassName);
-                    Class facClass = urlCl.loadClass(facClassName);
-                    MediatorFactory facInst = (MediatorFactory) facClass.newInstance();
-                    MediatorFactoryFinder.getInstance()
-                            .getFactoryMap().put(facInst.getTagQName(), facClass);
-                    log.info("Mediator loaded and registered for " +
-                            "the tag name: " + facInst.getTagQName());
-                }
-            } else {
-                handleException("Unable to find the MediatorFactory implementation. " +
-                        "Unable to register the MediatorFactory with the FactoryFinder");
+            // MediatorFactory registration
+            for (MediatorFactory factory : getProviders(MediatorFactory.class, urlCl)) {
+                QName tagQName = factory.getTagQName();
+                Class<? extends MediatorFactory> clazz = factory.getClass();
+                MediatorFactoryFinder.getInstance().getFactoryMap().put(tagQName, clazz);
+                log.info("Registered mediator factory " + clazz.getName() + " for " + tagQName);
             }
 
             // MediatorSerializer registration
-            URL serURL = urlCl.findResource(
-                    "META-INF/services/org.apache.synapse.config.xml.MediatorSerializer");
-            if (serURL != null) {
-                InputStream serStream = serURL.openStream();
-                InputStreamReader serReader = new InputStreamReader(serStream);
-
-                StringBuffer serSB = new StringBuffer();
-                int c;
-                while ((c = serReader.read()) != -1) {
-                    serSB.append((char) c);
-                }
-
-                String[] serClassNames = serSB.toString().split("\n");
-                for (String serClassName : serClassNames) {
-                    log.info("Registering the Mediator serializer: " + serClassName);
-                    Class serClass = urlCl.loadClass(serClassName);
-                    MediatorSerializer serInst = (MediatorSerializer) serClass.newInstance();
-                    MediatorSerializerFinder.getInstance()
-                            .getSerializerMap().put(serInst.getMediatorClassName(), serInst);
-                    log.info("Mediator loaded and registered for " +
-                            "the serialization as: " + serInst.getMediatorClassName());
-                }
-            } else {
-                if (log.isDebugEnabled()) {
-                    log.debug("Unable to find the MediatorSerializer implementation. " +
-                            "Unable to register the MediatorSerializer with the SerializerFinder");
-                }
+            for (MediatorSerializer serializer : getProviders(MediatorSerializer.class, urlCl)) {
+                String mediatorClassName = serializer.getMediatorClassName();
+                MediatorSerializerFinder.getInstance().getSerializerMap().put(
+                        mediatorClassName, serializer);
+                log.info("Registered mediator serializer " + serializer.getClass().getName()
+                        + " for " + mediatorClassName);
             }
-
+            
         } catch (IOException e) {
             handleException("I/O error in reading the mediator jar file", e);
-        } catch (ClassNotFoundException e) {
-            handleException("Unable to find the specified class on the path or in the jar file", e);
-        } catch (IllegalAccessException e) {
-            handleException("Unable to load the class from the jar", e);
-        } catch (InstantiationException e) {
-            handleException("Unable to instantiate the class specified", e);
         } finally {
             // restore the class loader back
             if (log.isDebugEnabled()) {
@@ -157,6 +133,40 @@
             Thread.currentThread().setContextClassLoader(prevCl);
         }
     }
+    
+    private <T> List<T> getProviders(Class<T> providerClass, URLClassLoader loader)
+            throws IOException {
+        
+        List<T> providers = new LinkedList<T>();
+        String providerClassName = providerClass.getName();
+        providerClassName = providerClassName.substring(providerClassName.indexOf('.')+1);
+        URL servicesURL = loader.findResource("META-INF/services/" + providerClass.getName());
+        if (servicesURL != null) {
+            BufferedReader in
+                = new BufferedReader(new InputStreamReader(servicesURL.openStream()));
+            try {
+                String className;
+                while ((className = in.readLine()) != null) {
+                    log.info("Loading the " + providerClassName + " implementation: " + className);
+                    try {
+                        Class<? extends T> clazz
+                            = loader.loadClass(className).asSubclass(providerClass);
+                        providers.add(clazz.newInstance());
+                    } catch (ClassNotFoundException e) {
+                        handleException("Unable to find the specified class on the path or " +
+                        		"in the jar file", e);
+                    } catch (IllegalAccessException e) {
+                        handleException("Unable to load the class from the jar", e);
+                    } catch (InstantiationException e) {
+                        handleException("Unable to instantiate the class specified", e);
+                    }
+                }
+            } finally {
+                in.close();
+            }
+        }
+        return providers;
+    }
 
     /**
      * This will not be implemented because we do not support changing the directory at runtime