Author: johnh
Date: Wed Jan 26 02:14:44 2011
New Revision: 1063570

URL: http://svn.apache.org/viewvc?rev=1063570&view=rev
Log:
Refactor HTTP JS serving into a pluggable pipeline, to break up JsServlet's ad 
hoc/monolithic functional nature. Adds additional testing along with inherent 
capability for code augmentation. JsHandler, producing core code, remains 
untouched so it may be shared with metadata JS service.

Patch provided by Jacobo Tarrio.


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/GadgetException.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.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=1063570&r1=1063569&r2=1063570&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
 Wed Jan 26 02:14:44 2011
@@ -33,6 +33,7 @@ import org.apache.shindig.common.servlet
 import org.apache.shindig.gadgets.config.DefaultConfigContributorModule;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.InvalidationHandler;
+import org.apache.shindig.gadgets.js.JavascriptModule;
 import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.preload.PreloadModule;
 import org.apache.shindig.gadgets.render.RenderModule;
@@ -73,6 +74,7 @@ public class DefaultGuiceModule extends 
     install(new SubstituterModule());
     install(new TemplateModule());
     install(new UriModule());
+    install(new JavascriptModule());
 
     // 
bind(Long.class).annotatedWith(Names.named("org.apache.shindig.serviceExpirationDurationMinutes")).toInstance(60l);
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java?rev=1063570&r1=1063569&r2=1063570&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
 Wed Jan 26 02:14:44 2011
@@ -79,6 +79,9 @@ public class GadgetException extends Exc
 
     // Signed fetch
     REQUEST_SIGNING_FAILURE,
+    
+    // Error in the JavaScript processing pipeline
+    JS_PROCESSING_ERROR,
   }
 
   private final Code code;

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java?rev=1063570&r1=1063569&r2=1063570&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
 Wed Jan 26 02:14:44 2011
@@ -19,22 +19,17 @@ package org.apache.shindig.gadgets.servl
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 
-import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.shindig.common.servlet.HttpUtil;
 import org.apache.shindig.common.servlet.InjectedServlet;
-import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.gadgets.GadgetException;
-import org.apache.shindig.gadgets.uri.JsUriManager;
-import org.apache.shindig.gadgets.uri.UriStatus;
-import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
-import org.apache.shindig.gadgets.uri.UriCommon.Param;
+import org.apache.shindig.gadgets.js.JsException;
+import org.apache.shindig.gadgets.js.JsRequest;
+import org.apache.shindig.gadgets.js.JsRequestBuilder;
+import org.apache.shindig.gadgets.js.JsResponse;
+import org.apache.shindig.gadgets.js.JsServingPipeline;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.regex.Pattern;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -46,191 +41,72 @@ import javax.servlet.http.HttpServletRes
 public class JsServlet extends InjectedServlet {
   private static final long serialVersionUID = 6255917470412008175L;
 
-  @VisibleForTesting
-  static final String JSLOAD_ONLOAD_ERROR = "jsload must require onload";
-
-  @VisibleForTesting
-  static final String ONLOAD_JS_TPL = "(function() {" +
-      "var nm='%s';" +
-      "if (typeof window[nm]==='function') {" +
-      "window[nm]();" +
-      '}' +
-      "})();";
-
-  @VisibleForTesting
-  static final String JSLOAD_JS_TPL = "(function() {" +
-      "document.write('<scr' + 'ipt type=\"text/javascript\" src=\"%s\"></scr' 
+ 'ipt>');" +
-      "})();"; // Concatenated to avoid some browsers do dynamic script 
injection.
-
-  private static final Pattern ONLOAD_FN_PATTERN = 
Pattern.compile("[a-zA-Z0-9_]+");
-
-  private transient JsHandler jsHandler;
-  private transient JsUriManager jsUriManager;
-  private int jsloadTtlSecs;
+  private JsServingPipeline jsServingPipeline;
   private CachingSetter cachingSetter;
 
+  private JsRequestBuilder jsRequestBuilder;
+
   @VisibleForTesting
   static class CachingSetter {
     public void setCachingHeaders(HttpServletResponse resp, int ttl, boolean 
noProxy) {
-      HttpUtil.setCachingHeaders(resp, ttl, false);
+      if (ttl < 0) {
+        HttpUtil.setCachingHeaders(resp, noProxy);
+      } else if (ttl == 0) {
+        HttpUtil.setNoCache(resp);
+      } else {
+        HttpUtil.setCachingHeaders(resp, ttl, noProxy);
+      }
     }
   }
 
   @Inject
