Author: etnu
Date: Sat Nov 29 15:00:39 2008
New Revision: 721736

URL: http://svn.apache.org/viewvc?rev=721736&view=rev
Log:
Fixed a problem with cache size growth when different collection types are used.


Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java?rev=721736&r1=721735&r2=721736&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
 Sat Nov 29 15:00:39 2008
@@ -27,9 +27,11 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Logger;
 
 /**
@@ -46,8 +48,7 @@
   private final Map<String, GadgetFeature> core;
 
   // Caches the transitive dependencies to enable faster lookups.
-  private final Map<Collection<String>, Collection<GadgetFeature>> cache
-      = Maps.newConcurrentHashMap();
+  final Map<Set<String>, Collection<GadgetFeature>> cache = 
Maps.newConcurrentHashMap();
 
   private boolean graphComplete = false;
 
@@ -125,27 +126,33 @@
   public Collection<GadgetFeature> getFeatures(Collection<String> needed,
                                                Collection<String> unsupported) 
{
     graphComplete = true;
+
+    Set<String> neededSet;
     if (needed.isEmpty()) {
-      needed = core.keySet();
+      neededSet = core.keySet();
+    } else {
+      neededSet = new HashSet<String>(needed);
     }
+
     // We use the cache only for situations where all needed are available.
     // if any are missing, the result won't be cached.
-    Collection<GadgetFeature> libCache = cache.get(needed);
+    Collection<GadgetFeature> libCache = cache.get(neededSet);
     if (libCache != null) {
       return libCache;
     }
     List<GadgetFeature> ret = new LinkedList<GadgetFeature>();
-    populateDependencies(needed, ret);
+    populateDependencies(neededSet, ret);
     // Fill in anything that was optional but missing. These won't be cached.
     if (unsupported != null) {
-      for (String feature : needed) {
+      for (String feature : neededSet) {
         if (!features.containsKey(feature)) {
           unsupported.add(feature);
         }
       }
     }
     if (unsupported == null || unsupported.isEmpty()) {
-      cache.put(needed, Collections.unmodifiableList(ret));
+      cache.put(neededSet, Collections.unmodifiableList(ret));
+      logger.info("Added to cache. Size is now: " + cache.size());
     }
     return ret;
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java?rev=721736&r1=721735&r2=721736&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
 Sat Nov 29 15:00:39 2008
@@ -218,7 +218,6 @@
       forced = Sets.newHashSet(forcedLibs.split(":"));
     }
 
-
     // Forced libs are always done first.
     if (!forced.isEmpty()) {
       String jsUrl = urlGenerator.getBundledJsUrl(forced, context);
@@ -227,6 +226,8 @@
       headTag.appendChild(libsTag);
 
       // Forced transitive deps need to be added as well so that they don't 
get pulled in twice.
+      // Without this, a shared dependency between forced and non-forced libs 
would get pulled into
+      // both the external forced script and the inlined script.
       // TODO: Figure out a clean way to avoid having to call getFeatures 
twice.
       for (GadgetFeature dep : featureRegistry.getFeatures(forced)) {
         forced.add(dep.getName());

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java?rev=721736&r1=721735&r2=721736&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java
 Sat Nov 29 15:00:39 2008
@@ -20,8 +20,14 @@
 package org.apache.shindig.gadgets;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import edu.emory.mathcs.backport.java.util.Collections;
+
 import org.junit.Before;
 import org.junit.Test;
 
@@ -90,6 +96,33 @@
   }
 
   @Test
+  @SuppressWarnings("unchecked")
+  public void getFeaturesUsesCache() throws GadgetException {
+    registry.register(makeFeature(DEP_NAME, DEP_CONTENT, null));
+    registry.register(makeFeature("feat0", CONTENT, DEP_NAME));
+    registry.register(makeFeature("feat1", CONTENT, DEP_NAME));
+
+    Set<String> setKeys = Sets.immutableSortedSet("feat0", "feat1");
+    List<String> listKeys = Lists.newLinkedList("feat0", "feat1");
+    Collection<String> collectKeys
+        = Collections.unmodifiableCollection(Lists.newArrayList("feat0", 
"feat1"));
+
+    // Fill the cache.
+    assertEquals(0, registry.cache.size());
+    registry.getFeatures(collectKeys);
+    assertEquals(1, registry.cache.size());
+
+    Collection<GadgetFeature> setFeatures = registry.getFeatures(setKeys);
+    assertEquals(1, registry.cache.size());
+    Collection<GadgetFeature> listFeatures = registry.getFeatures(listKeys);
+    assertEquals(1, registry.cache.size());
+    Collection<GadgetFeature> collectFeatures = 
registry.getFeatures(collectKeys);
+    assertEquals(1, registry.cache.size());
+    assertSame(listFeatures, collectFeatures);
+    assertSame(setFeatures, listFeatures);
+  }
+
+  @Test
   public void getAllFeatures() throws Exception {
     for (String feature : FEATURE_LIST) {
       registry.register(makeFeature(feature, CONTENT, DEP_NAME));


Reply via email to