Author: mhermanto
Date: Tue Apr 12 03:20:01 2011
New Revision: 1091280

URL: http://svn.apache.org/viewvc?rev=1091280&view=rev
Log:
Allow override for JS loading mechanism.
http://codereview.appspot.com/4388053/

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 Tue Apr 12 03:20:01 2011
@@ -68,6 +68,7 @@ public class DefaultGuiceModule extends 
     
bind(Executor.class).annotatedWith(Names.named("shindig.concat.executor")).to(ShindigExecutorService.class);
 
     bindConstant().annotatedWith(Names.named("shindig.jsload.ttl-secs")).to(60 
* 60); // 1 hour
+    
bindConstant().annotatedWith(Names.named("shindig.jsload.require-onload-with-jsload")).to(true);
 
     install(new DefaultConfigContributorModule());
     install(new ParseModule());
@@ -99,7 +100,7 @@ public class DefaultGuiceModule extends 
     handlerBinder.addBinding().to(HttpRequestHandler.class);
     handlerBinder.addBinding().to(GadgetsHandler.class);
   }
-  
+
   /**
    * Sets up the multibinding for extended feature resources
    */

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsLoadProcessor.java
 Tue Apr 12 03:20:01 2011
@@ -43,18 +43,17 @@ public class JsLoadProcessor implements 
       "})();"; // Concatenated to avoid some browsers do dynamic script 
injection.
 
   private final JsUriManager jsUriManager;
-  private int jsloadTtlSecs;
+  private final int jsloadTtlSecs;
+  private final boolean requireOnload;
 
   @Inject
   public JsLoadProcessor(
-      JsUriManager jsUriManager, @Named("shindig.jsload.ttl-secs") int 
jsloadTtlSecs) {
+      JsUriManager jsUriManager,
+      @Named("shindig.jsload.ttl-secs") int jsloadTtlSecs,
+      @Named("shindig.jsload.require-onload-with-jsload") boolean 
requireOnload) {
     this.jsUriManager = jsUriManager;
     this.jsloadTtlSecs = jsloadTtlSecs;
-  }
-
-  @VisibleForTesting
-  public void setJsloadTtlSecs(int jsloadTtlSecs) {
-    this.jsloadTtlSecs = jsloadTtlSecs;
+    this.requireOnload = requireOnload;
   }
 
   public boolean process(JsRequest request, JsResponseBuilder builder)
@@ -65,33 +64,36 @@ public class JsLoadProcessor implements 
     // versioned JS. The loader script is much smaller and cacheable for a
     // configurable amount of time.
     if (jsUri.isJsload()) {
+      // Require users to specify &onload=. This ensures a reliable 
continuation
+      // of JS execution. IE asynchronously loads script, before it loads
+      // source-scripted and inlined JS.
+      if (requireOnload && jsUri.getOnload() == null) {
+        throw new JsException(HttpServletResponse.SC_BAD_REQUEST, 
JSLOAD_ONLOAD_ERROR);
+      }
+
+      int refresh = getCacheTtlSecs(jsUri);
+      builder.setCacheTtlSecs(refresh);
+      builder.setProxyCacheable(true);
+      
       doJsload(jsUri, builder);
       return false;
     }
     return true;
   }
   
-  private void doJsload(JsUri jsUri, JsResponseBuilder resp)
+  protected void doJsload(JsUri jsUri, JsResponseBuilder resp)
       throws JsException {
-    String onloadStr = jsUri.getOnload();
-
-    // Require users to specify &onload=. This ensures a reliable continuation
-    // of JS execution. IE asynchronously loads script, before it loads
-    // source-scripted and inlined JS.
-    if (onloadStr == null) {
-      throw new JsException(HttpServletResponse.SC_BAD_REQUEST, 
JSLOAD_ONLOAD_ERROR);
-    }
-
     jsUri.setJsload(false);
     jsUri.setNohint(true);
     Uri incUri = jsUriManager.makeExternJsUri(jsUri);
-
-    int refresh = getCacheTtlSecs(jsUri);
-    resp.setCacheTtlSecs(refresh);
-    resp.setProxyCacheable(true);
     resp.appendJs(createJsloadScript(incUri), CODE_ID);
   }
 
+  protected String createJsloadScript(Uri uri) {
+    String uriString = uri.toString();
+    return String.format(JSLOAD_JS_TPL, uriString);
+  }
+
   private int getCacheTtlSecs(JsUri jsUri) {
     if (jsUri.isNoCache()) {
       return 0;
@@ -102,10 +104,4 @@ public class JsLoadProcessor implements 
     }
   }
 
-  @VisibleForTesting
-  String createJsloadScript(Uri uri) {
-    String uriString = uri.toString();
-    return String.format(JSLOAD_JS_TPL, uriString);
-  }
-
 }

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsLoadProcessorTest.java
 Tue Apr 12 03:20:01 2011
