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 2014/07/03 16:00:18 UTC
git commit: [CXF-5832] Make the attachments map returned from the
JAX-WS properties a live "wrapper" over around the List that CXF
uses.
Repository: cxf
Updated Branches:
refs/heads/master eafb1dc17 -> 8394d3a8a
[CXF-5832] Make the attachments map returned from the JAX-WS properties a live "wrapper" over around the List<Attachment> that CXF uses.
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/8394d3a8
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/8394d3a8
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/8394d3a8
Branch: refs/heads/master
Commit: 8394d3a8a3056156074165005c8479b5cccf1c84
Parents: eafb1dc
Author: Daniel Kulp <dk...@apache.org>
Authored: Thu Jul 3 09:42:52 2014 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jul 3 09:43:43 2014 -0400
----------------------------------------------------------------------
.../apache/cxf/attachment/AttachmentUtil.java | 72 ++++++++++++++++++--
.../cxf/jaxws/AbstractJAXWSMethodInvoker.java | 19 ------
.../jaxws/context/WrappedMessageContext.java | 5 ++
3 files changed, 71 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/8394d3a8/core/src/main/java/org/apache/cxf/attachment/AttachmentUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/attachment/AttachmentUtil.java b/core/src/main/java/org/apache/cxf/attachment/AttachmentUtil.java
index dc8a68a..37c9b2d 100644
--- a/core/src/main/java/org/apache/cxf/attachment/AttachmentUtil.java
+++ b/core/src/main/java/org/apache/cxf/attachment/AttachmentUtil.java
@@ -28,10 +28,13 @@ import java.net.URI;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
+import java.util.AbstractMap;
+import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -243,22 +246,79 @@ public final class AttachmentUtil {
return buffer.toString();
}
- public static Map<String, DataHandler> getDHMap(Collection<Attachment> attachments) {
+ public static Map<String, DataHandler> getDHMap(final Collection<Attachment> attachments) {
Map<String, DataHandler> dataHandlers = null;
if (attachments != null) {
if (attachments instanceof LazyAttachmentCollection) {
dataHandlers = ((LazyAttachmentCollection)attachments).createDataHandlerMap();
} else {
- //preserve the order of iteration
- dataHandlers = new LinkedHashMap<String, DataHandler>();
- for (Attachment attachment : attachments) {
- dataHandlers.put(attachment.getId(), attachment.getDataHandler());
- }
+ dataHandlers = new DHMap(attachments);
}
}
return dataHandlers == null ? new LinkedHashMap<String, DataHandler>() : dataHandlers;
}
+ static class DHMap extends AbstractMap<String, DataHandler> {
+ final Collection<Attachment> list;
+ public DHMap(Collection<Attachment> l) {
+ list = l;
+ }
+ public Set<Map.Entry<String, DataHandler>> entrySet() {
+ return new AbstractSet<Map.Entry<String, DataHandler>>() {
+ @Override
+ public Iterator<Map.Entry<String, DataHandler>> iterator() {
+ final Iterator<Attachment> it = list.iterator();
+ return new Iterator<Map.Entry<String, DataHandler>>() {
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+ public java.util.Map.Entry<String, DataHandler> next() {
+ final Attachment a = it.next();
+ return new Map.Entry<String, DataHandler>() {
+ @Override
+ public String getKey() {
+ return a.getId();
+ }
+
+ @Override
+ public DataHandler getValue() {
+ return a.getDataHandler();
+ }
+
+ @Override
+ public DataHandler setValue(DataHandler value) {
+ return null;
+ }
+ };
+ }
+ public void remove() {
+ it.remove();
+ }
+ };
+ }
+
+ @Override
+ public int size() {
+ return list.size();
+ }
+ };
+ }
+ public DataHandler put(String key, DataHandler value) {
+ Iterator<Attachment> i = list.iterator();
+ DataHandler ret = null;
+ while (i.hasNext()) {
+ Attachment a = i.next();
+ if (a.getId().equals(key)) {
+ i.remove();
+ ret = a.getDataHandler();
+ break;
+ }
+ }
+ list.add(new AttachmentImpl(key, value));
+ return ret;
+ }
+ }
+
public static String cleanContentId(String id) {
if (id != null) {
if (id.startsWith("<")) {
http://git-wip-us.apache.org/repos/asf/cxf/blob/8394d3a8/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AbstractJAXWSMethodInvoker.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AbstractJAXWSMethodInvoker.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AbstractJAXWSMethodInvoker.java
index 361294f..fabcdd2 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AbstractJAXWSMethodInvoker.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/AbstractJAXWSMethodInvoker.java
@@ -22,15 +22,12 @@ package org.apache.cxf.jaxws;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
-import javax.activation.DataHandler;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Provider;
import javax.xml.ws.Response;
@@ -39,7 +36,6 @@ import javax.xml.ws.handler.MessageContext.Scope;
import javax.xml.ws.soap.SOAPFaultException;
import org.apache.cxf.annotations.UseAsyncMethod;
-import org.apache.cxf.attachment.AttachmentImpl;
import org.apache.cxf.binding.soap.SoapFault;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.continuations.Continuation;
@@ -49,7 +45,6 @@ import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxws.context.WrappedMessageContext;
-import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.FaultMode;
import org.apache.cxf.message.Message;
@@ -337,20 +332,6 @@ public abstract class AbstractJAXWSMethodInvoker extends FactoryInvoker {
heads.remove("Content-Type");
}
}
- Map<String, DataHandler> dataHandlers
- = CastUtils.cast((Map<?, ?>)out.get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS));
- if (dataHandlers != null && !dataHandlers.isEmpty()) {
- Collection<Attachment> attachments = out.getAttachments();
- if (attachments == null) {
- attachments = new ArrayList<Attachment>();
- out.setAttachments(attachments);
- }
- for (Map.Entry<String, DataHandler> entry : dataHandlers.entrySet()) {
- Attachment att = new AttachmentImpl(entry.getKey(), entry.getValue());
- attachments.add(att);
- }
- }
- out.remove(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/8394d3a8/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
index 0d18ac7..f1d245a 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WrappedMessageContext.java
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxws.context;
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -365,6 +366,10 @@ public class WrappedMessageContext implements MessageContext {
if (attachments instanceof WrappedAttachments) {
dataHandlers = ((WrappedAttachments) attachments).getAttachments();
} else {
+ if (attachments == null) {
+ attachments = new ArrayList<Attachment>();
+ mc.put(Message.ATTACHMENTS, attachments);
+ }
dataHandlers = AttachmentUtil.getDHMap(attachments);
mc.put(propertyName,
dataHandlers);