Author: alex.guizar(a)jboss.com
Date: 2009-11-27 01:27:43 -0500 (Fri, 27 Nov 2009)
New Revision: 343
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WSDLParser.java
Log:
RIFTSAW-118: scan only input messages reachable from the receiving port when resolving
doc/lit operation
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java
===================================================================
---
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java 2009-11-27
03:32:13 UTC (rev 342)
+++
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/SOAPMessageAdapter.java 2009-11-27
06:27:43 UTC (rev 343)
@@ -333,19 +333,21 @@
// Extracting whatever header elements we find in the message, binding and
abstract parts
// aren't reliable enough given what people do out there.
- Iterator headersIter = soapHeader.getChildElements();
- while (headersIter.hasNext()) {
- javax.xml.soap.SOAPHeaderElement headerElem = (javax.xml.soap.SOAPHeaderElement)
headersIter.next();
- String partName = findHeaderPartName(headerDefs,
headerElem.getElementQName());
- Document doc = DOMUtils.newDocument();
-
- // RIFTSAW-74 - slight modification to avoid jbossws exception when
reconstructing the
- // SOAP message.
-
- //Element destPart = doc.createElementNS(null, partName);
- //destPart.appendChild(doc.importNode(headerElem, true));
- //odeMessage.setHeaderPart(partName, destPart);
- odeMessage.setHeaderPart(partName, (Element)doc.importNode(headerElem,
true));
+ if (soapHeader != null) {
+ Iterator headersIter = soapHeader.getChildElements();
+ while (headersIter.hasNext()) {
+ javax.xml.soap.SOAPHeaderElement headerElem = (javax.xml.soap.SOAPHeaderElement)
headersIter.next();
+ String partName = findHeaderPartName(headerDefs, headerElem.getElementQName());
+ Document doc = DOMUtils.newDocument();
+
+ // RIFTSAW-74 - slight modification to avoid jbossws exception when
reconstructing the
+ // SOAP message.
+
+ //Element destPart = doc.createElementNS(null, partName);
+ //destPart.appendChild(doc.importNode(headerElem, true));
+ //odeMessage.setHeaderPart(partName, destPart);
+ odeMessage.setHeaderPart(partName, (Element)doc.importNode(headerElem, true));
+ }
}
}
catch (SOAPException e)
@@ -369,13 +371,14 @@
javax.wsdl.Message msgType) {
// Is this header part of the "payload" messsage?
boolean payloadMessageHeader = headerdef.getMessage() == null ||
headerdef.getMessage().equals(msgType.getQName());
- boolean requiredHeader = payloadMessageHeader || (headerdef.getRequired() != null
&& headerdef.getRequired());
+ boolean requiredHeader = payloadMessageHeader ||
Boolean.TRUE.equals(headerdef.getRequired());
- if (requiredHeader && header == null)
- throw new RuntimeException("Soap Header is missing a required field " +
headerdef.getElementType());
+ if (header == null) {
+ if (requiredHeader)
+ throw new RuntimeException("Soap Header is missing a required field " +
headerdef.getElementType());
- if (header == null)
- return;
+ return;
+ }
javax.wsdl.Message hdrMsg = wsdl.getMessage(headerdef.getMessage());
if (hdrMsg == null)
Modified:
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WSDLParser.java
===================================================================
---
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WSDLParser.java 2009-11-27
03:32:13 UTC (rev 342)
+++
trunk/runtime/engine/src/main/java/org/jboss/soa/bpel/runtime/ws/WSDLParser.java 2009-11-27
06:27:43 UTC (rev 343)
@@ -25,6 +25,7 @@
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.xml.namespace.QName;
import java.net.URL;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -50,81 +51,54 @@
public Operation getDocLitOperation(QName service, String port, QName payloadName)
{
reset();
- return _getDocLitOperation(this.wsdlDefinition, service, port, payloadName);
+ Operation result = _getDocLitOperation(this.wsdlDefinition, service, port,
payloadName);
+ if (result == null)
+ throw new IllegalArgumentException("Unable to find operation for element
"+payloadName);
+ return result;
}
- private Operation _getDocLitOperation(Definition wsdl, QName service, String port,
QName payloadName)
+ @SuppressWarnings("unchecked")
+ private Operation _getDocLitOperation(Definition wsdl, QName serviceName, String
portName, QName payloadName)
{
- Operation match = null;
- dfsDepth++;
+ if(++dfsDepth>50) // easier then retaining references
+ throw new IllegalStateException("Recursive loop detected. DFS depth reached
limit");
- if(dfsDepth>50) // easier then retaining references
- throw new IllegalStateException("Recursive loop detected. DFS depth reached
limit");
-
// namespace / java.util.List of imports
- Map<String, List<Import>> imports = wsdl.getImports();
- for(String ns : imports.keySet())
+ Collection<List<Import>> imports = wsdl.getImports().values();
+ for(List<Import> importNS : imports)
{
- List<Import> importNS = imports.get(ns);
for(Import wsdlImport : importNS)
{
- Operation result = _getDocLitOperation(wsdlImport.getDefinition(), service, port,
payloadName);
+ Operation result = _getDocLitOperation(wsdlImport.getDefinition(), serviceName,
portName, payloadName);
if(result!=null)
- {
- match = result;
- break;
- }
+ return result;
}
-
- if(match!=null) break;
}
- if(match!=null) // DFS results
- return match;
-
- // resolve wsdl:message
- Map<QName, Message> messages = wsdl.getMessages();
- QName relatedMessage = null;
- for(QName qname : messages.keySet())
- {
- Message candidate = messages.get(qname);
- Map<String, Part> parts = candidate.getParts();
- for(String s : parts.keySet())
- {
- Part p = parts.get(s);
- if(p.getElementName().equals(payloadName))
- {
- relatedMessage = qname;
- break;
- }
- }
- }
-
- if(null==relatedMessage)
- throw new IllegalArgumentException("Unable to find WSDL Message for element
"+payloadName);
-
// resolve the port & operation
- Operation relatedOperation = null;
+ Service service = wsdl.getService(serviceName);
+ if (service == null)
+ return null; // service might be defined elsewhere
- Service s = wsdl.getService(service);
- Port p = s.getPort(port);
- Binding b = p.getBinding();
+ Port port = service.getPort(portName);
+ if (port == null)
+ throw new IllegalArgumentException("service "+serviceName+" contains
no such port "+portName);
- PortType portType = b.getPortType();
+ Binding binding = port.getBinding();
+ PortType portType = binding.getPortType();
List<Operation> operations = portType.getOperations();
for(Operation op : operations)
{
- if(op.getInput().getMessage().getQName().equals(relatedMessage))
+ Message message = op.getInput().getMessage();
+ Collection<Part> parts = message.getParts().values();
+ for(Part part : parts)
{
- relatedOperation = op;
- break;
+ if(part.getElementName().equals(payloadName))
+ return op;
}
}
- if(null==relatedOperation)
- throw new IllegalArgumentException("Unable to find WSDL Operation for Message
"+relatedMessage);
-
- return relatedOperation;
+ return null;
}
public URL getServiceLocationURL(QName serviceQName, String portName)