Author: sagara
Date: Thu May 17 07:17:48 2012
New Revision: 1339501

URL: http://svn.apache.org/viewvc?rev=1339501&view=rev
Log:
AXIS2-5322 - Implemented ServiceBuilderExtension concept.  

Added:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java
   (with props)
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java
   (with props)
Modified:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractDeployer.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractDeployer.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractDeployer.java?rev=1339501&r1=1339500&r2=1339501&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractDeployer.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractDeployer.java
 Thu May 17 07:17:48 2012
@@ -15,10 +15,16 @@
  */
 package org.apache.axis2.deployment;
 
+import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.description.AxisService;
 
+
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * AbstractDeployer class which can be extended by all Axis2 deployers
@@ -31,6 +37,11 @@ public abstract class AbstractDeployer i
      */
     protected Map<String, DeploymentFileData> deploymentFileDataMap
             = new ConcurrentHashMap<String, DeploymentFileData>();
+    
+    /**
+     * Keep ServiceBuilderExtension associated with this Deployer.
+     */
+    private List<ServiceBuilderExtension> serviceBuilderExtensions = new 
CopyOnWriteArrayList<ServiceBuilderExtension>();
 
     public void deploy(DeploymentFileData deploymentFileData) throws 
DeploymentException {
         deploymentFileDataMap.put(deploymentFileData.getAbsolutePath(), 
deploymentFileData);
@@ -43,4 +54,39 @@ public abstract class AbstractDeployer i
     public void cleanup() throws DeploymentException {
         // Deployers which require cleaning up should override this method
     }
+
+    public List<ServiceBuilderExtension> getServiceBuilderExtensions() {
+        return serviceBuilderExtensions;
+    }
+
+    public void addServiceBuilderExtensions(ServiceBuilderExtension 
serviceBuilderExtension) {
+        serviceBuilderExtensions.add(serviceBuilderExtension);
+    }
+
+    /**
+     * This method executes ServiceBuilderExtensions associated with this
+     * Deployer instance and return a list AxisService instances. It is 
required
+     * to explicitly call this method within the deploy() method in order to 
use
+     * ServiceBuilderExtension.
+     * 
+     * @param deploymentFileData
+     * @param configurationContext
+     * @return
+     * @throws DeploymentException
+     */
+    protected Map<String, AxisService> executeServiceBuilderExtensions(
+            DeploymentFileData deploymentFileData, ConfigurationContext 
configurationContext)
+            throws DeploymentException {
+        if (getServiceBuilderExtensions().size() > 0) {
+            for (ServiceBuilderExtension ext : getServiceBuilderExtensions()) {
+                // a Service should be build by only one 
ServiceBuilderExtension
+                Map<String, AxisService> serviceMap = 
ext.buildAxisServices(deploymentFileData);
+                if (serviceMap != null && serviceMap.size() > 0) {
+                    return serviceMap;
+                }
+            }
+        }
+        return new HashMap<String, AxisService>();
+    }
+    
 }

Added: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java?rev=1339501&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java
 Thu May 17 07:17:48 2012
@@ -0,0 +1,68 @@
+package org.apache.axis2.deployment;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.engine.AxisConfiguration;
+
+/**
+ * <p>The Class AbstractServiceBuilderExtension is abstract class that can be 
used
+ * to write new ServiceBuilderExtensions.</p>
+ * 
+ * @since 1.7.0
+ */
+public abstract class AbstractServiceBuilderExtension implements 
ServiceBuilderExtension {
+
+    /** The configuration context. */
+    ConfigurationContext configurationContext;
+
+    /** The axis configuration. */
+    AxisConfiguration axisConfiguration;
+
+    /**
+     * The directory associated with base Deployer of with this
+     * AbstractServiceBuilderExtension instance.
+     */
+    String directory;
+
+    public void init(ConfigurationContext configurationContext) {
+        this.configurationContext = configurationContext;
+        this.axisConfiguration = 
this.configurationContext.getAxisConfiguration();
+    }
+
+    /**
+     * Gets the directory.
+     * 
+     * @return the directory
+     */
+    public String getDirectory() {
+        return directory;
+    }
+
+    /**
+     * Sets the directory.
+     * 
+     * @param directory
+     *            the new directory
+     */
+    public void setDirectory(String directory) {
+        this.directory = directory;
+    }
+
+    /**
+     * Gets the configuration context.
+     * 
+     * @return the configuration context
+     */
+    public ConfigurationContext getConfigurationContext() {
+        return configurationContext;
+    }
+
+    /**
+     * Gets the axis configuration.
+     * 
+     * @return the axis configuration
+     */
+    public AxisConfiguration getAxisConfiguration() {
+        return axisConfiguration;
+    }
+
+}

