You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ay...@apache.org on 2013/06/27 15:12:23 UTC
svn commit: r1497340 - in /cxf/trunk/rt/frontend/jaxws/src:
main/java/org/apache/cxf/jaxws/context/
test/java/org/apache/cxf/jaxws/context/
Author: ay
Date: Thu Jun 27 13:12:22 2013
New Revision: 1497340
URL: http://svn.apache.org/r1497340
Log:
[CXF-5095] Allow adding attachments to the context using jaxws attachments
Added:
cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedAttachments.java
cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WrappedMessageContextTest.java
Modified:
cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
Added: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedAttachments.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedAttachments.java?rev=1497340&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedAttachments.java (added)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedAttachments.java Thu Jun 27 13:12:22 2013
@@ -0,0 +1,200 @@
+/**
+ * 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.jaxws.context;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+
+import org.apache.cxf.attachment.AttachmentImpl;
+import org.apache.cxf.message.Attachment;
+
+/**
+ * This is a package local attachments wrapper class to treat the jaxws attachments
+ * as CXF's attachments.
+ */
+class WrappedAttachments implements Set<Attachment> {
+ private Map<String, DataHandler> attachments;
+ private Map<String, Attachment> cache;
+
+ public WrappedAttachments(Map<String, DataHandler> attachments) {
+ this.attachments = attachments;
+ this.cache = new HashMap<String, Attachment>();
+ }
+
+ public int size() {
+ return attachments.size();
+ }
+
+ public boolean isEmpty() {
+ return attachments.isEmpty();
+ }
+
+ public boolean contains(Object o) {
+ if (o instanceof Attachment) {
+ return attachments.containsKey(((Attachment) o).getId());
+ }
+ return false;
+ }
+
+ public Iterator<Attachment> iterator() {
+ return new WrappedAttachmentsIterator(attachments.entrySet().iterator());
+ }
+
+ public Object[] toArray() {
+ Object[] obj = new Object[attachments.size()];
+ int i = 0;
+ for (Map.Entry<String, DataHandler> entry : attachments.entrySet()) {
+ Attachment o = cache.get(entry.getKey());
+ if (o == null) {
+ o = new AttachmentImpl(entry.getKey(), entry.getValue());
+ cache.put(entry.getKey(), o);
+ }
+ obj[i++] = o;
+ }
+ return obj;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T[] toArray(T[] a) {
+ Object[] obj = toArray();
+ return (T[])Arrays.copyOf(obj, obj.length, a.getClass());
+ }
+
+ public boolean add(Attachment e) {
+ if (!attachments.containsKey(e.getId())) {
+ attachments.put(e.getId(), e.getDataHandler());
+ cache.put(e.getId(), e);
+ return true;
+ }
+ return false;
+ }
+
+ public boolean remove(Object o) {
+ if (o instanceof Attachment) {
+ cache.remove(((Attachment) o).getId());
+ return attachments.remove(((Attachment) o).getId()) != null;
+ }
+ return false;
+ }
+
+ public boolean containsAll(Collection<?> c) {
+ boolean b = true;
+ for (Iterator<?> it = c.iterator(); it.hasNext();) {
+ Object o = it.next();
+ if (!(o instanceof Attachment) && attachments.containsKey(((Attachment) o).getId())) {
+ b = false;
+ break;
+ }
+ }
+ return b;
+ }
+
+ public boolean addAll(Collection<? extends Attachment> c) {
+ boolean b = false;
+ for (Iterator<? extends Attachment> it = c.iterator(); it.hasNext();) {
+ Attachment o = it.next();
+ if (!attachments.containsKey(o.getId())) {
+ b = true;
+ attachments.put(o.getId(), o.getDataHandler());
+ cache.put(o.getId(), o);
+ }
+ }
+ return b;
+ }
+
+ public boolean retainAll(Collection<?> c) {
+ boolean b = false;
+ Set<String> ids = new HashSet<String>();
+ for (Iterator<?> it = c.iterator(); it.hasNext();) {
+ Object o = it.next();
+ if (o instanceof Attachment) {
+ ids.add(((Attachment)o).getId());
+ }
+ }
+
+ for (Iterator<String> it = attachments.keySet().iterator(); it.hasNext();) {
+ String k = it.next();
+ if (!ids.contains(k)) {
+ b = true;
+ it.remove();
+ cache.remove(k);
+ }
+ }
+ return b;
+ }
+
+ public boolean removeAll(Collection<?> c) {
+ boolean b = false;
+ for (Iterator<?> it = c.iterator(); it.hasNext();) {
+ Object o = it.next();
+ if (o instanceof Attachment && attachments.containsKey(((Attachment) o).getId())) {
+ b = true;
+ attachments.remove(((Attachment) o).getId());
+ cache.remove(((Attachment) o).getId());
+ }
+ }
+ return b;
+ }
+
+ public void clear() {
+ attachments.clear();
+ cache.clear();
+ }
+
+ Map<String, DataHandler> getAttachments() {
+ return attachments;
+ }
+
+ class WrappedAttachmentsIterator implements Iterator<Attachment> {
+ private Iterator<Map.Entry<String, DataHandler>> iterator;
+ private String key;
+
+ public WrappedAttachmentsIterator(Iterator<Map.Entry<String, DataHandler>> iterator) {
+ this.iterator = iterator;
+ }
+
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ public Attachment next() {
+ Map.Entry<String, DataHandler> e = iterator.next();
+ key = e.getKey();
+ Attachment o = cache.get(key);
+ if (o == null) {
+ o = new AttachmentImpl(key, e.getValue());
+ cache.put(key, o);
+ }
+ return o;
+ }
+
+ public void remove() {
+ iterator.remove();
+ cache.remove(key);
+ }
+ }
+}
Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java?rev=1497340&r1=1497339&r2=1497340&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java Thu Jun 27 13:12:22 2013
@@ -358,11 +358,15 @@ public class WrappedMessageContext imple
return null;
}
Collection<Attachment> attachments = CastUtils.cast((Collection<?>)mc.get(Message.ATTACHMENTS));
- Map<String, DataHandler> dataHandlers =
- AttachmentUtil.getDHMap(attachments);
- mc.put(propertyName,
- dataHandlers);
- scopes.put(propertyName, Scope.APPLICATION);
+ Map<String, DataHandler> dataHandlers;
+ if (attachments instanceof WrappedAttachments) {
+ dataHandlers = ((WrappedAttachments) attachments).getAttachments();
+ } else {
+ dataHandlers = AttachmentUtil.getDHMap(attachments);
+ mc.put(propertyName,
+ dataHandlers);
+ scopes.put(propertyName, Scope.APPLICATION);
+ }
return dataHandlers;
}
@@ -416,7 +420,6 @@ public class WrappedMessageContext imple
Object ret = null;
if ((MessageContext.HTTP_RESPONSE_HEADERS.equals(key)
|| MessageContext.HTTP_RESPONSE_CODE.equals(key)
- || MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS.equals(key)
|| MessageContext.HTTP_RESPONSE_CODE.equals(key))
&& !isResponse() && !isRequestor()) {
Message tmp = createResponseMessage();
@@ -447,6 +450,9 @@ public class WrappedMessageContext imple
authPolicy.setPassword((String)value);
} else if (MessageContext.HTTP_REQUEST_HEADERS.equals(key)) {
ret = message.put(Message.PROTOCOL_HEADERS, value);
+ } else if (MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS.equals(key)) {
+ Map<String, DataHandler> attachments = CastUtils.cast((Map<?, ?>)value);
+ ret = message.put(Message.ATTACHMENTS, new WrappedAttachments(attachments));
} else if (SoapBindingConstants.SOAP_ACTION.equals(mappedKey)
&& !isRequestor() && exchange != null) {
Message tmp = createResponseMessage();
Added: cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WrappedMessageContextTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WrappedMessageContextTest.java?rev=1497340&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WrappedMessageContextTest.java (added)
+++ cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WrappedMessageContextTest.java Thu Jun 27 13:12:22 2013
@@ -0,0 +1,84 @@
+/**
+ * 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.jaxws.context;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.MessageContext.Scope;
+
+import org.apache.cxf.attachment.AttachmentImpl;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.message.Attachment;
+import org.apache.cxf.message.Message;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class WrappedMessageContextTest extends Assert {
+ @Test
+ public void testPutAndGetJaxwsAttachments() throws Exception {
+ WrappedMessageContext context =
+ new WrappedMessageContext(new HashMap<String, Object>(), null, Scope.APPLICATION);
+
+ DataHandler dh1 = new DataHandler(new ByteArrayDataSource("Hello world!".getBytes(), "text/plain"));
+ DataHandler dh2 = new DataHandler(new ByteArrayDataSource("Hola mundo!".getBytes(), "text/plain"));
+ DataHandler dh3 = new DataHandler(new ByteArrayDataSource("Bonjour tout le monde!".getBytes(), "text/plain"));
+ Map<String, DataHandler> jattachments = new HashMap<String, DataHandler>();
+ context.put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS, jattachments);
+
+ jattachments.put("attachment-1", dh1);
+
+ Set<Attachment> cattachments = CastUtils.cast((Set<?>)context.get(Message.ATTACHMENTS));
+ assertNotNull(cattachments);
+
+ assertEquals(1, cattachments.size());
+
+ jattachments.put("attachment-2", dh2);
+
+ assertEquals(2, cattachments.size());
+
+ AttachmentImpl ca = new AttachmentImpl("attachment-3", dh3);
+ ca.setHeader("X-test", "true");
+ cattachments.add(ca);
+
+ assertEquals(3, jattachments.size());
+ assertEquals(3, cattachments.size());
+ for (Attachment a : cattachments) {
+ if ("attachment-1".equals(a.getId())) {
+ assertEquals("Hello world!", a.getDataHandler().getContent());
+ } else if ("attachment-2".equals(a.getId())) {
+ assertEquals("Hola mundo!", a.getDataHandler().getContent());
+ } else if ("attachment-3".equals(a.getId())) {
+ assertEquals("Bonjour tout le monde!", a.getDataHandler().getContent());
+ assertEquals("true", a.getHeader("X-test"));
+ } else {
+ fail("unknown attachment");
+ }
+ }
+ }
+}