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


Reply via email to