You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by bl...@apache.org on 2009/09/26 22:47:22 UTC

svn commit: r819207 - in /incubator/wink/trunk/wink-common/src: main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java

Author: bluk
Date: Sat Sep 26 20:47:21 2009
New Revision: 819207

URL: http://svn.apache.org/viewvc?rev=819207&view=rev
Log:
Change ProvidersRegistry to use SoftConcurrentMap

The performance difference between the SoftConcurrentMap
and ConcurrentHashMap seems negligible after the
removal of the locks in SoftConcurrentMap and
I would like to use the same caching mechanisms.

Thanks to Doug Larson for taking the profile.

Modified:
    incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java
    incubator/wink/trunk/wink-common/src/test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java

Modified: incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java?rev=819207&r1=819206&r2=819207&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java (original)
+++ incubator/wink/trunk/wink-common/src/main/java/org/apache/wink/common/internal/registry/ProvidersRegistry.java Sat Sep 26 20:47:21 2009
@@ -20,7 +20,6 @@
 package org.apache.wink.common.internal.registry;
 
 import java.lang.annotation.Annotation;
-import java.lang.ref.SoftReference;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -36,8 +35,6 @@
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
@@ -56,6 +53,7 @@
 import org.apache.wink.common.internal.utils.AnnotationUtils;
 import org.apache.wink.common.internal.utils.GenericsUtils;
 import org.apache.wink.common.internal.utils.MediaTypeUtils;
+import org.apache.wink.common.internal.utils.SoftConcurrentMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -504,17 +502,17 @@
 
     private abstract class MediaTypeMap<T> {
 
-        private volatile Map<MediaType, Set<ObjectFactory<T>>>                                       data           =
-                                                                                                                        new HashMap<MediaType, Set<ObjectFactory<T>>>();
+        private volatile Map<MediaType, Set<ObjectFactory<T>>>                                          data           =
+                                                                                                                           new HashMap<MediaType, Set<ObjectFactory<T>>>();
         @SuppressWarnings("unchecked")
-        private volatile Entry<MediaType, Set<ObjectFactory<T>>>[]                                   entrySet       =
-                                                                                                                        data
-                                                                                                                            .entrySet()
-                                                                                                                            .toArray(new Entry[0]);
-        private final Class<?>                                                                       rawType;
+        private volatile Entry<MediaType, Set<ObjectFactory<T>>>[]                                      entrySet       =
+                                                                                                                           data
+                                                                                                                               .entrySet()
+                                                                                                                               .toArray(new Entry[0]);
+        private final Class<?>                                                                          rawType;
 
-        private final Map<Class<?>, SoftReference<ConcurrentMap<MediaType, List<ObjectFactory<T>>>>> providersCache =
-                                                                                                                        new ConcurrentHashMap<Class<?>, SoftReference<ConcurrentMap<MediaType, List<ObjectFactory<T>>>>>(); ;
+        private final SoftConcurrentMap<Class<?>, SoftConcurrentMap<MediaType, List<ObjectFactory<T>>>> providersCache =
+                                                                                                                           new SoftConcurrentMap<Class<?>, SoftConcurrentMap<MediaType, List<ObjectFactory<T>>>>(); ;
 
         public MediaTypeMap(Class<?> rawType) {
             super();
@@ -543,22 +541,17 @@
                 .debug("Getting providers by media type by calling getProvidersByMediaType({}, {})",
                        mediaType,
                        cls);
-            SoftReference<ConcurrentMap<MediaType, List<ObjectFactory<T>>>> mediaTypeToProvidersCacheRef =
+            SoftConcurrentMap<MediaType, List<ObjectFactory<T>>> mediaTypeToProvidersCache =
                 providersCache.get(cls);
-            ConcurrentMap<MediaType, List<ObjectFactory<T>>> mediaTypeToProvidersCache = null;
-            if (mediaTypeToProvidersCacheRef != null) {
-                mediaTypeToProvidersCache = mediaTypeToProvidersCacheRef.get();
-            }
             if (mediaTypeToProvidersCache == null) {
                 logger
                     .debug("MediaType to providers cache for class {} does not exist so creating",
                            cls);
                 mediaTypeToProvidersCache =
-                    new ConcurrentHashMap<MediaType, List<ObjectFactory<T>>>();
-                providersCache
-                    .put(cls,
-                         new SoftReference<ConcurrentMap<MediaType, List<ObjectFactory<T>>>>(
-                                                                                             mediaTypeToProvidersCache));
+                    new SoftConcurrentMap<MediaType, List<ObjectFactory<T>>>();
+                providersCache.put(cls,
+
+                mediaTypeToProvidersCache);
             }
 
             List<ObjectFactory<T>> list = mediaTypeToProvidersCache.get(mediaType);

Modified: incubator/wink/trunk/wink-common/src/test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-common/src/test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java?rev=819207&r1=819206&r2=819207&view=diff
==============================================================================
--- incubator/wink/trunk/wink-common/src/test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java (original)
+++ incubator/wink/trunk/wink-common/src/test/java/org/apache/wink/common/internal/registry/ProvidersRegistryTest.java Sat Sep 26 20:47:21 2009
@@ -20,12 +20,12 @@
 package org.apache.wink.common.internal.registry;
 
 import java.lang.reflect.Field;
-import java.util.concurrent.ConcurrentHashMap;
 
 import junit.framework.TestCase;
 
 import org.apache.wink.common.internal.application.ApplicationValidator;
 import org.apache.wink.common.internal.lifecycle.LifecycleManagersRegistry;
+import org.apache.wink.common.internal.utils.SoftConcurrentMap;
 
 public class ProvidersRegistryTest extends TestCase {
     
@@ -55,7 +55,7 @@
         field2.setAccessible(true);
         Object providersCache = field2.get(messageBodyReaders);
         
-        assertTrue(providersCache instanceof ConcurrentHashMap);    
+        assertTrue(providersCache instanceof SoftConcurrentMap);    
     }
     
     // TODO:  perhaps future tests should be added to actually exercise the providersCache code, but it would be an involved,