Author: johnh
Date: Wed Jan 26 01:42:45 2011
New Revision: 1063559

URL: http://svn.apache.org/viewvc?rev=1063559&view=rev
Log:
Adds support for incremental loading of JS via the &loaded= parameter.

The union of all features that have been loaded by name should be provided in 
this param in colon-delimited
fashion. Doing so subtracts their JS and that of their dependencies from the 
request's output, since that JS
is thus being declared as having been included.


Added:
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsHandlerTest.java
Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsHandler.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/UriCommon.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/JsUriManagerTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsHandler.java?rev=1063559&r1=1063558&r2=1063559&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsHandler.java
 Wed Jan 26 01:42:45 2011
@@ -48,6 +48,8 @@ import com.google.inject.Singleton;
  */
 @Singleton
 public class JsHandler {
+  private static final Collection<String> EMPTY_SET = Sets.newHashSet();
+  
   protected final FeatureRegistry registry;
   protected final ContainerConfig containerConfig;
   protected final Map<String, ConfigContributor> configContributors;
@@ -87,6 +89,13 @@ public class JsHandler {
     boolean isProxyCacheable = true;
     
     FeatureRegistry.LookupResult lookup = registry.getFeatureResources(ctx, 
needed, null);
+    
+    // Quick-and-dirty implementation of incremental JS loading.
+    Collection<String> alreadyLoaded = EMPTY_SET;
+    Collection<String> alreadyHaveLibs = jsUri.getLoadedLibs();
+    if (alreadyHaveLibs.size() > 0) {
+      alreadyLoaded = registry.getFeatures(alreadyHaveLibs);
+    }
 
     // Collate all JS desired for the current request.
     StringBuilder jsData = new StringBuilder();
@@ -94,6 +103,7 @@ public class JsHandler {
     boolean doCompile = !jsUri.isDebug() && shouldUseCompiler(jsUri);
     Set<String> everythingExported = Sets.newHashSet();
     for (FeatureRegistry.FeatureBundle bundle : lookup.getBundles()) {
+      if (alreadyLoaded.contains(bundle.getName())) continue;
       for (FeatureResource featureResource : bundle.getResources()) {
         String content = jsUri.isDebug() || doCompile
            ? featureResource.getDebugContent() : featureResource.getContent();

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java?rev=1063559&r1=1063558&r2=1063559&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
 Wed Jan 26 01:42:45 2011
@@ -40,7 +40,7 @@ import java.util.Collection;
 public class DefaultJsUriManager implements JsUriManager {
   static final String JS_HOST_PARAM = "gadgets.uri.js.host";
   static final String JS_PATH_PARAM = "gadgets.uri.js.path";
-  static final JsUri INVALID_URI = new JsUri(UriStatus.BAD_URI, 
Lists.<String>newArrayList());
+  static final JsUri INVALID_URI = new JsUri(UriStatus.BAD_URI);
   protected static final String JS_SUFFIX = ".js";
   protected static final String JS_DELIMITER = ":";
 
@@ -152,6 +152,11 @@ public class DefaultJsUriManager impleme
     }
 
     Collection<String> libs = getJsLibs(path);
+    String haveParam = uri.getQueryParameter(Param.ALREADY_HAVE.getKey());
+    if (haveParam == null) {
+      haveParam = "";
+    }
+    Collection<String> have = getJsLibs(haveParam);
     UriStatus status = UriStatus.VALID_UNVERSIONED;
     String version = uri.getQueryParameter(Param.VERSION.getKey());
     if (version != null && versioner != null) {
@@ -159,7 +164,7 @@ public class DefaultJsUriManager impleme
       status = versioner.validate(gadgetParam, container, libs, version);
     }
 
-    return new JsUri(status, uri, libs);
+    return new JsUri(status, uri, libs, have);
   }
 
   static String addJsLibs(Collection<String> extern) {

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java?rev=1063559&r1=1063558&r2=1063559&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
 Wed Jan 26 01:42:45 2011
@@ -28,6 +28,7 @@ import org.apache.shindig.gadgets.Render
 import org.apache.shindig.gadgets.uri.UriCommon.Param;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Interface defining methods used to generate Uris for the /js servlet.
@@ -49,12 +50,14 @@ public interface JsUriManager {
   JsUri processExternJsUri(Uri uri) throws GadgetException;
 
   public static class JsUri extends ProxyUriBase {
+    private final static Collection<String> EMPTY_COLL = 
ImmutableList.<String>of();
     private final Collection<String> libs;
+    private final Collection<String> loadedLibs;
     private final String onload;
     private final boolean jsload;
     private final RenderingContext context;
 
-    public JsUri(UriStatus status, Uri origUri, Collection<String> libs) {
+    public JsUri(UriStatus status, Uri origUri, Collection<String> libs, 
Collection<String> have) {
       super(status, origUri);
       if (origUri != null) {
         String param = 
origUri.getQueryParameter(Param.CONTAINER_MODE.getKey());
@@ -67,10 +70,11 @@ public interface JsUriManager {
         this.onload = null;
       }
       this.libs = libs;
+      this.loadedLibs = have;
     }
 
-    public JsUri(UriStatus status, Collection<String> libs) {
-      this(status, null, libs);
+    public JsUri(UriStatus status) {
+      this(status, null, EMPTY_COLL, EMPTY_COLL);
     }
 
     public JsUri(UriStatus status, Collection<String> libs, RenderingContext 
context,
@@ -80,6 +84,7 @@ public interface JsUriManager {
       this.onload = onload;
       this.jsload = jsload;
       this.libs = libs;
+      this.loadedLibs = EMPTY_COLL;
     }
 
     public JsUri(Gadget gadget, Collection<String> libs) {
@@ -88,6 +93,7 @@ public interface JsUriManager {
       this.jsload = false;
       this.context = RenderingContext.GADGET;
       this.libs = libs;
+      this.loadedLibs = EMPTY_COLL;
     }
 
     public JsUri(Integer refresh, boolean debug, boolean noCache, String 
container, String gadget,
@@ -97,10 +103,20 @@ public interface JsUriManager {
       this.jsload = jsload;
       this.context = context;
       this.libs = libs;
+      this.loadedLibs = EMPTY_COLL;
     }
 
     public Collection<String> getLibs() {
-      return Collections.unmodifiableCollection(libs);
+      return nonNullLibs(libs);
+    }
+    
+    public Collection<String> getLoadedLibs() {
+      return nonNullLibs(loadedLibs);
+    }
+    
+    private Collection<String> nonNullLibs(Collection<String> in) {
+      in = in != null ? in : EMPTY_COLL;
+      return Collections.unmodifiableCollection(in);
     }
 
     public RenderingContext getContext() {
@@ -126,6 +142,7 @@ public interface JsUriManager {
       JsUri objUri = (JsUri) obj;
       return (super.equals(obj)
           && Objects.equal(this.libs, objUri.libs)
+          && Objects.equal(this.loadedLibs, objUri.loadedLibs)
           && Objects.equal(this.onload, objUri.onload)
           && Objects.equal(this.jsload, objUri.jsload)
           && Objects.equal(this.context, objUri.context));

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/UriCommon.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/UriCommon.java?rev=1063559&r1=1063558&r2=1063559&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/UriCommon.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/UriCommon.java
 Wed Jan 26 01:42:45 2011
@@ -49,6 +49,7 @@ public interface UriCommon {
     CONTAINER_MODE("c"),
     JSLOAD("jsload"),
     ONLOAD("onload"),
+    ALREADY_HAVE("loaded"),
 
     // Proxy resize params:
     RESIZE_HEIGHT("resize_h"),

Added: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsHandlerTest.java?rev=1063559&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsHandlerTest.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsHandlerTest.java
 Wed Jan 26 01:42:45 2011
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.shindig.gadgets.servlet;
+
+import org.apache.shindig.config.ContainerConfig;
+import org.apache.shindig.gadgets.config.ConfigContributor;
+import org.apache.shindig.gadgets.features.FeatureRegistry;
+import org.apache.shindig.gadgets.rewrite.js.JsCompiler;
+
+import org.easymock.EasyMock;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Map;
+
+public class JsHandlerTest {
+  private JsHandler handler;
+  private FeatureRegistry registry;
+  private ContainerConfig config;
+  private JsCompiler compiler;
+  private Map<String, ConfigContributor> configContributors;
+  
+  @Before
+  public void setUp() {
+    
+  }
+  
+  @Test
+  public void doNothing() {
+    
+  }
+}

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/JsUriManagerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/JsUriManagerTest.java?rev=1063559&r1=1063558&r2=1063559&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/JsUriManagerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/JsUriManagerTest.java
 Wed Jan 26 01:42:45 2011
@@ -37,49 +37,53 @@ import java.util.List;
 public class JsUriManagerTest extends UriManagerTestBase {
   private static final UriStatus STATUS = UriStatus.VALID_UNVERSIONED;
   private static final List<String> LIBS = Lists.newArrayList("feat1", 
"feat2");
+  private static final List<String> HAVE = Lists.newArrayList("have1", 
"have2");
   private static final String CONTAINER_VALUE = "ig";
   private static final String ONLOAD_VALUE = "ol";
 
   @Test
   public void newJsUriWithOriginalUri() throws Exception {
     UriBuilder builder = newTestUriBuilder(RenderingContext.CONTAINER);
-    JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, builder.toUri(), 
LIBS);
+    JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, builder.toUri(), 
LIBS, HAVE);
     assertEquals(RenderingContext.CONTAINER, jsUri.getContext());
     assertEquals(CONTAINER_VALUE, jsUri.getContainer());
     assertTrue(jsUri.isJsload());
     assertTrue(jsUri.isNoCache());
     assertEquals(ONLOAD_VALUE, jsUri.getOnload());
     assertEquals(LIBS, Lists.newArrayList(jsUri.getLibs()));
+    assertEquals(HAVE, Lists.newArrayList(jsUri.getLoadedLibs()));
   }
 
   @Test
   public void newJsUriWithConfiguredGadgetContext() throws Exception {
     UriBuilder builder = newTestUriBuilder(RenderingContext.CONFIGURED_GADGET);
-    JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, builder.toUri(), 
LIBS);
+    JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, builder.toUri(), 
LIBS, HAVE);
     assertEquals(RenderingContext.CONFIGURED_GADGET, jsUri.getContext());
     assertEquals(CONTAINER_VALUE, jsUri.getContainer());
     assertTrue(jsUri.isJsload());
     assertTrue(jsUri.isNoCache());
     assertEquals(ONLOAD_VALUE, jsUri.getOnload());
     assertEquals(LIBS, Lists.newArrayList(jsUri.getLibs()));
+    assertEquals(HAVE, Lists.newArrayList(jsUri.getLoadedLibs()));
   }
 
   @Test
   public void newJsUriWithEmptyOriginalUri() throws Exception {
     JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, null,
-        Collections.<String>emptyList()); // Null URI.
+        Collections.<String>emptyList(), null); // Null URI.
     assertEquals(RenderingContext.GADGET, jsUri.getContext());
     assertEquals(ContainerConfig.DEFAULT_CONTAINER, jsUri.getContainer());
     assertFalse(jsUri.isJsload());
     assertFalse(jsUri.isNoCache());
     assertNull(jsUri.getOnload());
     assertTrue(jsUri.getLibs().isEmpty());
+    assertTrue(jsUri.getLoadedLibs().isEmpty());
   }
 
   private UriBuilder newTestUriBuilder(RenderingContext context) {
     UriBuilder builder = new UriBuilder();
     builder.setScheme("http");
-    builder.setAuthority("localohst");
+    builder.setAuthority("localhost");
     builder.setPath("/gadgets/js/feature.js");
     builder.addQueryParameter(Param.CONTAINER.getKey(), CONTAINER_VALUE);
     builder.addQueryParameter(Param.CONTAINER_MODE.getKey(), 
context.getParamValue());


Reply via email to