@@ -54,11 +54,11 @@ public class JsLoadProcessorTest {
     jsUri = control.createMock(JsUri.class);
     uri = Uri.parse("http://example.org/foo.xml";);
     response = new JsResponseBuilder();
-    processor = new JsLoadProcessor(jsUriManager, 1234);
-    
+    processor = new JsLoadProcessor(jsUriManager, 1234, true);
+
     EasyMock.expect(request.getJsUri()).andReturn(jsUri);
   }
-  
+
   @Test
   public void testSkipsWhenNoJsLoad() throws Exception {
     EasyMock.expect(jsUri.isJsload()).andReturn(false);
@@ -67,7 +67,7 @@ public class JsLoadProcessorTest {
     assertTrue(processor.process(request, response));
     control.verify();
   }
-  
+
   @Test
   public void testFailsWhenNoOnloadIsSpecified() throws Exception {
     EasyMock.expect(jsUri.isJsload()).andReturn(true);
@@ -82,7 +82,7 @@ public class JsLoadProcessorTest {
     }
     control.verify();
   }
-  
+
   @Test
   public void testGeneratesLoaderCodeWithNoCache() throws Exception {
     setExpectations(true, null);

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java?rev=1091280&r1=1091279&r2=1091280&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsServletTest.java
 Tue Apr 12 03:20:01 2011
@@ -72,8 +72,10 @@ public class JsServletTest extends Servl
     servlet.setJsRequestBuilder(new JsRequestBuilder(jsUriManagerMock));
 
     getJsProcessorMock = mock(GetJsContentProcessor.class);
-    
-    jsLoadProcessor = new JsLoadProcessor(jsUriManagerMock, 0);
+  }
+
+  private void setUp(int jsloadTtlSecs) {
+    jsLoadProcessor = new JsLoadProcessor(jsUriManagerMock, jsloadTtlSecs, 
true);
     JsProcessorRegistry jsProcessorRegistry =
         new DefaultJsProcessorRegistry(
             ImmutableList.<JsProcessor>of(jsLoadProcessor, new 
IfModifiedSinceProcessor(),
@@ -110,16 +112,18 @@ public class JsServletTest extends Servl
 
   @Test
   public void testJsServletGivesErrorWhenUriManagerThrowsException() throws 
Exception {
+    setUp(0);
     expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andThrow(new 
GadgetException(null));
     replay();
-    
+
     servlet.doGet(request, recorder);
     assertEquals(HttpServletResponse.SC_BAD_REQUEST, 
recorder.getHttpStatusCode());
     verify();
   }
-  
+
   @Test
   public void 
testWithIfModifiedSinceHeaderPresentAndVersionReturnsNotModified() throws 
Exception {
+    setUp(0);
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, 
false, false, false,
         null, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
@@ -130,9 +134,10 @@ public class JsServletTest extends Servl
     assertEquals(HttpServletResponse.SC_NOT_MODIFIED, 
recorder.getHttpStatusCode());
     verify();
   }
-  
+
   @Test
   public void testWithIfModifiedSinceHeaderPresentButNoVersionActsNormal() 
throws Exception {
+    setUp(0);
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, 
false, false, false,
         null, REFRESH_INTERVAL_SEC, UriStatus.VALID_UNVERSIONED);
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
@@ -154,9 +159,10 @@ public class JsServletTest extends Servl
     assertEquals(EXAMPLE_JS_CODE, recorder.getResponseAsString());
     verify();
   }
-  
+
   @Test
   public void testDoJsloadNormal() throws Exception {
+    setUp(0);
     String url = 
"http://localhost/gadgets/js/feature.js?v=abc&nocache=0&onload="; + ONLOAD_PARAM;
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true, 
true, false,
         ONLOAD_PARAM, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
@@ -176,6 +182,8 @@ public class JsServletTest extends Servl
 
   @Test
   public void testDoJsloadWithJsLoadTimeout() throws Exception {
+    setUp(TIMEOUT_SEC); // Enable JS load timeout.
+
     String url = 
"http://localhost/gadgets/js/feature.js?v=abc&nocache=0&onload="; + ONLOAD_PARAM;
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true, 
true,
         false, ONLOAD_PARAM, -1, UriStatus.VALID_VERSIONED); // Disable 
refresh interval.
@@ -183,7 +191,6 @@ public class JsServletTest extends Servl
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
     expect(jsUriManagerMock.makeExternJsUri(isA(JsUri.class)))
         .andReturn(Uri.parse(url));
-    jsLoadProcessor.setJsloadTtlSecs(TIMEOUT_SEC); // Enable JS load timeout.
     httpUtilMock.setCachingHeaders(recorder, TIMEOUT_SEC, false);
     replay();
 
@@ -196,6 +203,7 @@ public class JsServletTest extends Servl
 
   @Test
   public void testDoJsloadNoOnload() throws Exception {
+    setUp(0);
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true, 
true, false,
         null, // lacks &onload=
         REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
@@ -210,6 +218,7 @@ public class JsServletTest extends Servl
 
   @Test
   public void testDoJsloadNoCache() throws Exception {
+    setUp(0);
     String url = 
"http://localhost/gadgets/js/feature.js?v=abc&nocache=1&onload="; + ONLOAD_PARAM;
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true, 
true,
         true, // Set to no cache.


Reply via email to