Propchange: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AbstractServiceBuilderExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java?rev=1339501&r1=1339500&r2=1339501&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
 Thu May 17 07:17:48 2012
@@ -421,6 +421,35 @@ public class AxisConfigBuilder extends D
             deployer.setDirectory(directory);
             deployer.setExtension(extension);
             
+            for (Iterator<?> itr = element.getChildrenWithName(new QName(
+                    TAG_SERVICE_BUILDER_EXTENSION)); itr.hasNext();) {
+                OMElement serviceBuilderEle = (OMElement) itr.next();
+                String serviceBuilderClass = 
serviceBuilderEle.getAttributeValue(new QName(
+                        TAG_CLASS_NAME));
+                String serviceBuilderName = 
serviceBuilderEle.getAttributeValue(new QName(
+                        ATTRIBUTE_CLASS));
+                if (serviceBuilderClass != null && serviceBuilderName != null) 
{
+                    ServiceBuilderExtension builderExtension;
+                    try {
+                        Class<ServiceBuilderExtension> builderExtensionClass = 
Loader
+                                .loadClass(serviceBuilderClass);
+                        builderExtension = builderExtensionClass.newInstance();
+                        builderExtension.setDirectory(directory);
+                    } catch (UnsupportedClassVersionError ex) {
+                        log.info("Disabled - " + deployerClassName + " - " + 
ex.getMessage());
+                        continue;
+                    } catch (Throwable e) {
+                        log.warn("Unable to instantiate deployer " + 
deployerClassName
+                                + "; see debug logs for more details");
+                        log.debug(e.getMessage(), e);
+                        continue;
+                    }
+                    if (deployer instanceof AbstractDeployer) {
+                        ((AbstractDeployer) 
deployer).addServiceBuilderExtensions(builderExtension);
+                    }
+                }  
+            }     
+            
             Map<String, Deployer> extensionMap = deployers.get(directory);
             if (extensionMap == null) {
                 extensionMap = new HashMap<String, Deployer>();

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java?rev=1339501&r1=1339500&r2=1339501&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
 Thu May 17 07:17:48 2012
@@ -20,7 +20,7 @@
 
 package org.apache.axis2.deployment;
 
-import org.apache.axis2.Constants;
+
 
 /**
  * Constants used during service/module deployment.
@@ -104,6 +104,7 @@ public interface DeploymentConstants {
     String TAG_BEFORE = "before";
     String TAG_SUPPORTED_POLICY_NAMESPACES = "supported-policy-namespaces";
     String TAG_NAMESPACES = "namespaces";
+    String TAG_SERVICE_BUILDER_EXTENSION = "serviceBuilderExtension";
 
     //ClusterBuilder
     String TAG_NODE_MANAGER = "nodeManager";

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java?rev=1339501&r1=1339500&r2=1339501&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
 Thu May 17 07:17:48 2012
@@ -938,6 +938,13 @@ public abstract class DeploymentEngine i
         for (Map<String, Deployer> extensionMap : deployerMap.values()) {
             for (Deployer deployer : extensionMap.values()) {
                 deployer.init(configContext);
+                if (deployer instanceof AbstractDeployer) {
+                    for (Iterator<ServiceBuilderExtension> sbeItr = 
((AbstractDeployer) deployer)
+                            .getServiceBuilderExtensions().iterator(); 
sbeItr.hasNext();) {
+                        //init ServiceBuilderExtensions
+                        sbeItr.next().init(configContext);
+                    }
+                }
             }
         }
     }
@@ -1198,6 +1205,11 @@ public abstract class DeploymentEngine i
         if (configContext != null) {
             // Initialize the Deployer
             deployer.init(configContext);
+            for (Iterator<ServiceBuilderExtension> sbeItr = 
((AbstractDeployer) deployer)
+                    .getServiceBuilderExtensions().iterator(); 
sbeItr.hasNext();) {
+                //init ServiceBuilderExtensions
+                sbeItr.next().init(configContext);
+            }
             if (!hotDeployment) {
                 //TBD
             }

Added: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java?rev=1339501&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java
 Thu May 17 07:17:48 2012
@@ -0,0 +1,84 @@
+package org.apache.axis2.deployment;
+
+import java.util.Map;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.description.AxisService;
+
+/**
+ * <p>
+ * The interface ServiceBuilderExtension provides an extension point to
+ * org.apache.axis2.deployment.Deployer interface. During the deployment, a
+ * Deployer invoke all ServiceBuilderExtension instances associated with it and
+ * receive a list of org.apache.axis2.description.AxisService generated by one
+ * of above ServiceBuilderExtension instances.
+ * </p>
+ * 
+ * <p>
+ * It is possible to register ServiceBuilderExtension for a
+ * org.apache.axis2.deployment.Deployer through the axis2.xml configuration 
file
+ * or one can can set ServiceBuilderExtension programtically.
+ * </p>
+ * 
+ * <p>
+ * Example
+ * </p>
+ * <p>
+ * 
+ * <pre>
+ * {@code
+ *           <deployer extension="extension" directory="custom-directory" 
class="Deployer implementation">
+ *              <serviceBuilderExtension name ="builderExtensionA" 
class="org.apache.axis2.BuilderExtensionA"/>
+ *              <serviceBuilderExtension name ="builderExtensionA" 
class="org.apache.axis2.BuilderExtensionB"/>
+ *              <serviceBuilderExtension name ="builderExtensionA" 
class="org.apache.axis2.BuilderExtensionC"/> 
+ *      </deployer> }
+ * </pre> 
+ * </p>
+ * 
+ * 
+ * <ul>
+ * <li>
+ * To use ServiceBuilderExtension a custom Deployer must be extended from 
org.apache.axis2.deployment.AbstractDeployer 
+ * class where org.apache.axis2.deployment.AbstractDeployer class register 
ServiceBuilderExtensions with underline Deployer
+ * instance. 
+ * </li>
+ * <li>
+ * Within deploy() method it is expected to call 
org.apache.axis2.deployment.AbstractDeployer#executeServiceBuilderExtensions
+ * method to receive  list of AxisService instances generated by 
ServiceBuilderExtensions.
+ * </li>
+ * <li>
+ *  For a given deploymentFile, if a ServiceBuilderExtension could create a 
AxisService then 
+ *  stop execution of other ServiceBuilderExtensions registered and return the 
AxisService immediately 
+ *  to the base Deployer for the further processing.    
+ * </li>
+ * </ul>
+ * 
+ * @since 1.7.0
+ */
+public interface ServiceBuilderExtension {
+
+    /**
+     * Initialize ServiceBuilderExtension instance. This method should be 
called
+     * when Initializing the base Deployer.
+     * 
+     * @param configurationContext
+     *            the configuration context
+     */
+    public void init(ConfigurationContext configurationContext);
+
+    /**
+     * Builds the AxisService.
+     * 
+     * @param deploymentFileData
+     *            the deployment file data *
+     * @return the map of AxisService instances.
+     * @throws DeploymentException
+     *             the deployment exception
+     */
+    public Map<String, AxisService> buildAxisServices(DeploymentFileData 
deploymentFileData)
+            throws DeploymentException;
+    
+    public void setDirectory(String directory);
+
+}

Propchange: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/ServiceBuilderExtension.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java?rev=1339501&r1=1339500&r2=1339501&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
 Thu May 17 07:17:48 2012
@@ -39,6 +39,7 @@ public class DeploymentFileData {
     private ClassLoader classLoader;
     private Deployer deployer;
     private URL url;
+    private Object serviceMetaData;
 
     public URL getUrl() {
         return url;
@@ -150,4 +151,13 @@ public class DeploymentFileData {
     public void deploy() throws DeploymentException {
         deployer.deploy(this);
     }
+
+    public Object getServiceMetaData() {
+        return serviceMetaData;
+    }
+
+    public void setServiceMetaData(Object serviceMetaData) {
+        this.serviceMetaData = serviceMetaData;
+    }    
+    
 }


Reply via email to