You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by mh...@apache.org on 2011/05/03 04:07:27 UTC

svn commit: r1098892 - in /shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java

Author: mhermanto
Date: Tue May  3 02:07:27 2011
New Revision: 1098892

URL: http://svn.apache.org/viewvc?rev=1098892&view=rev
Log:
Expand externs as needed.
http://codereview.appspot.com/4444086/

Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java?rev=1098892&r1=1098891&r2=1098892&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/JsResponseBuilder.java Tue May  3 02:07:27 2011
@@ -18,10 +18,11 @@
 
 package org.apache.shindig.gadgets.js;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 import java.util.List;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -36,15 +37,17 @@ public class JsResponseBuilder {
   private int statusCode;
   private int cacheTtlSecs;
   private boolean proxyCacheable;
-  private final StringBuilder externs;
-
+  private final StringBuilder rawExterns;
+  private final List<String> externs;
+  
   public JsResponseBuilder() {
     jsCode = Lists.newLinkedList();
     statusCode = HttpServletResponse.SC_OK;
     cacheTtlSecs = 0;
     proxyCacheable = false;
     errors = Lists.newLinkedList();
-    externs = new StringBuilder();
+    rawExterns = new StringBuilder();
+    externs = Lists.newLinkedList();
   }
 
   public JsResponseBuilder(JsResponse response) {
@@ -56,7 +59,7 @@ public class JsResponseBuilder {
       errors.addAll(Lists.newArrayList(response.getErrors()));
     }
     if (response.getExterns() != null) {
-      externs.append(response.getExterns());
+      rawExterns.append(response.getExterns());
     }
     statusCode = response.getStatusCode();
     cacheTtlSecs = response.getCacheTtlSecs();
@@ -187,7 +190,7 @@ public class JsResponseBuilder {
    * Appends a blob of raw extern.
    */
   public JsResponseBuilder appendRawExtern(String rawExtern) {
-    this.externs.append(rawExtern).append(EXTERN_DELIM);
+    this.rawExterns.append(rawExtern).append(EXTERN_DELIM);
     return this;
   }
 
@@ -195,9 +198,7 @@ public class JsResponseBuilder {
    * Appends a line of extern.
    */
   public JsResponseBuilder appendExtern(String extern) {
-    this.externs
-        .append((extern.indexOf(".") <= 0) ? ("var " + extern) : extern)
-        .append(" = {}").append(EXTERN_DELIM);
+    this.externs.add(extern);
     return this;
   }
 
@@ -215,8 +216,9 @@ public class JsResponseBuilder {
    * Deletes all externs in the builder.
    */
   public JsResponseBuilder clearExterns() {
-    int last = externs.length();
-    this.externs.delete(0, last);
+    int last = rawExterns.length();
+    this.rawExterns.delete(0, last);
+    this.externs.clear();
     return this;
   }
 
@@ -225,6 +227,32 @@ public class JsResponseBuilder {
    */
   public JsResponse build() {
     return new JsResponse(jsCode, statusCode, cacheTtlSecs, proxyCacheable,
-        errors, externs.toString());
+        errors, rawExterns.toString() + buildExternString());
+  }
+
+  private String buildExternString() {
+    StringBuilder builder = new StringBuilder();
+    Set<String> set = Sets.newHashSet();
+    for (String ext : externs) {
+      List<String> expandedList = expand(ext);
+      for (String exp : expandedList) {
+        if (set.contains(exp)) continue;
+        if (exp.endsWith(".prototype")) continue;
+        if (exp.indexOf(".") < 0) builder.append("var ");
+        builder.append(exp).append(" = {}").append(EXTERN_DELIM);
+        set.add(exp);
+      }
+    }
+    return builder.toString();
+  }
+
+  private List<String> expand(String value) {
+    List<String> result = Lists.newArrayList();
+    StringBuilder cur = new StringBuilder();
+    for (String part : value.split("\\.")) {
+      cur.append(cur.length() > 0 ? "." : "").append(part);
+      result.add(cur.toString());
+    }
+    return result;
   }
-}
\ No newline at end of file
+}

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java?rev=1098892&r1=1098891&r2=1098892&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/JsResponseBuilderTest.java Tue May  3 02:07:27 2011
@@ -34,9 +34,19 @@ public class JsResponseBuilderTest {
 
   @Test
   public void testExterns() throws Exception {
-    builder.appendExtern("a");
-    builder.appendExtern("a.b");
-    assertEquals("var a = {};\na.b = {};\n", builder.build().getExterns());
+    builder.appendExtern("b");
+    builder.appendExtern("b");
+    builder.appendExtern("c.d");
+    builder.appendExtern("c.d");
+    builder.appendExtern("e.prototype.f");
+    builder.appendExtern("e.prototype.f");
+    builder.appendRawExtern("var a");
+    String eee = builder.build().getExterns();
+    assertEquals(
+        "var a;\n" +
+        "var b = {};\n" +
+        "var c = {};\nc.d = {};\n" +
+        "var e = {};\ne.prototype.f = {};\n",
+        builder.build().getExterns());
   }
-
 }