Added: incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisDispatcher.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisDispatcher.java?rev=421429&view=auto ============================================================================== --- incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisDispatcher.java (added) +++ incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisDispatcher.java Wed Jul 12 14:54:59 2006 @@ -0,0 +1,129 @@ +package com.fs.pxe.axis2.hooks; + + +import org.apache.axiom.om.OMElement; +import org.apache.axis2.AxisFault; +import org.apache.axis2.addressing.EndpointReference; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.HandlerDescription; +import org.apache.axis2.engine.AbstractDispatcher; +import org.apache.axis2.engine.AxisConfiguration; +import org.apache.axis2.i18n.Messages; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.xml.namespace.QName; + + +/** + * Dispatches the service based on the information from the target endpoint URL. + */ +public class PXEAxisDispatcher extends AbstractDispatcher { + + /** + * Field NAME + */ + public static final QName NAME = new QName("http://pxe.intalio.org/", + "PXEAxisDispatcher"); + private static final Log log = LogFactory.getLog(PXEAxisDispatcher.class); + QName operationName = null; + + + public AxisOperation findOperation(AxisService service, MessageContext messageContext) + throws AxisFault { + AxisOperation operation; + + // Start with the wsaAction. We assume wsaAction is the more reliable + // way to identify the operation. + String action = messageContext.getWSAAction(); + if (action != null) { + log.debug(Messages.getMessage("checkingoperation", action)); + operation = service.getOperationByAction(action); + if (operation != null) + return operation; + } + + // Failing that, look at the body of the SOAP message. We expect one + // element that has the same (local) name as the operation. This works + // well for RPC, not always for Doc/Lit. + OMElement bodyFirstChild = messageContext.getEnvelope().getBody().getFirstElement(); + if (bodyFirstChild != null) { + String localName = bodyFirstChild.getLocalName(); + log.debug("Checking for Operation using SOAP message body's first child's local name : " + + localName); + operation = service.getOperation(new QName(localName)); + if (operation != null) + return operation; + + // Of course, the element name most likely uses the suffix + // Request or Response, so look for those and strip them. + int index = localName.lastIndexOf("Request"); + if (index + "Request".length() == localName.length()) { + return service.getOperation(new QName(localName.substring(0, index))); + } + index = localName.lastIndexOf("Response"); + if (index + "Response".length() == localName.length()) { + return service.getOperation(new QName(localName.substring(0, index))); + } + } + + return null; + } + + /* + * (non-Javadoc) + * @see org.apache.axis2.engine.AbstractDispatcher#findService(org.apache.axis2.context.MessageContext) + */ + public AxisService findService(MessageContext messageContext) throws AxisFault { + EndpointReference toEPR = messageContext.getTo(); + + if (toEPR != null) { + log.debug("Checking for Service using target endpoint address : " + toEPR.getAddress()); + + // The only thing we understand if a service name that + // follows /processes/ in the request URL. + String path = parseRequestURLForService(toEPR.getAddress()); + if (path != null) { + AxisConfiguration registry = + messageContext.getConfigurationContext().getAxisConfiguration(); + return registry.getService(path); + } + } + + return null; + } + + + public void initDispatcher() { + init(new HandlerDescription(NAME)); + } + + + /** + * 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 String parseRequestURLForService(String path) { + int index = path.indexOf("/processes/"); + if (-1 != index) { + String service; + + int serviceStart = index + "/processes/".length(); + if (path.length() > serviceStart + 1) { + service = path.substring(serviceStart); + // Path may contain query string, not interesting for us. + int queryIndex = service.indexOf('?'); + if (queryIndex > 0) { + service = service.substring(0, queryIndex); + } + return service; + } + } + return null; + } + +}
Added: incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisService.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisService.java?rev=421429&view=auto ============================================================================== --- incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisService.java (added) +++ incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisService.java Wed Jul 12 14:54:59 2006 @@ -0,0 +1,40 @@ +package com.fs.pxe.axis2.hooks; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.WSDL2AxisServiceBuilder; +import org.apache.axis2.engine.AxisConfiguration; + +import javax.wsdl.Definition; +import javax.xml.namespace.QName; +import java.util.Iterator; + +/** + * Implementation of Axis Service used by PXE iapi to enlist itself + * its service. Allows us to build the service using a WSDL definition + * using our own receiver. + */ +public class PXEAxisService extends AxisService { + + public static AxisService createService(AxisConfiguration axisConfig, Definition wsdlDefinition, + QName wsdlServiceName, String portName) throws AxisFault { + WSDL2AxisServiceBuilder serviceBuilder = + new WSDL2AxisServiceBuilder(wsdlDefinition, wsdlServiceName, portName); + serviceBuilder.setServerSide(true); + AxisService axisService = serviceBuilder.populateService(); + axisService.setName(wsdlServiceName.getLocalPart()); + axisService.setWsdlfound(true); + axisService.setClassLoader(axisConfig.getServiceClassLoader()); + + Iterator operations = axisService.getOperations(); + PXEMessageReceiver msgReceiver = new PXEMessageReceiver(); + while (operations.hasNext()) { + AxisOperation operation = (AxisOperation) operations.next(); + if (operation.getMessageReceiver() == null) { + operation.setMessageReceiver(msgReceiver); + } + } + return axisService; + } +} Added: incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisServlet.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisServlet.java?rev=421429&view=auto ============================================================================== --- incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisServlet.java (added) +++ incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEAxisServlet.java Wed Jul 12 14:54:59 2006 @@ -0,0 +1,35 @@ +package com.fs.pxe.axis2.hooks; + +import com.fs.pxe.axis2.PXEServer; +import org.apache.axis2.transport.http.AxisServlet; +import org.apache.axis2.AxisFault; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; + +/** + * Overrides standard AxisServlet to handle our service configurations and + * deployment ourselves. + */ +public class PXEAxisServlet extends AxisServlet { + + private PXEServer _pxeServer; + + /** + * Initialize the Axis configuration context + * + * @param config Servlet configuration + * @throws ServletException + */ + public void init(ServletConfig config) throws ServletException { + super.init(config); + _pxeServer = new PXEServer(); + _pxeServer.init(config, axisConfiguration); + } + + public void stop() throws AxisFault { + super.stop(); + _pxeServer.shutDown(); + } + +} Added: incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEMessageReceiver.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEMessageReceiver.java?rev=421429&view=auto ============================================================================== --- incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEMessageReceiver.java (added) +++ incubator/ode/scratch/pxe-iapi/axis2/src/main/java/com/fs/pxe/axis2/hooks/PXEMessageReceiver.java Wed Jul 12 14:54:59 2006 @@ -0,0 +1,78 @@ +package com.fs.pxe.axis2.hooks; + +import com.fs.pxe.axis2.PXEService; +import org.apache.axis2.AxisFault; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.engine.AxisEngine; +import org.apache.axis2.receivers.AbstractMessageReceiver; +import org.apache.axis2.util.Utils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.concurrent.ExecutorService; + +/** + * Receives messages forwarded by Axis. + */ +public class PXEMessageReceiver extends AbstractMessageReceiver { + + private static final Log __log = LogFactory.getLog(PXEMessageReceiver.class); + + private PXEService _service; + private ExecutorService _executorService; + + public final void receive(final MessageContext msgContext) throws AxisFault { + if (__log.isDebugEnabled()) + __log.debug("Received message for " + msgContext.getAxisService().getName() + + "." + msgContext.getAxisOperation().getName()); + if (hasResponse(msgContext.getAxisOperation())) { + // Client is expecting a response, running in the same thread + MessageContext outMsgContext = Utils.createOutMessageContext(msgContext); + outMsgContext.getOperationContext().addMessageContext(outMsgContext); + invokeBusinessLogic(msgContext, outMsgContext); + if (__log.isDebugEnabled()) { + __log.debug("Reply for " + msgContext.getAxisService().getName() + + "." + msgContext.getAxisOperation().getName()); + __log.debug("Reply message " + outMsgContext.getEnvelope()); + } + AxisEngine engine = new AxisEngine( + msgContext.getOperationContext().getServiceContext().getConfigurationContext()); + engine.send(outMsgContext); + } else { + // No response expected, this thread doesn't need us + _executorService.submit(new Runnable() { + public void run() { + try { + invokeBusinessLogic(msgContext, null); + } catch (AxisFault axisFault) { + __log.error("Error process in-only message.", axisFault); + } + } + }); + } + } + + private void invokeBusinessLogic(MessageContext msgContext, MessageContext outMsgContext) + throws AxisFault { + _service.onAxisMessageExchange(msgContext, outMsgContext, getSOAPFactory(msgContext)); + } + + public void setService(PXEService service) { + _service = service; + } + + public void setExecutorService(ExecutorService executorService) { + _executorService = executorService; + } + + private boolean hasResponse(AxisOperation op) { + switch(op.getAxisSpecifMEPConstant()) { + case AxisOperation.MEP_CONSTANT_IN_OUT: return true; + case AxisOperation.MEP_CONSTANT_OUT_ONLY: return true; + case AxisOperation.MEP_CONSTANT_OUT_OPTIONAL_IN: return true; + case AxisOperation.MEP_CONSTANT_ROBUST_OUT_ONLY: return true; + default: return false; + } + } +} Modified: incubator/ode/scratch/pxe-iapi/bpel-dd/src/main/xsd/dd.xsdconfig URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/bpel-dd/src/main/xsd/dd.xsdconfig?rev=421429&r1=421428&r2=421429&view=diff ============================================================================== --- incubator/ode/scratch/pxe-iapi/bpel-dd/src/main/xsd/dd.xsdconfig (original) +++ incubator/ode/scratch/pxe-iapi/bpel-dd/src/main/xsd/dd.xsdconfig Wed Jul 12 14:54:59 2006 @@ -2,7 +2,7 @@ xmlns:dd="http://pxe.fivesight.com/schemas/2006/06/27/dd"> <xb:namespace uri="http://pxe.fivesight.com/schemas/2006/06/27/dd"> - <xb:package>com.fs.pxe.axis.dd</xb:package> + <xb:package>com.fs.pxe.axis2.dd</xb:package> </xb:namespace> <xb:namespace uri="##any"> Modified: incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/BpelServerImpl.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/BpelServerImpl.java?rev=421429&r1=421428&r2=421429&view=diff ============================================================================== --- incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/BpelServerImpl.java (original) +++ incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/BpelServerImpl.java Wed Jul 12 14:54:59 2006 @@ -24,7 +24,7 @@ import com.fs.pxe.bpel.pmapi.BpelManagementFacade; import com.fs.pxe.bpel.runtime.ExpressionLanguageRuntimeRegistry; import com.fs.pxe.bom.wsdl.Definition4BPEL; -import com.fs.pxe.axis.dd.TDeployment; +import com.fs.pxe.axis2.dd.TDeployment; import com.fs.utils.msg.MessageBundle; import java.io.*; Modified: incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/ProcessDDInitializer.java URL: http://svn.apache.org/viewvc/incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/ProcessDDInitializer.java?rev=421429&r1=421428&r2=421429&view=diff ============================================================================== --- incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/ProcessDDInitializer.java (original) +++ incubator/ode/scratch/pxe-iapi/bpel-runtime/src/main/java/com/fs/pxe/bpel/engine/ProcessDDInitializer.java Wed Jul 12 14:54:59 2006 @@ -10,9 +10,9 @@ import com.fs.pxe.bpel.iapi.BpelEngineException; import com.fs.pxe.bpel.iapi.EndpointReference; import com.fs.pxe.bom.wsdl.Definition4BPEL; -import com.fs.pxe.axis.dd.TDeployment; -import com.fs.pxe.axis.dd.TInvoke; -import com.fs.pxe.axis.dd.TProvide; +import com.fs.pxe.axis2.dd.TDeployment; +import com.fs.pxe.axis2.dd.TInvoke; +import com.fs.pxe.axis2.dd.TProvide; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Element;
