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 2015/07/09 18:20:37 UTC

[4/9] cxf git commit: [CXF-6458] Start work on trying to "close" the Unmarshallers that implement closeable.

[CXF-6458] Start work on trying to "close" the Unmarshallers that implement closeable.


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/37d49fb3
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/37d49fb3
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/37d49fb3

Branch: refs/heads/3.0.x-fixes
Commit: 37d49fb307cc83c72d2c06b9711b0d523c921d5a
Parents: c780d3a
Author: Daniel Kulp <dk...@apache.org>
Authored: Fri Jun 19 15:21:20 2015 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jul 9 12:20:26 2015 -0400

----------------------------------------------------------------------
 .../org/apache/cxf/common/jaxb/JAXBUtils.java   | 50 ++++++++++++++++++++
 .../AbstractBPBeanDefinitionParser.java         |  7 ++-
 .../jsse/TLSClientParametersConfig.java         |  4 +-
 .../spring/AbstractBeanDefinitionParser.java    | 10 +++-
 .../configuration/spring/JAXBBeanFactory.java   |  4 +-
 .../cxf/ws/addressing/VersionTransformer.java   | 18 +++++--
 .../org/apache/cxf/jaxb/io/DataReaderImpl.java  | 31 ++++++++----
 .../org/apache/cxf/jaxrs/ext/xml/XMLSource.java | 13 +++--
 .../cxf/jaxrs/provider/JAXBElementProvider.java |  4 +-
 .../org/apache/cxf/jaxrs/utils/JAXBUtils.java   | 16 ++++++-
 .../handler/AnnotationHandlerChainBuilder.java  |  4 +-
 .../handler/logical/LogicalMessageImpl.java     |  5 +-
 .../handler/soap/SOAPMessageContextImpl.java    |  5 +-
 .../org/apache/cxf/jaxws/spi/ProviderImpl.java  | 18 +++++--
 .../cxf/jaxrs/provider/json/JSONProvider.java   |  4 +-
 .../apache/cxf/ws/addressing/soap/MAPCodec.java |  5 +-
 ...ndpointReferenceDomainExpressionBuilder.java | 38 ++++++---------
 .../builder/jaxb/JaxbAssertionBuilder.java      |  5 +-
 .../apache/cxf/wsdl/JAXBExtensionHelper.java    |  4 +-
 .../internal/WSDiscoveryServiceImpl.java        |  3 +-
 20 files changed, 182 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java b/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
index d4b900e..fe3d2ed 100644
--- a/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
+++ b/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
@@ -21,6 +21,7 @@ package org.apache.cxf.common.jaxb;
 
 
 import java.io.BufferedReader;
+import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -48,10 +49,12 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.PropertyException;
 import javax.xml.bind.SchemaOutputResolver;
+import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.attachment.AttachmentMarshaller;
 import javax.xml.bind.attachment.AttachmentUnmarshaller;
@@ -59,6 +62,7 @@ import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.Result;
+import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.stream.StreamResult;
 
