You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ni...@apache.org on 2007/03/20 08:07:14 UTC
svn commit: r520299 - in /incubator/cxf/trunk:
rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/
systests/src/test/java/org/apache/cxf/systest/jaxws/
Author: ningjiang
Date: Tue Mar 20 00:07:12 2007
New Revision: 520299
URL: http://svn.apache.org/viewvc?view=rev&rev=520299
Log:
[CXF-470] Changed the requestContext and responseContext to ThreadLocal Objects
Modified:
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerXMLTest.java
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java?view=diff&rev=520299&r1=520298&r2=520299
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java Tue Mar 20 00:07:12 2007
@@ -22,8 +22,6 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicReference;
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
@@ -33,9 +31,10 @@
public class BindingProviderImpl implements BindingProvider {
- protected AtomicReference<Map<String, Object>> requestContext =
- new AtomicReference<Map<String, Object>>();
- protected Map<String, Object> responseContext;
+ protected ThreadLocal <Map<String, Object>> requestContext =
+ new ThreadLocal<Map<String, Object>>();
+ protected ThreadLocal <Map<String, Object>> responseContext =
+ new ThreadLocal<Map<String, Object>>();
private final Binding binding;
public BindingProviderImpl() {
@@ -48,16 +47,20 @@
public Map<String, Object> getRequestContext() {
if (null == requestContext.get()) {
- requestContext.compareAndSet(null, new ConcurrentHashMap<String, Object>(4));
- }
- return (Map<String, Object>)requestContext.get();
+ requestContext.set(new HashMap<String, Object>());
+ }
+ return requestContext.get();
}
-
+
public Map<String, Object> getResponseContext() {
- if (responseContext == null) {
- responseContext = new HashMap<String, Object>();
+ if (null == responseContext.get()) {
+ responseContext.set(new HashMap<String, Object>());
}
- return responseContext;
+ return responseContext.get();
+ }
+
+ protected void clearContext(ThreadLocal<Map<String, Object>> context) {
+ context.set(null);
}
public Binding getBinding() {
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java?view=diff&rev=520299&r1=520298&r2=520299
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java Tue Mar 20 00:07:12 2007
@@ -114,9 +114,16 @@
message.setContent(JAXBContext.class, context);
}
- Map<String, Object> requestContext = this.getRequestContext();
- Map<String, Object> responseContext = this.getResponseContext();
- message.putAll(requestContext);
+
+ Map<String, Object> reqContext = this.getRequestContext();
+ Map<String, Object> respContext = this.getResponseContext();
+ // cleanup the requestContext threadlocal variable
+ clearContext(requestContext);
+ // clear the response context's hold information
+ // Not call the clear Context is to avoid the error
+ // that getResponseContext() would be called by Client code first
+ respContext.clear();
+ message.putAll(reqContext);
//need to do context mapping from jax-ws to cxf message
ContextPropertiesMapping.mapRequestfromJaxws2Cxf(message);
@@ -140,7 +147,7 @@
// execute chain
chain.doIntercept(message);
-
+
if (message.getContent(Exception.class) != null) {
throw new RuntimeException(message.get(Exception.class));
}
@@ -156,9 +163,9 @@
if (!isOneWay) {
synchronized (exchange) {
Message inMsg = waitResponse(exchange);
- responseContext.putAll(inMsg);
+ respContext.putAll(inMsg);
//need to do context mapping from cxf message to jax-ws
- ContextPropertiesMapping.mapResponsefromCxf2Jaxws(responseContext);
+ ContextPropertiesMapping.mapResponsefromCxf2Jaxws(respContext);
return cl.cast(inMsg.getContent(Object.class));
}
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java?view=diff&rev=520299&r1=520298&r2=520299
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java Tue Mar 20 00:07:12 2007
@@ -24,9 +24,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.FutureTask;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
import javax.xml.ws.AsyncHandler;
@@ -52,9 +50,10 @@
private static final Logger LOG = LogUtils.getL7dLogger(JaxWsClientProxy.class);
- protected AtomicReference<Map<String, Object>> requestContext =
- new AtomicReference<Map<String, Object>>();
- protected Map<String, Object> responseContext;
+ protected ThreadLocal <Map<String, Object>> requestContext =
+ new ThreadLocal<Map<String, Object>>();
+ protected ThreadLocal <Map<String, Object>> responseContext =
+ new ThreadLocal<Map<String, Object>>();
private Endpoint endpoint;
private final Binding binding;
@@ -96,16 +95,22 @@
if (null == params) {
params = new Object[0];
}
-
- Map<String, Object> reqContext = this.getRequestContext();
- Map<String, Object> resContext = this.getResponseContext();
+ Map<String, Object> reqContext = this.getRequestContext();
+ Map<String, Object> respContext = this.getResponseContext();
+ // Clear the request ThreadLocal variable
+ clearContext(requestContext);
+ // Clear the response context's hold information
+ // Not call the clear Context is to avoid the error
+ // that getResponseContext() could be called by Client code first
+ respContext.clear();
+
Map<String, Object> context = new HashMap<String, Object>();
// need to do context mapping from jax-ws to cxf message
ContextPropertiesMapping.mapRequestfromJaxws2Cxf(reqContext);
context.put(Client.REQUEST_CONTEXT, reqContext);
- context.put(Client.RESPONSE_CONTEXT, resContext);
+ context.put(Client.RESPONSE_CONTEXT, respContext);
reqContext.put(Method.class.getName(), method);
@@ -118,7 +123,7 @@
result = invokeSync(method, oi, params, context);
}
// need to do context mapping from cxf message to jax-ws
- ContextPropertiesMapping.mapResponsefromCxf2Jaxws(resContext);
+ ContextPropertiesMapping.mapResponsefromCxf2Jaxws(respContext);
return result;
}
@@ -142,19 +147,25 @@
return r;
}
}
+
+ private void clearContext(ThreadLocal<Map<String, Object>> context) {
+ if (null != context.get()) {
+ context.set(null);
+ }
+ }
public Map<String, Object> getRequestContext() {
if (null == requestContext.get()) {
- requestContext.compareAndSet(null, new ConcurrentHashMap<String, Object>(4));
+ requestContext.set(new HashMap<String, Object>());
}
- return (Map<String, Object>)requestContext.get();
+ return requestContext.get();
}
public Map<String, Object> getResponseContext() {
- if (responseContext == null) {
- responseContext = new HashMap<String, Object>();
- }
- return responseContext;
+ if (null == responseContext.get()) {
+ responseContext.set(new HashMap<String, Object>());
+ }
+ return responseContext.get();
}
public Binding getBinding() {
Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerXMLTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerXMLTest.java?view=diff&rev=520299&r1=520298&r2=520299
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerXMLTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerXMLTest.java Tue Mar 20 00:07:12 2007
@@ -228,16 +228,18 @@
reply = greeter.sayHi();
assertNotNull("no response received from service", reply);
assertEquals(response2, reply);
+
+ BindingProvider bp = (BindingProvider) greeter;
+ Map<String, Object> responseContext = bp.getResponseContext();
+ Integer responseCode = (Integer) responseContext.get(Message.RESPONSE_CODE);
+ assertEquals(200, responseCode.intValue());
greeter.greetMeOneWay(System.getProperty("user.name"));
} catch (UndeclaredThrowableException ex) {
throw (Exception) ex.getCause();
}
- BindingProvider bp = (BindingProvider) greeter;
- Map<String, Object> responseContext = bp.getResponseContext();
- Integer responseCode = (Integer) responseContext.get(Message.RESPONSE_CODE);
- assertEquals(200, responseCode.intValue());
+
}
@Test