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/09/03 20:13:05 UTC
svn commit: r691706 - in /cxf/trunk:
common/common/src/main/java/org/apache/cxf/staxutils/
distribution/bundle/all/ distribution/bundle/jaxrs/
distribution/bundle/minimal/ parent/
rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ ...
Author: dkulp
Date: Wed Sep 3 11:13:05 2008
New Revision: 691706
URL: http://svn.apache.org/viewvc?rev=691706&view=rev
Log:
[CXF-1778, CXF-1781] Fix memory leak with ws-addressing if server is down
Make sure we process the mustUnderstand headers
If List<Header> contains SoapHeader objects, make sure we write the mustUnderstand/actor stuff out
Remove dependency on stax-utils
Added:
cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java (with props)
Modified:
cxf/trunk/distribution/bundle/all/pom.xml
cxf/trunk/distribution/bundle/jaxrs/pom.xml
cxf/trunk/distribution/bundle/minimal/pom.xml
cxf/trunk/parent/pom.xml
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java
cxf/trunk/rt/databinding/aegis/pom.xml
cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/xml/SourceType.java
cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
cxf/trunk/rt/javascript/pom.xml
cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHdrServiceImpl.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java
Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java?rev=691706&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java Wed Sep 3 11:13:05 2008
@@ -0,0 +1,167 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.staxutils;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+
+public class DelegatingXMLStreamWriter implements XMLStreamWriter {
+ XMLStreamWriter delegate;
+
+ public DelegatingXMLStreamWriter(XMLStreamWriter del) {
+ delegate = del;
+ }
+
+ public void close() throws XMLStreamException {
+ delegate.close();
+ }
+
+ public void flush() throws XMLStreamException {
+ delegate.flush();
+ }
+
+ public NamespaceContext getNamespaceContext() {
+ return delegate.getNamespaceContext();
+ }
+
+
+
+
+ public String getPrefix(String uri) throws XMLStreamException {
+ return delegate.getPrefix(uri);
+ }
+
+ public Object getProperty(String name) throws IllegalArgumentException {
+ return delegate.getProperty(name);
+ }
+
+ public void setDefaultNamespace(String uri) throws XMLStreamException {
+ delegate.setDefaultNamespace(uri);
+ }
+
+ public void setNamespaceContext(NamespaceContext ctx) throws XMLStreamException {
+ delegate.setNamespaceContext(ctx);
+ }
+
+ public void setPrefix(String pfx, String uri) throws XMLStreamException {
+ delegate.setPrefix(pfx, uri);
+ }
+
+ public void writeAttribute(String prefix, String uri,
+ String local, String value) throws XMLStreamException {
+ delegate.writeAttribute(prefix, uri, local, value);
+ }
+
+ public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
+ delegate.writeAttribute(uri, local, value);
+ }
+
+ public void writeAttribute(String local, String value) throws XMLStreamException {
+ delegate.writeAttribute(local, value);
+ }
+
+ public void writeCData(String cdata) throws XMLStreamException {
+ delegate.writeCData(cdata);
+ }
+
+ public void writeCharacters(char[] arg0, int arg1, int arg2) throws XMLStreamException {
+ delegate.writeCharacters(arg0, arg1, arg2);
+ }
+
+ public void writeCharacters(String text) throws XMLStreamException {
+ delegate.writeCharacters(text);
+ }
+
+ public void writeComment(String text) throws XMLStreamException {
+ delegate.writeComment(text);
+ }
+
+ public void writeDefaultNamespace(String uri) throws XMLStreamException {
+ delegate.writeDefaultNamespace(uri);
+ }
+
+ public void writeDTD(String dtd) throws XMLStreamException {
+ delegate.writeDTD(dtd);
+ }
+
+ public void writeEmptyElement(String prefix, String local, String uri) throws XMLStreamException {
+ delegate.writeEmptyElement(prefix, local, uri);
+ }
+
+ public void writeEmptyElement(String uri, String local) throws XMLStreamException {
+ delegate.writeEmptyElement(uri, local);
+ }
+
+ public void writeEmptyElement(String localName) throws XMLStreamException {
+ delegate.writeEmptyElement(localName);
+ }
+
+ public void writeEndDocument() throws XMLStreamException {
+ delegate.writeEndDocument();
+ }
+
+ public void writeEndElement() throws XMLStreamException {
+ delegate.writeEndElement();
+ }
+
+ public void writeEntityRef(String ent) throws XMLStreamException {
+ delegate.writeEntityRef(ent);
+ }
+
+ public void writeNamespace(String prefix, String uri) throws XMLStreamException {
+ delegate.writeNamespace(prefix, uri);
+ }
+
+ public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
+ delegate.writeProcessingInstruction(target, data);
+ }
+
+ public void writeProcessingInstruction(String target) throws XMLStreamException {
+ delegate.writeProcessingInstruction(target);
+ }
+
+ public void writeStartDocument() throws XMLStreamException {
+ delegate.writeStartDocument();
+ }
+
+ public void writeStartDocument(String encoding, String ver) throws XMLStreamException {
+ delegate.writeStartDocument(encoding, ver);
+ }
+
+ public void writeStartDocument(String ver) throws XMLStreamException {
+ delegate.writeStartDocument(ver);
+ }
+
+ public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
+ delegate.writeStartElement(prefix, local, uri);
+ }
+
+ public void writeStartElement(String uri, String local) throws XMLStreamException {
+ delegate.writeStartElement(uri, local);
+ }
+
+ public void writeStartElement(String local) throws XMLStreamException {
+ delegate.writeStartElement(local);
+ }
+
+
+}
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/DelegatingXMLStreamWriter.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: cxf/trunk/distribution/bundle/all/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/distribution/bundle/all/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/distribution/bundle/all/pom.xml (original)
+++ cxf/trunk/distribution/bundle/all/pom.xml Wed Sep 3 11:13:05 2008
@@ -261,7 +261,6 @@
antlr*;resolution:=optional,
com.ibm*;resolution:=optional,
com.sun*;resolution:=optional,
- javanet.staxutils*;resolution:=optional,
javax.jms*;resolution:=optional,
javax.ws.rs*;resolution:=optional,
repackage;resolution:=optional,
Modified: cxf/trunk/distribution/bundle/jaxrs/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/distribution/bundle/jaxrs/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/distribution/bundle/jaxrs/pom.xml (original)
+++ cxf/trunk/distribution/bundle/jaxrs/pom.xml Wed Sep 3 11:13:05 2008
@@ -116,7 +116,6 @@
antlr*;resolution:=optional,
com.ibm*;resolution:=optional,
com.sun*;resolution:=optional,
- javanet.staxutils*;resolution:=optional,
javax.jms*;resolution:=optional,
javax.ws.rs*;resolution:=optional,
repackage;resolution:=optional,
Modified: cxf/trunk/distribution/bundle/minimal/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/distribution/bundle/minimal/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/distribution/bundle/minimal/pom.xml (original)
+++ cxf/trunk/distribution/bundle/minimal/pom.xml Wed Sep 3 11:13:05 2008
@@ -150,7 +150,6 @@
antlr*;resolution:=optional,
com.ibm*;resolution:=optional,
com.sun*;resolution:=optional,
- javanet.staxutils*;resolution:=optional,
javax.jms*;resolution:=optional,
javax.ws.rs*;resolution:=optional,
repackage;resolution:=optional,
Modified: cxf/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/parent/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/parent/pom.xml (original)
+++ cxf/trunk/parent/pom.xml Wed Sep 3 11:13:05 2008
@@ -497,18 +497,6 @@
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>net.java.dev.stax-utils</groupId>
- <artifactId>stax-utils</artifactId>
- <version>20060502</version>
- <exclusions>
- <exclusion>
- <groupId>com.bea.xml</groupId>
- <artifactId>jsr173-ri</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java Wed Sep 3 11:13:05 2008
@@ -21,6 +21,7 @@
import java.net.URI;
import java.util.HashSet;
+import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Logger;
@@ -34,11 +35,15 @@
import org.apache.cxf.binding.soap.SoapVersion;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.headers.Header;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.phase.Phase;
public class MustUnderstandInterceptor extends AbstractSoapInterceptor {
+
+
private static final Logger LOG = LogUtils.getL7dLogger(MustUnderstandInterceptor.class);
private static final ResourceBundle BUNDLE = LOG.getResourceBundle();
@@ -54,22 +59,35 @@
SoapVersion soapVersion = soapMessage.getVersion();
Set<Header> mustUnderstandHeaders = new HashSet<Header>();
Set<URI> serviceRoles = new HashSet<URI>();
- Set<QName> notUnderstandQNames = new HashSet<QName>();
+ Set<Header> notUnderstandHeaders = new HashSet<Header>();
+ Set<Header> ultimateReceiverHeaders = new HashSet<Header>();
Set<QName> mustUnderstandQNames = new HashSet<QName>();
- buildMustUnderstandHeaders(mustUnderstandHeaders, soapMessage, serviceRoles);
+ buildMustUnderstandHeaders(mustUnderstandHeaders, soapMessage,
+ serviceRoles, ultimateReceiverHeaders);
initServiceSideInfo(mustUnderstandQNames, soapMessage, serviceRoles);
- if (!checkUnderstand(mustUnderstandHeaders, mustUnderstandQNames, notUnderstandQNames)) {
+ if (!checkUnderstand(mustUnderstandHeaders, mustUnderstandQNames,
+ notUnderstandHeaders)) {
StringBuffer sb = new StringBuffer(300);
- int pos = 0;
- for (QName qname : notUnderstandQNames) {
- pos = pos + qname.toString().length() + 2;
- sb.append(qname.toString() + ", ");
+ boolean first = true;
+ for (Header head : notUnderstandHeaders) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(", ");
+ }
+ sb.append(head.getName().toString());
}
- sb.delete(pos - 2, pos);
- throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, sb.toString()),
+ if (sb.length() > 0) {
+ throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, sb.toString()),
soapVersion.getMustUnderstand());
+ }
+ }
+ if (!ultimateReceiverHeaders.isEmpty()) {
+ soapMessage.getInterceptorChain()
+ .add(new UltimateReceiverMustUnderstandInterceptor(ultimateReceiverHeaders,
+ mustUnderstandQNames));
}
}
@@ -98,15 +116,17 @@
private void buildMustUnderstandHeaders(Set<Header> mustUnderstandHeaders,
SoapMessage soapMessage,
- Set<URI> serviceRoles) {
+ Set<URI> serviceRoles,
+ Set<Header> ultimateReceiverHeaders) {
for (Header header : soapMessage.getHeaders()) {
if (header instanceof SoapHeader && ((SoapHeader)header).isMustUnderstand()) {
String role = ((SoapHeader)header).getActor();
- if (role != null) {
+ if (!StringUtils.isEmpty(role)) {
role = role.trim();
- if (role.equals(soapMessage.getVersion().getNextRole())
- || role.equals(soapMessage.getVersion().getUltimateReceiverRole())) {
+ if (role.equals(soapMessage.getVersion().getNextRole())) {
mustUnderstandHeaders.add(header);
+ } else if (role.equals(soapMessage.getVersion().getUltimateReceiverRole())) {
+ ultimateReceiverHeaders.add(header);
} else {
for (URI roleFromBinding : serviceRoles) {
if (role.equals(roleFromBinding.toString())) {
@@ -117,7 +137,7 @@
} else {
// if role omitted, the soap node is ultimate receiver,
// needs to understand
- mustUnderstandHeaders.add(header);
+ ultimateReceiverHeaders.add(header);
}
}
}
@@ -125,17 +145,64 @@
private boolean checkUnderstand(Set<Header> mustUnderstandHeaders,
Set<QName> mustUnderstandQNames,
- Set<QName> notUnderstandQNames) {
+ Set<Header> notUnderstandHeaders) {
for (Header header : mustUnderstandHeaders) {
QName qname = header.getName();
if (!mustUnderstandQNames.contains(qname)) {
- notUnderstandQNames.add(qname);
+ notUnderstandHeaders.add(header);
}
}
- if (notUnderstandQNames.size() > 0) {
+ if (notUnderstandHeaders.size() > 0) {
return false;
}
return true;
}
+
+
+
+ /**
+ *
+ */
+ private class UltimateReceiverMustUnderstandInterceptor extends AbstractSoapInterceptor {
+ Set<Header> ultimateReceiverHeaders;
+ Set<QName> knownHeaders;
+ public UltimateReceiverMustUnderstandInterceptor(Set<Header> ult,
+ Set<QName> knownHeaders) {
+ super(Phase.INVOKE);
+ this.knownHeaders = knownHeaders;
+ ultimateReceiverHeaders = ult;
+ }
+ public void handleMessage(SoapMessage soapMessage) throws Fault {
+ SoapVersion soapVersion = soapMessage.getVersion();
+ Set<Header> notFound = new HashSet<Header>();
+ List<Header> heads = soapMessage.getHeaders();
+ for (Header header : ultimateReceiverHeaders) {
+ if (heads.contains(header)
+ && header.getDirection() == Header.Direction.DIRECTION_IN
+ && !knownHeaders.contains(header.getName())) {
+ notFound.add(header);
+ }
+ }
+
+
+ if (!notFound.isEmpty()) {
+ StringBuffer sb = new StringBuffer(300);
+ boolean first = true;
+ for (Header head : notFound) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append(", ");
+ }
+ sb.append(head.getName().toString());
+ }
+ if (sb.length() > 0) {
+ throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, sb.toString()),
+ soapVersion.getMustUnderstand());
+ }
+ }
+ }
+
+ }
}
Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java Wed Sep 3 11:13:05 2008
@@ -43,6 +43,7 @@
import org.apache.cxf.binding.soap.SoapVersionFactory;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.HeaderManager;
import org.apache.cxf.headers.HeaderProcessor;
@@ -160,8 +161,10 @@
soapVersion.getAttrNameMustUnderstand());
String act = hel.getAttributeNS(soapVersion.getNamespace(),
soapVersion.getAttrNameRole());
-
- shead.setActor(act);
+
+ if (!StringUtils.isEmpty(act)) {
+ shead.setActor(act);
+ }
shead.setMustUnderstand(Boolean.valueOf(mu) || "1".equals(mu));
//mark header as inbound header.(for distinguishing between the direction to
//avoid piggybacking of headers from request->server->response.
Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java Wed Sep 3 11:13:05 2008
@@ -31,10 +31,12 @@
import org.apache.cxf.Bus;
import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.SoapVersion;
import org.apache.cxf.binding.soap.model.SoapHeaderInfo;
import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.databinding.DataWriter;
import org.apache.cxf.headers.Header;
@@ -52,6 +54,7 @@
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.ServiceModelUtil;
+import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
import org.apache.cxf.staxutils.StaxUtils;
public class SoapOutInterceptor extends AbstractSoapInterceptor {
@@ -87,8 +90,8 @@
message.getInterceptorChain().add(new SoapOutEndingInterceptor());
}
- private void writeSoapEnvelopeStart(SoapMessage message) {
- SoapVersion soapVersion = message.getVersion();
+ private void writeSoapEnvelopeStart(final SoapMessage message) {
+ final SoapVersion soapVersion = message.getVersion();
try {
XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
xtw.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
@@ -105,6 +108,11 @@
soapVersion.getNamespace());
List<Header> hdrList = message.getHeaders();
for (Header header : hdrList) {
+ XMLStreamWriter writer = xtw;
+ if (header instanceof SoapHeader) {
+ SoapHeader soapHeader = (SoapHeader)header;
+ writer = new SOAPHeaderWriter(xtw, soapHeader, soapVersion);
+ }
DataBinding b = header.getDataBinding();
if (b == null) {
HeaderProcessor hp = bus.getExtension(HeaderManager.class)
@@ -114,11 +122,13 @@
}
}
if (b != null) {
+ MessagePartInfo part = new MessagePartInfo(header.getName(), null);
+ part.setConcreteName(header.getName());
b.createWriter(XMLStreamWriter.class)
- .write(header.getObject(), xtw);
+ .write(header.getObject(), part, writer);
} else {
Element node = (Element)header.getObject();
- StaxUtils.copy(node, xtw);
+ StaxUtils.copy(node, writer);
}
}
}
@@ -245,6 +255,71 @@
soapVersion.getSender());
}
}
-
- }
+ }
+
+ public static class SOAPHeaderWriter extends DelegatingXMLStreamWriter {
+ final SoapHeader soapHeader;
+ final SoapVersion soapVersion;
+ boolean firstDone;
+
+ public SOAPHeaderWriter(XMLStreamWriter writer,
+ SoapHeader header,
+ SoapVersion version) {
+ super(writer);
+ soapHeader = header;
+ soapVersion = version;
+ }
+
+ public void writeAttribute(String prefix, String uri, String local, String value)
+ throws XMLStreamException {
+ if (soapVersion.getNamespace().equals(uri)
+ && (local.equals(soapVersion.getAttrNameMustUnderstand())
+ || local.equals(soapVersion.getAttrNameRole()))) {
+ return;
+ }
+ super.writeAttribute(prefix, uri, local, value);
+ }
+ public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
+ if (soapVersion.getNamespace().equals(uri)
+ && (local.equals(soapVersion.getAttrNameMustUnderstand())
+ || local.equals(soapVersion.getAttrNameRole()))) {
+ return;
+ }
+ super.writeAttribute(uri, local, value);
+ }
+
+ private void writeSoapAttributes() throws XMLStreamException {
+ if (!firstDone) {
+ firstDone = true;
+ if (!StringUtils.isEmpty(soapHeader.getActor())) {
+ super.writeAttribute(soapVersion.getPrefix(),
+ soapVersion.getNamespace(),
+ soapVersion.getAttrNameRole(),
+ soapHeader.getActor());
+ }
+ if (soapHeader.isMustUnderstand()) {
+ super.writeAttribute(soapVersion.getPrefix(),
+ soapVersion.getNamespace(),
+ soapVersion.getAttrNameMustUnderstand(),
+ "true");
+ }
+ }
+ }
+ public void writeStartElement(String arg0, String arg1, String arg2)
+ throws XMLStreamException {
+ super.writeStartElement(arg0, arg1, arg2);
+ writeSoapAttributes();
+ }
+ public void writeStartElement(String arg0, String arg1)
+ throws XMLStreamException {
+ super.writeStartElement(arg0, arg1);
+ writeSoapAttributes();
+ }
+ public void writeStartElement(String arg0) throws XMLStreamException {
+ super.writeStartElement(arg0);
+ writeSoapAttributes();
+ }
+
+
+ };
}
Modified: cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java (original)
+++ cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/TestBase.java Wed Sep 3 11:13:05 2008
@@ -69,6 +69,7 @@
phases.add(phase2);
phases.add(phase3);
phases.add(phase4);
+ phases.add(new Phase(Phase.INVOKE, 5));
chain = new PhaseInterceptorChain(phases);
soapMessage = TestUtil.createEmptySoapMessage(Soap11.getInstance(), chain);
Modified: cxf/trunk/rt/databinding/aegis/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/pom.xml (original)
+++ cxf/trunk/rt/databinding/aegis/pom.xml Wed Sep 3 11:13:05 2008
@@ -84,17 +84,6 @@
<version>${jdom.version}</version>
</dependency>
<dependency>
- <groupId>net.java.dev.stax-utils</groupId>
- <artifactId>stax-utils</artifactId>
- <version>20060502</version>
- <exclusions>
- <exclusion>
- <groupId>com.bea.xml</groupId>
- <artifactId>jsr173-ri</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
</dependency>
Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/xml/SourceType.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/xml/SourceType.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/xml/SourceType.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/xml/SourceType.java Wed Sep 3 11:13:05 2008
@@ -24,8 +24,6 @@
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -34,8 +32,6 @@
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
-import javanet.staxutils.ContentHandlerToXMLStreamWriter;
-
import org.apache.cxf.aegis.Context;
import org.apache.cxf.aegis.DatabindingException;
import org.apache.cxf.aegis.type.Type;
@@ -101,24 +97,8 @@
}
StaxUtils.writeElement(element, writer, false);
- } else if (object instanceof SAXSource) {
- SAXSource source = (SAXSource)object;
-
- try {
- XMLReader xmlReader = source.getXMLReader();
- if (xmlReader == null) {
- xmlReader = createXMLReader();
- }
-
- xmlReader.setContentHandler(new FilteringContentHandlerToXMLStreamWriter(writer));
-
- xmlReader.parse(source.getInputSource());
- } catch (Exception e) {
- throw new DatabindingException("Could not send xml.", e);
- }
- } else if (object instanceof StreamSource) {
- StreamSource ss = (StreamSource)object;
- XMLStreamReader reader = StaxUtils.createXMLStreamReader(ss.getInputStream(), null);
+ } else {
+ XMLStreamReader reader = StaxUtils.createXMLStreamReader((Source)object);
StaxUtils.copy(reader, writer);
}
}
@@ -136,17 +116,4 @@
}
}
- class FilteringContentHandlerToXMLStreamWriter extends ContentHandlerToXMLStreamWriter {
- public FilteringContentHandlerToXMLStreamWriter(XMLStreamWriter xmlStreamWriter) {
- super(xmlStreamWriter);
- }
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
- }
- }
}
Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Wed Sep 3 11:13:05 2008
@@ -158,6 +158,8 @@
&& part.getTypeQName().getLocalPart().equals("hexBinary")) {
mObj = new HexBinaryAdapter().marshal((byte[])mObj);
writeObject(marshaller, source, new JAXBElement(elName, String.class, mObj));
+ } else if (mObj instanceof JAXBElement) {
+ writeObject(marshaller, source, mObj);
} else {
writeObject(marshaller, source, new JAXBElement(elName, cls, mObj));
}
Modified: cxf/trunk/rt/javascript/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/javascript/pom.xml?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/javascript/pom.xml (original)
+++ cxf/trunk/rt/javascript/pom.xml Wed Sep 3 11:13:05 2008
@@ -69,10 +69,6 @@
<version>${jdom.version}</version>
</dependency>
<dependency>
- <groupId>net.java.dev.stax-utils</groupId>
- <artifactId>stax-utils</artifactId>
- </dependency>
- <dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
</dependency>
Modified: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java (original)
+++ cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java Wed Sep 3 11:13:05 2008
@@ -116,6 +116,13 @@
* @param message the messsage message
*/
public void handleFault(SoapMessage message) {
+ AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, true, false);
+ if (ContextUtils.isRequestor(message)
+ && !message.getExchange().isOneWay()
+ && maps != null) {
+ //fault occured trying to sent the message, remove it
+ uncorrelatedExchanges.remove(maps.getMessageID().getValue());
+ }
}
/**
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHdrServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHdrServiceImpl.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHdrServiceImpl.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHdrServiceImpl.java Wed Sep 3 11:13:05 2008
@@ -104,35 +104,36 @@
MessageContext ctx = context == null ? null : context.getMessageContext();
if (ctx.containsKey(Header.HEADER_LIST)) {
List oobHdr = (List) ctx.get(Header.HEADER_LIST);
-
- if (oobHdr instanceof List) {
- Iterator iter = oobHdr.iterator();
- while (iter.hasNext()) {
- Object hdr = iter.next();
- if (hdr instanceof Header && ((Header) hdr).getObject() instanceof Node) {
- Header hdr1 = (Header) hdr;
- //System.out.println("Node conains : " + hdr1.getObject().toString());
- try {
- JAXBElement job = (JAXBElement) JAXBContext.newInstance(ObjectFactory.class)
- .createUnmarshaller()
- .unmarshal((Node) hdr1.getObject());
- OutofBandHeader ob = (OutofBandHeader) job.getValue();
- if ("testOobHeader".equals(ob.getName())
- && "testOobHeaderValue".equals(ob.getValue())
- && "testHdrAttribute".equals(ob.getHdrAttribute())) {
+ Iterator iter = oobHdr.iterator();
+ while (iter.hasNext()) {
+ Object hdr = iter.next();
+ if (hdr instanceof Header && ((Header) hdr).getObject() instanceof Node) {
+ Header hdr1 = (Header) hdr;
+ //System.out.println("Node conains : " + hdr1.getObject().toString());
+ try {
+ JAXBElement job = (JAXBElement) JAXBContext.newInstance(ObjectFactory.class)
+ .createUnmarshaller()
+ .unmarshal((Node) hdr1.getObject());
+ OutofBandHeader ob = (OutofBandHeader) job.getValue();
+ if ("testOobHeader".equals(ob.getName())
+ && "testOobHeaderValue".equals(ob.getValue())) {
+ if ("testHdrAttribute".equals(ob.getHdrAttribute())) {
+ success = true;
+ iter.remove(); //mark it processed
+ } else if ("dontProcess".equals(ob.getHdrAttribute())) {
+ //we won't remove it so we won't let the runtime know
+ //it's processed. It SHOULD throw an exception
+ //saying the mustunderstand wasn't processed
success = true;
- } else {
- throw new RuntimeException("test failed");
}
- } catch (JAXBException ex) {
- //
- ex.printStackTrace();
+ } else {
+ throw new RuntimeException("test failed");
}
+ } catch (JAXBException ex) {
+ //
+ ex.printStackTrace();
}
}
- } else {
- throw new RuntimeException("Header should not be null"
- + "and should be of type JAXBHeaderHolder");
}
} else {
throw new RuntimeException("MessageContext is null or doesnot contain OOBHeaders");
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java?rev=691706&r1=691705&r2=691706&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java Wed Sep 3 11:13:05 2008
@@ -38,6 +38,7 @@
import org.apache.cxf.BusFactory;
+import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.bus.spring.SpringBusFactory;
import org.apache.cxf.headers.Header;
import org.apache.cxf.jaxb.JAXBDataBinding;
@@ -78,7 +79,7 @@
assertTrue("server did not launch correctly", launchServer(Server.class, true));
}
- private void addOutOfBoundHeader(PutLastTradedPricePortType portType) {
+ private void addOutOfBoundHeader(PutLastTradedPricePortType portType, boolean invalid) {
InvocationHandler handler = Proxy.getInvocationHandler(portType);
BindingProvider bp = null;
@@ -90,14 +91,13 @@
OutofBandHeader ob = new OutofBandHeader();
ob.setName("testOobHeader");
ob.setValue("testOobHeaderValue");
- ob.setHdrAttribute("testHdrAttribute");
+ ob.setHdrAttribute(invalid ? "dontProcess" : "testHdrAttribute");
- JAXBElement<OutofBandHeader> job = new JAXBElement<OutofBandHeader>(
- new QName(TEST_HDR_NS, TEST_HDR_REQUEST_ELEM), OutofBandHeader.class, null, ob);
- Header hdr = new Header(
+ SoapHeader hdr = new SoapHeader(
new QName(TEST_HDR_NS, TEST_HDR_REQUEST_ELEM),
- job,
+ ob,
new JAXBDataBinding(ob.getClass()));
+ hdr.setMustUnderstand(true);
List<Header> holder = new ArrayList<Header>();
holder.add(hdr);
@@ -182,10 +182,16 @@
priceData.setTickerSymbol("CELTIX");
Holder<TradePriceData> holder = new Holder<TradePriceData>(priceData);
- addOutOfBoundHeader(putLastTradedPrice);
-
+ addOutOfBoundHeader(putLastTradedPrice, false);
putLastTradedPrice.sayHi(holder);
-
checkReturnedOOBHeader(putLastTradedPrice);
+
+ addOutOfBoundHeader(putLastTradedPrice, true);
+ try {
+ putLastTradedPrice.sayHi(holder);
+ fail("mustUnderstand header should not have been processed");
+ } catch (Exception ex) {
+ assertTrue(ex.getMessage().contains("Can not understand"));
+ }
}
}