[jboss-svn-commits] JBL Code SVN: r36854 - labs/jbossesb/branches/JBESB_4_9_CP/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/proxy.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 18 17:27:44 EDT 2011


Author: dward
Date: 2011-03-18 17:27:43 -0400 (Fri, 18 Mar 2011)
New Revision: 36854

Modified:
   labs/jbossesb/branches/JBESB_4_9_CP/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/proxy/SOAPProxy.java
Log:
Fix for JBESB-3585 "SOAPProxy needs to handle the document case where SOAPAction is not set"


Modified: labs/jbossesb/branches/JBESB_4_9_CP/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/proxy/SOAPProxy.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_9_CP/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/proxy/SOAPProxy.java	2011-03-18 21:26:05 UTC (rev 36853)
+++ labs/jbossesb/branches/JBESB_4_9_CP/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/proxy/SOAPProxy.java	2011-03-18 21:27:43 UTC (rev 36854)
@@ -28,18 +28,21 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.xml.namespace.QName;
 import javax.wsdl.Binding;
 import javax.wsdl.BindingOperation;
 import javax.wsdl.Definition;
+import javax.wsdl.Input;
 import javax.wsdl.Operation;
+import javax.wsdl.Part;
 import javax.wsdl.Port;
+import javax.wsdl.PortType;
 import javax.wsdl.Service;
 import javax.wsdl.extensions.ExtensibilityElement;
 import javax.wsdl.extensions.soap.SOAPAddress;
 import javax.wsdl.extensions.soap.SOAPOperation;
 import javax.wsdl.extensions.soap12.SOAP12Address;
 import javax.wsdl.extensions.soap12.SOAP12Operation;
+import javax.xml.namespace.QName;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
@@ -174,9 +177,11 @@
 	private MessagePayloadProxy payloadProxy;
 	
 	private Map<String,QName> soapaction_to_binding = new HashMap<String,QName>();
+	private Map<QName,QName> element_to_operation = new HashMap<QName,QName>();
 	private Map<QName,QName> operation_to_binding = new HashMap<QName,QName>();
 	private Map<QName,SOAPProxyTransport> binding_to_transport = new HashMap<QName,SOAPProxyTransport>();
 	
+	@SuppressWarnings({ "unchecked", "rawtypes" })
 	public SOAPProxy(ConfigTree config) throws ConfigurationException
 	{
 		payloadProxy = new MessagePayloadProxy(config);
@@ -199,6 +204,43 @@
 		Collection<Binding> bindings = wsdl_def.getBindings().values();
 		for ( Binding wsdl_bind : bindings )
 		{
+			PortType wsdl_portType = wsdl_bind.getPortType();
+			if (wsdl_portType != null)
+			{
+				Collection<Operation> operations = wsdl_portType.getOperations();
+				for (Operation wsdl_portType_oper : operations)
+				{
+					Input wsdl_portType_oper_input = wsdl_portType_oper.getInput();
+					if (wsdl_portType_oper_input != null)
+					{
+						javax.wsdl.Message wsdl_portType_oper_input_msg = wsdl_portType_oper_input.getMessage();
+						if (wsdl_portType_oper_input_msg != null)
+						{
+							Collection wsdl_portType_oper_input_msg_parts = wsdl_portType_oper_input_msg.getParts().values();
+							if (wsdl_portType_oper_input_msg_parts.size() != 1)
+							{
+								// size should only be 1 for document
+								continue;
+							}
+							Part wsdl_portType_oper_input_msg_part = (Part)wsdl_portType_oper_input_msg_parts.iterator().next();
+							QName element = wsdl_portType_oper_input_msg_part.getElementName();
+							if ( element != null && !element_to_operation.containsKey(element) )
+							{
+								QName operation = new QName(wsdl_portType.getQName().getNamespaceURI(), wsdl_portType_oper.getName());
+								// no need for a duplicate mapping
+								if ( operation != null && !element.equals(operation) )
+								{
+									element_to_operation.put(element, operation);
+									if ( logger.isInfoEnabled() )
+									{
+										logger.info("mapped element [" + element + "] to operation [" + operation + "]");
+									}
+								}
+							}
+						}
+					}
+				}
+			}
 			List<BindingOperation> operations = wsdl_bind.getBindingOperations();
 			for ( BindingOperation wsdl_bind_oper : operations )
 			{
@@ -237,7 +279,7 @@
 							}
 						}
 					}
