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());