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; + } + }