Author: mhermanto
Date: Wed Feb 2 23:23:28 2011
New Revision: 1066689
URL: http://svn.apache.org/viewvc?rev=1066689&view=rev
Log:
Enum for different types of JS compilation.
http://codereview.appspot.com/4092044/
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsCompileMode.java
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/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/JsCompileModeTest.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/JsCompileMode.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsCompileMode.java?rev=1066689&r1=1066688&r2=1066689&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsCompileMode.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsCompileMode.java
Wed Feb 2 23:23:28 2011
@@ -18,9 +18,17 @@
package org.apache.shindig.gadgets;
public enum JsCompileMode {
- DEBUG("0"),
- BUILD_TIME_COMPILE("1"),
- RUN_TIME_COMPILE("2");
+ // Concats all build-time compile-version JS.
+ BUILD_TIME("0"),
+ // Performs run-time compilation of concatenated built-time debug-version JS.
+ // All symbols exported (and as long as in transitive dependency) are
+ // retained/unbofuscated.
+ ALL_RUN_TIME("1"),
+ // Like run ALL_RUN_TIME, except the only retained/unobfuscated symbols are
+ // ones exported from the explicitly-requested features, ie: if feature=foo
+ // depends on feature=bar, /gadgets/js/foo will expose foo.* exported APIs,
+ // not bar.* exported APIs. This can potentially eliminate all un-used code.
+ EXPLICIT_RUN_TIME("2");
private final String paramValue;
@@ -39,7 +47,7 @@ public enum JsCompileMode {
return mode;
}
}
- return JsCompileMode.DEBUG;
+ return JsCompileMode.BUILD_TIME;
}
}
\ No newline at end of file
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=1066689&r1=1066688&r2=1066689&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 Feb 2 23:23:28 2011
@@ -21,6 +21,7 @@ import org.apache.commons.lang.StringUti
import org.apache.shindig.common.JsonSerializer;
import org.apache.shindig.config.ContainerConfig;
import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.JsCompileMode;
import org.apache.shindig.gadgets.RenderingContext;
import org.apache.shindig.gadgets.config.ConfigContributor;
import org.apache.shindig.gadgets.features.ApiDirective;
@@ -49,7 +50,7 @@ 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;
@@ -64,14 +65,17 @@ public class JsHandler {
this.containerConfig = containerConfig;
this.configContributors = configContributors;
}
-
+
@Inject(optional = true)
public void setSupportCompiler(JsCompiler compiler) {
this.compiler = compiler;
}
-
- protected boolean shouldUseCompiler(JsUri jsUri) {
- return compiler != null;
+
+ protected boolean willCompile(JsUri jsUri) {
+ JsCompileMode mode = jsUri.getCompileMode();
+ return (compiler != null) && !jsUri.isDebug() && (
+ mode == JsCompileMode.ALL_RUN_TIME ||
+ mode == JsCompileMode.EXPLICIT_RUN_TIME);
}
/**
@@ -87,9 +91,9 @@ public class JsHandler {
Collection<String> needed = jsUri.getLibs();
String container = ctx.getContainer();
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();
@@ -98,14 +102,15 @@ public class JsHandler {
}
// Collate all JS desired for the current request.
+ boolean willCompile = willCompile(jsUri);
StringBuilder jsData = new StringBuilder();
- List<String> externs = Lists.newArrayList();
- boolean doCompile = !jsUri.isDebug() && shouldUseCompiler(jsUri);
- Set<String> everythingExported = Sets.newHashSet();
+ List<String> allExterns = Lists.newArrayList();
+ Set<String> allExports = Sets.newHashSet();
+
for (FeatureRegistry.FeatureBundle bundle : lookup.getBundles()) {
if (alreadyLoaded.contains(bundle.getName())) continue;
for (FeatureResource featureResource : bundle.getResources()) {
- String content = jsUri.isDebug() || doCompile
+ String content = jsUri.isDebug() || willCompile
? featureResource.getDebugContent() : featureResource.getContent();
if (content == null) content = "";
if (!featureResource.isExternal()) {
@@ -117,19 +122,25 @@ public class JsHandler {
isProxyCacheable = isProxyCacheable &&
featureResource.isProxyCacheable();
jsData.append(";\n");
}
-
- if (doCompile) {
- // Add all needed exports while collecting externs.
+
+ if (willCompile) {
+
List<String> rawExports = Lists.newArrayList();
- for (ApiDirective api : bundle.getApis()) {
- if (api.getType() == ApiDirective.Type.JS) {
- if (api.isExports()) {
- rawExports.add(api.getValue());
- } else if (api.isUses()) {
- externs.add(api.getValue());
- }
+
+ // Add exports of bundle, regardless.
+ if (jsUri.getCompileMode() == JsCompileMode.ALL_RUN_TIME) {
+ appendExportsForBundle(bundle, rawExports);
+
+ // Add exports of bundle if it is an explicitly-specified feature.
+ } else if (jsUri.getCompileMode() == JsCompileMode.EXPLICIT_RUN_TIME) {
+ if (needed.contains(bundle.getName())) {
+ appendExportsForBundle(bundle, rawExports);
}
}
+
+ // Add externs for this bundle.
+ appendExternsForBundle(bundle, allExterns);
+
Collections.sort(rawExports);
String prevExport = null;
for (String export : rawExports) {
@@ -138,10 +149,10 @@ public class JsHandler {
String base = "window";
for (int i = 0; i < pieces.length; ++i) {
String symExported = (i == 0) ? pieces[0] : base + "." +
pieces[i];
- if (!everythingExported.contains(symExported)) {
+ if (!allExports.contains(symExported)) {
String curExport = base + "['" + pieces[i] + "']=" +
symExported + ";\n";
jsData.append(curExport);
- everythingExported.add(symExported);
+ allExports.add(symExported);
}
base = symExported;
}
@@ -150,11 +161,11 @@ public class JsHandler {
}
}
}
-
+
// Compile if desired. Specific compiler options are provided to the
JsCompiler instance.
- if (doCompile) {
+ if (willCompile) {
StringBuilder compiled = new StringBuilder();
- JsCompiler.Result result = compiler.compile(jsData.toString(), externs);
+ JsCompiler.Result result = compiler.compile(jsData.toString(),
allExterns);
String code = result.getCode();
if (code != null) {
compiled.append(code);
@@ -187,11 +198,27 @@ public class JsHandler {
jsData.append("gadgets.config.init(").append(JsonSerializer.serialize(config)).append(");\n");
}
}
-
+
// Wrap up the response.
return new Response(jsData, isProxyCacheable);
}
+ private void appendExternsForBundle(FeatureRegistry.FeatureBundle bundle,
List<String> externs) {
+ for (ApiDirective api : bundle.getApis()) {
+ if (api.getType() == ApiDirective.Type.JS && api.isUses()) {
+ externs.add(api.getValue());
+ }
+ }
+ }
+
+ private void appendExportsForBundle(FeatureRegistry.FeatureBundle bundle,
List<String> exports) {
+ for (ApiDirective api : bundle.getApis()) {
+ if (api.getType() == ApiDirective.Type.JS && api.isExports()) {
+ exports.add(api.getValue());
+ }
+ }
+ }
+
/**
* Define the response data from JsHandler.
*/
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=1066689&r1=1066688&r2=1066689&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 Feb 2 23:23:28 2011
@@ -24,6 +24,7 @@ import java.util.Collections;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.JsCompileMode;
import org.apache.shindig.gadgets.RenderingContext;
import org.apache.shindig.gadgets.uri.UriCommon.Param;
@@ -54,6 +55,7 @@ public interface JsUriManager {
private final Collection<String> libs;
private final Collection<String> loadedLibs;
private final String onload;
+ private final JsCompileMode compileMode;
private boolean jsload;
private boolean nohint;
private final RenderingContext context;
@@ -62,13 +64,16 @@ public interface JsUriManager {
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());
- this.context = RenderingContext.valueOfParam(param);
+ String contextParam =
origUri.getQueryParameter(Param.CONTAINER_MODE.getKey());
+ this.context = RenderingContext.valueOfParam(contextParam);
+ String compileParam =
origUri.getQueryParameter(Param.COMPILE_MODE.getKey());
+ this.compileMode = JsCompileMode.valueOfParam(compileParam);
this.jsload =
"1".equals(origUri.getQueryParameter(Param.JSLOAD.getKey()));
this.onload = origUri.getQueryParameter(Param.ONLOAD.getKey());
this.nohint =
"1".equals(origUri.getQueryParameter(Param.NO_HINT.getKey()));
} else {
this.context = RenderingContext.GADGET;
+ this.compileMode = JsCompileMode.BUILD_TIME;
this.jsload = false;
this.onload = null;
this.nohint = false;
@@ -85,10 +90,11 @@ public interface JsUriManager {
public JsUri(UriStatus status, Collection<String> libs, RenderingContext
context,
String onload, boolean jsload, boolean nohint) {
super(status, null);
- this.context = context;
+ this.compileMode = JsCompileMode.BUILD_TIME;
this.onload = onload;
this.jsload = jsload;
this.nohint = nohint;
+ this.context = context;
this.libs = libs;
this.loadedLibs = EMPTY_COLL;
this.origUri = null;
@@ -96,6 +102,7 @@ public interface JsUriManager {
public JsUri(Gadget gadget, Collection<String> libs) {
super(gadget);
+ this.compileMode = JsCompileMode.BUILD_TIME;
this.onload = null;
this.jsload = false;
this.nohint = false;
@@ -108,6 +115,7 @@ public interface JsUriManager {
public JsUri(Integer refresh, boolean debug, boolean noCache, String
container, String gadget,
Collection<String> libs, String onload, boolean jsload, boolean
nohint, RenderingContext context, Uri origUri) {
super(null, refresh, debug, noCache, container, gadget);
+ this.compileMode = JsCompileMode.BUILD_TIME;
this.onload = onload;
this.jsload = jsload;
this.nohint = nohint;
@@ -116,7 +124,7 @@ public interface JsUriManager {
this.loadedLibs = EMPTY_COLL;
this.origUri = origUri;
}
-
+
public JsUri(JsUri origJsUri) {
super(origJsUri.getStatus(), origJsUri.getRefresh(),
origJsUri.isDebug(),
@@ -128,6 +136,7 @@ public interface JsUriManager {
this.onload = origJsUri.getOnload();
this.jsload = origJsUri.isJsload();
this.nohint = origJsUri.isNohint();
+ this.compileMode = origJsUri.getCompileMode();
this.context = origJsUri.getContext();
this.origUri = origJsUri.getOrigUri();
}
@@ -135,11 +144,11 @@ public interface JsUriManager {
public Collection<String> getLibs() {
return libs;
}
-
+
public Collection<String> getLoadedLibs() {
return loadedLibs;
}
-
+
private Collection<String> nonNullLibs(Collection<String> in) {
in = in != null ? in : EMPTY_COLL;
return Collections.unmodifiableCollection(in);
@@ -149,6 +158,10 @@ public interface JsUriManager {
return context;
}
+ public JsCompileMode getCompileMode() {
+ return compileMode;
+ }
+
public String getOnload() {
return onload;
}
@@ -156,19 +169,19 @@ public interface JsUriManager {
public boolean isJsload() {
return jsload;
}
-
+
public void setJsload(boolean jsload) {
this.jsload = jsload;
}
-
+
public boolean isNohint() {
return nohint;
}
-
+
public void setNohint(boolean nohint) {
this.nohint = nohint;
}
-
+
public Uri getOrigUri() {
return origUri;
}
@@ -188,8 +201,9 @@ public interface JsUriManager {
&& Objects.equal(this.onload, objUri.onload)
&& Objects.equal(this.jsload, objUri.jsload)
&& Objects.equal(this.nohint, objUri.nohint)
- && Objects.equal(this.context, objUri.context))
- && Objects.equal(this.origUri, objUri.origUri);
+ && Objects.equal(this.compileMode, objUri.compileMode)
+ && Objects.equal(this.context, objUri.context)
+ && Objects.equal(this.origUri, objUri.origUri));
}
@Override
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=1066689&r1=1066688&r2=1066689&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 Feb 2 23:23:28 2011
@@ -47,6 +47,7 @@ public interface UriCommon {
// JS request params
CONTAINER_MODE("c"),
+ COMPILE_MODE("compile"),
JSLOAD("jsload"),
ONLOAD("onload"),
ALREADY_HAVE("loaded"),
Modified:
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/JsCompileModeTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/JsCompileModeTest.java?rev=1066689&r1=1066688&r2=1066689&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/JsCompileModeTest.java
(original)
+++
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/JsCompileModeTest.java
Wed Feb 2 23:23:28 2011
@@ -16,7 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.shindig.gadgets;
import static org.junit.Assert.assertEquals;
@@ -26,9 +25,9 @@ import org.junit.Test;
public class JsCompileModeTest {
@Test
public void testValueOfParam() {
- assertEquals(JsCompileMode.DEBUG, JsCompileMode.valueOfParam(null));
- assertEquals(JsCompileMode.DEBUG, JsCompileMode.valueOfParam("0"));
- assertEquals(JsCompileMode.BUILD_TIME_COMPILE,
JsCompileMode.valueOfParam("1"));
- assertEquals(JsCompileMode.RUN_TIME_COMPILE,
JsCompileMode.valueOfParam("2"));
+ assertEquals(JsCompileMode.BUILD_TIME, JsCompileMode.valueOfParam(null));
+ assertEquals(JsCompileMode.BUILD_TIME, JsCompileMode.valueOfParam("0"));
+ assertEquals(JsCompileMode.ALL_RUN_TIME, JsCompileMode.valueOfParam("1"));
+ assertEquals(JsCompileMode.EXPLICIT_RUN_TIME,
JsCompileMode.valueOfParam("2"));
}
-}
+}
\ No newline at end of file
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=1066689&r1=1066688&r2=1066689&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 Feb 2 23:23:28 2011
@@ -18,7 +18,6 @@
*/
package org.apache.shindig.gadgets.uri;
-import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
@@ -29,8 +28,8 @@ import com.google.caja.util.Lists;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.common.uri.UriBuilder;
import org.apache.shindig.config.ContainerConfig;
+import org.apache.shindig.gadgets.JsCompileMode;
import org.apache.shindig.gadgets.RenderingContext;
-import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
import org.apache.shindig.gadgets.uri.UriCommon.Param;
import org.junit.Test;
@@ -46,9 +45,11 @@ public class JsUriManagerTest extends Ur
@Test
public void newJsUriWithOriginalUri() throws Exception {
- Uri uri = newTestUriBuilder(RenderingContext.CONTAINER).toUri();
+ Uri uri = newTestUriBuilder(RenderingContext.CONTAINER,
+ JsCompileMode.ALL_RUN_TIME).toUri();
JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, uri, LIBS, HAVE);
assertEquals(RenderingContext.CONTAINER, jsUri.getContext());
+ assertEquals(JsCompileMode.ALL_RUN_TIME, jsUri.getCompileMode());
assertEquals(CONTAINER_VALUE, jsUri.getContainer());
assertTrue(jsUri.isJsload());
assertTrue(jsUri.isNoCache());
@@ -61,9 +62,11 @@ public class JsUriManagerTest extends Ur
@Test
public void newJsUriWithConfiguredGadgetContext() throws Exception {
- Uri uri = newTestUriBuilder(RenderingContext.CONFIGURED_GADGET).toUri();
+ Uri uri = newTestUriBuilder(RenderingContext.CONFIGURED_GADGET,
+ JsCompileMode.ALL_RUN_TIME).toUri();
JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, uri, LIBS, HAVE);
assertEquals(RenderingContext.CONFIGURED_GADGET, jsUri.getContext());
+ assertEquals(JsCompileMode.ALL_RUN_TIME, jsUri.getCompileMode());
assertEquals(CONTAINER_VALUE, jsUri.getContainer());
assertTrue(jsUri.isJsload());
assertTrue(jsUri.isNoCache());
@@ -80,6 +83,7 @@ public class JsUriManagerTest extends Ur
Collections.<String>emptyList(), null); // Null URI.
assertEquals(RenderingContext.GADGET, jsUri.getContext());
assertEquals(ContainerConfig.DEFAULT_CONTAINER, jsUri.getContainer());
+ assertEquals(JsCompileMode.BUILD_TIME, jsUri.getCompileMode());
assertFalse(jsUri.isJsload());
assertFalse(jsUri.isNoCache());
assertFalse(jsUri.isNohint());
@@ -88,22 +92,25 @@ public class JsUriManagerTest extends Ur
assertTrue(jsUri.getLoadedLibs().isEmpty());
assertNull(jsUri.getOrigUri());
}
-
+
@Test
public void newJsUriCopyOfOtherJsUri() throws Exception {
- Uri uri = newTestUriBuilder(RenderingContext.CONTAINER).toUri();
+ Uri uri = newTestUriBuilder(RenderingContext.CONTAINER,
+ JsCompileMode.ALL_RUN_TIME).toUri();
JsUriManager.JsUri jsUri = new JsUriManager.JsUri(STATUS, uri, LIBS, HAVE);
JsUriManager.JsUri jsUriCopy = new JsUriManager.JsUri(jsUri);
assertEquals(jsUri, jsUriCopy);
}
- private UriBuilder newTestUriBuilder(RenderingContext context) {
+ private UriBuilder newTestUriBuilder(RenderingContext context,
+ JsCompileMode compileMode) {
UriBuilder builder = new UriBuilder();
builder.setScheme("http");
builder.setAuthority("localhost");
builder.setPath("/gadgets/js/feature.js");
builder.addQueryParameter(Param.CONTAINER.getKey(), CONTAINER_VALUE);
builder.addQueryParameter(Param.CONTAINER_MODE.getKey(),
context.getParamValue());
+ builder.addQueryParameter(Param.COMPILE_MODE.getKey(),
compileMode.getParamValue());
builder.addQueryParameter(Param.JSLOAD.getKey(), "1");
builder.addQueryParameter(Param.NO_CACHE.getKey(), "1");
builder.addQueryParameter(Param.NO_HINT.getKey(), "1");