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 2009/12/23 04:20:07 UTC

svn commit: r893388 - in /cxf/trunk: common/common/src/main/java/org/apache/cxf/common/util/ rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/ rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/

Author: dkulp
Date: Wed Dec 23 03:20:06 2009
New Revision: 893388

URL: http://svn.apache.org/viewvc?rev=893388&view=rev
Log:
[CXF-2286, CXF-1816] Use weak references for ASMHelper stuff to make
sure classes are not held onto strongly.

Modified:
    cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/ASMHelper.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletContextResourceResolver.java

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/ASMHelper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/ASMHelper.java?rev=893388&r1=893387&r2=893388&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/ASMHelper.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/common/util/ASMHelper.java Wed Dec 23 03:20:06 2009
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.common.util;
 
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.Method;
@@ -36,8 +37,8 @@
     protected static final Map<Class<?>, String> PRIMITIVE_MAP = new HashMap<Class<?>, String>();
     protected static final Map<Class<?>, String> NONPRIMITIVE_MAP = new HashMap<Class<?>, String>();
     
-    protected static final Map<Class<?>, TypeHelperClassLoader> LOADER_MAP 
-        = new WeakIdentityHashMap<Class<?>, TypeHelperClassLoader>();
+    protected static final Map<Class<?>, WeakReference<TypeHelperClassLoader>> LOADER_MAP 
+        = new WeakIdentityHashMap<Class<?>, WeakReference<TypeHelperClassLoader>>();
     
     protected static boolean oldASM;
     
@@ -191,10 +192,13 @@
     }
     
     private static synchronized TypeHelperClassLoader getTypeHelperClassLoader(Class<?> l) {
-        TypeHelperClassLoader ret = LOADER_MAP.get(l);
-        if (ret == null) {
+        WeakReference<TypeHelperClassLoader> ref = LOADER_MAP.get(l);
+        TypeHelperClassLoader ret;
+        if (ref == null || ref.get() == null) {
             ret = new TypeHelperClassLoader(l.getClassLoader());
-            LOADER_MAP.put(l, ret);
+            LOADER_MAP.put(l, new WeakReference<TypeHelperClassLoader>(ret));
+        } else {
+            ret = ref.get();
         }
         return ret;
     }

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=893388&r1=893387&r2=893388&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Wed Dec 23 03:20:06 2009
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
@@ -48,7 +49,6 @@
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementDecl;
 import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLEventWriter;
 import javax.xml.stream.XMLStreamReader;
@@ -59,8 +59,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
-import org.xml.sax.SAXException;
-
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.CacheMap;
@@ -109,15 +107,15 @@
                                                                                XMLStreamWriter.class};
 
     private static final class CachedContextAndSchemas {
-        private JAXBContext context;
+        private WeakReference<JAXBContext> context;
         private Collection<DOMSource> schemas;
 
         CachedContextAndSchemas(JAXBContext context) {
-            this.context = context;
+            this.context = new WeakReference<JAXBContext>(context);
         }
 
         public JAXBContext getContext() {
-            return context;
+            return context.get();
         }
 
         public Collection<DOMSource> getSchemas() {
@@ -149,11 +147,7 @@
                 BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/02/addressing/wsdl", dr);
                 resolver.unresolve();
             }
-        } catch (IOException e) {
-            //IGNORE
-        } catch (ParserConfigurationException e) {
-            //IGNORE
-        } catch (SAXException e) {
+        } catch (Exception e) {
             //IGNORE
         }
         try {
@@ -166,11 +160,7 @@
                 BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/08/addressing", dr);
                 resolver.unresolve();
             }
-        } catch (IOException e) {
-            //IGNORE
-        } catch (ParserConfigurationException e) {
-            //IGNORE
-        } catch (SAXException e) {
+        } catch (Exception e) {
             //IGNORE
         }
         try {
@@ -183,11 +173,7 @@
                 BUILT_IN_SCHEMAS.put("http://schemas.xmlsoap.org/ws/2005/02/rm", dr);
                 resolver.unresolve();
             }
-        } catch (IOException e) {
-            //IGNORE
-        } catch (ParserConfigurationException e) {
-            //IGNORE
-        } catch (SAXException e) {
+        } catch (Exception e) {
             //IGNORE
         }
         try {
@@ -200,15 +186,10 @@
                 BUILT_IN_SCHEMAS.put("http://schemas.xmlsoap.org/ws/2005/02/rm", dr);
                 resolver.unresolve();
             }
-        } catch (IOException e) {
-            //IGNORE
-        } catch (ParserConfigurationException e) {
-            //IGNORE
-        } catch (SAXException e) {
+        } catch (Exception e) {
             //IGNORE
         }
     }
-    
 
     Class[] extraClass;
 
@@ -362,7 +343,7 @@
             } else {
                 synchronized (JAXBCONTEXT_CACHE) {
                     JAXBCONTEXT_CACHE.put(contextClasses, cachedContextAndSchemas);
-                }                
+                } 
             }
         }
         ctx = cachedContextAndSchemas.getContext();
@@ -489,6 +470,7 @@
         }
 
         JAXBUtils.scanPackages(classes, OBJECT_FACTORY_CACHE);
+        //JAXBUtils.scanPackages(classes, new HashMap<Package, CachedClass>());
         addWsAddressingTypes(classes);
 
         for (Class<?> clz : classes) {
@@ -516,9 +498,12 @@
                 cachedContextAndSchemas = JAXBCONTEXT_CACHE.get(classes);
             }
         }
-        if (cachedContextAndSchemas == null) {
-            JAXBContext ctx = createContext(classes, map);
-            cachedContextAndSchemas = new CachedContextAndSchemas(ctx);
+        if (cachedContextAndSchemas != null) {
+            context = cachedContextAndSchemas.getContext();
+        }
+        if (context == null) {
+            context = createContext(classes, map);
+            cachedContextAndSchemas = new CachedContextAndSchemas(context);
             synchronized (JAXBCONTEXT_CACHE) {
                 if (typeRefs.isEmpty()) {
                     JAXBCONTEXT_CACHE.put(classes, cachedContextAndSchemas);

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletContextResourceResolver.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletContextResourceResolver.java?rev=893388&r1=893387&r2=893388&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletContextResourceResolver.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/ServletContextResourceResolver.java Wed Dec 23 03:20:06 2009
@@ -60,7 +60,11 @@
         try {
             if (entryName != null) {
                 InitialContext ic = new InitialContext();
-                obj = ic.lookup(entryName);
+                try {
+                    obj = ic.lookup(entryName);
+                } finally {
+                    ic.close();
+                }
             }
         } catch (NamingException e) {
             //do nothing