Author: sagara
Date: Fri May 18 09:51:52 2012
New Revision: 1340051
URL: http://svn.apache.org/viewvc?rev=1340051&view=rev
Log:
AXIS2-5322 - Refactored JAXWSDeployer so that codes can be shared among
JAXWSDeployer and JAXWSServiceBuilderExtension through newly introduced
JAXWSDeployerSupport class. JAXWSServiceBuilderExtension support to deploy
JAX-WS artefacts based on service.xml file. Test coverage need to be added.
Added:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java
(with props)
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java
(with props)
Modified:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
Modified:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java?rev=1340051&r1=1340050&r2=1340051&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
(original)
+++
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
Fri May 18 09:51:52 2012
@@ -27,26 +27,13 @@ import org.apache.axis2.deployment.Deplo
import org.apache.axis2.deployment.DeploymentErrorMsgs;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
import org.apache.axis2.deployment.util.Utils;
-import org.apache.axis2.description.AxisOperation;
-import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
-import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.jaxws.addressing.util.EndpointContextMap;
-import org.apache.axis2.jaxws.addressing.util.EndpointContextMapManager;
-import org.apache.axis2.jaxws.addressing.util.EndpointKey;
-import org.apache.axis2.jaxws.description.DescriptionFactory;
-import org.apache.axis2.jaxws.description.EndpointDescription;
-import org.apache.axis2.jaxws.server.JAXWSMessageReceiver;
-import org.apache.axis2.util.Loader;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.jws.WebService;
-import javax.xml.namespace.QName;
-import javax.xml.ws.WebServiceProvider;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -104,7 +91,8 @@ public class JAXWSDeployer extends Abstr
getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
axisConfig.isChildFirstClassLoading());
Thread.currentThread().setContextClassLoader(classLoader);
- deployClasses("JAXWS-Builtin", file.toURL(),
Thread.currentThread().getContextClassLoader(), classList);
+ JAXWSDeployerSupport deployerSupport = new
JAXWSDeployerSupport(configCtx, directory);
+ deployerSupport.deployClasses("JAXWS-Builtin", file.toURL(),
Thread.currentThread().getContextClassLoader(), classList);
} catch (NoClassDefFoundError e) {
if (log.isDebugEnabled()) {
log.debug(Messages.getMessage("deployingexception",
e.getMessage()), e);
@@ -121,10 +109,10 @@ public class JAXWSDeployer extends Abstr
protected ArrayList<String> getClassesInWebInfDirectory(File file) {
String filePath = file.getAbsolutePath();
- Collection files = FileUtils.listFiles(file, new String[]{"class"},
true);
+ Collection<File> files = FileUtils.listFiles(file, new
String[]{"class"}, true);
ArrayList<String> classList = new ArrayList<String>();
- for (Iterator iterator = files.iterator(); iterator.hasNext();) {
- File f = (File) iterator.next();
+ for (Iterator<File> iterator = files.iterator(); iterator.hasNext();) {
+ File f = iterator.next();
String fPath = f.getAbsolutePath();
String fqcn = fPath.substring(filePath.length() + 1);
fqcn = fqcn.substring(0, fqcn.length() - ".class".length());
@@ -164,7 +152,8 @@ public class JAXWSDeployer extends Abstr
Thread.currentThread().setContextClassLoader(classLoader);
List<String> classList =
Utils.getListOfClasses(deploymentFileData);
- AxisServiceGroup serviceGroup = deployClasses(groupName,
location, classLoader, classList);
+ JAXWSDeployerSupport deployerSupport = new
JAXWSDeployerSupport(configCtx, directory);
+ AxisServiceGroup serviceGroup =
deployerSupport.deployClasses(groupName, location, classLoader, classList);
if(serviceGroup == null) {
String msg = "Error while deploying JAX-WS jar: " +
@@ -186,61 +175,6 @@ public class JAXWSDeployer extends Abstr
}
}
- protected AxisServiceGroup deployClasses(String groupName, URL location,
ClassLoader classLoader, List<String> classList)
- throws ClassNotFoundException, InstantiationException,
IllegalAccessException, AxisFault {
- ArrayList<AxisService> axisServiceList = new ArrayList<AxisService>();
- // Get the hierarchical path of the service
- String serviceHierarchy =
Utils.getServiceHierarchy(location.getPath(), this.directory);
- for (String className : classList) {
- Class<?> pojoClass;
- try {
- pojoClass = Loader.loadClass(classLoader, className);
- } catch (Exception e){
- continue;
- }
- WebService wsAnnotation =
pojoClass.getAnnotation(WebService.class);
- WebServiceProvider wspAnnotation = null;
- if (wsAnnotation == null) {
- wspAnnotation =
pojoClass.getAnnotation(WebServiceProvider.class);
- }
-
- // Create an Axis Service only if the class is not an interface
and it has either
- // @WebService annotation or @WebServiceProvider annotation.
- if ((wsAnnotation != null
- || wspAnnotation != null)
- && !pojoClass.isInterface()) {
- AxisService axisService;
- axisService =
- createAxisService(classLoader,
- className,
- location);
- if(axisService != null) {
- if (serviceHierarchy != null) {
- axisService.setName(serviceHierarchy +
axisService.getName());
- }
- log.info("Deploying JAXWS annotated class " + className +
" as a service - "
- + axisService.getName());
- axisServiceList.add(axisService);
- }
- }
- }
- int size = axisServiceList.size();
- if (size <= 0) {
- return null;
- }
- //creating service group by considering the hierarchical path also
- AxisServiceGroup serviceGroup = new AxisServiceGroup();
- if (serviceHierarchy != null) {
- serviceGroup.setServiceGroupName(serviceHierarchy + groupName);
- }
- for (AxisService axisService : axisServiceList) {
- serviceGroup.addService(axisService);
- }
- axisConfig.addServiceGroup(serviceGroup);
- configureAddressing(serviceGroup);
- return serviceGroup;
- }
-
protected void storeFaultyService(DeploymentFileData deploymentFileData,
Throwable t) {
StringWriter errorWriter = new StringWriter();
PrintWriter ptintWriter = new PrintWriter(errorWriter);
@@ -250,37 +184,6 @@ public class JAXWSDeployer extends Abstr
put(deploymentFileData.getFile().getAbsolutePath(), error);
}
- protected AxisService createAxisService(ClassLoader classLoader,
- String className,
- URL serviceLocation) throws
ClassNotFoundException,
- InstantiationException,
- IllegalAccessException,
- AxisFault {
- Class<?> pojoClass = Loader.loadClass(classLoader, className);
- AxisService axisService;
- try {
- axisService = DescriptionFactory.createAxisService(pojoClass,
configCtx);
- } catch (Throwable t) {
- log.info("Exception creating Axis Service : " + t.getCause(), t);
- return null;
- }
- if (axisService != null) {
- Iterator<AxisOperation> operations = axisService.getOperations();
- while (operations.hasNext()) {
- AxisOperation axisOperation = operations.next();
- if (axisOperation.getMessageReceiver() == null) {
- axisOperation.setMessageReceiver(new
JAXWSMessageReceiver());
- }
- }
- axisService.setElementFormDefault(false);
- axisService.setFileName(serviceLocation);
- axisService.setClassLoader(classLoader);
- axisService.addParameter(new
Parameter(org.apache.axis2.jaxws.spi.Constants.CACHE_CLASSLOADER, classLoader));
- axisService.addParameter(new
Parameter("modifyUserWSDLPortAddress", "true"));
- }
- return axisService;
- }
-
public void setDirectory(String directory) {
this.directory = directory;
}
@@ -326,35 +229,6 @@ public class JAXWSDeployer extends Abstr
return false;
}
- private boolean isEmpty(String string) {
- return (string == null || "".equals(string));
- }
-
- //Store the address URIs that we will need to create endpoint references
at runtime.
- private void configureAddressing(AxisServiceGroup serviceGroup) {
- EndpointContextMap map =
- (EndpointContextMap)
configCtx.getProperty(org.apache.axis2.jaxws.Constants.ENDPOINT_CONTEXT_MAP);
-
- if (map == null) {
- map = EndpointContextMapManager.getEndpointContextMap();
-
configCtx.setProperty(org.apache.axis2.jaxws.Constants.ENDPOINT_CONTEXT_MAP,
map);
- }
-
- Iterator<AxisService> iterator = serviceGroup.getServices();
-
- while (iterator.hasNext()) {
- AxisService axisService = iterator.next();
- Parameter param =
-
axisService.getParameter(EndpointDescription.AXIS_SERVICE_PARAMETER);
- EndpointDescription ed = (EndpointDescription) param.getValue();
- QName serviceName = ed.getServiceQName();
- QName portName = ed.getPortQName();
- EndpointKey key = new EndpointKey(serviceName, portName);
-
- map.put(key, axisService);
- }
- }
-
/**
* Checks whether there's a 'lib' folder inside the provided folder and
adds all the lib URLs
* into the provided URL list.
Added:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java?rev=1340051&view=auto
==============================================================================
---
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java
(added)
+++
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java
Fri May 18 09:51:52 2012
@@ -0,0 +1,349 @@
+package org.apache.axis2.jaxws.framework;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.ws.WebServiceProvider;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.deployment.DeploymentException;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.deployment.util.Utils;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.AxisServiceGroup;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.jaxws.addressing.util.EndpointContextMap;
+import org.apache.axis2.jaxws.addressing.util.EndpointContextMapManager;
+import org.apache.axis2.jaxws.addressing.util.EndpointKey;
+import org.apache.axis2.jaxws.description.DescriptionFactory;
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.server.JAXWSMessageReceiver;
+import org.apache.axis2.util.Loader;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * <p>The Class JAXWSDeployerSupport act as a helper class for both
JAXWSDeployer
+ * and JAXWSServiceBuilderExtension.</p>
+ *
+ * @since 1.7.0
+ */
+public class JAXWSDeployerSupport {
+
+ private static final Log log =
LogFactory.getLog(JAXWSDeployerSupport.class);
+
+ /** The configuration context. */
+ private ConfigurationContext configurationContext;
+
+ /** The directory. */
+ private String directory;
+
+ public JAXWSDeployerSupport() {
+ this(null, null);
+ }
+
+ /**
+ * Instantiates a new jAXWS deployer support.
+ *
+ * @param configurationContext
+ * the configuration context
+ */
+ public JAXWSDeployerSupport(ConfigurationContext configurationContext) {
+ this(configurationContext, null);
+ }
+
+ /**
+ * Instantiates a new jAXWS deployer support.
+ *
+ * @param configurationContext
+ * the configuration context
+ * @param directory
+ * the directory
+ */
+ public JAXWSDeployerSupport(ConfigurationContext configurationContext,
String directory) {
+ this.configurationContext = configurationContext;
+ this.directory = directory;
+ }
+
+ /**
+ * Gets the configuration context.
+ *
+ * @return the configuration context
+ */
+ public ConfigurationContext getConfigurationContext() {
+ return configurationContext;
+ }
+
+ /**
+ * Sets the configuration context.
+ *
+ * @param configurationContext
+ * the new configuration context
+ */
+ public void setConfigurationContext(ConfigurationContext
configurationContext) {
+ this.configurationContext = configurationContext;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * Deploy classes.
+ *
+ * @param groupName
+ * the group name
+ * @param location
+ * the location
+ * @param classLoader
+ * the class loader
+ * @param classList
+ * the class list
+ * @return the axis service group
+ * @throws ClassNotFoundException
+ * the class not found exception
+ * @throws InstantiationException
+ * the instantiation exception
+ * @throws IllegalAccessException
+ * the illegal access exception
+ * @throws AxisFault
+ * the axis fault
+ */
+ protected AxisServiceGroup deployClasses(String groupName, URL location,
+ ClassLoader classLoader, List<String> classList) throws
ClassNotFoundException,
+ InstantiationException, IllegalAccessException, AxisFault {
+
+ String serviceHierarchy =
Utils.getServiceHierarchy(location.getPath(), this.directory);
+ Collection<AxisService> axisServiceList = deployClasses(location,
classLoader, classList)
+ .values();
+ // creating service group by considering the hierarchical path also
+ if (axisServiceList.size() > 0) {
+ AxisServiceGroup serviceGroup = new AxisServiceGroup();
+ for (Iterator<AxisService> axItr = axisServiceList.iterator();
axItr.hasNext();) {
+ serviceGroup.addService(axItr.next());
+ }
+ if (serviceHierarchy != null) {
+ serviceGroup.setServiceGroupName(serviceHierarchy + groupName);
+ }
+
getConfigurationContext().getAxisConfiguration().addServiceGroup(serviceGroup);
+ configureAddressing(serviceGroup);
+ return serviceGroup;
+ }
+ return null;
+ }
+
+ /**
+ * Deploy classes.
+ *
+ * @param location
+ * the location
+ * @param classLoader
+ * the class loader
+ * @param classList
+ * the class list
+ * @return the hash map
+ * @throws ClassNotFoundException
+ * the class not found exception
+ * @throws InstantiationException
+ * the instantiation exception
+ * @throws IllegalAccessException
+ * the illegal access exception
+ * @throws AxisFault
+ * the axis fault
+ */
+ protected HashMap<String, AxisService> deployClasses(URL location,
ClassLoader classLoader,
+ List<String> classList) throws ClassNotFoundException,
InstantiationException,
+ IllegalAccessException, AxisFault {
+ HashMap<String, AxisService> services = new HashMap<String,
AxisService>();
+ // Get the hierarchical path of the service
+
+ String serviceHierarchy =
Utils.getServiceHierarchy(location.getPath(), getDirectory());
+ for (String className : classList) {
+ Class<?> pojoClass;
+ try {
+ pojoClass = Loader.loadClass(classLoader, className);
+ } catch (Exception e) {
+ continue;
+ }
+ WebService wsAnnotation =
pojoClass.getAnnotation(WebService.class);
+ WebServiceProvider wspAnnotation = null;
+ if (wsAnnotation == null) {
+ wspAnnotation =
pojoClass.getAnnotation(WebServiceProvider.class);
+ }
+
+ // Create an Axis Service only if the class is not an interface and
+ // it has either
+ // @WebService annotation or @WebServiceProvider annotation.
+ if ((wsAnnotation != null || wspAnnotation != null) &&
!pojoClass.isInterface()) {
+ AxisService axisService;
+ axisService = createAxisService(classLoader, className,
location);
+ if (axisService != null) {
+ log.info("Deploying JAXWS annotated class " + className +
" as a service - "
+ + serviceHierarchy + axisService.getName());
+ services.put(axisService.getName(), axisService);
+ }
+ }
+ }
+ return services;
+ }
+
+ /**
+ * Creates the axis service.
+ *
+ * @param classLoader
+ * the class loader
+ * @param className
+ * the class name
+ * @param serviceLocation
+ * the service location
+ * @return the axis service
+ * @throws ClassNotFoundException
+ * the class not found exception
+ * @throws InstantiationException
+ * the instantiation exception
+ * @throws IllegalAccessException
+ * the illegal access exception
+ * @throws AxisFault
+ * the axis fault
+ */
+ protected AxisService createAxisService(ClassLoader classLoader, String
className,
+ URL serviceLocation) throws ClassNotFoundException,
InstantiationException,
+ IllegalAccessException, AxisFault {
+ Class<?> pojoClass = Loader.loadClass(classLoader, className);
+ AxisService axisService;
+ try {
+ axisService = DescriptionFactory
+ .createAxisService(pojoClass, getConfigurationContext());
+ } catch (Throwable t) {
+ log.info("Exception creating Axis Service : " + t.getCause(), t);
+ return null;
+ }
+ if (axisService != null) {
+ Iterator<AxisOperation> operations = axisService.getOperations();
+ while (operations.hasNext()) {
+ AxisOperation axisOperation = operations.next();
+ if (axisOperation.getMessageReceiver() == null) {
+ axisOperation.setMessageReceiver(new
JAXWSMessageReceiver());
+ }
+ }
+ axisService.setElementFormDefault(false);
+ axisService.setFileName(serviceLocation);
+ axisService.setClassLoader(classLoader);
+ axisService.addParameter(new Parameter(
+ org.apache.axis2.jaxws.spi.Constants.CACHE_CLASSLOADER,
classLoader));
+ }
+ return axisService;
+ }
+
+ /**
+ * Gets the list of classes.
+ *
+ * @param deploymentFileData
+ * the deployment file data
+ * @return the list of classes
+ * @throws DeploymentException
+ * the deployment exception
+ */
+ public List<String> getListOfClasses(DeploymentFileData deploymentFileData)
+ throws DeploymentException {
+ return Utils.getListOfClasses(deploymentFileData);
+ }
+
+ /**
+ * Gets the service class name from meta data.
+ *
+ * @param serviceMetaData
+ * the service meta data
+ * @return the service class name from meta data
+ */
+ public List<String> getServiceClassNameFromMetaData(OMElement
serviceMetaData) {
+ List<String> classNames = new ArrayList<String>();
+ if (serviceMetaData.getLocalName().equals("serviceGroup")) {
+ for (Iterator<OMElement> services =
serviceMetaData.getChildrenWithLocalName("service"); services
+ .hasNext();) {
+ for (Iterator<OMElement> parameters =
services.next().getChildrenWithLocalName(
+ "parameter"); parameters.hasNext();) {
+ OMElement parameter = parameters.next();
+ OMAttribute att = parameter.getAttribute(new
QName("name"));
+ if (att != null) {
+ String value = att.getAttributeValue();
+ if (value != null && "ServiceClass".equals(value)) {
+ classNames.add(parameter.getText());
+ }
+ }
+ }
+ }
+
+ } else if (serviceMetaData.getLocalName().equals("service")) {
+ for (Iterator<OMElement> parameters = serviceMetaData
+ .getChildrenWithLocalName("parameter");
parameters.hasNext();) {
+ OMElement parameter = parameters.next();
+ OMAttribute att = parameter.getAttribute(new QName("name"));
+ if (att != null) {
+ String value = att.getAttributeValue();
+ if (value != null && "ServiceClass".equals(value)) {
+ classNames.add(parameter.getText());
+ }
+ }
+ }
+
+ }
+ return classNames;
+ }
+
+ /**
+ * Configure addressing.
+ *
+ * @param serviceGroup
+ * the service group
+ */
+ private void configureAddressing(AxisServiceGroup serviceGroup) {
+ EndpointContextMap map = (EndpointContextMap)
getConfigurationContext().getProperty(
+ org.apache.axis2.jaxws.Constants.ENDPOINT_CONTEXT_MAP);
+
+ if (map == null) {
+ map = EndpointContextMapManager.getEndpointContextMap();
+ getConfigurationContext().setProperty(
+ org.apache.axis2.jaxws.Constants.ENDPOINT_CONTEXT_MAP,
map);
+ }
+
+ Iterator<AxisService> iterator = serviceGroup.getServices();
+
+ while (iterator.hasNext()) {
+ AxisService axisService = iterator.next();
+ Parameter param =
axisService.getParameter(EndpointDescription.AXIS_SERVICE_PARAMETER);
+ EndpointDescription ed = (EndpointDescription) param.getValue();
+ QName serviceName = ed.getServiceQName();
+ QName portName = ed.getPortQName();
+ EndpointKey key = new EndpointKey(serviceName, portName);
+
+ map.put(key, axisService);
+ }
+ }
+
+}
Propchange:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployerSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java?rev=1340051&view=auto
==============================================================================
---
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java
(added)
+++
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java
Fri May 18 09:51:52 2012
@@ -0,0 +1,170 @@
+package org.apache.axis2.jaxws.framework;
+
+import java.net.MalformedURLException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.deployment.AbstractServiceBuilderExtension;
+import org.apache.axis2.deployment.DeploymentConstants;
+import org.apache.axis2.deployment.DeploymentException;
+import org.apache.axis2.deployment.repository.util.DeploymentFileData;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.jaxws.server.JAXWSMessageReceiver;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * <p>
+ * The Class JAXWSServiceBuilderExtension is an implementation of
+ * org.apache.axis2.deployment.ServiceBuilderExtension interface and facilitate
+ * to deploy JAX-WS artifacts through other Deployers.
+ * </p>
+ *
+ * <p>
+ * As an example it is possible to use JAXWSServiceBuilderExtension class to
add
+ * JAX-WS support for service.xml meta file based service deployment. First,
+ * JAXWSServiceBuilderExtension create initial AxisService and ServiceDeployer
+ * add further configuration based of provided service.xml meta data file.
+ * Annotated call may load from embedded archive (AAR), a exploded directory or
+ * from Classpath.
+ * </p>
+ *
+ * <p>
+ * It is expected to define only JAXWSMessageReceiver as MessageReceivers in
the
+ * service.xml file
+ * </p>
+ *
+ * <p>
+ * Example :
+ * </p>
+ *
+ * <pre>
+ * {@code
+ * <messageReceivers>
+ * <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver"/>
+ * <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver"/>
+ * </messageReceivers>
+ *
+ * }
+ * </pre>
+ *
+ * @since 1.7.0
+ */
+public class JAXWSServiceBuilderExtension extends
AbstractServiceBuilderExtension {
+
+ private static final Log log =
LogFactory.getLog(JAXWSServiceBuilderExtension.class);
+
+ public Map<String, AxisService> buildAxisServices(DeploymentFileData
deploymentFileData)
+ throws DeploymentException {
+
+ if (!checkPreconditions(deploymentFileData.getServiceMetaData())) {
+ // Should not process further.
+ return null;
+ }
+
+ ClassLoader threadClassLoader =
Thread.currentThread().getContextClassLoader();
+ try {
+
Thread.currentThread().setContextClassLoader(deploymentFileData.getClassLoader());
+ try {
+ JAXWSDeployerSupport deployerSupport = new
JAXWSDeployerSupport(
+ getConfigurationContext(), getDirectory());
+ List<String> listOfClasses =
deployerSupport.getListOfClasses(deploymentFileData);
+
+ /*
+ * if listOfClasses contains no results, let's try to load
+ * implementation class from service.xml.
+ */
+ if ((listOfClasses == null || listOfClasses.size() == 0)
+ && deploymentFileData.getServiceMetaData() != null
+ && deploymentFileData.getServiceMetaData() instanceof
OMElement) {
+ OMElement serviceMetaData = (OMElement)
deploymentFileData.getServiceMetaData();
+ listOfClasses = deployerSupport
+ .getServiceClassNameFromMetaData(serviceMetaData);
+ }
+
+ return
deployerSupport.deployClasses(deploymentFileData.getFile().toURL(),
+ deploymentFileData.getClassLoader(), listOfClasses);
+
+ } catch (AxisFault e) {
+ log.error(e);
+ } catch (MalformedURLException e) {
+ log.error(e);
+ } catch (ClassNotFoundException e) {
+ log.error(e);
+ } catch (InstantiationException e) {
+ log.error(e);
+ } catch (IllegalAccessException e) {
+ log.error(e);
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(threadClassLoader);
+ }
+ return null;
+ }
+
+ /**
+ * This method check whether all the defined <messageReceiver> are type of
+ * JAXWSMessageReceiver. Return true only if all the <messageReceiver>
+ * elements satisfy above condition.
+ *
+ * @param metaData
+ * the meta data
+ * @return true, if successful
+ */
+ protected boolean checkPreconditions(Object metaData) {
+ boolean checkOK = false;
+ if (metaData != null && metaData instanceof OMElement) {
+ OMElement metaDataEle = (OMElement) metaData;
+ if
(DeploymentConstants.TAG_SERVICE.equals(metaDataEle.getLocalName())) {
+ // if only one <service> present.
+ return checkMessageReceivers(metaDataEle);
+ } else if
(DeploymentConstants.TAG_SERVICE_GROUP.equals(metaDataEle.getLocalName())) {
+ // if <serviceGroup> present.
+ OMElement groupMrs = metaDataEle.getFirstChildWithName(new
QName(
+ DeploymentConstants.TAG_MESSAGE_RECEIVERS));
+ // check MRs direct under <serviceGroup>.
+ if (groupMrs != null && !checkMessageReceivers(metaDataEle)) {
+ return false;
+ }
+ for (Iterator<OMElement> serviceItr = metaDataEle
+
.getChildrenWithLocalName(DeploymentConstants.TAG_SERVICE); serviceItr
+ .hasNext();) {
+ // check list of <service> under <serviceGroup>.
+ if (!checkMessageReceivers(serviceItr.next())) {
+ return false;
+ } else {
+ checkOK = true;
+ }
+ }
+ }
+ }
+ return checkOK;
+ }
+
+ private boolean checkMessageReceivers(OMElement mrsElement) {
+ boolean checkOK = false;
+ if (mrsElement != null) {
+ Iterator<OMElement> eleItr = (mrsElement)
+
.getChildrenWithLocalName(DeploymentConstants.TAG_MESSAGE_RECEIVERS);
+ for (Iterator<OMElement> mrItr =
eleItr.next().getChildrenWithLocalName(
+ DeploymentConstants.TAG_MESSAGE_RECEIVER);
mrItr.hasNext();) {
+ OMElement mrEle = mrItr.next();
+ String mrCalssName = mrEle.getAttributeValue(new QName(
+ DeploymentConstants.ATTRIBUTE_CLASS));
+ if (mrCalssName != null
+ &&
!JAXWSMessageReceiver.class.getName().equals(mrCalssName)) {
+ return false;
+ } else {
+ checkOK = true;
+ }
+ }
+ }
+ return checkOK;
+ }
+
+}
Propchange:
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSServiceBuilderExtension.java
------------------------------------------------------------------------------
svn:eol-style = native