Revision: 4503
Author:   [email protected]
Date:     Tue Jun 14 15:54:02 2011
Log:      Modify RenderContext to allow easy subclassing.
http://codereview.appspot.com/4610043



[email protected]

http://code.google.com/p/google-caja/source/detail?r=4503

Modified:
/trunk/src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java
 /trunk/src/com/google/caja/parser/html/Dom.java
 /trunk/src/com/google/caja/parser/js/CajoledModule.java
 /trunk/src/com/google/caja/reporting/RenderContext.java
 /trunk/tests/com/google/caja/plugin/BrowserTestCase.java

=======================================
--- /trunk/src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java Mon Jun 6 16:07:54 2011 +++ /trunk/src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java Tue Jun 14 15:54:02 2011
@@ -19,7 +19,6 @@
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.net.URLConnection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -136,13 +135,13 @@

     Map<InputSource, ? extends CharSequence> originalSources
= Collections.singletonMap(new InputSource(guessURI(base, url)), input);
-
+
     PluginMeta meta = new PluginMeta(fetcher, null);
     meta.setEnableES53(es53Mode);
     PluginCompiler compiler = makePluginCompiler(meta, mq);
     compiler.setJobCache(new AppEngineJobCache());
     compiler.setMessageContext(mc);
-
+
     URI uri = guessURI(base, url);
     InputSource is = new InputSource(uri);
     CharProducer cp = CharProducer.Factory.fromString(input, is);
@@ -156,17 +155,17 @@
       mq.addMessage(e.getCajaMessage());
       okToContinue = false;
     }
-
+
     if (okToContinue && inputNode != null) {
       compiler.addInput(inputNode, uri);
       okToContinue &= compiler.run();
     }
-
+
     outputJs = okToContinue ? compiler.getJavascript() : null;
     outputHtml = okToContinue ? compiler.getStaticHtml() : null;
-
+
     String[] messages = formatMessages(originalSources, mc, mq);
-
+
     StringBuilder jsOut = new StringBuilder();
     TokenConsumer renderer = new JsPrettyPrinter(new Concatenator(jsOut));
     RenderContext rc = new RenderContext(renderer)
=======================================
--- /trunk/src/com/google/caja/parser/html/Dom.java     Fri Apr  8 23:31:20 2011
+++ /trunk/src/com/google/caja/parser/html/Dom.java     Tue Jun 14 15:54:02 2011
@@ -25,14 +25,13 @@
 import com.google.caja.util.Callback;

 import java.io.IOException;
-import java.io.Serializable;

 import org.w3c.dom.Node;

 /**
  * A parse tree wrapper for an org.w3c.DOM node.
  */
-public final class Dom extends AbstractParseTreeNode implements Serializable {
+public final class Dom extends AbstractParseTreeNode {
   private static final long serialVersionUID = -5111504015682453850L;
   private final Node n;

=======================================
--- /trunk/src/com/google/caja/parser/js/CajoledModule.java Fri Apr 8 23:31:20 2011 +++ /trunk/src/com/google/caja/parser/js/CajoledModule.java Tue Jun 14 15:54:02 2011
@@ -30,7 +30,6 @@
 import com.google.javascript.jscomp.jsonml.JsonML;

 import java.io.IOException;
-import java.io.Serializable;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Collections;
@@ -48,9 +47,9 @@
  * @author [email protected]
  */
 public final class CajoledModule extends AbstractParseTreeNode
-    implements JsonMLCompatible, Serializable {
+    implements JsonMLCompatible {
   private static final long serialVersionUID = -2499144011243193616L;
-
+
// A stub file name by which to call the (otherwise anonymous) cajoled output.
   private static final InputSource CAJOLED_OUTPUT_FILE_NAME =
       new InputSource(URI.create("file:///CAJOLED-OUTPUT"));
=======================================
--- /trunk/src/com/google/caja/reporting/RenderContext.java Tue Aug 10 14:40:28 2010 +++ /trunk/src/com/google/caja/reporting/RenderContext.java Tue Jun 14 15:54:02 2011
@@ -41,7 +41,7 @@
     this(true, false, false, MarkupRenderMode.HTML, false, out);
   }

-  private RenderContext(
+  protected RenderContext(
       boolean asciiOnly, boolean embeddable, boolean json,
       MarkupRenderMode markupMode, boolean rawObjKeys, TokenConsumer out) {
     if (null == out) { throw new NullPointerException(); }
@@ -69,27 +69,43 @@
   public final MarkupRenderMode markupRenderMode() { return markupMode; }
   public final boolean rawObjKeys() { return rawObjKeys; }
   public final TokenConsumer getOut() { return out; }
+
+ /** Must be overridden by subclasses to return an instance of the subclass. */
+  protected RenderContext derive(
+      boolean asciiOnly, boolean embeddable, boolean json,
+      MarkupRenderMode markupMode, boolean rawObjKeys) {
+    return new RenderContext(
+        asciiOnly, embeddable, json, markupMode, rawObjKeys, out);
+  }
+
+  private RenderContext deriveChecked(
+      boolean asciiOnly, boolean embeddable, boolean json,
+      MarkupRenderMode markupMode, boolean rawObjKeys) {
+    RenderContext derived = derive(
+        asciiOnly, embeddable, json, markupMode, rawObjKeys);
+    // Enforce that derive has been overridden.
+    assert derived.getClass() == getClass();
+    return derived;
+  }

   public RenderContext withAsciiOnly(boolean b) {
     return b != asciiOnly
- ? new RenderContext(b, embeddable, json, markupMode, rawObjKeys, out)
+        ? deriveChecked(b, embeddable, json, markupMode, rawObjKeys)
         : this;
   }
   public RenderContext withEmbeddable(boolean b) {
     return b != embeddable
- ? new RenderContext(asciiOnly, b, json, markupMode, rawObjKeys, out)
+        ? deriveChecked(asciiOnly, b, json, markupMode, rawObjKeys)
         : this;
   }
   public RenderContext withJson(boolean b) {
     return b != json
-        ? new RenderContext(
-            asciiOnly, embeddable, b, markupMode, rawObjKeys, out)
+        ? deriveChecked(asciiOnly, embeddable, b, markupMode, rawObjKeys)
         : this;
   }
   public RenderContext withMarkupRenderMode(MarkupRenderMode markupMode) {
     return markupMode != this.markupMode
-        ? new RenderContext(
-            asciiOnly, embeddable, json, markupMode, rawObjKeys, out)
+ ? deriveChecked(asciiOnly, embeddable, json, markupMode, rawObjKeys)
         : this;
   }
   @Deprecated
@@ -99,7 +115,7 @@
   }
   public RenderContext withRawObjKeys(boolean b) {
     return b != this.rawObjKeys
- ? new RenderContext(asciiOnly, embeddable, json, markupMode, b, out)
+        ? deriveChecked(asciiOnly, embeddable, json, markupMode, b)
         : this;
   }
 }
=======================================
--- /trunk/tests/com/google/caja/plugin/BrowserTestCase.java Thu Apr 14 16:53:55 2011 +++ /trunk/tests/com/google/caja/plugin/BrowserTestCase.java Tue Jun 14 15:54:02 2011
@@ -264,7 +264,9 @@
    *
    * @param servlets a Jetty Context to which servlets can be added.
    */
-  protected void addServlets(Context servlets) { }
+  protected void addServlets(Context servlets) {
+    // Adds none but may be overridden.
+  }

   public interface Check {
     boolean run();

Reply via email to