You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2011/08/12 22:30:46 UTC

svn commit: r1157240 - in /shindig/trunk: features/src/main/javascript/features/globals/ features/src/main/javascript/features/opensearch/ java/common/conf/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/gadgets/src/main/java/org/apache/sh...

Author: lindner
Date: Fri Aug 12 20:30:45 2011
New Revision: 1157240

URL: http://svn.apache.org/viewvc?rev=1157240&view=rev
Log:
Patch from Dan Dumont | Enable closure with simple optimizations turned on.

Modified:
    shindig/trunk/features/src/main/javascript/features/globals/globals.js
    shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js
    shindig/trunk/java/common/conf/shindig.properties
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/JsCompileMode.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java
    shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/js/JsCompilerModule.java
    shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/rewrite/js/ClosureJsCompiler.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/CompilationProcessorTest.java
    shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java

Modified: shindig/trunk/features/src/main/javascript/features/globals/globals.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/globals/globals.js?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/globals/globals.js (original)
+++ shindig/trunk/features/src/main/javascript/features/globals/globals.js Fri Aug 12 20:30:45 2011
@@ -20,16 +20,16 @@
  * @namespace The global gadgets namespace
  * @type {Object}
  */
-var gadgets = window['gadgets'] || {};
+gadgets = window['gadgets'] || {};
 
 /**
  * @namespace The global shindig namespace, used for shindig specific extensions and data
  * @type {Object}
  */
-var shindig = window['shindig'] || {};
+shindig = window['shindig'] || {};
 
 /**
  * @namespace The global osapi namespace, used for opensocial API specific extensions
  * @type {Object}
  */
-var osapi = window['osapi'] || {};
+osapi = window['osapi'] || {};

Modified: shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js (original)
+++ shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js Fri Aug 12 20:30:45 2011
@@ -290,7 +290,7 @@
         }
       }
       return false;
-    }//,
+    }
 
     /*
      * Convenience method for unit testing, allowing the test script to set

Modified: shindig/trunk/java/common/conf/shindig.properties
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/conf/shindig.properties?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/common/conf/shindig.properties (original)
+++ shindig/trunk/java/common/conf/shindig.properties Fri Aug 12 20:30:45 2011
@@ -174,3 +174,7 @@ org.apache.shindig.gadgets.uri.urlMaxLen
 
 # Default cachettl value for versioned url in seconds. Here default value is 1 year.
 org.apache.shindig.gadgets.servlet.longLivedRefreshSec=31536000
+
+# Closure compiler optimization level.  One of advanced|simple|whitespace_only|none.
+# Defaults to simple.
+shindig.closure.compile.level=simple
\ No newline at end of file

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=1157240&r1=1157239&r2=1157240&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 Fri Aug 12 20:30:45 2011
@@ -48,7 +48,7 @@ public enum JsCompileMode {
         return mode;
       }
     }
-    return JsCompileMode.COMPILE_CONCAT;
+    return getDefault();
   }
 
   public static JsCompileMode getDefault() {

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java Fri Aug 12 20:30:45 2011
@@ -33,7 +33,6 @@ public class CompilationProcessor implem
 
   /**
    * Compile content in the inbound JsResponseBuilder.
-   * TODO: Re-add support for externs here if they're ever used.
    * TODO: Convert JsCompiler to take JsResponseBuilder directly rather than Iterable<JsContent>
    * @throws JsException
    */
@@ -42,7 +41,7 @@ public class CompilationProcessor implem
     for (JsContent jsc : jsContents) {
       FeatureBundle bundle = jsc.getFeatureBundle();
       if (bundle != null) {
-        builder.appendExterns(bundle.getApis(ApiDirective.Type.JS, false));
+        builder.appendExterns(bundle.getApis(ApiDirective.Type.JS, true));
       }
     }
 

Modified: shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/js/JsCompilerModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/js/JsCompilerModule.java?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/js/JsCompilerModule.java (original)
+++ shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/js/JsCompilerModule.java Fri Aug 12 20:30:45 2011
@@ -17,6 +17,9 @@
  */
 package org.apache.shindig.gadgets.js;
 
