You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2008/07/16 21:23:05 UTC
svn commit: r677385 - in /cxf/trunk:
api/src/main/java/org/apache/cxf/service/model/
rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/
tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/
Author: dkulp
Date: Wed Jul 16 12:23:05 2008
New Revision: 677385
URL: http://svn.apache.org/viewvc?rev=677385&view=rev
Log:
[CXF-1696] Fix problems occuring when a wsdl is used that has out of band headers using the same part names as parts in the real message.
Modified:
cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java
cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java Wed Jul 16 12:23:05 2008
@@ -33,6 +33,7 @@
private OperationInfo operation;
private Map<QName, MessagePartInfo> messageParts
= new LinkedHashMap<QName, MessagePartInfo>(4);
+ private List<MessagePartInfo> outOfBandParts;
/**
* Initializes a new instance of the <code>MessagePartContainer</code>.
@@ -102,6 +103,12 @@
}
i++;
}
+ for (MessagePartInfo p : getOutOfBandParts()) {
+ if (part == p) {
+ return i;
+ }
+ i++;
+ }
return -1;
}
@@ -111,6 +118,11 @@
return p;
}
}
+ for (MessagePartInfo p : getOutOfBandParts()) {
+ if (p.getIndex() == i) {
+ return p;
+ }
+ }
return null;
}
@@ -141,6 +153,12 @@
}
}
}
+ for (MessagePartInfo mpi2 : getOutOfBandParts()) {
+ if (name.equals(mpi2.getName())
+ || name.equals(mpi2.getConcreteName())) {
+ return mpi2;
+ }
+ }
return mpi;
}
@@ -154,7 +172,7 @@
if (n == -1) {
return null;
}
- for (MessagePartInfo mpi : messageParts.values()) {
+ for (MessagePartInfo mpi : getMessageParts()) {
if (n == 0) {
return mpi;
}
@@ -163,17 +181,42 @@
return null;
}
+
+ public MessagePartInfo addOutOfBandMessagePart(QName name) {
+ if (name == null) {
+ throw new IllegalArgumentException("Invalid name [" + name + "]");
+ }
+
+ MessagePartInfo part = new MessagePartInfo(name, this);
+ if (outOfBandParts == null) {
+ outOfBandParts = new ArrayList<MessagePartInfo>(1);
+ }
+ part.setIndex(messageParts.size() + outOfBandParts.size());
+ outOfBandParts.add(part);
+ return part;
+ }
+
+
+
/**
* Returns all message parts for this message.
*
* @return all message parts.
*/
public List<MessagePartInfo> getMessageParts() {
- return Collections.unmodifiableList(new ArrayList<MessagePartInfo>(messageParts.values()));
+ List<MessagePartInfo> parts = new ArrayList<MessagePartInfo>(messageParts.values());
+ parts.addAll(getOutOfBandParts());
+ return Collections.unmodifiableList(parts);
+ }
+ public List<MessagePartInfo> getOutOfBandParts() {
+ if (outOfBandParts == null) {
+ return Collections.emptyList();
+ }
+ return Collections.unmodifiableList(outOfBandParts);
}
public int size() {
- return messageParts.size();
+ return messageParts.size() + getOutOfBandParts().size();
}
Modified: cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java Wed Jul 16 12:23:05 2008
@@ -41,6 +41,10 @@
mInfo = info;
pname = n;
}
+
+ public void setMessageContainer(AbstractMessageContainer info) {
+ mInfo = info;
+ }
/**
* @return Returns the name.
Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java Wed Jul 16 12:23:05 2008
@@ -500,8 +500,13 @@
if (StringUtils.isEmpty(partNameFilter)
|| part.getName().equals(partNameFilter)) {
- MessagePartInfo pi = minfo.addMessagePart(new QName(minfo.getName().getNamespaceURI(), part
- .getName()));
+ QName pqname = new QName(minfo.getName().getNamespaceURI(), part.getName());
+ MessagePartInfo pi = minfo.addOutOfBandMessagePart(pqname);
+
+ if (!minfo.getName().equals(msg.getQName())) {
+ pi.setMessageContainer(new MessageInfo(minfo.getOperation(), null, msg.getQName()));
+ }
+
if (part.getTypeName() != null) {
pi.setTypeQName(part.getTypeName());
pi.setElement(false);
@@ -577,8 +582,19 @@
for (SoapHeader header : headers) {
SoapHeaderInfo headerInfo = new SoapHeaderInfo();
headerInfo.setUse(header.getUse());
- MessagePartInfo part = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
- .getPart()));
+ MessagePartInfo part = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
+ header.getPart()));
+ if (part != null && header.getMessage() != null
+ && !part.getMessageInfo().getName().equals(header.getMessage())) {
+ part = null;
+ //out of band, let's find it
+ for (MessagePartInfo mpi : msg.getOutOfBandParts()) {
+ if (mpi.getName().getLocalPart().equals(header.getPart())
+ && mpi.getMessageInfo().getName().equals(header.getMessage())) {
+ part = mpi;
+ }
+ }
+ }
if (part != null) {
headerInfo.setPart(part);
messageParts.remove(part);
@@ -609,54 +625,9 @@
List<MessagePartInfo> bodyParts = new ArrayList<MessagePartInfo>();
for (Iterator itr = parts.iterator(); itr.hasNext();) {
Object part = itr.next();
- String partName = null;
if (part instanceof MIMEPart) {
MIMEPart mpart = (MIMEPart) part;
- if (mpart.getExtensibilityElements().size() < 1) {
- throw new RuntimeException("MIMEPart should at least contain one element!");
- }
- for (Object content : mpart.getExtensibilityElements()) {
- if (content instanceof MIMEContent) {
- MIMEContent mc = (MIMEContent)content;
- partName = mc.getPart();
-
- if (attParts == null) {
- attParts = new LinkedList<MessagePartInfo>();
- }
-
- MessagePartInfo mpi =
- msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
- partName));
- mpi.setProperty(Message.CONTENT_TYPE, mc.getType());
- attParts.add(mpi);
- // Attachments shouldn't be part of the body message
- bmsg.getMessageParts().remove(mpi);
- } else if (SOAPBindingUtil.isSOAPBody(content)) {
- SoapBody sb = SOAPBindingUtil.getSoapBody(content);
- if (sb.getParts() != null && sb.getParts().size() == 1) {
- partName = (String) sb.getParts().get(0);
- }
-
- // We can have a list of empty part names here.
- if (partName != null) {
- addSoapBodyPart(msg, bodyParts, partName);
- }
- } else if (SOAPBindingUtil.isSOAPHeader(content)) {
- SoapHeader header = SOAPBindingUtil.getSoapHeader(content);
-
- SoapHeaderInfo headerInfo = new SoapHeaderInfo();
- headerInfo.setUse(header.getUse());
- MessagePartInfo mpi =
- msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
- .getPart()));
- if (mpi != null) {
- headerInfo.setPart(mpi);
- messageParts.remove(part);
- bmsg.getMessageParts().remove(mpi);
- bmsg.addExtensor(headerInfo);
- }
- }
- }
+ attParts = handleMimePart(mpart, attParts, msg, bmsg, bodyParts, messageParts);
} else {
addSoapBodyPart(msg, bodyParts, (String)part);
}
@@ -669,6 +640,75 @@
bmsg.addExtensor(bodyInfo);
}
+
+ private List<MessagePartInfo> handleMimePart(MIMEPart mpart,
+ List<MessagePartInfo> attParts,
+ MessageInfo msg,
+ BindingMessageInfo bmsg,
+ List<MessagePartInfo> bodyParts,
+ List<MessagePartInfo> messageParts) {
+ if (mpart.getExtensibilityElements().size() < 1) {
+ throw new RuntimeException("MIMEPart should at least contain one element!");
+ }
+ String partName = null;
+ for (Object content : mpart.getExtensibilityElements()) {
+ if (content instanceof MIMEContent) {
+ MIMEContent mc = (MIMEContent)content;
+ partName = mc.getPart();
+
+ if (attParts == null) {
+ attParts = new LinkedList<MessagePartInfo>();
+ }
+
+ MessagePartInfo mpi =
+ msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
+ partName));
+ mpi.setProperty(Message.CONTENT_TYPE, mc.getType());
+ attParts.add(mpi);
+ // Attachments shouldn't be part of the body message
+ bmsg.getMessageParts().remove(mpi);
+ } else if (SOAPBindingUtil.isSOAPBody(content)) {
+ SoapBody sb = SOAPBindingUtil.getSoapBody(content);
+ if (sb.getParts() != null && sb.getParts().size() == 1) {
+ partName = (String) sb.getParts().get(0);
+ }
+
+ // We can have a list of empty part names here.
+ if (partName != null) {
+ addSoapBodyPart(msg, bodyParts, partName);
+ }
+ } else if (SOAPBindingUtil.isSOAPHeader(content)) {
+ SoapHeader header = SOAPBindingUtil.getSoapHeader(content);
+
+ SoapHeaderInfo headerInfo = new SoapHeaderInfo();
+ headerInfo.setUse(header.getUse());
+ MessagePartInfo mpi =
+ msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
+ .getPart()));
+
+ if (mpi != null && header.getMessage() != null
+ && !mpi.getMessageInfo().getName().equals(header.getMessage())) {
+ mpi = null;
+ //out of band, let's find it
+ for (MessagePartInfo mpi2 : msg.getOutOfBandParts()) {
+ if (mpi2.getName().getLocalPart().equals(header.getPart())
+ && mpi2.getMessageInfo().getName().equals(header.getMessage())) {
+ mpi = mpi2;
+ }
+ }
+ }
+
+ if (mpi != null) {
+ headerInfo.setPart(mpi);
+ messageParts.remove(mpart);
+ bmsg.getMessageParts().remove(mpi);
+ bmsg.addExtensor(headerInfo);
+ }
+ }
+ }
+ return attParts;
+ }
+
private void addSoapBodyPart(MessageInfo msg, List<MessagePartInfo> bodyParts, String partName) {
MessagePartInfo mpi = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
partName));
Modified: cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl (original)
+++ cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl Wed Jul 16 12:23:05 2008
@@ -73,14 +73,14 @@
</wsdl:portType>
<wsdl:message name="CallerIDHeader">
- <wsdl:part name="callerID" element="types:CallerIDHeader"/>
+ <wsdl:part name="parameters" element="types:CallerIDHeader"/>
</wsdl:message>
<wsdl:message name="OrderPizzaRequest">
- <wsdl:part name="body" element="types:OrderPizza"/>
+ <wsdl:part name="parameters" element="types:OrderPizza"/>
</wsdl:message>
<wsdl:message name="OrderPizzaResponse">
- <wsdl:part name="body" element="types:OrderPizzaResponse"/>
+ <wsdl:part name="parameters" element="types:OrderPizzaResponse"/>
</wsdl:message>
<wsdl:binding name="PizzaPortBinding" type="tns:Pizza">
@@ -88,7 +88,7 @@
<wsdl:operation name="OrderPizza">
<soap:operation soapAction=""/>
<wsdl:input>
- <soap:header message="tns:CallerIDHeader" part="callerID" use="literal" />
+ <soap:header message="tns:CallerIDHeader" part="parameters" use="literal" />
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>