You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by eg...@apache.org on 2007/02/01 17:55:20 UTC
svn commit: r502283 - in /incubator/cxf/trunk:
rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/
rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/
rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/
rt/databinding/jaxb/src/test/ja...
Author: eglynn
Date: Thu Feb 1 08:55:18 2007
New Revision: 502283
URL: http://svn.apache.org/viewvc?view=rev&rev=502283
Log:
Applying patch for CXF-398 from Sergey Beryozkin.
Added:
incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java (with props)
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java (with props)
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java (with props)
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/attachmentData
Modified:
incubator/cxf/trunk/rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java
incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/XMLMessageDataReader.java
incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/io/XMLMessageDataReaderTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ProviderChainObserver.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/support/ContextPropertiesMappingTest.java
incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java
incubator/cxf/trunk/rt/transports/http2/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java
Modified: incubator/cxf/trunk/rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java (original)
+++ incubator/cxf/trunk/rt/bindings/xml/src/main/java/org/apache/cxf/binding/xml/XMLBindingFactory.java Thu Feb 1 08:55:18 2007
@@ -30,6 +30,7 @@
import org.apache.cxf.binding.xml.interceptor.XMLFaultOutInterceptor;
import org.apache.cxf.binding.xml.interceptor.XMLMessageInInterceptor;
import org.apache.cxf.binding.xml.interceptor.XMLMessageOutInterceptor;
+import org.apache.cxf.interceptor.AttachmentInInterceptor;
import org.apache.cxf.interceptor.StaxInInterceptor;
import org.apache.cxf.interceptor.StaxOutInterceptor;
import org.apache.cxf.interceptor.URIMappingInterceptor;
@@ -58,8 +59,10 @@
XMLBinding xb = new XMLBinding();
+ xb.getInInterceptors().add(new AttachmentInInterceptor());
xb.getInInterceptors().add(new StaxInInterceptor());
xb.getInInterceptors().add(new XMLMessageInInterceptor());
+ xb.getInInterceptors().add(new URIMappingInterceptor());
xb.getInFaultInterceptors().add(new XMLFaultInInterceptor());
@@ -69,8 +72,6 @@
xb.getOutFaultInterceptors().add(new StaxOutInterceptor());
xb.getOutFaultInterceptors().add(new XMLFaultOutInterceptor());
- xb.getInInterceptors().add(new URIMappingInterceptor());
-
return xb;
}
Added: incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java?view=auto&rev=502283
==============================================================================
--- incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java (added)
+++ incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java Thu Feb 1 08:55:18 2007
@@ -0,0 +1,44 @@
+/**
+ * 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.binding.xml;
+
+import junit.framework.TestCase;
+
+import org.apache.cxf.binding.Binding;
+import org.apache.cxf.interceptor.AttachmentInInterceptor;
+import org.apache.cxf.interceptor.Interceptor;
+
+public class XMLBindingFactoryTest extends TestCase {
+
+ public void testContainsInAttachmentInterceptor() {
+ XMLBindingFactory xbf = new XMLBindingFactory();
+ Binding b = xbf.createBinding(null);
+
+ boolean found = false;
+ for (Interceptor interseptor : b.getInInterceptors()) {
+ if (interseptor instanceof AttachmentInInterceptor) {
+ found = true;
+ }
+ }
+
+ assertTrue("No in attachment interceptor found", found);
+ }
+
+}
Propchange: incubator/cxf/trunk/rt/bindings/xml/src/test/java/org/apache/cxf/binding/xml/XMLBindingFactoryTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/XMLMessageDataReader.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/XMLMessageDataReader.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/XMLMessageDataReader.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/XMLMessageDataReader.java Thu Feb 1 08:55:18 2007
@@ -62,13 +62,12 @@
Object obj = null;
InputStream is = input.getContent(InputStream.class);
+ if (is == null) {
+ // TODO LOG ERROR here
+ return null;
+ }
try {
- // Tolerate empty InputStream in order to deal with HTTP GET
- if (is == null || is.available() == 0) {
- // TODO LOG ERROR here
- return null;
- }
-
+
// Processing Souce type
if (DOMSource.class.isAssignableFrom(type)) {
Document doc = XMLUtils.parse(is);
Modified: incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/io/XMLMessageDataReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/io/XMLMessageDataReaderTest.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/io/XMLMessageDataReaderTest.java (original)
+++ incubator/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/io/XMLMessageDataReaderTest.java Thu Feb 1 08:55:18 2007
@@ -57,8 +57,6 @@
assertTrue(XMLUtils.toString((Source)source).contains(expected));
}
- // XMLMessageDataReader needs to tolerate empty input stream
- // in order to deal with HTTP GET, no exceptions should be thrown.
public void testReadEmptyInputStream() throws Exception {
InputStream is = getTestStream("../resources/emptyReq.xml");
assertNotNull(is);
@@ -68,6 +66,10 @@
XMLMessage xmlMsg = new XMLMessage(msg);
Object source = reader.read(null, xmlMsg, DOMSource.class);
+ assertNull(source);
+
+ msg.setContent(InputStream.class, null);
+ source = reader.read(null, xmlMsg, DOMSource.class);
assertNull(source);
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ProviderChainObserver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ProviderChainObserver.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ProviderChainObserver.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ProviderChainObserver.java Thu Feb 1 08:55:18 2007
@@ -19,9 +19,13 @@
package org.apache.cxf.jaxws;
+import javax.activation.DataSource;
+
import org.apache.cxf.Bus;
import org.apache.cxf.binding.Binding;
+import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.interceptor.AttachmentInInterceptor;
import org.apache.cxf.jaxws.interceptors.DispatchInInterceptor;
import org.apache.cxf.jaxws.interceptors.DispatchOutInterceptor;
import org.apache.cxf.jaxws.support.JaxWsImplementorInfo;
@@ -52,10 +56,6 @@
exchange.setInMessage(message);
message.setExchange(exchange);
- // message.setContent(Class.class, implInfo.getProviderParameterType());
- // message.setContent(javax.xml.ws.Service.Mode.class,
- // implInfo.getServiceMode());
-
exchange.put(javax.xml.ws.Service.Mode.class, implInfo.getServiceMode());
exchange.put(Class.class, implInfo.getProviderParameterType());
@@ -78,6 +78,13 @@
// Modified the binding in interceptors
endpoint.getBinding().getInInterceptors().clear();
+
+ Class type = message.getExchange().get(Class.class);
+ if (!DataSource.class.isAssignableFrom(type)
+ && !SoapMessage.class.isAssignableFrom(type)) {
+ endpoint.getBinding().getInInterceptors().add(new AttachmentInInterceptor());
+ }
+
endpoint.getBinding().getInInterceptors().add(new DispatchInInterceptor());
chain.add(endpoint.getBinding().getInInterceptors());
// Modified the binding out interceptors
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInInterceptor.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInInterceptor.java Thu Feb 1 08:55:18 2007
@@ -20,6 +20,7 @@
package org.apache.cxf.jaxws.interceptors;
import java.io.InputStream;
+import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
@@ -44,6 +45,8 @@
public class DispatchInInterceptor extends AbstractInDatabindingInterceptor {
+ private static final Logger LOG = Logger.getLogger(DispatchInInterceptor.class.getName());
+
public DispatchInInterceptor() {
super();
setPhase(Phase.READ);
@@ -51,6 +54,12 @@
@SuppressWarnings("unchecked")
public void handleMessage(Message message) throws Fault {
+
+ if (isGET(message)) {
+ LOG.info("DispatchInInterceptor skipped in HTTP GET method");
+ return;
+ }
+
Service.Mode m = message.getExchange().get(Service.Mode.class);
Class type = message.getExchange().get(Class.class);
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutInterceptor.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutInterceptor.java Thu Feb 1 08:55:18 2007
@@ -20,6 +20,7 @@
package org.apache.cxf.jaxws.interceptors;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import javax.activation.DataSource;
@@ -115,7 +116,9 @@
transformer.transform((Source)obj, new StreamResult(os));
}
if (obj instanceof DataSource) {
+ InputStream is = ((DataSource)obj).getInputStream();
IOUtils.copy(((DataSource)obj).getInputStream(), os);
+ is.close();
}
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/servlet/ServletDestination.java Thu Feb 1 08:55:18 2007
@@ -26,6 +26,7 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
@@ -189,6 +190,26 @@
* @param headers the current set of headers
*/
protected void copyResponseHeaders(Message message, HttpServletResponse response) {
+
+ Map<?, ?> headers = (Map<?, ?>)message.get(Message.PROTOCOL_HEADERS);
+ if (null != headers) {
+ if (!headers.containsKey(Message.CONTENT_TYPE)) {
+ setContentType(message, response);
+ }
+ for (Iterator<?> iter = headers.keySet().iterator(); iter.hasNext();) {
+ String header = (String)iter.next();
+ List<?> headerList = (List<?>)headers.get(header);
+ for (Object value : headerList) {
+ response.addHeader(header, (String)value);
+ }
+ }
+ } else {
+ setContentType(message, response);
+ }
+
+ }
+
+ protected void setContentType(Message message, HttpServletResponse response) {
String ct = (String) message.get(Message.CONTENT_TYPE);
String enc = (String) message.get(Message.ENCODING);
@@ -201,7 +222,6 @@
response.setContentType("text/xml; charset=" + enc);
}
}
-
protected void doMessage(MessageImpl inMessage) throws IOException {
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java Thu Feb 1 08:55:18 2007
@@ -18,15 +18,20 @@
*/
package org.apache.cxf.jaxws.support;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.activation.DataHandler;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.jaxws.context.WrappedMessageContext;
+import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
@@ -129,7 +134,11 @@
if (null != requestHeaders) {
ctx.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
}
-
+
+ addMessageAttachments(ctx,
+ exchange.getInMessage(),
+ MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
+
Message outMessage = exchange.getOutMessage();
if (null != outMessage) {
Object responseHeaders =
@@ -141,6 +150,26 @@
ctx.put(MessageContext.HTTP_RESPONSE_HEADERS, responseHeaders);
}
return ctx;
+ }
+
+ private static void addMessageAttachments(MessageContext ctx,
+ Message message,
+ String propertyName) {
+ Map<String, DataHandler> dataHandlers = null;
+
+ Collection<Attachment> attachments = message.getAttachments();
+ if (attachments != null) {
+
+ //preserve the order of iteration
+ dataHandlers = new LinkedHashMap<String, DataHandler>();
+ for (Attachment attachment : attachments) {
+ dataHandlers.put(attachment.getId(), attachment.getDataHandler());
+ }
+ }
+
+ ctx.put(propertyName,
+ dataHandlers == null ? Collections.EMPTY_MAP
+ : Collections.unmodifiableMap(dataHandlers));
}
public static void updateWebServiceContext(Exchange exchange, MessageContext ctx) {
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/support/ContextPropertiesMappingTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/support/ContextPropertiesMappingTest.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/support/ContextPropertiesMappingTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/support/ContextPropertiesMappingTest.java Thu Feb 1 08:55:18 2007
@@ -18,14 +18,20 @@
*/
package org.apache.cxf.jaxws.support;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.Map;
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
+import org.apache.cxf.attachment.AttachmentImpl;
+import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
@@ -103,6 +109,10 @@
Object outMessageHeader = outMessage.get(Message.PROTOCOL_HEADERS);
assertEquals("the outMessage PROTOCOL_HEADERS should be update", responseHeader, outMessageHeader);
+ Object inAttachments = ctx.get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
+ assertNotNull("inbound attachments object must be initialized", inAttachments);
+ assertTrue("inbound attachments must be in a Map", inAttachments instanceof Map);
+ assertTrue("no inbound attachments expected", ((Map)inAttachments).isEmpty());
}
public void testUpdateWebServiceContext() {
@@ -125,4 +135,36 @@
assertEquals("incorrect response code returned", RESPONSE_CODE, respCode);
}
+ @SuppressWarnings("unchecked")
+ public void testCreateWebServiceContextWithInAttachments() {
+ Exchange exchange = new ExchangeImpl();
+ Message inMessage = new MessageImpl();
+
+ Collection<Attachment> attachments = new LinkedList<Attachment>();
+
+ DataSource source = EasyMock.createNiceMock(DataSource.class);
+ DataHandler handler1 = new DataHandler(source);
+ attachments.add(new AttachmentImpl("part1", handler1));
+ DataHandler handler2 = new DataHandler(source);
+ attachments.add(new AttachmentImpl("part2", handler2));
+ inMessage.setAttachments(attachments);
+
+ inMessage.putAll(message);
+ exchange.setInMessage(inMessage);
+ exchange.setOutMessage(new MessageImpl());
+
+ MessageContext ctx = ContextPropertiesMapping.createWebServiceContext(exchange);
+
+ Object inAttachments = ctx.get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
+ assertNotNull("inbound attachments object must be initialized", inAttachments);
+ assertTrue("inbound attachments must be in a Map", inAttachments instanceof Map);
+ Map<String, DataHandler> dataHandlers = (Map)inAttachments;
+ assertEquals("two inbound attachments expected", 2, dataHandlers.size());
+
+ assertTrue("part1 attachment is missing", dataHandlers.containsKey("part1"));
+ // should do as it's the same instance
+ assertTrue("part1 handler is missing", dataHandlers.get("part1") == handler1);
+ assertTrue("part2 attachment is missing", dataHandlers.containsKey("part2"));
+ assertTrue("part2 handler is missing", dataHandlers.get("part2") == handler2);
+ }
}
Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java (original)
+++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java Thu Feb 1 08:55:18 2007
@@ -204,10 +204,13 @@
* @param headers the current set of headers
*/
protected void copyResponseHeaders(Message message, HttpResponse response) {
- response.setContentType((String) message.get(Message.CONTENT_TYPE));
-
Map<?, ?> headers = (Map<?, ?>)message.get(Message.PROTOCOL_HEADERS);
if (null != headers) {
+
+ if (!headers.containsKey(Message.CONTENT_TYPE)) {
+ response.setContentType((String) message.get(Message.CONTENT_TYPE));
+ }
+
for (Iterator<?> iter = headers.keySet().iterator(); iter.hasNext();) {
String header = (String)iter.next();
List<?> headerList = (List<?>)headers.get(header);
@@ -215,6 +218,8 @@
response.addField(header, (String)value);
}
}
+ } else {
+ response.setContentType((String) message.get(Message.CONTENT_TYPE));
}
}
Modified: incubator/cxf/trunk/rt/transports/http2/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http2/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java?view=diff&rev=502283&r1=502282&r2=502283
==============================================================================
--- incubator/cxf/trunk/rt/transports/http2/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java (original)
+++ incubator/cxf/trunk/rt/transports/http2/src/main/java/org/apache/cxf/transport/http/JettyHTTPDestination.java Thu Feb 1 08:55:18 2007
@@ -223,10 +223,13 @@
* @param headers the current set of headers
*/
protected void copyResponseHeaders(Message message, HttpServletResponse response) {
- response.setContentType((String) message.get(Message.CONTENT_TYPE));
-
Map<?, ?> headers = (Map<?, ?>)message.get(Message.PROTOCOL_HEADERS);
if (null != headers) {
+
+ if (!headers.containsKey(Message.CONTENT_TYPE)) {
+ response.setContentType((String) message.get(Message.CONTENT_TYPE));
+ }
+
for (Iterator<?> iter = headers.keySet().iterator(); iter.hasNext();) {
String header = (String)iter.next();
List<?> headerList = (List<?>)headers.get(header);
@@ -234,6 +237,8 @@
response.addHeader(header, (String)value);
}
}
+ } else {
+ response.setContentType((String) message.get(Message.CONTENT_TYPE));
}
}
Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java?view=auto&rev=502283
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java Thu Feb 1 08:55:18 2007
@@ -0,0 +1,122 @@
+/**
+ * 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.systest.provider;
+
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.ws.Endpoint;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.cxf.common.util.Base64Utility;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.systest.common.ClientServerSetupBase;
+import org.apache.cxf.systest.common.ClientServerTestBase;
+import org.apache.cxf.systest.common.TestServerBase;
+
+public class AttachmentProviderXMLClientServerTest extends ClientServerTestBase {
+
+ public static class Server extends TestServerBase {
+
+ protected void run() {
+ Object implementor = new AttachmentStreamSourceXMLProvider();
+ String address = "http://localhost:9033/XMLServiceAttachment";
+ Endpoint.publish(address, implementor);
+ }
+
+ public static void main(String[] args) {
+ try {
+ Server s = new Server();
+ s.start();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(-1);
+ } finally {
+ System.out.println("done!");
+ }
+ }
+ }
+
+ public static Test suite() throws Exception {
+ TestSuite suite = new TestSuite(AttachmentProviderXMLClientServerTest.class);
+ return new ClientServerSetupBase(suite) {
+ public void startServers() throws Exception {
+ assertTrue("server did not launch correctly",
+ launchServer(Server.class));
+ }
+ };
+ }
+
+ public void testRequestWithAttachment() throws Exception {
+
+ HttpURLConnection connection =
+ (HttpURLConnection)new URL("http://localhost:9033/XMLServiceAttachment").openConnection();
+ connection.setRequestMethod("POST");
+
+ String ct = "multipart/related; type=\"text/xml\"; " + "start=\"rootPart\"; "
+ + "boundary=\"----=_Part_4_701508.1145579811786\"";
+ connection.addRequestProperty("Content-Type", ct);
+
+ connection.setDoOutput(true);
+
+ InputStream is = getClass().getResourceAsStream("attachmentData");
+ IOUtils.copy(is, connection.getOutputStream());
+ connection.getOutputStream().close();
+ is.close();
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ assertEquals("wrong content type", "application/xml+custom", connection.getContentType());
+ Document result = builder.parse(connection.getInputStream());
+ assertNotNull("result must not be null", result);
+
+ connection.getInputStream().close();
+
+ NodeList resList = result.getDocumentElement().getElementsByTagName("att");
+ assertEquals("Two attachments must've been encoded", 2, resList.getLength());
+
+ verifyAttachment(resList, "foo", "foobar");
+ verifyAttachment(resList, "bar", "barbaz");
+ }
+
+ private void verifyAttachment(NodeList atts, String contentId, String value) {
+
+ for (int i = 0; i < atts.getLength(); i++) {
+ Element expElem = (Element)atts.item(i);
+ String child = expElem.getFirstChild().getNodeValue();
+ if (contentId.equals(expElem.getAttribute("contentId"))
+ && (Base64Utility.encode(value.getBytes()).equals(child)
+ || Base64Utility.encode((value + "\n").getBytes()).equals(child))) {
+ return;
+ }
+ }
+
+ fail("No encoded attachment with id " + contentId + " found");
+ }
+}
Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentProviderXMLClientServerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java?view=auto&rev=502283
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java Thu Feb 1 08:55:18 2007
@@ -0,0 +1,113 @@
+/**
+ * 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.systest.provider;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.annotation.Resource;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.Provider;
+import javax.xml.ws.Service;
+import javax.xml.ws.ServiceMode;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.WebServiceProvider;
+import javax.xml.ws.handler.MessageContext;
+
+import org.w3c.dom.Document;
+
+import org.apache.cxf.common.util.Base64Utility;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XMLUtils;
+import org.apache.cxf.message.Message;
+
+@WebServiceProvider(serviceName = "AttachmentStreamSourceXMLProvider")
+@ServiceMode(value = Service.Mode.PAYLOAD)
+@javax.xml.ws.BindingType(value = "http://cxf.apache.org/bindings/xformat")
+public class AttachmentStreamSourceXMLProvider implements Provider<StreamSource> {
+
+ @Resource
+ protected WebServiceContext wsContext;
+
+ @SuppressWarnings("unchecked")
+ public StreamSource invoke(StreamSource source) {
+
+ MessageContext mc = wsContext.getMessageContext();
+
+ String httpMethod = (String)mc.get(MessageContext.HTTP_REQUEST_METHOD);
+ if ("POST".equals(httpMethod)) {
+
+ int count = 0;
+ // we really want to verify that a root part is a proper XML as expected
+ DOMResult result = new DOMResult();
+ try {
+ Transformer transformer = XMLUtils.newTransformer();
+ transformer.transform(source, result);
+ count =
+ Integer.parseInt(((Document)result.getNode()).getDocumentElement().getAttribute("count"));
+ } catch (Exception ex) {
+ // ignore
+ }
+
+ Map<String, DataHandler> dataHandlers =
+ (Map)mc.get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
+ StringBuilder buf = new StringBuilder();
+ buf.append("<response>");
+ int i = 0;
+ for (Map.Entry<String, DataHandler> entry : dataHandlers.entrySet()) {
+ if (i++ > count) {
+ break;
+ }
+ try {
+ InputStream is = entry.getValue().getInputStream();
+ ByteArrayOutputStream bous = new ByteArrayOutputStream();
+ IOUtils.copy(is, bous);
+
+ buf.append("<att contentId=\"" + entry.getKey() + "\">");
+ buf.append(Base64Utility.encode(bous.toByteArray()));
+ buf.append("</att>");
+
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+ buf.append("</response>");
+
+ Map<Object, List<?>> respHeaders = (Map)mc.get(MessageContext.HTTP_RESPONSE_HEADERS);
+ List<String> contentTypeValues = new ArrayList<String>();
+ contentTypeValues.add("application/xml+custom");
+ respHeaders.put(Message.CONTENT_TYPE, contentTypeValues);
+
+ return new StreamSource(new StringReader(buf.toString()));
+ }
+ return source;
+
+ }
+
+}
Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/AttachmentStreamSourceXMLProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/attachmentData
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/attachmentData?view=auto&rev=502283
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/attachmentData (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/provider/attachmentData Thu Feb 1 08:55:18 2007
@@ -0,0 +1,20 @@
+
+------=_Part_4_701508.1145579811786
+Content-Type: text/xml
+Content-ID: <rootPart>
+
+<attachmentRequest count="2"/>
+
+------=_Part_4_701508.1145579811786
+Content-Type: image/jpeg
+Content-Transfer-Encoding: binary
+Content-ID: <foo>
+
+foobar
+------=_Part_4_701508.1145579811786--
+Content-Type: image/jpeg
+Content-Transfer-Encoding: binary
+Content-ID: <bar>
+
+barbaz
+------=_Part_4_701508.1145579811786--
\ No newline at end of file