+import org.apache.shindig.gadgets.rewrite.js.ClosureJsCompiler;
+import org.apache.shindig.gadgets.rewrite.js.JsCompiler;
+
 import com.google.inject.AbstractModule;
 
 /**
@@ -26,6 +29,6 @@ public class JsCompilerModule extends Ab
 
   @Override
   protected void configure() {
-    // nothing to configure here
+    bind(JsCompiler.class).to(ClosureJsCompiler.class);
   }
 }

Modified: shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/rewrite/js/ClosureJsCompiler.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/rewrite/js/ClosureJsCompiler.java?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/rewrite/js/ClosureJsCompiler.java (original)
+++ shindig/trunk/java/gadgets/src/main/java16/org/apache/shindig/gadgets/rewrite/js/ClosureJsCompiler.java Fri Aug 12 20:30:45 2011
@@ -17,6 +17,26 @@
  */
 package org.apache.shindig.gadgets.rewrite.js;
 
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.shindig.common.cache.Cache;
+import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.logging.i18n.MessageKeys;
+import org.apache.shindig.common.util.HashUtil;
+import org.apache.shindig.gadgets.features.ApiDirective;
+import org.apache.shindig.gadgets.features.FeatureRegistry.FeatureBundle;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.js.JsContent;
+import org.apache.shindig.gadgets.js.JsResponse;
+import org.apache.shindig.gadgets.js.JsResponseBuilder;
+import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
@@ -24,13 +44,15 @@ import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.debugging.sourcemap.SourceMapping;
 import com.google.debugging.sourcemap.SourceMapConsumerFactory;
 import com.google.debugging.sourcemap.SourceMapParseException;
+import com.google.debugging.sourcemap.SourceMapping;
 import com.google.debugging.sourcemap.proto.Mapping.OriginalMapping;
 import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import com.google.javascript.jscomp.BasicErrorManager;
 import com.google.javascript.jscomp.CheckLevel;
+import com.google.javascript.jscomp.CommandLineRunner;
 import com.google.javascript.jscomp.CompilationLevel;
 import com.google.javascript.jscomp.Compiler;
 import com.google.javascript.jscomp.CompilerOptions;
@@ -39,24 +61,6 @@ import com.google.javascript.jscomp.JSSo
 import com.google.javascript.jscomp.Result;
 import com.google.javascript.jscomp.SourceMap;
 
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.shindig.common.cache.Cache;
-import org.apache.shindig.common.cache.CacheProvider;
-import org.apache.shindig.common.util.HashUtil;
-import org.apache.shindig.gadgets.features.ApiDirective;
-import org.apache.shindig.gadgets.features.FeatureRegistry.FeatureBundle;
-import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.js.JsContent;
-import org.apache.shindig.gadgets.js.JsResponse;
-import org.apache.shindig.gadgets.js.JsResponseBuilder;
-import org.apache.shindig.gadgets.rewrite.js.JsCompiler;
-import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
 public class ClosureJsCompiler implements JsCompiler {
   // Based on Closure Library's goog.exportSymbol implementation.
   private static final JsContent EXPORTSYMBOL_CODE =
@@ -65,32 +69,65 @@ public class ClosureJsCompiler implement
               + "for(;parts.length&&(part=parts.shift());){if(!parts.length){"
               + "cur[part]=obj;}else{cur=cur[part]||(cur[part]={})}}};", "[goog.exportSymbol]");
 
+  //class name for logging purpose
+  private static final String classname = ClosureJsCompiler.class.getName();
+  private static final Logger LOG = Logger.getLogger(classname, MessageKeys.MESSAGES);
+
   @VisibleForTesting
   static final String CACHE_NAME = "CompiledJs";
 
   private final DefaultJsCompiler defaultCompiler;
   private final Cache<String, JsResponse> cache;
+  private final List<JSSourceFile> defaultExterns;
+  private final String compileLevel;
+  private final CompilerOptions compilerOptions;
 
   @Inject
