Author: mriou
Date: Wed Jul 23 08:46:12 2008
New Revision: 679114

URL: http://svn.apache.org/viewvc?rev=679114&view=rev
Log:
ODE-345 Allow BPEL Processes To Be Provided Over JMS (including topics).

Modified:
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java?rev=679114&r1=679113&r2=679114&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
 Wed Jul 23 08:46:12 2008
@@ -59,7 +59,15 @@
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.sql.DataSource;
-import javax.transaction.*;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
 import javax.transaction.xa.XAResource;
 import javax.wsdl.Definition;
 import javax.xml.namespace.QName;
@@ -313,15 +321,24 @@
     }
 
     public ODEService createService(ProcessConf pconf, QName serviceName, 
String portName) throws AxisFault {
-        destroyService(serviceName, portName);
-        AxisService axisService = ODEAxisService.createService(_axisConfig, 
pconf, serviceName, portName);
+        Definition wsdlDefinition = pconf.getDefinitionForService(serviceName);
+
+        // Since multiple processes may provide services at the same (JMS) 
endpoint, qualify
+        // the (JMS) endpoint-specific NCName with a process-relative URI, if 
necessary.
+        QName uniqueServiceName = new QName(serviceName.getNamespaceURI(),
+                ODEAxisService.extractServiceName(wsdlDefinition, serviceName, 
portName,
+                        ODEAxisService.deriveBaseServiceUri(pconf)));
+
+        destroyService(uniqueServiceName, portName);
+
+        AxisService axisService = ODEAxisService.createService(
+                _axisConfig, pconf, serviceName, portName, 
uniqueServiceName.getLocalPart());
         ODEService odeService = new ODEService(axisService, pconf, 
serviceName, portName, _server, _txMgr);
 
-        _services.put(serviceName, portName, odeService);
+        _services.put(uniqueServiceName, portName, odeService);
 
         // Setting our new service on the receiver, the same receiver handles
-        // all
-        // operations so the first one should fit them all
+        // all operations so the first one should fit them all
         AxisOperation firstOp = (AxisOperation) 
axisService.getOperations().next();
         ((ODEMessageReceiver) 
firstOp.getMessageReceiver()).setService(odeService);
 

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java?rev=679114&r1=679113&r2=679114&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java
 Wed Jul 23 08:46:12 2008
@@ -38,9 +38,11 @@
 import org.apache.axis2.deployment.ServiceBuilder;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
 import org.apache.axis2.description.WSDL11ToAxisServiceBuilder;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.transport.jms.JMSConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.axis2.OdeFault;
@@ -60,9 +62,8 @@
     private static final Log LOG = LogFactory.getLog(ODEAxisService.class);
 
     public static AxisService createService(AxisConfiguration axisConfig, 
ProcessConf pconf, QName wsdlServiceName,
-                                            String portName) throws AxisFault {
+                                            String portName, String 
axisServiceName) throws AxisFault {
         Definition wsdlDefinition = 
pconf.getDefinitionForService(wsdlServiceName);
-        String serviceName = extractServiceName(wsdlDefinition, 
wsdlServiceName, portName);
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("Create AxisService:"+" service="+wsdlServiceName+" 
port="+portName
@@ -79,7 +80,7 @@
             serviceBuilder.setServerSide(true);
 
             AxisService axisService = serviceBuilder.populateService();
-            axisService.setName(serviceName);
+            axisService.setName(axisServiceName);
             axisService.setWsdlFound(true);
             axisService.setCustomWsdl(true);
             axisService.setClassLoader(axisConfig.getServiceClassLoader());
@@ -110,7 +111,7 @@
 
             // In doc/lit we need to declare a mapping between operations and 
message element names
             // to be able to route properly.
-            declarePartsElements(wsdlDefinition, wsdlServiceName, serviceName, 
portName);
+            declarePartsElements(wsdlDefinition, wsdlServiceName, 
axisServiceName, portName);
 
             Iterator operations = axisService.getOperations();
             ODEMessageReceiver msgReceiver = new ODEMessageReceiver();
@@ -120,13 +121,36 @@
                     operation.setMessageReceiver(msgReceiver);
                 }
             }
+            
+            // Set the JMS destination name on the Axis Service (used only if 
endpoint is JMS)  
+            axisService.addParameter(new Parameter(JMSConstants.DEST_PARAM, 
extractJMSDestinationName(axisServiceName)));
+
             return axisService;
         } catch (Exception e) {
             throw AxisFault.makeFault(e);
         }
     }
 