@@ -164,6 +168,52 @@ public final class JAXBUtils {
     private JAXBUtils() {
     }
     
+    public static void closeUnmarshaller(Unmarshaller u) {
+        if (u instanceof Closeable) {
+            //need to do this to clear the ThreadLocal cache
+            //see https://java.net/jira/browse/JAXB-1000
+
+            try {
+                ((Closeable)u).close();
+            } catch (IOException e) {
+                //ignore
+            }
+        }
+    }
+    public static Object unmarshall(JAXBContext c, Element e) throws JAXBException {
+        Unmarshaller u = c.createUnmarshaller();
+        try {
+            return u.unmarshal(e);
+        } finally {
+            closeUnmarshaller(u);
+        }
+    }
+    public static <T> JAXBElement<T> unmarshall(JAXBContext c, Element e, Class<T> cls) throws JAXBException {
+        Unmarshaller u = c.createUnmarshaller();
+        try {
+            return u.unmarshal(e, cls);
+        } finally {
+            closeUnmarshaller(u);
+        }
+    }
+    public static Object unmarshall(JAXBContext c, Source s) throws JAXBException {
+        Unmarshaller u = c.createUnmarshaller();
+        try {
+            return u.unmarshal(s);
+        } finally {
+            closeUnmarshaller(u);
+        }
+    }
+    public static <T> JAXBElement<T> unmarshall(JAXBContext c, XMLStreamReader reader,
+                                                Class<T> cls) throws JAXBException {
+        Unmarshaller u = c.createUnmarshaller();
+        try {
+            return u.unmarshal(reader, cls);
+        } finally {
+            closeUnmarshaller(u);
+        }
+    }
+    
     public static String builtInTypeToJavaType(String type) {
         return BUILTIN_DATATYPES_MAP.get(type);
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/configuration/blueprint/AbstractBPBeanDefinitionParser.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/configuration/blueprint/AbstractBPBeanDefinitionParser.java b/core/src/main/java/org/apache/cxf/configuration/blueprint/AbstractBPBeanDefinitionParser.java
index c71601c..c211c8c 100644
--- a/core/src/main/java/org/apache/cxf/configuration/blueprint/AbstractBPBeanDefinitionParser.java
+++ b/core/src/main/java/org/apache/cxf/configuration/blueprint/AbstractBPBeanDefinitionParser.java
@@ -48,6 +48,7 @@ import org.apache.aries.blueprint.mutable.MutableValueMetadata;
 import org.apache.cxf.bus.blueprint.BlueprintBus;
 import org.apache.cxf.common.jaxb.JAXBContextCache;
 import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.DOMUtils;
@@ -335,7 +336,7 @@ public abstract class AbstractBPBeanDefinitionParser {
         public Object createJAXBBean(String v) {
             XMLStreamReader reader = StaxUtils.createXMLStreamReader(new StringReader(v));
             try {
-                Object o = ctx.createUnmarshaller().unmarshal(reader, cls);
+                Object o = JAXBUtils.unmarshall(ctx, reader, cls);
                 if (o instanceof JAXBElement<?>) {
                     JAXBElement<?> el = (JAXBElement<?>)o;
                     o = el.getValue();
@@ -360,6 +361,7 @@ public abstract class AbstractBPBeanDefinitionParser {
                                             Class<?> c) {   
         try {
             XMLStreamWriter xmlWriter = null;
+            Unmarshaller u = null;
             try {
                 StringWriter writer = new StringWriter();
                 xmlWriter = StaxUtils.createXMLStreamWriter(writer);
@@ -375,7 +377,7 @@ public abstract class AbstractBPBeanDefinitionParser {
                 bean.addProperty(propertyName, factory);
 
             } catch (Exception ex) {                
-                Unmarshaller u = getContext(c).createUnmarshaller();
+                u = getContext(c).createUnmarshaller();
                 Object obj;
                 if (c != null) {
                     obj = u.unmarshal(data, c);
@@ -393,6 +395,7 @@ public abstract class AbstractBPBeanDefinitionParser {
                 }
             } finally {
                 StaxUtils.close(xmlWriter);
+                JAXBUtils.closeUnmarshaller(u);
             }
         } catch (JAXBException e) {
             throw new RuntimeException("Could not parse configuration.", e);

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParametersConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParametersConfig.java b/core/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParametersConfig.java
index 5677b9b..7df3e05 100644
--- a/core/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParametersConfig.java
+++ b/core/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParametersConfig.java
@@ -36,6 +36,7 @@ import javax.xml.stream.XMLStreamReader;
 import org.apache.cxf.common.injection.NoJSR250Annotations;
 import org.apache.cxf.common.jaxb.JAXBContextCache;
 import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.configuration.security.TLSClientParametersType;
 import org.apache.cxf.staxutils.StaxUtils;
@@ -140,7 +141,7 @@ public final class TLSClientParametersConfig {
         
         StringReader reader = new StringReader(s);
         XMLStreamReader data = StaxUtils.createXMLStreamReader(reader);
-        Unmarshaller u;
+        Unmarshaller u = null;
         try {
             u = getContext().createUnmarshaller();
             JAXBElement<TLSClientParametersType> type = u.unmarshal(data, TLSClientParametersType.class);
@@ -156,6 +157,7 @@ public final class TLSClientParametersConfig {
             } catch (XMLStreamException ex) {
                 throw new RuntimeException(ex);
             }
+            JAXBUtils.closeUnmarshaller(u);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java b/core/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java
index 7fcc99f..d28cbfb 100644
--- a/core/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java
+++ b/core/src/main/java/org/apache/cxf/configuration/spring/AbstractBeanDefinitionParser.java
@@ -38,8 +38,10 @@ import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
+
 import org.apache.cxf.common.jaxb.JAXBContextCache;
 import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.DOMUtils;
@@ -334,6 +336,7 @@ public abstract class AbstractBeanDefinitionParser
                                             Class<?> c) {
         try {
             XMLStreamWriter xmlWriter = null;
+            Unmarshaller u = null;
             try {
                 StringWriter writer = new StringWriter();
                 xmlWriter = StaxUtils.createXMLStreamWriter(writer);
@@ -348,7 +351,7 @@ public abstract class AbstractBeanDefinitionParser
                 jaxbbean.addConstructorArgValue(c);
                 bean.addPropertyValue(propertyName, jaxbbean.getBeanDefinition());
             } catch (Exception ex) {
-                Unmarshaller u = getContext(c).createUnmarshaller();
+                u = getContext(c).createUnmarshaller();
                 Object obj;
                 if (c != null) {
                     obj = u.unmarshal(data, c);
@@ -364,6 +367,7 @@ public abstract class AbstractBeanDefinitionParser
                 }
             } finally {
                 StaxUtils.close(xmlWriter);
+                JAXBUtils.closeUnmarshaller(u);
             }
         } catch (JAXBException e) {
             throw new RuntimeException("Could not parse configuration.", e);
@@ -426,8 +430,9 @@ public abstract class AbstractBeanDefinitionParser
     protected static <T> T unmarshalFactoryString(String s, JAXBContext ctx, Class<T> cls) {
         StringReader reader = new StringReader(s);
         XMLStreamReader data = StaxUtils.createXMLStreamReader(reader);
+        Unmarshaller u = null;
         try {
-            Unmarshaller u = ctx.createUnmarshaller();
+            u = ctx.createUnmarshaller();
             JAXBElement<?> obj = u.unmarshal(data, cls);
             return cls.cast(obj.getValue());
         } catch (RuntimeException e) {
@@ -440,6 +445,7 @@ public abstract class AbstractBeanDefinitionParser
             } catch (XMLStreamException ex) {
                 throw new RuntimeException(ex);
             }
+            JAXBUtils.closeUnmarshaller(u);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/configuration/spring/JAXBBeanFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/configuration/spring/JAXBBeanFactory.java b/core/src/main/java/org/apache/cxf/configuration/spring/JAXBBeanFactory.java
index c542482..9e4efc9 100644
--- a/core/src/main/java/org/apache/cxf/configuration/spring/JAXBBeanFactory.java
+++ b/core/src/main/java/org/apache/cxf/configuration/spring/JAXBBeanFactory.java
@@ -28,6 +28,7 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.staxutils.StaxUtils;
 
 /**
@@ -44,7 +45,7 @@ public final class JAXBBeanFactory {
         
         StringReader reader = new StringReader(s);
         XMLStreamReader data = StaxUtils.createXMLStreamReader(reader);
-        Unmarshaller u;
+        Unmarshaller u = null;
         try {
             Object obj;
             u = context.createUnmarshaller();
@@ -67,6 +68,7 @@ public final class JAXBBeanFactory {
             } catch (XMLStreamException ex) {
                 throw new RuntimeException(ex);
             }
+            JAXBUtils.closeUnmarshaller(u);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java b/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
index 588c83f..dec36de 100644
--- a/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
+++ b/core/src/main/java/org/apache/cxf/ws/addressing/VersionTransformer.java
@@ -26,12 +26,16 @@ import java.util.Map;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
 import javax.xml.namespace.QName;
 //import javax.xml.ws.EndpointReference;
 //import javax.xml.ws.wsaddressing.W3CEndpointReference;
 
+
+
 import org.w3c.dom.Element;
 
+import org.apache.cxf.common.jaxb.JAXBUtils;
 // importation convention: if the same class name is used for 
 // 2005/08 and 2004/08, then the former version is imported
 // and the latter is fully qualified when used
@@ -436,12 +440,16 @@ public class VersionTransformer {
             return null;
         }
         JAXBContext ctx = getExposedJAXBContext(tns);
-        JAXBElement<?> o = ctx.createUnmarshaller().unmarshal(ref, getExposedReferenceType(tns));
-        if (o != null) {
-            return convertToNative(o.getValue());
+        Unmarshaller um = ctx.createUnmarshaller();
+        try {
+            JAXBElement<?> o = um.unmarshal(ref, getExposedReferenceType(tns));
+            if (o != null) {
+                return convertToNative(o.getValue());
+            }
+            return convertToNative(null);
+        } finally {
+            JAXBUtils.closeUnmarshaller(um);
         }
-        return convertToNative(null);
-        
     }
     /**
      * Converts a version specific EndpointReferenceType to the native version

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
----------------------------------------------------------------------
diff --git a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
index de13029..374736f 100644
--- a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
+++ b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
@@ -34,6 +34,7 @@ import javax.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.namespace.QName;
 
 import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.databinding.DataReader;
 import org.apache.cxf.interceptor.Fault;
@@ -173,20 +174,32 @@ public class DataReaderImpl<T> extends JAXBDataBase implements DataReader<T> {
             }
         }
         
-        Object obj = JAXBEncoderDecoder.unmarshall(createUnmarshaller(), reader, part, 
-                                             unwrapJAXBElement);
-        onCompleteUnmarshalling();
-        
-        return obj;
+        Unmarshaller um = createUnmarshaller();
+        try {
+            Object obj = JAXBEncoderDecoder.unmarshall(um, reader, part, 
+                                                 unwrapJAXBElement);
+            onCompleteUnmarshalling();
+            
+            return obj;
+        } finally {
+            JAXBUtils.closeUnmarshaller(um);
+        }
     }
 
     public Object read(QName name, T input, Class<?> type) {
-        Object obj = JAXBEncoderDecoder.unmarshall(createUnmarshaller(), input,
+        Unmarshaller um = createUnmarshaller();
+        
+        try {
+            Object obj = JAXBEncoderDecoder.unmarshall(um, input,
                                              name, type, 
                                              unwrapJAXBElement);
-        onCompleteUnmarshalling();
-        
-        return obj;
+            onCompleteUnmarshalling();
+            
+            return obj;
+        } finally {
+            JAXBUtils.closeUnmarshaller(um);
+        }
+
     }
 
     private void onCompleteUnmarshalling() {

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLSource.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLSource.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLSource.java
index c1272a6..062338d 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLSource.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLSource.java
@@ -47,6 +47,7 @@ import org.w3c.dom.NodeList;
 
 import org.xml.sax.InputSource;
 
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
@@ -358,10 +359,14 @@ public class XMLSource {
                 c = provider.getClassContext(cls);
             }
             Unmarshaller u = c.createUnmarshaller();
-            if (cls.getAnnotation(XmlRootElement.class) != null) {
-                return cls.cast(u.unmarshal(s));
-            } else {
-                return u.unmarshal(s, cls).getValue();
+            try {
+                if (cls.getAnnotation(XmlRootElement.class) != null) {
+                    return cls.cast(u.unmarshal(s));
+                } else {
+                    return u.unmarshal(s, cls).getValue();
+                }
+            } finally {
+                JAXBUtils.closeUnmarshaller(u);
             }
         } catch (Exception ex) {
             throw new RuntimeException(ex);

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
index f17c93b..4c61df9 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
@@ -168,13 +168,14 @@ public class JAXBElementProvider<T> extends AbstractJAXBProvider<T>  {
         }
         
         XMLStreamReader reader = null;
+        Unmarshaller unmarshaller = null;
         try {
             
             boolean isCollection = InjectionUtils.isSupportedCollectionOrArray(type);
             Class<?> theGenericType = isCollection ? InjectionUtils.getActualType(genericType) : type;
             Class<?> theType = getActualType(theGenericType, genericType, anns);
 
-            Unmarshaller unmarshaller = createUnmarshaller(theType, genericType, isCollection);
+            unmarshaller = createUnmarshaller(theType, genericType, isCollection);
             addAttachmentUnmarshaller(unmarshaller);
             Object response = null;
             if (JAXBElement.class.isAssignableFrom(type) 
@@ -217,6 +218,7 @@ public class JAXBElementProvider<T> extends AbstractJAXBProvider<T>  {
             } catch (XMLStreamException e) {
                 // Ignore
             }
+            JAXBUtils.closeUnmarshaller(unmarshaller);
         }
         // unreachable
         return null;

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
index 27ed25a..aba95d2 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXBUtils.java
@@ -18,9 +18,12 @@
  */
 package org.apache.cxf.jaxrs.utils;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
@@ -28,7 +31,18 @@ public final class JAXBUtils {
     private JAXBUtils() {
         
     }
-    
+    public static void closeUnmarshaller(Unmarshaller u) {
+        if (u instanceof Closeable) {
+            //need to do this to clear the ThreadLocal cache
+            //see https://java.net/jira/browse/JAXB-1000
+
+            try {
+                ((Closeable)u).close();
+            } catch (IOException e) {
+                //ignore
+            }
+        }        
+    }
     public static Object convertWithAdapter(Object obj,
                                             Class<?> adapterClass,
                                             Annotation[] anns) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
index 914db9e..d8d62f4 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AnnotationHandlerChainBuilder.java
@@ -44,6 +44,7 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.jaxws.handler.types.PortComponentHandlerType;
@@ -265,8 +266,7 @@ public class AnnotationHandlerChainBuilder extends HandlerChainBuilder {
     private void processHandlerElement(Element el, List<Handler> chain) {
         try {
             JAXBContext ctx = getContextForPortComponentHandlerType();
-            PortComponentHandlerType pt = ctx.createUnmarshaller()
-                .unmarshal(el, PortComponentHandlerType.class).getValue();
+            PortComponentHandlerType pt = JAXBUtils.unmarshall(ctx, el, PortComponentHandlerType.class).getValue();
             chain.addAll(buildHandlerChain(pt, classLoader));
         } catch (JAXBException e) {
             // TODO Auto-generated catch block

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
index dfe6ad0..835289a 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
@@ -47,6 +47,7 @@ import org.w3c.dom.Node;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver;
 import org.apache.cxf.binding.soap.saaj.SAAJUtils;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.interceptor.Fault;
@@ -241,14 +242,14 @@ public class LogicalMessageImpl implements LogicalMessage {
                     parent.removeChild(ds.getNode());
                 }
                 try {
-                    return arg0.createUnmarshaller().unmarshal(ds);
+                    return JAXBUtils.unmarshall(arg0, ds);
                 } finally {
                     if (parent instanceof DocumentFragment) {
                         parent.insertBefore(ds.getNode(), next);
                     }
                 }
             } 
-            return arg0.createUnmarshaller().unmarshal(getPayload());
+            return JAXBUtils.unmarshall(arg0, getPayload());
         } catch (JAXBException e) {
             throw new WebServiceException(e);
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
index ffcf1ce..6dc8af0 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
@@ -40,6 +40,7 @@ import javax.xml.ws.handler.soap.SOAPMessageContext;
 
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxws.context.WrappedMessageContext;
 import org.apache.cxf.message.Message;
@@ -97,9 +98,7 @@ public class SOAPMessageContextImpl extends WrappedMessageContext implements SOA
                 if ((allRoles
                     || roles.contains(she.getActor())) 
                     && name.equals(she.getElementQName())) {
-                    
-                    ret.add(context.createUnmarshaller().unmarshal(she));
-                    
+                    ret.add(JAXBUtils.unmarshall(context, she));
                 }
             }
             return ret.toArray(new Object[ret.size()]);

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
index bc890fa..58714a5 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
@@ -50,6 +50,7 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.feature.Feature;
 import org.apache.cxf.helpers.DOMUtils;
@@ -182,7 +183,7 @@ public class ProviderImpl extends javax.xml.ws.spi.Provider {
     public static EndpointReferenceType convertToInternal(EndpointReference external) {
         if (external instanceof W3CEndpointReference) {
             
-            
+            Unmarshaller um = null;
             try {
                 Document doc = DOMUtils.newDocument();
                 DOMResult result = new DOMResult(doc);
@@ -194,13 +195,16 @@ public class ProviderImpl extends javax.xml.ws.spi.Provider {
                 //jaxContext = ContextUtils.getJAXBContext();
                 JAXBContext context = JAXBContext
                     .newInstance(new Class[] {org.apache.cxf.ws.addressing.ObjectFactory.class});
-                EndpointReferenceType internal = context.createUnmarshaller()
+                um = context.createUnmarshaller();
+                EndpointReferenceType internal = um
                     .unmarshal(reader, EndpointReferenceType.class)
                     .getValue();
                 return internal;
             } catch (JAXBException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
+            } finally {
+                JAXBUtils.closeUnmarshaller(um);
             }
             return null;
         } else {
@@ -362,7 +366,11 @@ public class ProviderImpl extends javax.xml.ws.spi.Provider {
                 return AccessController.doPrivileged(new PrivilegedExceptionAction<W3CEndpointReference>() {
                     public W3CEndpointReference run() throws Exception {
                         Unmarshaller unmarshaller = getJAXBContext().createUnmarshaller();
-                        return (W3CEndpointReference)unmarshaller.unmarshal(writer.getDocument());
+                        try {
+                            return (W3CEndpointReference)unmarshaller.unmarshal(writer.getDocument());
+                        } finally {
+                            JAXBUtils.closeUnmarshaller(unmarshaller);
+                        }
                     }
                 });
             } catch (PrivilegedActionException pae) {
@@ -391,8 +399,9 @@ public class ProviderImpl extends javax.xml.ws.spi.Provider {
             final XMLStreamReader reader = StaxUtils.createXMLStreamReader(eprInfoset);
             return AccessController.doPrivileged(new PrivilegedExceptionAction<EndpointReference>() {
                 public EndpointReference run() throws Exception {
+                    Unmarshaller unmarshaller = null;
                     try {
-                        Unmarshaller unmarshaller = getJAXBContext().createUnmarshaller();
+                        unmarshaller = getJAXBContext().createUnmarshaller();
                         return (EndpointReference)unmarshaller.unmarshal(reader);
                     } finally {
                         try {
@@ -400,6 +409,7 @@ public class ProviderImpl extends javax.xml.ws.spi.Provider {
                         } catch (XMLStreamException e) {
                             // Ignore
                         }
+                        JAXBUtils.closeUnmarshaller(unmarshaller);
                     }
                 }
             });

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/json/JSONProvider.java
----------------------------------------------------------------------
diff --git a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/json/JSONProvider.java b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/json/JSONProvider.java
index ab90546..2a53be9 100644
--- a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/json/JSONProvider.java
+++ b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/json/JSONProvider.java
@@ -217,6 +217,7 @@ public class JSONProvider<T> extends AbstractJAXBProvider<T>  {
         
         XMLStreamReader reader = null;
         String enc = HttpUtils.getEncoding(mt, "UTF-8");
+        Unmarshaller unmarshaller = null;
         try {
             InputStream realStream = getInputStream(type, genericType, is);
             if (Document.class.isAssignableFrom(type)) {
@@ -229,7 +230,7 @@ public class JSONProvider<T> extends AbstractJAXBProvider<T>  {
             Class<?> theGenericType = isCollection ? InjectionUtils.getActualType(genericType) : type;
             Class<?> theType = getActualType(theGenericType, genericType, anns);
             
-            Unmarshaller unmarshaller = createUnmarshaller(theType, genericType, isCollection);
+            unmarshaller = createUnmarshaller(theType, genericType, isCollection);
             XMLStreamReader xsr = createReader(type, realStream, isCollection, enc);
             
             Object response = null;
@@ -270,6 +271,7 @@ public class JSONProvider<T> extends AbstractJAXBProvider<T>  {
             } catch (XMLStreamException e) {
                 throw ExceptionUtils.toBadRequestException(e, null);
             }
+            JAXBUtils.closeUnmarshaller(unmarshaller);
         }
         // unreachable
         return null;

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
----------------------------------------------------------------------
diff --git a/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java b/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
index e0a5bf6..75e20d4 100644
--- a/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
+++ b/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
@@ -46,6 +46,7 @@ import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.SoapVersion;
 import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
 import org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.headers.Header;
@@ -470,11 +471,11 @@ public class MAPCodec extends AbstractSoapInterceptor {
         // REVISIT generate MessageAddressingHeaderRequired fault if an
         // expected header is missing 
         AddressingProperties maps = null;
+        Unmarshaller unmarshaller = null;
         try {
             List<Header> header = message.getHeaders();
             if (header != null) {
                 LOG.log(Level.FINE, "Inbound WS-Addressing headers");
-                Unmarshaller unmarshaller = null;
                 Set<Element> referenceParameterHeaders = null;
                 QName invalidCardinalityQName = null;
                 Iterator<Header> iter = header.iterator();
@@ -588,6 +589,8 @@ public class MAPCodec extends AbstractSoapInterceptor {
             }
         } catch (JAXBException je) {
             LOG.log(Level.WARNING, "SOAP_HEADER_DECODE_FAILURE_MSG", je); 
+        } finally {
+            JAXBUtils.closeUnmarshaller(unmarshaller);
         }
         return maps;
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/external/EndpointReferenceDomainExpressionBuilder.java
----------------------------------------------------------------------
diff --git a/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/external/EndpointReferenceDomainExpressionBuilder.java b/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/external/EndpointReferenceDomainExpressionBuilder.java
index 62b24ea..6d77493 100644
--- a/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/external/EndpointReferenceDomainExpressionBuilder.java
+++ b/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/external/EndpointReferenceDomainExpressionBuilder.java
@@ -26,13 +26,13 @@ import java.util.ResourceBundle;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
 import javax.xml.namespace.QName;
 
 import org.w3c.dom.Element;
 
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.cxf.ws.policy.PolicyException;
@@ -48,7 +48,7 @@ public class EndpointReferenceDomainExpressionBuilder implements DomainExpressio
     private static final Collection<QName> SUPPORTED_TYPES = Collections.singletonList(
         new QName("http://www.w3.org/2005/08/addressing", "EndpointReference"));
     
-    private Unmarshaller unmarshaller;
+    private JAXBContext context;
     
     public EndpointReferenceDomainExpressionBuilder() {
 
@@ -61,7 +61,7 @@ public class EndpointReferenceDomainExpressionBuilder implements DomainExpressio
     public DomainExpression build(Element e) {
         Object obj = null;
         try {
-            obj = getUnmarshaller().unmarshal(e);
+            obj = JAXBUtils.unmarshall(createJAXBContext(), e);
         } catch (JAXBException ex) {
             throw new PolicyException(new Message("EPR_DOMAIN_EXPRESSION_BUILD_EXC", BUNDLE, 
                                                   (Object[])null), ex);
@@ -75,28 +75,18 @@ public class EndpointReferenceDomainExpressionBuilder implements DomainExpressio
         eprde.setEndpointReference((EndpointReferenceType)obj);
         return eprde;
     }
-
-    protected Unmarshaller getUnmarshaller() {
-        if (unmarshaller == null) {
-            createUnmarshaller();
-        }
-        
-        return unmarshaller;
-    }
     
-    protected synchronized void createUnmarshaller() {
-        if (unmarshaller != null) {
-            return;
-        }
-        
-        try {
-            Class<?> clz = EndpointReferenceType.class;
-            String pkg = PackageUtils.getPackageName(clz);
-            JAXBContext context = JAXBContext.newInstance(pkg, clz.getClassLoader());
-            unmarshaller = context.createUnmarshaller();
-        } catch (JAXBException ex) {
-            throw new PolicyException(new Message("EPR_DOMAIN_EXPRESSION_BUILDER_INIT_EXC", BUNDLE, 
-                                                  (Object[])null), ex);
+    protected synchronized JAXBContext createJAXBContext() {
+        if (context == null) {
+            try {
+                Class<?> clz = EndpointReferenceType.class;
+                String pkg = PackageUtils.getPackageName(clz);
+                context = JAXBContext.newInstance(pkg, clz.getClassLoader());
+            } catch (JAXBException ex) {
+                throw new PolicyException(new Message("EPR_DOMAIN_EXPRESSION_BUILDER_INIT_EXC", BUNDLE, 
+                                                      (Object[])null), ex);
+            }
         }
+        return context;
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builder/jaxb/JaxbAssertionBuilder.java
----------------------------------------------------------------------
diff --git a/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builder/jaxb/JaxbAssertionBuilder.java b/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builder/jaxb/JaxbAssertionBuilder.java
index 22c9bd5..17966b4 100644
--- a/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builder/jaxb/JaxbAssertionBuilder.java
+++ b/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builder/jaxb/JaxbAssertionBuilder.java
@@ -138,10 +138,13 @@ public class JaxbAssertionBuilder<T> implements AssertionBuilder<Element> {
     @SuppressWarnings("unchecked")
     protected T getData(Element element) {
         Object obj = null;
+        Unmarshaller um = getUnmarshaller();
         try {
-            obj = getUnmarshaller().unmarshal(element);
+            obj = um.unmarshal(element);
         } catch (JAXBException ex) {
             LogUtils.log(LOG, Level.SEVERE, "UNMARSHAL_ELEMENT_EXC", ex);
+        } finally {
+            JAXBUtils.closeUnmarshaller(um);
         }
         if (obj instanceof JAXBElement<?>) {
             JAXBElement<?> el = (JAXBElement<?>)obj;

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/rt/wsdl/src/main/java/org/apache/cxf/wsdl/JAXBExtensionHelper.java
----------------------------------------------------------------------
diff --git a/rt/wsdl/src/main/java/org/apache/cxf/wsdl/JAXBExtensionHelper.java b/rt/wsdl/src/main/java/org/apache/cxf/wsdl/JAXBExtensionHelper.java
index abe0bcc..f5bae66 100644
--- a/rt/wsdl/src/main/java/org/apache/cxf/wsdl/JAXBExtensionHelper.java
+++ b/rt/wsdl/src/main/java/org/apache/cxf/wsdl/JAXBExtensionHelper.java
@@ -346,8 +346,9 @@ public class JAXBExtensionHelper implements ExtensionSerializer, ExtensionDeseri
                                            QName qname, Element element, Definition wsdl,
                                            ExtensionRegistry registry) throws WSDLException {
         XMLStreamReader reader = null;
+        Unmarshaller u = null;
         try {
-            Unmarshaller u = createUnmarshaller();
+            u = createUnmarshaller();
         
             Object o = null;
             if (namespace == null) {
@@ -376,6 +377,7 @@ public class JAXBExtensionHelper implements ExtensionSerializer, ExtensionDeseri
             } catch (XMLStreamException ex) {
                 throw new WSDLException(WSDLException.PARSER_ERROR, ex.getMessage(), ex);
             }
+            JAXBUtils.closeUnmarshaller(u);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/cxf/blob/37d49fb3/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java b/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
index de8a0e6..0ddf0c2 100644
--- a/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
+++ b/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
@@ -56,6 +56,7 @@ import org.w3c.dom.Document;
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.jaxb.JAXBContextCache;
+import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.endpoint.Server;
@@ -498,7 +499,7 @@ public class WSDiscoveryServiceImpl implements WSDiscoveryService {
                     return null;
                 }
                 
-                Object obj = context.createUnmarshaller().unmarshal(doc.getDocumentElement());
+                Object obj = JAXBUtils.unmarshall(context, doc.getDocumentElement());
                 if (obj instanceof JAXBElement) {
                     obj = ((JAXBElement)obj).getValue();
                 }