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 2008/07/22 05:56:23 UTC

svn commit: r678630 - in /cxf/branches/2.0.x-fixes: ./ rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java

Author: dkulp
Date: Mon Jul 21 20:56:22 2008
New Revision: 678630

URL: http://svn.apache.org/viewvc?rev=678630&view=rev
Log:
Merged revisions 678629 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r678629 | dkulp | 2008-07-21 23:54:45 -0400 (Mon, 21 Jul 2008) | 2 lines
  
  [CXF-1712] Fix problems of caching objectfactories based on classname instead of Package object
........

Modified:
    cxf/branches/2.0.x-fixes/   (props changed)
    cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
    cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java

Propchange: cxf/branches/2.0.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jul 21 20:56:22 2008
@@ -1 +1 @@
-/cxf/trunk:673548,674485,674547,674551,674562,674601,674649,674764,674887,675644,675653,677048,677385,678004,678009,678559
+/cxf/trunk:673548,674485,674547,674551,674562,674601,674649,674764,674887,675644,675653,677048,677385,678004,678009,678559,678629

Propchange: cxf/branches/2.0.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=678630&r1=678629&r2=678630&view=diff
==============================================================================
--- cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Mon Jul 21 20:56:22 2008
@@ -24,13 +24,13 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -112,26 +112,26 @@
     }
     
     private static final class CachedClassOrNull {
-        private Class<?> cachedClass;
+        private WeakReference<Class<?>> cachedClass;
 
         public CachedClassOrNull(Class<?> cachedClass) {
-            this.cachedClass = cachedClass;
+            this.cachedClass = new WeakReference<Class<?>>(cachedClass);
         }
 
         public Class<?> getCachedClass() {
-            return cachedClass;
+            return cachedClass == null ? null : cachedClass.get();
         }
 
         public void setCachedClass(Class<?> cachedClass) {
-            this.cachedClass = cachedClass;
+            this.cachedClass = new WeakReference<Class<?>>(cachedClass);
         }
     }
 
     private static final Map<Set<Class<?>>, CachedContextAndSchemas> JAXBCONTEXT_CACHE 
         = new CacheMap<Set<Class<?>>, CachedContextAndSchemas>();
     
-    private static final Map<String, CachedClassOrNull> OBJECT_FACTORY_CACHE
-        = new CacheMap<String, CachedClassOrNull>();
+    private static final Map<Package, CachedClassOrNull> OBJECT_FACTORY_CACHE
+        = new CacheMap<Package, CachedClassOrNull>();
 
     Class[] extraClass;
 
@@ -394,16 +394,6 @@
     }
 
     public JAXBContext createJAXBContext(Set<Class<?>> classes, String defaultNs) throws JAXBException {
-        Iterator it = classes.iterator();
-        String className = "";
-        Object remoteExceptionObject = null;
-        while (it.hasNext()) {
-            remoteExceptionObject = (Class)it.next();
-            className = remoteExceptionObject.toString();
-            if (!("".equals(className)) && className.contains("RemoteException")) {
-                it.remove();
-            }
-        }
         // add user extra class into jaxb context
         if (extraClass != null && extraClass.length > 0) {
             for (Class clz : extraClass) {
@@ -422,13 +412,17 @@
         for (Class<?> jcls : classes) {
             String pkgName = PackageUtils.getPackageName(jcls);
             if (!packages.containsKey(pkgName)) {
+                Package pkg = jcls.getPackage();
+                
                 packages.put(pkgName, jcls.getResourceAsStream("jaxb.index"));
                 packageLoaders.put(pkgName, jcls.getClassLoader());
                 String objectFactoryClassName = pkgName + "." + "ObjectFactory";
                 Class<?> ofactory = null;
                 CachedClassOrNull cachedFactory = null;
-                synchronized (OBJECT_FACTORY_CACHE) {
-                    cachedFactory = OBJECT_FACTORY_CACHE.get(objectFactoryClassName);
+                if (pkg != null) {
+                    synchronized (OBJECT_FACTORY_CACHE) {
+                        cachedFactory = OBJECT_FACTORY_CACHE.get(pkg);
+                    }
                 }
                 if (cachedFactory != null) {
                     ofactory = cachedFactory.getCachedClass();
@@ -438,9 +432,9 @@
                         ofactory = Class.forName(objectFactoryClassName, false, jcls
                                                  .getClassLoader());
                         objectFactories.add(ofactory);
-                        addToObjectFactoryCache(objectFactoryClassName, ofactory);
+                        addToObjectFactoryCache(pkg, ofactory);
                     } catch (ClassNotFoundException e) {
-                        addToObjectFactoryCache(objectFactoryClassName, null);
+                        addToObjectFactoryCache(pkg, null);
                     }
                 } else {
                     objectFactories.add(ofactory);                    
@@ -519,9 +513,12 @@
         return cachedContextAndSchemas.getContext();
     }
 
-    private void addToObjectFactoryCache(String objectFactoryClassName, Class<?> ofactory) {
+    private void addToObjectFactoryCache(Package objectFactoryPkg, Class<?> ofactory) {
+        if (objectFactoryPkg == null) {
+            return;
+        }
         synchronized (OBJECT_FACTORY_CACHE) {
-            OBJECT_FACTORY_CACHE.put(objectFactoryClassName, 
+            OBJECT_FACTORY_CACHE.put(objectFactoryPkg, 
                                      new CachedClassOrNull(ofactory));
         }
     }

Modified: cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java?rev=678630&r1=678629&r2=678630&view=diff
==============================================================================
--- cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java (original)
+++ cxf/branches/2.0.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java Mon Jul 21 20:56:22 2008
@@ -121,17 +121,6 @@
     }
 
     @Test
-    public void testCreateJAXBContext() throws Exception {
-        try {
-            Set<Class<?>> classes = new HashSet<Class<?>>();
-            classes.add(Class.forName("java.rmi.RemoteException"));
-            assertNotNull(new JAXBDataBinding().createJAXBContext(classes));
-        } catch (Exception e) {
-            assertFalse(true);
-        }
-        
-    }
-    @Test
     public void testCreateReader() {
         DataReader reader = jaxbDataBinding.createReader(XMLStreamReader.class);
         assertTrue(reader instanceof DataReaderImpl);