[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