-    public static AxisService createService(AxisConfiguration axisConfig, 
QName serviceQName, String port,
+    /**
+     * Extract the JMS destination name that is embedded in the Axis service 
name.
+     * @param serviceName the name of the axis service
+     * @return the corresponding JMS destination name
+     */
+    private static String extractJMSDestinationName(String serviceName) {
+       String destinationPrefix = "dynamicQueues/";
+        int index = serviceName.indexOf(destinationPrefix);
+        if (index == -1) {
+               destinationPrefix = "dynamicTopics/";
+               index = serviceName.indexOf(destinationPrefix);
+        }
+        if (index != -1) {
+            return serviceName.substring(index);
+        }
+       
+               return null;
+       }
+
+       public static AxisService createService(AxisConfiguration axisConfig, 
QName serviceQName, String port,
                                             String axisName, Definition 
wsdlDef, MessageReceiver receiver) throws AxisFault {
 
         WSDL11ToAxisServiceBuilder serviceBuilder = new 
WSDL11ToAxisServiceBuilder(wsdlDef, serviceQName, port);
@@ -144,7 +168,7 @@
         return axisService;
     }
 
-    private static String extractServiceName(Definition wsdlDefinition, QName 
wsdlServiceName, String portName)
+    public static String extractServiceName(Definition wsdlDefinition, QName 
wsdlServiceName, String portName, String baseUri)
             throws AxisFault {
         String url = null;
         Service service = wsdlDefinition.getService(wsdlServiceName);
@@ -164,7 +188,7 @@
             throw new OdeFault("Could not extract any soap:address from 
service WSDL definition " + wsdlServiceName
                     + " (necessary to establish the process target address)!");
         }
-        String serviceName = parseURLForService(url);
+        String serviceName = parseURLForService(url, baseUri);
         if (serviceName == null) {
             throw new OdeFault("The soap:address used for service WSDL 
definition " + wsdlServiceName + " and port "
                     + portName + " should be of the form 
http://hostname:port/ode/processes/myProcessEndpointName";);
@@ -176,12 +200,18 @@
      * Obtain the service name from the request URL. The request URL is 
expected to use the path "/processes/" under
      * which all processes and their services are listed. Returns null if the 
path does not contain this part.
      */
-    protected static String parseURLForService(String path) {
-        int index = path.indexOf("/processes/");
+    protected static String parseURLForService(String path, String baseUri) {
+       // Assume that path is HTTP-based, by default
+       String servicePrefix = "/processes/";
+       // Don't assume JMS-based paths start the same way 
+       if (path.startsWith("jms")) {
+               servicePrefix = "jms:/";
+       }
+        int index = path.indexOf(servicePrefix);
         if (-1 != index) {
             String service;
 
-            int serviceStart = index + "/processes/".length();
+            int serviceStart = index + servicePrefix.length();
             if (path.length() > serviceStart + 1) {
                 service = path.substring(serviceStart);
                 // Path may contain query string, not interesting for us.
@@ -189,6 +219,10 @@
                 if (queryIndex > 0) {
                     service = service.substring(0, queryIndex);
                 }
+                // Qualify shared JMS names with unique baseUri
+                if (path.startsWith("jms")) {
+                       service = baseUri + "/" + service;
+                }
                 return service;
             }
         }
@@ -241,4 +275,35 @@
         }
     }
 
+    /*
+     * Generates a URI of the following form:
+     *     ${deploy_bundleNcName}/${diagram_relativeURL}/${process_relativeURL}
+     * When a service name (local part only) is qualified (prefixed) with the 
above,
+     * it results in a unique identifier that may be used as that service's 
name.  
+     */
+       public static String deriveBaseServiceUri(ProcessConf pconf) {
+               if (pconf != null) {
+                       StringBuffer baseServiceUri = new StringBuffer();
+                       String bundleName = pconf.getPackage();
+                       if (bundleName != null) {
+                               baseServiceUri.append(bundleName).append("/");
+                               if (pconf.getBpelDocument() != null) {
+                                       String diagramName = 
pconf.getBpelDocument();
+                                       if (diagramName.indexOf(".") > 0) {
+                                               diagramName = 
diagramName.substring(0, diagramName.indexOf(".") - 1);
+                                       }
+                                       
baseServiceUri.append(diagramName).append("/");
+                                       String processName = pconf.getType() != 
null 
+                                               ? 
pconf.getType().getLocalPart() : null;
+                                       if (processName != null) {
+                                               
baseServiceUri.append(processName);
+                                               return 
baseServiceUri.toString();
+                                       }
+                               }
+                       }
+                       
+               }
+               return null;
+       }
+
 }


Reply via email to