This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch 3.2.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.2.x-fixes by this push:
     new 7335df9  [CXF-7591, CXF-7710] More updates to response context 
handling to wrapper maps already in place
7335df9 is described below

commit 7335df984ca96375b38f5aec7ff3e9b2f60c9a34
Author: Daniel Kulp <dk...@apache.org>
AuthorDate: Wed Oct 17 14:51:57 2018 -0400

    [CXF-7591, CXF-7710] More updates to response context handling to wrapper 
maps already in place
---
 .../java/org/apache/cxf/endpoint/ClientImpl.java   | 153 ++++++++++++---------
 1 file changed, 86 insertions(+), 67 deletions(-)

diff --git a/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java 
b/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
index 2a73a84..1506ade 100644
--- a/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
+++ b/core/src/main/java/org/apache/cxf/endpoint/ClientImpl.java
@@ -21,6 +21,7 @@ package org.apache.cxf.endpoint;
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.io.Serializable;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
@@ -29,6 +30,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
@@ -242,7 +244,7 @@ public class ClientImpl
         requestContext.remove(t);
         responseContext.remove(t);
     }
-    
+
     public Contexts getContexts() {
         return new Contexts() {
             @Override
@@ -256,14 +258,15 @@ public class ClientImpl
             @Override
             public Map<String, Object> getResponseContext() {
                 return ClientImpl.this.getResponseContext();
-            }            
+            }
         };
     }
+
     public Map<String, Object> getRequestContext() {
         if (isThreadLocalRequestContext()) {
             final Thread t = Thread.currentThread();
             if (!requestContext.containsKey(t)) {
-                EchoContext freshRequestContext = new 
EchoContext(currentRequestContext, requestContext);
+                EchoContext freshRequestContext = new 
EchoContext(currentRequestContext);
                 requestContext.put(t, freshRequestContext);
             }
             latestContextThread = t;
@@ -272,30 +275,21 @@ public class ClientImpl
         return currentRequestContext;
     }
     public Map<String, Object> getResponseContext() {
-        final Thread t = Thread.currentThread();
-        ResponseContext ret = responseContext.get(t);
-        if (ret == null) {
-            ret = new ResponseContext();
-            responseContext.put(t, ret);
+        if (!responseContext.containsKey(Thread.currentThread())) {
+            final Thread t = Thread.currentThread();
+            responseContext.put(t, new ResponseContext());
         }
-        return ret;
-    }
-    protected Map<String, Object> newResponseContext() {
-        final Thread t = Thread.currentThread();
-        ResponseContext ret = new ResponseContext();
-        responseContext.put(t, ret);
-        return ret;
+        return responseContext.get(Thread.currentThread());
     }
-    protected Map<String, Object> reloadResponseContext(Map<String, Object> o) 
{
-        final Thread t = Thread.currentThread();
-        ResponseContext ctx = responseContext.get(t);
-        if (ctx == null) {
-            ctx = new ResponseContext(o);
-            responseContext.put(t, ctx);
-        } else if (o != ctx) {
-            ctx.reload(o);
-        }
-        return ctx;
+    protected Map<String, Object> setResponseContext(Map<String, Object> ctx) {
+        if (ctx instanceof ResponseContext) {
+            ResponseContext c = (ResponseContext)ctx;
+            responseContext.put(Thread.currentThread(), c);
+            return c;
+        }
+        ResponseContext c = new ResponseContext(ctx);
+        responseContext.put(Thread.currentThread(), c);
+        return c;
     }
     public boolean isThreadLocalRequestContext() {
         Object o = currentRequestContext.get(THREAD_LOCAL_REQUEST_CONTEXT);
@@ -482,7 +476,7 @@ public class ClientImpl
                 context.put(REQUEST_CONTEXT, reqContext);
             }
             if (resContext == null) {
-                resContext = newResponseContext();
+                resContext = new ResponseContext();
                 context.put(RESPONSE_CONTEXT, resContext);
             }
 
@@ -518,7 +512,7 @@ public class ClientImpl
                                 // handle the right response
                                 List<Object> resList = null;
                                 Message inMsg = 
message.getExchange().getInMessage();
-                                Map<String, Object> ctx = getResponseContext();
+                                Map<String, Object> ctx = 
responseContext.get(Thread.currentThread());
                                 resList = 
CastUtils.cast(inMsg.getContent(List.class));
                                 Object[] result = resList == null ? null : 
resList.toArray();
                                 callback.handleResponse(ctx, result);
@@ -545,9 +539,7 @@ public class ClientImpl
             }
             return processResult(message, exchange, oi, resContext);
         } finally {
-            if (callback == null) {
-                reloadResponseContext(resContext);
-            }
+            setResponseContext(resContext);
             if (origLoader != null) {
                 origLoader.reset();
             }
@@ -646,7 +638,7 @@ public class ClientImpl
                 resContext.putAll(inMsg);
                 // remove the recursive reference if present
                 resContext.remove(Message.INVOCATION_CONTEXT);
-                reloadResponseContext(resContext);
+                setResponseContext(resContext);
             }
             resList = CastUtils.cast(inMsg.getContent(List.class));
         }
