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;
}