-					QName operation = new QName(wsdl_bind.getPortType().getQName().getNamespaceURI(), wsdl_bind_oper.getOperation().getName());
+					QName operation = new QName(wsdl_portType.getQName().getNamespaceURI(), wsdl_bind_oper.getOperation().getName());
 					if ( operation != null && !operation_to_binding.containsKey(operation) )
 					{
 						operation_to_binding.put(operation, binding);
@@ -324,35 +366,40 @@
 	
 	public Message process(Message message) throws ActionProcessingException
 	{
-		String soapaction = null;
 		HttpRequest request = HttpRequest.getRequest(message);
-		if (request != null)
-		{
-			soapaction = request.getHeaderValue("soapaction");
-		}
+		String soapaction = (request != null) ? request.getHeaderValue("soapaction") : null;
 		if (soapaction == null)
 		{
 			soapaction = (String)message.getProperties().getProperty("soapaction");
 		}
+		QName element = null;
+		QName operation = null;
 		QName binding = (soapaction != null) ? soapaction_to_binding.get(soapaction) : null;
-		QName operation = null;
 		if (binding == null)
 		{
 			if ( logger.isEnabledFor(Level.WARN) )
 			{
-				logger.warn("null binding for soapaction [" + soapaction + "]; parsing envelope to discover operation...");
+				logger.warn("null binding for soapaction [" + soapaction + "]; parsing envelope to find element or operation...");
 			}
-			operation = getOperation(message);
-			binding = (operation != null) ? operation_to_binding.get(operation) : null;
-			if ( binding == null  && logger.isEnabledFor(Level.ERROR) )
+			element = findElement(message);
+			operation = element;
+			if (element != null)
 			{
-				logger.error("null binding for operation [" + operation + "] in addition to soapaction [" + soapaction + "]");
+				if ( element_to_operation.containsKey(element) )
+				{
+					operation = element_to_operation.get(element);
+				}
+				binding = (operation != null) ? operation_to_binding.get(operation) : null;
 			}
 		}
+		if ( binding == null  && logger.isEnabledFor(Level.ERROR) )
+		{
+			logger.error("null binding for element [" + element + "] or operation [" + operation + "] in addition to soapaction [" + soapaction + "]");
+		}
 		SOAPProxyTransport transport = (binding != null) ? binding_to_transport.get(binding) : null;
 		if (transport == null)
 		{
-			throw new ActionProcessingException("null transport for soapaction [" + soapaction + "], operation [" + operation + "], binding [" + binding + "]");
+			throw new ActionProcessingException("null transport for soapaction [" + soapaction + "], element [" + element + "], operation [" + operation + "], binding [" + binding + "]");
 		}
 		if ( logger.isDebugEnabled() )
 		{
@@ -368,9 +415,45 @@
 			transport.destroy();
 		}
 	}
-	
+
+	/** Get the endpoint address from the ports extensible element
+	*/
+	private String getSOAPAddress(Port srcPort) throws ConfigurationException
+	{
+		String soapAddress = "dummy";
+
+		@SuppressWarnings("unchecked")
+		List<ExtensibilityElement> elements = srcPort.getExtensibilityElements();
+		for ( ExtensibilityElement extElement : elements )
+		{
+			QName elementType = extElement.getElementType();
+
+			if ( extElement instanceof SOAPAddress )
+			{
+				SOAPAddress	addr = (SOAPAddress)extElement;
+				soapAddress	= addr.getLocationURI();
+				break;
+			}
+			else if ( extElement instanceof	SOAP12Address )
+			{
+				SOAP12Address addr = (SOAP12Address)extElement;
+				soapAddress	= addr.getLocationURI();
+				break;
+			}
+			else if ("address".equals(elementType.getLocalPart()))
+			{
+				logger.warn("Unprocessed extension element: " + elementType);
+			}
+		}
+
+		if (soapAddress == null)
+			throw new ConfigurationException("Cannot obtain SOAP address");
+
+		return soapAddress;
+	}
+
 	// This is a best guess (and potentially expensive)!  See logger.warn(String) warning in process(Message) above.
-	private QName getOperation(Message message) throws ActionProcessingException
+	private QName findElement(Message message) throws ActionProcessingException
 	{
 		Object payload;
 		try
@@ -404,8 +487,8 @@
 		{
 			throw new ActionProcessingException( "unsupported payload type: " + payload.getClass().getName() );
 		}
-		QName operation = null;
-		ContentHandler ch = new OperationFinder();
+		QName element = null;
+		ContentHandler ch = new ElementFinder();
 		try
 		{
 			XMLReader xr = XMLReaderFactory.createXMLReader();
@@ -420,50 +503,15 @@
 		{
 			throw new ActionProcessingException(ioe);
 		}
-		catch (OperationFinder.OperationFound of)
+		catch (ElementFinder.ElementFound ef)
 		{
-			operation = of.operation;
+			element = ef.element;
 		}
-		return operation;
+		return element;
 	}
 
-	/** Get the endpoint address from the ports extensible element
-	*/
-	private String getSOAPAddress(Port srcPort) throws ConfigurationException
+	private static class ElementFinder extends DefaultHandler
 	{
-		String soapAddress = "dummy";
-
-		List<ExtensibilityElement> elements = srcPort.getExtensibilityElements();
-		for ( ExtensibilityElement extElement : elements )
-		{
-			QName elementType = extElement.getElementType();
-
-			if ( extElement instanceof SOAPAddress )
-			{
-				SOAPAddress	addr = (SOAPAddress)extElement;
-				soapAddress	= addr.getLocationURI();
-				break;
-			}
-			else if ( extElement instanceof	SOAP12Address )
-			{
-				SOAP12Address addr = (SOAP12Address)extElement;
-				soapAddress	= addr.getLocationURI();
-				break;
-			}
-			else if ("address".equals(elementType.getLocalPart()))
-			{
-				logger.warn("Unprocessed extension element: " + elementType);
-			}
-		}
-
-		if (soapAddress == null)
-			throw new ConfigurationException("Cannot obtain SOAP address");
-
-		return soapAddress;
-	}
-
-	private static class OperationFinder extends DefaultHandler
-	{
 		
 		private boolean insideEnvelope = false;
 		private boolean insideBody = false;
@@ -482,19 +530,19 @@
 			else if (insideEnvelope && insideBody)
 			{
 				// stop parsing as soon as possible!
-				throw new OperationFound( new QName(uri, localName) );
+				throw new ElementFound( new QName(uri, localName) );
 			}
 		}
 		
 		@SuppressWarnings("serial")
-		private static class OperationFound extends RuntimeException
+		private static class ElementFound extends RuntimeException
 		{
 			
-			private QName operation;
+			private QName element;
 			
-			private OperationFound(QName operation)
+			private ElementFound(QName element)
 			{
-				this.operation = operation;
+				this.element = element;
 			}
 			
 		}



More information about the jboss-svn-commits mailing list