Author: mhermanto
Date: Wed Apr 27 07:39:49 2011
New Revision: 1097023

URL: http://svn.apache.org/viewvc?rev=1097023&view=rev
Log:
JsCompiler.compile() no longers throws JsException ... in favor of JsResponse 
built-in http return code and extensible error messages.
http://codereview.appspot.com/4430068/

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/CompilationProcessor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponse.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/js/JsCompiler.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

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=1097023&r1=1097022&r2=1097023&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
 Wed Apr 27 07:39:49 2011
@@ -36,9 +36,10 @@ public class CompilationProcessor implem
    * TODO: Re-add support for externs here if they're ever used.
    * TODO: Convert JsCompiler to take JsResponseBuilder directly rather than 
Iterable<JsContent>
    */
-  public boolean process(JsRequest request, JsResponseBuilder builder)
-      throws JsException {
-    Iterable<JsContent> jsContents = builder.build().getAllJsContent();
+  public boolean process(JsRequest request, JsResponseBuilder builder) throws 
JsException {
+    JsResponse responseSoFar = builder.build();
+    
+    Iterable<JsContent> jsContents = responseSoFar.getAllJsContent();
     for (JsContent jsc : jsContents) {
       FeatureBundle bundle = jsc.getFeatureBundle();
       if (bundle != null) {
@@ -47,8 +48,11 @@ public class CompilationProcessor implem
     }
 
     JsResponse result = compiler.compile(request.getJsUri(), jsContents,
-        builder.build().getExterns());
+        responseSoFar.getExterns());
+    
     builder.clearJs().appendAllJs(result.getAllJsContent());
+    builder.setStatusCode(result.getStatusCode());
+    builder.addErrors(result.getErrors());
     return true;
   }
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponse.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponse.java?rev=1097023&r1=1097022&r2=1097023&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponse.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponse.java
 Wed Apr 27 07:39:49 2011
@@ -32,6 +32,7 @@ public class JsResponse {
   private final int statusCode;
   private final boolean proxyCacheable;
   private String codeString;
+  private String errorString;
 
   JsResponse(List<JsContent> jsCode, int statusCode, int cacheTtlSecs,
       boolean proxyCacheable, List<String> errors, String externs) {
@@ -100,7 +101,21 @@ public class JsResponse {
   public List<String> getErrors() {
     return errors;
   }
-
+  
+  /**
+   * Returns a string of all error messages associated with this response.
+   */
+  public String toErrorString() {
+    if (errorString == null) {
+      StringBuilder sb = new StringBuilder();
+      for (String error : getErrors()) {
+        sb.append(error);
+      }
+      errorString = sb.toString();
+    }
+    return errorString;
+  }
+  
   /**
    * Returns a string of generated externs.
    */

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/js/JsCompiler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/js/JsCompiler.java?rev=1097023&r1=1097022&r2=1097023&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/js/JsCompiler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/js/JsCompiler.java
 Wed Apr 27 07:39:49 2011
@@ -21,12 +21,9 @@ import com.google.inject.ImplementedBy;
 
 import org.apache.shindig.gadgets.features.FeatureRegistry.FeatureBundle;
 import org.apache.shindig.gadgets.js.JsContent;
-import org.apache.shindig.gadgets.js.JsException;
 import org.apache.shindig.gadgets.js.JsResponse;
 import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
 
-import java.util.List;
-
 /**
  * Compiler to pre-process each feature independently and compile a
  * concatenation of pre-processed data.
@@ -49,6 +46,5 @@ public interface JsCompiler {
    * @param externs The externs.
    * @return A compilation result object.
    */
-  JsResponse compile(JsUri jsUri, Iterable<JsContent> content, String externs)
-      throws JsException;
+  JsResponse compile(JsUri jsUri, Iterable<JsContent> content, String externs);
 }

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=1097023&r1=1097022&r2=1097023&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
 Wed Apr 27 07:39:49 2011
@@ -113,8 +113,7 @@ public class ClosureJsCompiler implement
     return new Compiler(errorManager);
   }
 
-  public JsResponse compile(JsUri jsUri, Iterable<JsContent> content, String 
externs) 
-      throws JsException {
+  public JsResponse compile(JsUri jsUri, Iterable<JsContent> content, String 
externs) {
     JsResponse exportResponse = defaultCompiler.compile(jsUri, content, 
externs);
     content = exportResponse.getAllJsContent();
 
@@ -147,13 +146,12 @@ public class ClosureJsCompiler implement
       if (actualCompiler.hasErrors()) {
         ImmutableList.Builder<String> errors = ImmutableList.builder();
         for (JSError error : actualCompiler.getErrors()) {
-          errors.add(error.toString());
+          errors.add(error.toString()); 
         }
-        builder.setStatusCode(HttpResponse.SC_NOT_FOUND)
-            .addErrors(errors.build()).build();
-        JsResponse errorResult = builder.build();
-        cache.addElement(cacheKey, errorResult);
-        return errorResult;
+        return cacheAndReturnErrorResult(
+            builder, cacheKey,
+            HttpResponse.SC_NOT_FOUND,
+            errors.build());
       }
 
       String compiled = actualCompiler.toSource();
@@ -161,8 +159,15 @@ public class ClosureJsCompiler implement
         // Emit code correlated w/ original source.
         // This operation is equivalent in final code to bundled-output,
         // but is less efficient and should perhaps only be used in code 
profiling.
-        SourceMappings sm = processSourceMap(result, allContent);      
-        builder.appendAllJs(sm.mapCompiled(compiled));
+        SourceMappings sm = processSourceMap(result, allContent);
+        if (sm != null) {
+          builder.appendAllJs(sm.mapCompiled(compiled));
+        } else {
+          return cacheAndReturnErrorResult(
+              builder, cacheKey,
+              HttpResponse.SC_INTERNAL_SERVER_ERROR,
+              Lists.newArrayList("Parse error for source map"));
+        }
       } else {
         builder.appendJs(compiled, "[compiled]");
       }
@@ -178,6 +183,16 @@ public class ClosureJsCompiler implement
     return lastResult;
   }
   
+  private JsResponse cacheAndReturnErrorResult(
+      JsResponseBuilder builder, String cacheKey,
+      int statusCode, List<String> messages) {
+    builder.setStatusCode(statusCode);
+    builder.addErrors(messages);
+    JsResponse result = builder.build(); 
+    cache.addElement(cacheKey, result);
+    return result;
+  }
+  
   // Override this method to return "true" for cases where individual chunks of
   // compiled JS should be emitted as JsContent objects, each correlating 
output JS
   // with the original source file from which they came.
@@ -265,15 +280,15 @@ public class ClosureJsCompiler implement
    * @param allInputs All inputs supplied to the compiler, in JsContent form.
    * @return SourceMappings object correlating compiled with originating input.
    */
-  private SourceMappings processSourceMap(Result result, List<JsContent> 
allInputs) 
-      throws JsException {
+  private SourceMappings processSourceMap(Result result, List<JsContent> 
allInputs) {
     StringBuilder sb = new StringBuilder();
     try {
       result.sourceMap.appendTo(sb, "done");
       return SourceMappings.parseV1(sb.toString(), allInputs);
-    } catch (Exception e) {
-      throw new JsException(HttpResponse.SC_INTERNAL_SERVER_ERROR,
-          "Parse error for source map: " + e);
+    } catch (IOException e) {
+      return null;
+    } catch (JSONException e) {
+      return null;
     }
   }
   

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=1097023&r1=1097022&r2=1097023&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
 Wed Apr 27 07:39:49 2011
@@ -86,21 +86,6 @@ public class CompilationProcessorTest {
     assertFalse(outIterator.hasNext());
   }
 
-  @Test(expected = JsException.class)
-  public void compilerExceptionThrows() throws Exception {
-    JsUri jsUri = control.createMock(JsUri.class);
-    JsResponseBuilder builder =
-        new JsResponseBuilder().setCacheTtlSecs(1234).setStatusCode(200)
-          .appendJs("content1:", "source1").appendJs("content2", "source2");
-    JsRequest request = control.createMock(JsRequest.class);
-    expect(request.getJsUri()).andReturn(jsUri);
-    List<String> emptyList = ImmutableList.of();
-    expect(compiler.compile(same(jsUri), 
eq(builder.build().getAllJsContent()), eq("")))
-        .andThrow(new JsException(400, "foo"));
-    control.replay();
-    processor.process(request, builder);
-  }
-
   private FeatureBundle mockBundle(String... externs) {
     FeatureBundle result = createMock(FeatureBundle.class);
     expect(result.getApis(ApiDirective.Type.JS, false)).andReturn(


Reply via email to