-  @VisibleForTesting
-  void setCachingSetter(CachingSetter util) {
-    this.cachingSetter = util;
-  }
-
-  @Inject
-  public void setJsHandler(JsHandler jsHandler) {
+  public void setJsRequestBuilder(JsRequestBuilder jsRequestBuilder) {
     checkInitialized();
-    this.jsHandler = jsHandler;
+    this.jsRequestBuilder = jsRequestBuilder;
   }
-
+  
   @Inject
-  public void setUrlGenerator(JsUriManager jsUriManager) {
-    checkInitialized();
-    this.jsUriManager = jsUriManager;
+  public void setCachingSetter(CachingSetter cachingSetter) {
+    this.cachingSetter = cachingSetter;
   }
 
   @Inject
-  public void setJsloadTtlSecs(@Named("shindig.jsload.ttl-secs") int 
jsloadTtlSecs) {
-    this.jsloadTtlSecs = jsloadTtlSecs;
+  public void setJsServingPipeline(JsServingPipeline jsServingPipeline) {
+    this.jsServingPipeline = jsServingPipeline;
   }
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws IOException {
 
-    JsUri jsUri = null;
+    JsRequest jsRequest;
     try {
-      jsUri = jsUriManager.processExternJsUri(new UriBuilder(req).toUri());
+      jsRequest = jsRequestBuilder.build(req);
     } catch (GadgetException e) {
       resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
       return;
     }
 
-    // Don't emit the JS itself; instead emit JS loader script that loads
-    // versioned JS. The loader script is much smaller and cacheable for a
-    // configurable amount of time.
-    if (jsUri.isJsload()) {
-      doJsload(jsUri, resp);
-      return;
-    }
-
-    // If an If-Modified-Since header is ever provided, we always say
-    // not modified. This is because when there actually is a change,
-    // cache busting should occur.
-    if (req.getHeader("If-Modified-Since") != null &&
-        jsUri.getStatus() == UriStatus.VALID_VERSIONED) {
-      resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+    JsResponse jsResponse;
+    try {
+      jsResponse = jsServingPipeline.execute(jsRequest);
+    } catch (JsException e) {
+      resp.sendError(e.getStatusCode(), e.getMessage());
       return;
     }
-
-    // Get JavaScript content from features aliases request.
-    JsHandler.Response handlerResponse =
-        jsHandler.getJsContent(jsUri, req.getHeader("Host"));
-    StringBuilder jsData = handlerResponse.getJsData();
-    boolean isProxyCacheable = handlerResponse.isProxyCacheable();
-
-    // Add onload handler to add callback function.
-    String onloadStr = req.getParameter(Param.ONLOAD.getKey());
-    if (onloadStr != null) {
-      if (!ONLOAD_FN_PATTERN.matcher(onloadStr).matches()) {
-        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid onload 
callback specified");
-        return;
-      }
-      jsData.append(createOnloadScript(onloadStr));
-    }
-
-    if (jsData.length() == 0) {
+    
+    if (jsResponse.getStatusCode() == 200 && jsResponse.getJsCode().length() 
== 0) {
       resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
       return;
     }
 
-    // post JavaScript content fetching
-    postJsContentProcessing(resp, jsUri.getStatus(), isProxyCacheable);
+    cachingSetter.setCachingHeaders(
+        resp, jsResponse.getCacheTtlSecs(), !jsResponse.isProxyCacheable());
 
+    resp.setStatus(jsResponse.getStatusCode());
     resp.setContentType("text/javascript; charset=utf-8");
-    byte[] response = jsData.toString().getBytes("UTF-8");
+    byte[] response = jsResponse.getJsCode().toString().getBytes("UTF-8");
     resp.setContentLength(response.length);
     resp.getOutputStream().write(response);
   }
-
-  private void doJsload(JsUri jsUri, HttpServletResponse resp)
-      throws IOException, UnsupportedEncodingException {
-    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) {
-      resp.sendError(HttpServletResponse.SC_BAD_REQUEST, JSLOAD_ONLOAD_ERROR);
-      return;
-    }
-
-    Uri incUri = jsUriManager.makeExternJsUri(jsUri);
-    // Remove the JsLoad param so we want get here again
-    UriBuilder uriBuilder = new UriBuilder(incUri);
-    uriBuilder.removeQueryParameter(Param.JSLOAD.getKey());
-    incUri = uriBuilder.toUri();
-
-    int refresh = getCacheTtlSecs(jsUri);
-    cachingSetter.setCachingHeaders(resp, refresh, false);
-
-    resp.setContentType("text/javascript; charset=utf-8");
-    byte[] incBytes = createJsloadScript(incUri).getBytes("UTF-8");
-    resp.setContentLength(incBytes.length);
-    resp.getOutputStream().write(incBytes);
-  }
-
-  private int getCacheTtlSecs(JsUri jsUri) {
-    if (jsUri.isNoCache()) {
-      return 0;
-    } else {
-      Integer jsUriRefresh = jsUri.getRefresh();
-      return (jsUriRefresh != null && jsUriRefresh >= 0)
-          ? jsUriRefresh : jsloadTtlSecs;
-    }
-  }
-
-
-  @VisibleForTesting
-  String createOnloadScript(String function) {
-    return String.format(ONLOAD_JS_TPL, 
StringEscapeUtils.escapeJavaScript(function));
-  }
-
-  @VisibleForTesting
-  String createJsloadScript(Uri uri) {
-    String uriString = uri.toString();
-    return String.format(JSLOAD_JS_TPL, uriString);
-  }
-
-  /**
-   * Provides post JavaScript content processing. The default behavior will 
check the UriStatus and
-   * update the response header with cache option.
-   *
-   * @param resp The HttpServeltResponse object.
-   * @param vstatus The UriStatus object.
-   * @param isProxyCacheable boolean true if content is cacheable and false 
otherwise.
-   */
-  protected void postJsContentProcessing(HttpServletResponse resp, UriStatus 
vstatus,
-      boolean isProxyCacheable) {
-    switch (vstatus) {
-      case VALID_VERSIONED:
-        // Versioned files get cached indefinitely
-        HttpUtil.setCachingHeaders(resp, !isProxyCacheable);
-        break;
-      case VALID_UNVERSIONED:
-        // Unversioned files get cached for 1 hour.
-        HttpUtil.setCachingHeaders(resp, 60 * 60, !isProxyCacheable);
-        break;
-      case INVALID_VERSION:
-        // URL is invalid in some way, likely version mismatch.
-        // Indicate no-cache forcing subsequent requests to regenerate URLs.
-        HttpUtil.setNoCache(resp);
-        break;
-    }
-  }
 }

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=1063570&r1=1063569&r2=1063570&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 Jan 26 02:14:44 2011
@@ -54,7 +54,7 @@ public interface JsUriManager {
     private final Collection<String> libs;
     private final Collection<String> loadedLibs;
     private final String onload;
-    private final boolean jsload;
+    private boolean jsload;
     private final RenderingContext context;
 
     public JsUri(UriStatus status, Uri origUri, Collection<String> libs, 
Collection<String> have) {
@@ -130,6 +130,10 @@ public interface JsUriManager {
     public boolean isJsload() {
       return jsload;
     }
+    
+    public void setJsload(boolean jsload) {
+      this.jsload = jsload;
+    }
 
     @Override
     public boolean equals(Object obj) {

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=1063570&r1=1063569&r2=1063570&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
 Wed Jan 26 02:14:44 2011
@@ -22,17 +22,30 @@ import static org.easymock.EasyMock.expe
 import static org.easymock.EasyMock.isA;
 
 import com.google.caja.util.Lists;
+import com.google.common.collect.ImmutableList;
 
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.RenderingContext;
+import org.apache.shindig.gadgets.js.AddOnloadFunctionProcessor;
+import org.apache.shindig.gadgets.js.DefaultJsProcessorRegistry;
+import org.apache.shindig.gadgets.js.DefaultJsServingPipeline;
+import org.apache.shindig.gadgets.js.GetJsContentProcessor;
+import org.apache.shindig.gadgets.js.IfModifiedSinceProcessor;
+import org.apache.shindig.gadgets.js.JsLoadProcessor;
+import org.apache.shindig.gadgets.js.JsProcessor;
+import org.apache.shindig.gadgets.js.JsProcessorRegistry;
+import org.apache.shindig.gadgets.js.JsRequestBuilder;
 import org.apache.shindig.gadgets.uri.JsUriManager;
 import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
+import org.apache.shindig.gadgets.uri.UriStatus;
 import org.junit.Before;
 import org.junit.Test;
 
 import javax.servlet.http.HttpServletResponse;
 
 public class JsServletTest extends ServletTestFixture {
+  private static final String EXAMPLE_JS_CODE = "some javascript code";
   private static final String CONTAINER_PARAM = "im_a_container";
   private static final String ONLOAD_PARAM = "onload_me";
   private static final int REFRESH_INTERVAL_SEC = 200;
@@ -42,17 +55,27 @@ public class JsServletTest extends Servl
   private JsServlet.CachingSetter httpUtilMock;
   private JsHandler jsHandlerMock;
   private JsUriManager jsUriManagerMock;
+  private JsLoadProcessor jsLoadProcessor;
+  private DefaultJsServingPipeline jsServingPipeline;
 
   @Before
   public void setUp() throws Exception {
     httpUtilMock = mock(JsServlet.CachingSetter.class);
     servlet.setCachingSetter(httpUtilMock);
 
+    jsUriManagerMock = mock(JsUriManager.class);
+    servlet.setJsRequestBuilder(new JsRequestBuilder(jsUriManagerMock));
+
     jsHandlerMock = mock(JsHandler.class);
-    servlet.setJsHandler(jsHandlerMock);
+    
+    jsLoadProcessor = new JsLoadProcessor(jsUriManagerMock, 0);
+    JsProcessorRegistry jsProcessorRegistry =
+        new DefaultJsProcessorRegistry(
+            ImmutableList.<JsProcessor>of(jsLoadProcessor, new 
IfModifiedSinceProcessor(),
+                new GetJsContentProcessor(jsHandlerMock), new 
AddOnloadFunctionProcessor()));
 
-    jsUriManagerMock = mock(JsUriManager.class);
-    servlet.setUrlGenerator(jsUriManagerMock);
+    jsServingPipeline = new DefaultJsServingPipeline(jsProcessorRegistry);
+    servlet.setJsServingPipeline(jsServingPipeline);
 
     // TODO: Abstract this out into a helper function associated with Uri 
class.
     expect(request.getScheme()).andReturn("http");
@@ -63,7 +86,8 @@ public class JsServletTest extends Servl
   }
 
   private JsUri mockJsUri(String container, RenderingContext context, boolean 
debug,
-      boolean jsload, boolean nocache, String onload, int refresh, String... 
libs) {
+      boolean jsload, boolean nocache, String onload, int refresh, UriStatus 
status,
+      String... libs) {
     JsUri result = mock(JsUri.class);
     expect(result.getContainer()).andReturn(container).anyTimes();
     expect(result.getContext()).andReturn(context).anyTimes();
@@ -72,6 +96,7 @@ public class JsServletTest extends Servl
     expect(result.isDebug()).andReturn(debug).anyTimes();
     expect(result.isNoCache()).andReturn(nocache).anyTimes();
     expect(result.isJsload()).andReturn(jsload).anyTimes();
+    expect(result.getStatus()).andReturn(status).anyTimes();
     if (libs != null) {
       expect(result.getLibs()).andReturn(Lists.newArrayList(libs)).anyTimes();
     }
@@ -79,20 +104,62 @@ public class JsServletTest extends Servl
   }
 
   @Test
+  public void testJsServletGivesErrorWhenUriManagerThrowsException() throws 
Exception {
+    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 {
+    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);
+    expect(request.getHeader("If-Modified-Since")).andReturn("12345");
+    replay();
+
+    servlet.doGet(request, recorder);
+    assertEquals(HttpServletResponse.SC_NOT_MODIFIED, 
recorder.getHttpStatusCode());
+    verify();
+  }
+  
+  @Test
+  public void testWithIfModifiedSinceHeaderPresentButNoVersionActsNormal() 
throws Exception {
+    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);
+    expect(request.getHeader("If-Modified-Since")).andReturn("12345");
+    JsHandler.Response response = new JsHandler.Response(new 
StringBuilder(EXAMPLE_JS_CODE), true);
+    expect(request.getHeader("Host")).andReturn("localhost");
+    expect(jsHandlerMock.getJsContent(jsUri, "localhost")).andReturn(response);
+    replay();
+
+    servlet.doGet(request, recorder);
+    assertEquals(HttpServletResponse.SC_OK, recorder.getHttpStatusCode());
+    assertEquals(EXAMPLE_JS_CODE, recorder.getResponseAsString());
+    verify();
+  }
+  
+  @Test
+  @SuppressWarnings("unchecked")
   public void testDoJsloadNormal() throws Exception {
     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);
+        ONLOAD_PARAM, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
 
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
     expect(jsUriManagerMock.makeExternJsUri(isA(JsUri.class)))
-        .andReturn(Uri.parse(url + "&jsload=1"));
+        .andReturn(Uri.parse(url));
     httpUtilMock.setCachingHeaders(recorder, REFRESH_INTERVAL_SEC, false);
     replay();
 
     servlet.doGet(request, recorder);
     assertEquals(HttpServletResponse.SC_OK, recorder.getHttpStatusCode());
-    assertEquals(String.format(JsServlet.JSLOAD_JS_TPL, url), 
recorder.getResponseAsString());
+    assertEquals(String.format(JsLoadProcessor.JSLOAD_JS_TPL, url),
+        recorder.getResponseAsString());
     verify();
   }
 
@@ -100,18 +167,19 @@ public class JsServletTest extends Servl
   public void testDoJsloadWithJsLoadTimeout() throws Exception {
     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); // Disable refresh interval.
+        false, ONLOAD_PARAM, -1, UriStatus.VALID_VERSIONED); // Disable 
refresh interval.
 
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
     expect(jsUriManagerMock.makeExternJsUri(isA(JsUri.class)))
-        .andReturn(Uri.parse(url + "&jsload=1"));
-    servlet.setJsloadTtlSecs(TIMEOUT_SEC); // Enable JS load timeout.
+        .andReturn(Uri.parse(url));
+    jsLoadProcessor.setJsloadTtlSecs(TIMEOUT_SEC); // Enable JS load timeout.
     httpUtilMock.setCachingHeaders(recorder, TIMEOUT_SEC, false);
     replay();
 
     servlet.doGet(request, recorder);
     assertEquals(HttpServletResponse.SC_OK, recorder.getHttpStatusCode());
-    assertEquals(String.format(JsServlet.JSLOAD_JS_TPL, url), 
recorder.getResponseAsString());
+    assertEquals(String.format(JsLoadProcessor.JSLOAD_JS_TPL, url),
+        recorder.getResponseAsString());
     verify();
   }
 
@@ -119,13 +187,13 @@ public class JsServletTest extends Servl
   public void testDoJsloadNoOnload() throws Exception {
     JsUri jsUri = mockJsUri(CONTAINER_PARAM, RenderingContext.CONTAINER, true, 
true, false,
         null, // lacks &onload=
-        REFRESH_INTERVAL_SEC);
+        REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
     replay();
 
     servlet.doGet(request, recorder);
     assertEquals(HttpServletResponse.SC_BAD_REQUEST, 
recorder.getHttpStatusCode());
-    assertEquals(JsServlet.JSLOAD_ONLOAD_ERROR, 
recorder.getResponseAsString());
+    assertEquals(JsLoadProcessor.JSLOAD_ONLOAD_ERROR, 
recorder.getResponseAsString());
     verify();
   }
 
@@ -134,17 +202,18 @@ public class JsServletTest extends Servl
     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.
-        ONLOAD_PARAM, REFRESH_INTERVAL_SEC);
+        ONLOAD_PARAM, REFRESH_INTERVAL_SEC, UriStatus.VALID_VERSIONED);
 
     
expect(jsUriManagerMock.processExternJsUri(isA(Uri.class))).andReturn(jsUri);
     expect(jsUriManagerMock.makeExternJsUri(isA(JsUri.class)))
-        .andReturn(Uri.parse(url + "&jsload=1"));
+        .andReturn(Uri.parse(url));
     httpUtilMock.setCachingHeaders(recorder, 0, false); // TTL of 0 is set.
     replay();
 
     servlet.doGet(request, recorder);
     assertEquals(HttpServletResponse.SC_OK, recorder.getHttpStatusCode());
-    assertEquals(String.format(JsServlet.JSLOAD_JS_TPL, url), 
recorder.getResponseAsString());
+    assertEquals(String.format(JsLoadProcessor.JSLOAD_JS_TPL, url),
+        recorder.getResponseAsString());
     verify();
   }
 }


Reply via email to