@@ -821,8 +813,9 @@ public class ClientImpl
                                                 Message.INVOCATION_CONTEXT));
                         resCtx = CastUtils.cast((Map<?, ?>) resCtx
                                 .get(RESPONSE_CONTEXT));
-                        resCtx = reloadResponseContext(resCtx);
-
+                        if (resCtx != null) {
+                            setResponseContext(resCtx);
+                        }
                         // remove callback so that it won't be invoked twice
                         callback = 
message.getExchange().remove(ClientCallback.class);
                         if (callback != null) {
@@ -849,14 +842,15 @@ public class ClientImpl
                                                                 
.getOutMessage()
                                                                 
.get(Message.INVOCATION_CONTEXT));
                 resCtx = CastUtils.cast((Map<?, 
?>)resCtx.get(RESPONSE_CONTEXT));
+                if (resCtx != null && responseContext != null) {
+                    setResponseContext(resCtx);
+                }
                 try {
                     Object obj[] = processResult(message, 
message.getExchange(),
                                                  null, resCtx);
 
-                    resCtx = reloadResponseContext(resCtx);
                     callback.handleResponse(resCtx, obj);
                 } catch (Throwable ex) {
-                    resCtx = reloadResponseContext(resCtx);
                     callback.handleException(resCtx, ex);
                 }
             }
@@ -1059,38 +1053,23 @@ public class ClientImpl
 
     public class EchoContext extends ConcurrentHashMap<String, Object> {
         private static final long serialVersionUID = 1L;
-        
-        final Map<Thread, EchoContext> context;
-        public EchoContext(Map<String, Object> sharedMap, Map<Thread, 
EchoContext> ctx) {
-            super(8, 0.75f, 4);
-            if (sharedMap != null) {
-                super.putAll(sharedMap);
-            }
-            context = ctx;
-        }
-
-        public EchoContext(Map<Thread, EchoContext> ctx) {
+        public EchoContext(Map<String, Object> sharedMap) {
             super(8, 0.75f, 4);
-            context = ctx;
+            putAll(sharedMap);
         }
 
         public void reload() {
-            reload(context.get(latestContextThread));
-        }
-        public void reload(Map<String, Object> content) {
             super.clear();
-            if (content != null) {
-                putAll(content);
-            }
+            super.putAll(requestContext.get(latestContextThread));
         }
         
         @Override
         public void clear() {
             super.clear();
             try {
-                for (Map.Entry<Thread, EchoContext> ent : context.entrySet()) {
+                for (Map.Entry<Thread, EchoContext> ent : 
requestContext.entrySet()) {
                     if (ent.getValue() == this) {
-                        context.remove(ent.getKey());
+                        requestContext.remove(ent.getKey());
                         return;
                     }
                 }
@@ -1100,30 +1079,25 @@ public class ClientImpl
         }
     }
 
-    /** 
+    /**
      * Class to handle the response contexts.   The clear is overloaded to 
remove
      * this context from the threadLocal caches in the ClientImpl
      */
-    class ResponseContext extends HashMap<String, Object> {
-        private static final long serialVersionUID = 1L;
+    class ResponseContext implements Map<String, Object>, Serializable {
+        private static final long serialVersionUID = 2L;
+        final Map<String, Object> wrapped;
         
         ResponseContext(Map<String, Object> origMap) {
-            super(origMap);
+            wrapped = origMap;
         }
 
         ResponseContext() {
+            wrapped = new HashMap<>();
         }
 
-        public void reload(Map<String, Object> content) {
-            super.clear();
-            if (content != null) {
-                putAll(content);
-            }
-        }
-        
         @Override
         public void clear() {
-            super.clear();
+            wrapped.clear();
             try {
                 for (Map.Entry<Thread, ResponseContext> ent : 
responseContext.entrySet()) {
                     if (ent.getValue() == this) {
@@ -1135,6 +1109,51 @@ public class ClientImpl
                 //ignore
             }
         }
+
+        @Override
+        public int size() {
+            return wrapped.size();
+        }
+        @Override
+        public boolean isEmpty() {
+            return wrapped.isEmpty();
+        }
+        @Override
+        public boolean containsKey(Object key) {
+            return wrapped.containsKey(key);
+        }
+        @Override
+        public boolean containsValue(Object value) {
+            return wrapped.containsKey(value);
+        }
+        @Override
+        public Object get(Object key) {
+            return wrapped.get(key);
+        }
+        @Override
+        public Object put(String key, Object value) {
+            return wrapped.put(key, value);
+        }
+        @Override
+        public Object remove(Object key) {
+            return wrapped.remove(key);
+        }
+        @Override
+        public void putAll(Map<? extends String, ? extends Object> m) {
+            wrapped.putAll(m);
+        }
+        @Override
+        public Set<String> keySet() {
+            return wrapped.keySet();
+        }
+        @Override
+        public Collection<Object> values() {
+            return wrapped.values();
+        }
+        @Override
+        public Set<Entry<String, Object>> entrySet() {
+            return wrapped.entrySet();
+        }
     }
 
     public void setExecutor(Executor executor) {

Reply via email to