-  public ClosureJsCompiler(DefaultJsCompiler defaultCompiler, CacheProvider cacheProvider) {
+  public ClosureJsCompiler(DefaultJsCompiler defaultCompiler, CacheProvider cacheProvider,
+      @Named("shindig.closure.compile.level") String level) {
     this.cache = cacheProvider.createCache(CACHE_NAME);
     this.defaultCompiler = defaultCompiler;
+    List<JSSourceFile> externs = null;
+    try {
+      externs = Collections.unmodifiableList(CommandLineRunner.getDefaultExterns());
+    } catch(IOException e) {
+      if (LOG.isLoggable(Level.WARNING)) {
+        LOG.log(Level.WARNING, "Unable to load default closure externs: " + e.getMessage(), e);
+      }
+    }
+    defaultExterns = externs;
+
+    compileLevel = level.toLowerCase().trim();
+    compilerOptions = defaultCompilerOptions();
   }
 
-  public static CompilerOptions defaultCompilerOptions() {
+  public CompilerOptions defaultCompilerOptions() {
     CompilerOptions result = new CompilerOptions();
-    CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel(result);
+    if (compileLevel.equals("advanced")) {
+      CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel(result);
+    }
+    else if (compileLevel.equals("whitespace_only")) {
+      CompilationLevel.WHITESPACE_ONLY.setOptionsForCompilationLevel(result);
+    }
+    else {
+      // If 'none', this complier will not run, @see compile
+      CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(result);
+    }
     return result;
   }
 
   @VisibleForTesting
   protected CompilerOptions getCompilerOptions(JsUri uri) {
-    CompilerOptions options = defaultCompilerOptions();
-
-    if (outputCorrelatedJs()) {
-      setSourceMapCompilerOptions(options);
+    /*
+     * This method gets called many times over the course of a single compilation.
+     * Keep the instantiated compiler options unless we need to set SourceMap options
+     */
+    if (!outputCorrelatedJs()) {
+      return compilerOptions;
     }
 
+    CompilerOptions options = defaultCompilerOptions();
+    setSourceMapCompilerOptions(options);
     return options;
   }
 
@@ -125,8 +162,15 @@ public class ClosureJsCompiler implement
     // Only run actual compiler if necessary.
     CompilerOptions options = getCompilerOptions(jsUri);
 
-    if (!jsUri.isDebug() || options.isExternExportsEnabled()) {
-      return doCompile(jsUri, content, externs, cacheKey);
+    if (!compileLevel.equals("none")) {
+      /*
+       *  isDebug usually will turn off all compilation, however, setting
+       *  isExternExportsEnabled and specifying an export path will keep the
+       *  closure compiler on and export the externs for debugging.
+       */
+      if (!jsUri.isDebug() || options.isExternExportsEnabled()) {
+        return doCompile(jsUri, content, externs, cacheKey);
+      }
     }
 
     return doDebug(content, cacheKey);
@@ -148,6 +192,9 @@ public class ClosureJsCompiler implement
 
     List<JSSourceFile> allExterns = Lists.newArrayList();
     allExterns.add(JSSourceFile.fromCode("externs", externs));
+    if (defaultExterns != null) {
+      allExterns.addAll(defaultExterns);
+    }
 
     List<JsContent> allContent = Lists.newLinkedList(content);
     if (options.isExternExportsEnabled()) {

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/CompilationProcessorTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/CompilationProcessorTest.java?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/CompilationProcessorTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/CompilationProcessorTest.java Fri Aug 12 20:30:45 2011
@@ -108,7 +108,7 @@ public class CompilationProcessorTest {
 
   private FeatureBundle mockBundle(String... externs) {
     FeatureBundle result = createMock(FeatureBundle.class);
-    expect(result.getApis(ApiDirective.Type.JS, false)).andReturn(
+    expect(result.getApis(ApiDirective.Type.JS, true)).andReturn(
         Lists.newArrayList(externs)).anyTimes();
     replay(result);
     return result;

Modified: shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java?rev=1157240&r1=1157239&r2=1157240&view=diff
==============================================================================
--- shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java (original)
+++ shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java Fri Aug 12 20:30:45 2011
@@ -350,9 +350,9 @@ public class EndToEndTest {
     // to synchronous, saving the test from needing to wait or sleep for XHR
     // completion.
     webClient.setAjaxController(new NicelyResynchronizingAjaxController());
-    webClient.waitForBackgroundJavaScript(2000);
+    webClient.waitForBackgroundJavaScript(120000);  // Closure can take a long time...
     webClient.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);
-    webClient.setTimeout(3000);
+    webClient.setTimeout(120000);  // Closure can take a long time...
 
     alertHandler = new CollectingAlertHandler();
     webClient.setAlertHandler(alertHandler);
@@ -427,7 +427,6 @@ public class EndToEndTest {
     if (!(page instanceof HtmlPage)) {
       fail("Got wrong page type. Was: " + page.getWebResponse().getContentType());
     }
-    webClient.waitForBackgroundJavaScript(5000);
     return (HtmlPage) page;
   }