Revision: 4172
Author: mikesamuel
Date: Mon Jul 12 16:56:22 2010
Log: Cleanup Jobs and AncestorChains.
http://codereview.appspot.com/1684042

Gets rid of unneeded complexity in AncestorChains and replaces
AncestorChains with ParseTreeNodes as the roots of jobs to make
jobs easier to cache.

[email protected]

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

Modified:
 /trunk/src/com/google/caja/opensocial/DefaultGadgetRewriter.java
 /trunk/src/com/google/caja/parser/AncestorChain.java
 /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java
 /trunk/src/com/google/caja/plugin/Job.java
 /trunk/src/com/google/caja/plugin/PluginCompiler.java
 /trunk/src/com/google/caja/plugin/PluginCompilerMain.java
 /trunk/src/com/google/caja/plugin/stages/CompileHtmlStage.java
 /trunk/src/com/google/caja/plugin/stages/ConsolidateCodeStage.java
 /trunk/src/com/google/caja/plugin/stages/DebuggingSymbolsStage.java
 /trunk/src/com/google/caja/plugin/stages/HtmlToBundleStage.java
 /trunk/src/com/google/caja/plugin/stages/HtmlToJsStage.java
 /trunk/src/com/google/caja/plugin/stages/InferFilePositionsStage.java
 /trunk/src/com/google/caja/plugin/stages/InlineCssImportsStage.java
 /trunk/src/com/google/caja/plugin/stages/JobCache.java
 /trunk/src/com/google/caja/plugin/stages/LegacyNamespaceFixupStage.java
 /trunk/src/com/google/caja/plugin/stages/OpenTemplateStage.java
 /trunk/src/com/google/caja/plugin/stages/ResolveUriStage.java
 /trunk/src/com/google/caja/plugin/stages/RewriteCssStage.java
 /trunk/src/com/google/caja/plugin/stages/RewriteHtmlStage.java
 /trunk/src/com/google/caja/plugin/stages/SanitizeHtmlStage.java
 /trunk/src/com/google/caja/plugin/stages/ValidateCssStage.java
 /trunk/src/com/google/caja/plugin/stages/ValidateJavascriptStage.java
 /trunk/src/com/google/caja/service/HtmlHandler.java
 /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkRunner.java
 /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkSize.java
 /trunk/tests/com/google/caja/parser/js/ParserTest.java
 /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java
 /trunk/tests/com/google/caja/plugin/stages/DebuggingSymbolsStageTest.java
/trunk/tests/com/google/caja/plugin/stages/LegacyNamespaceFixupStageTest.java
 /trunk/tests/com/google/caja/plugin/stages/OpenTemplateStageTest.java
 /trunk/tests/com/google/caja/plugin/stages/PipelineStageTestCase.java
 /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java

=======================================
--- /trunk/src/com/google/caja/opensocial/DefaultGadgetRewriter.java Tue Jun 1 16:47:13 2010 +++ /trunk/src/com/google/caja/opensocial/DefaultGadgetRewriter.java Mon Jul 12 16:56:22 2010
@@ -22,7 +22,6 @@
 import com.google.caja.lexer.InputSource;
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.TokenConsumer;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.DomParser;
 import com.google.caja.parser.html.Namespaces;
@@ -217,7 +216,7 @@
     compiler.setPreconditions(preconditions);
     compiler.setGoals(goals);

-    compiler.addInput(AncestorChain.instance(new Dom(content)), baseUri);
+    compiler.addInput(new Dom(content), baseUri);

     if (!compiler.run()) {
       throw new GadgetRewriteException("Gadget has compile errors");
=======================================
--- /trunk/src/com/google/caja/parser/AncestorChain.java Thu Oct 15 15:42:13 2009 +++ /trunk/src/com/google/caja/parser/AncestorChain.java Mon Jul 12 16:56:22 2010
@@ -33,36 +33,6 @@
   public <C extends ParseTreeNode> AncestorChain<C> child(C child) {
     return instance(this, child);
   }
-
- /** True if node is the first in its parent's child list, or is the root. */
-  public boolean isFirstSibling() {
-    return parent == null || parent.node.children().get(0) == node;
-  }
-
- /** True if node is the last in its parent's child list, or is the root. */
-  public boolean isLastSibling() {
-    return parent == null || parent.node.children().get(
-        parent.node.children().size() - 1) == node;
-  }
-
-  /** The previous sibling of parent or null. */
-  public ParseTreeNode getPrevSibling() {
-    int idx = indexInParent() - 1;
-    if (idx < 0) { return null; }
-    return parent.node.children().get(idx);
-  }
-
-  /** The next sibling of parent or null. */
-  public ParseTreeNode getNextSibling() {
-    int idx = indexInParent() + 1;
-    if (idx <= 0 || idx >= parent.node.children().size()) { return null; }
-    return parent.node.children().get(idx);
-  }
-
-  /** The index such that if node in its parent's children list or -1. */
-  public int indexInParent() {
-    return parent == null ? -1 : parent.node.children().indexOf(node);
-  }

   public ParseTreeNode getParentNode() {
     return parent != null ? parent.node : null;
=======================================
--- /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java Tue Jun 15 20:33:47 2010 +++ /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java Mon Jul 12 16:56:22 2010
@@ -24,7 +24,6 @@
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.TokenConsumer;
 import com.google.caja.lexer.escaping.UriUtil;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.html.DomParser;
 import com.google.caja.parser.html.Namespaces;
@@ -169,8 +168,7 @@
       for (File f : inputs) {
         try {
           URI fileUri = f.getCanonicalFile().toURI();
-          AncestorChain<?> parsedInput = parseInput(
-              new InputSource(fileUri), mq);
+ ParseTreeNode parsedInput = parseInput(new InputSource(fileUri), mq);
           if (parsedInput == null) {
             passed = false;
           } else {
@@ -195,10 +193,10 @@
           if (f.getName().endsWith(".env.json")) {
             loadEnvJsonFile(f, optimizer, mq);
           } else {
-            AncestorChain<?> parsedInput = parseInput(
+            ParseTreeNode parsedInput = parseInput(
                 new InputSource(f.getCanonicalFile().toURI()), mq);
             if (parsedInput != null) {
-              optimizer.addInput(parsedInput.cast(Statement.class).node);
+              optimizer.addInput((Statement) parsedInput);
             }
           }
         } catch (IOException ex) {
@@ -308,14 +306,11 @@
     return content;
   }

-  private AncestorChain<?> parseInput(InputSource is, MessageQueue mq)
+  private ParseTreeNode parseInput(InputSource is, MessageQueue mq)
       throws IOException {
-    CharProducer cp = CharProducer.Factory.fromString(
-        getSourceContent(is), is);
+ CharProducer cp = CharProducer.Factory.fromString(getSourceContent(is), is);
     try {
-      ParseTreeNode input = PluginCompilerMain.parseInput(is, cp, mq);
-      if (input == null) { return null; }
-      return AncestorChain.instance(input);
+      return PluginCompilerMain.parseInput(is, cp, mq);
     } catch (ParseException ex) {
       ex.toMessageQueue(mq);
       return null;
=======================================
--- /trunk/src/com/google/caja/plugin/Job.java  Thu Feb 25 15:55:35 2010
+++ /trunk/src/com/google/caja/plugin/Job.java  Mon Jul 12 16:56:22 2010
@@ -15,7 +15,6 @@
 package com.google.caja.plugin;

 import com.google.caja.SomethingWidgyHappenedError;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.css.CssTree;
 import com.google.caja.parser.html.Dom;
@@ -32,15 +31,14 @@
  * A parse tree that is awaiting rewriting, compiling, or rendering.
  */
 public final class Job {
-  private final AncestorChain<?> root;
+  private final ParseTreeNode root;
   private final ContentType type;
   private final URI baseUri;
   private final JobCache.Keys keys;

   public static Job job(
-      JobCache.Keys keys, AncestorChain<?> root, URI baseUri) {
+      JobCache.Keys keys, ParseTreeNode rootNode, URI baseUri) {
     ContentType type;
-    ParseTreeNode rootNode = root.node;
     if (rootNode instanceof Statement
         || rootNode instanceof Expression
         || rootNode instanceof UncajoledModule
@@ -55,47 +53,39 @@
     } else {
throw new SomethingWidgyHappenedError("Unknown input type " + rootNode);
     }
-    return new Job(keys, root, type, baseUri);
+    return new Job(keys, rootNode, type, baseUri);
   }

-  public static Job jsJob(
-      JobCache.Keys keys, AncestorChain<? extends Statement> root,
-      URI baseUri) {
+ public static Job jsJob(JobCache.Keys keys, Statement root, URI baseUri) {
     return new Job(keys, root, ContentType.JS, baseUri);
   }

-  public static Job exprJob(
-      JobCache.Keys keys, AncestorChain<? extends Expression> root,
-      URI baseUri) {
+ public static Job exprJob(JobCache.Keys keys, Expression root, URI baseUri) {
     return new Job(keys, root, ContentType.JS, baseUri);
   }

   public static Job moduleJob(
-      JobCache.Keys keys, AncestorChain<? extends UncajoledModule> root,
-      URI baseUri) {
+      JobCache.Keys keys, UncajoledModule root, URI baseUri) {
     return new Job(keys, root, ContentType.JS, baseUri);
   }

-  public static Job cajoledJob(
-      JobCache.Keys keys, AncestorChain<? extends CajoledModule> root) {
+  public static Job cajoledJob(JobCache.Keys keys, CajoledModule root) {
     return new Job(keys, root, ContentType.JS, null);
   }

-  public static Job domJob(
-      JobCache.Keys keys, AncestorChain<? extends Dom> root, URI baseUri) {
+  public static Job domJob(JobCache.Keys keys, Dom root, URI baseUri) {
     assert baseUri != null;
     return new Job(keys, root, ContentType.HTML, baseUri);
   }

   public static Job cssJob(
-      JobCache.Keys keys, AncestorChain<? extends CssTree.StyleSheet> root,
-      URI baseUri) {
+      JobCache.Keys keys, CssTree.StyleSheet root, URI baseUri) {
     assert baseUri != null;
     return new Job(keys, root, ContentType.CSS, baseUri);
   }

   private Job(
-      JobCache.Keys keys, AncestorChain<?> root, ContentType type,
+      JobCache.Keys keys, ParseTreeNode root, ContentType type,
       URI baseUri) {
     assert root != null;
     this.root = root;
@@ -104,7 +94,7 @@
     this.keys = keys == null ? JobCache.none() : keys;
   }

-  public AncestorChain<?> getRoot() { return root; }
+  public ParseTreeNode getRoot() { return root; }

   public ContentType getType() { return type; }

=======================================
--- /trunk/src/com/google/caja/plugin/PluginCompiler.java Fri Jun 11 11:02:06 2010 +++ /trunk/src/com/google/caja/plugin/PluginCompiler.java Mon Jul 12 16:56:22 2010
@@ -96,10 +96,14 @@
     this.compilationPipeline = null;
   }

-  public void addInput(AncestorChain<?> input, URI baseUri) {
+  public void addInput(ParseTreeNode input, URI baseUri) {
     jobs.getJobs().add(Job.job(null, input, baseUri));
-    jobs.getMessageContext().addInputSource(
-        input.node.getFilePosition().source());
+ jobs.getMessageContext().addInputSource(input.getFilePosition().source());
+  }
+
+  @Deprecated
+  public void addInput(AncestorChain<?> input, URI baseUri) {
+    addInput(input.node, baseUri);
   }

   @Deprecated
@@ -159,7 +163,7 @@
           }
         });
     return soleHtmlJob != null
-        ? soleHtmlJob.getRoot().cast(Dom.class).node.getValue() : null;
+        ? ((Dom) soleHtmlJob.getRoot()).getValue() : null;
   }

   /**
@@ -173,7 +177,7 @@
             return job.getType() == ContentType.JS;
           }
         });
- return soleJsJob != null ? (CajoledModule) soleJsJob.getRoot().node : null;
+    return soleJsJob != null ? (CajoledModule) soleJsJob.getRoot() : null;
   }

   private Job getConsolidatedOutput(Criterion<Job> filter) {
=======================================
--- /trunk/src/com/google/caja/plugin/PluginCompilerMain.java Thu Jun 17 11:19:37 2010 +++ /trunk/src/com/google/caja/plugin/PluginCompilerMain.java Mon Jul 12 16:56:22 2010
@@ -24,7 +24,6 @@
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.TokenConsumer;
 import com.google.caja.lexer.TokenQueue;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.css.CssParser;
 import com.google.caja.parser.html.Dom;
@@ -177,9 +176,7 @@
     for (URI input : inputs) {
       try {
         ParseTreeNode parseTree = parseInput(input);
-        if (null != parseTree) {
-          pluginc.addInput(AncestorChain.instance(parseTree), input);
-        }
+        if (null != parseTree) { pluginc.addInput(parseTree, input); }
       } catch (ParseException ex) {
         ex.toMessageQueue(mq);
         parsePassed = false;
=======================================
--- /trunk/src/com/google/caja/plugin/stages/CompileHtmlStage.java Thu Feb 25 15:55:35 2010 +++ /trunk/src/com/google/caja/plugin/stages/CompileHtmlStage.java Mon Jul 12 16:56:22 2010
@@ -17,7 +17,7 @@
 import com.google.caja.SomethingWidgyHappenedError;
 import com.google.caja.lang.css.CssSchema;
 import com.google.caja.lang.html.HtmlSchema;
-import com.google.caja.parser.AncestorChain;
+import com.google.caja.lexer.InputSource;
 import com.google.caja.parser.css.CssTree;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.DomParser;
@@ -70,6 +70,7 @@
     }

     for (JobCache.Keys cacheKeys : byKey.keySet()) {
+      URI baseUri = null;
       List<Pair<Node, URI>> ihtmlRoots = Lists.newArrayList();
       List<CssTree.StyleSheet> stylesheets = Lists.newArrayList();
       for (Job job : byKey.get(cacheKeys)) {
@@ -81,15 +82,16 @@
// maintain this behavior, regardless of whatever complexity that
             // might entail.
             ihtmlRoots.add(Pair.pair(
-                job.getRoot().cast(Dom.class).node.getValue(),
-                job.getBaseUri()));
+                ((Dom) job.getRoot()).getValue(), job.getBaseUri()));
+            if (baseUri == null) { baseUri = job.getBaseUri(); }
             break;
           case CSS:
- stylesheets.add(job.getRoot().cast(CssTree.StyleSheet.class).node);
+            stylesheets.add((CssTree.StyleSheet) job.getRoot());
             break;
default: throw new SomethingWidgyHappenedError(job.getType().name());
         }
       }
+      if (baseUri == null) { baseUri = InputSource.UNKNOWN.getUri(); }

       MessageQueue mq = jobs.getMessageQueue();

@@ -101,19 +103,16 @@
       Pair<Node, List<Block>> htmlAndJs = tc.getSafeHtml(
           DomParser.makeDocument(null, null));

-      Job outJob = makeJobFromHtml(cacheKeys, htmlAndJs.a);
+      Job outJob = makeJobFromHtml(cacheKeys, htmlAndJs.a, baseUri);
       jobs.getJobs().add(outJob);

       for (Block bl : htmlAndJs.b) {
-        jobs.getJobs().add(Job.jsJob(
-            cacheKeys, AncestorChain.instance(bl),
-            // TODO(mikesamuel): propagate base URI from ihtmlRoot.
-            bl.getFilePosition().source().getUri()));
+        jobs.getJobs().add(Job.jsJob(cacheKeys, bl, baseUri));
       }
     }

     return jobs.hasNoFatalErrors();
   }

-  abstract Job makeJobFromHtml(JobCache.Keys keys, Node html);
-}
+  abstract Job makeJobFromHtml(JobCache.Keys keys, Node html, URI baseUri);
+}
=======================================
--- /trunk/src/com/google/caja/plugin/stages/ConsolidateCodeStage.java Fri Jun 11 11:02:06 2010 +++ /trunk/src/com/google/caja/plugin/stages/ConsolidateCodeStage.java Mon Jul 12 16:56:22 2010
@@ -14,7 +14,6 @@

 package com.google.caja.plugin.stages;

-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.js.CajoledModule;
 import com.google.caja.parser.quasiliteral.CajitaModuleRewriter;
 import com.google.caja.parser.quasiliteral.ModuleManager;
@@ -41,7 +40,7 @@
     List<Job> jsJobs = jobs.getJobsByType(ContentType.JS);
     List<CajoledModule> modules = Lists.newArrayList();
     for (Job job : jsJobs) {
-      CajoledModule module = (CajoledModule) job.getRoot().node;
+      CajoledModule module = (CajoledModule) job.getRoot();
       if (module.getSrc() == null) {
         // Is top level.  Not a loaded module from ValidateJavaScriptStage.
         modules.add(module);
@@ -49,8 +48,7 @@
     }
     jobs.getJobs().removeAll(jsJobs);
     CajitaModuleRewriter rw = new CajitaModuleRewriter(mgr);
-    jobs.getJobs().add(Job.cajoledJob(
-        null, AncestorChain.instance(rw.rewrite(modules))));
+    jobs.getJobs().add(Job.cajoledJob(null, rw.rewrite(modules)));
     return jobs.hasNoFatalErrors();
   }
 }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/DebuggingSymbolsStage.java Mon Feb 22 08:26:46 2010 +++ /trunk/src/com/google/caja/plugin/stages/DebuggingSymbolsStage.java Mon Jul 12 16:56:22 2010
@@ -15,7 +15,6 @@
 package com.google.caja.plugin.stages;

 import com.google.caja.lexer.FilePosition;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.ParseTreeNodeContainer;
 import com.google.caja.parser.js.CajoledModule;
@@ -74,27 +73,26 @@
       Job job = it.next();
       if (job.getType() != ContentType.JS
           // May occur if the cajita rewriter does not run due to errors.
-          || !(job.getRoot().node instanceof CajoledModule)) {
+          || !(job.getRoot() instanceof CajoledModule)) {
         continue;
       }

       if (DEBUG) {
         System.err.println(
             "\n\nPre\n===\n"
- + (job.getRoot().cast(CajoledModule.class).node.toStringDeep(1))
+            + ((CajoledModule) job.getRoot()).toStringDeep(1)
             + "\n\n");
       }

       DebuggingSymbols symbols = new DebuggingSymbols();
       CajoledModule js = addSymbols(
-          job.getRoot().cast(CajoledModule.class), symbols, mq);
+          (CajoledModule) job.getRoot(), symbols, mq);
       if (!symbols.isEmpty()) {
         if (DEBUG) {
System.err.println("\n\nPost\n===\n" + js.toStringDeep() + "\n\n");
         }
         it.set(Job.cajoledJob(
-            job.getCacheKeys(),
-            AncestorChain.instance(attachSymbols(symbols, js, mq))));
+            job.getCacheKeys(), attachSymbols(symbols, js, mq)));
       }
     }
     return jobs.hasNoFatalErrors();
@@ -108,10 +106,9 @@
    * @return rewritten JS.
    */
   private CajoledModule addSymbols(
-      AncestorChain<CajoledModule> js, DebuggingSymbols symbols,
-      MessageQueue mq) {
+      CajoledModule js, DebuggingSymbols symbols, MessageQueue mq) {
     return (CajoledModule) new CajaRuntimeDebuggingRewriter(symbols, mq)
-        .expand(js.node);
+        .expand(js);
   }

   /**
=======================================
--- /trunk/src/com/google/caja/plugin/stages/HtmlToBundleStage.java Mon Feb 22 08:26:46 2010 +++ /trunk/src/com/google/caja/plugin/stages/HtmlToBundleStage.java Mon Jul 12 16:56:22 2010
@@ -16,11 +16,11 @@

 import com.google.caja.lang.css.CssSchema;
 import com.google.caja.lang.html.HtmlSchema;
-import com.google.caja.lexer.InputSource;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.plugin.Job;

+import java.net.URI;
+
 import org.w3c.dom.Node;

 /**
@@ -35,9 +35,7 @@
   }

   @Override
-  Job makeJobFromHtml(JobCache.Keys cacheKeys, Node html) {
-    return Job.domJob(
-        cacheKeys, AncestorChain.instance(new Dom(html)),
-        InputSource.UNKNOWN.getUri());
+  Job makeJobFromHtml(JobCache.Keys cacheKeys, Node html, URI baseUri) {
+    return Job.domJob(cacheKeys, new Dom(html), baseUri);
   }
 }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/HtmlToJsStage.java Fri Jun 11 11:02:06 2010 +++ /trunk/src/com/google/caja/plugin/stages/HtmlToJsStage.java Mon Jul 12 16:56:22 2010
@@ -18,7 +18,6 @@
 import com.google.caja.lang.html.HtmlSchema;
 import com.google.caja.lexer.FilePosition;
 import com.google.caja.lexer.TokenConsumer;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.Nodes;
 import com.google.caja.parser.js.Block;
 import com.google.caja.parser.js.Expression;
@@ -31,6 +30,8 @@
 import com.google.caja.render.Concatenator;
 import com.google.caja.reporting.RenderContext;

+import java.net.URI;
+
 import org.w3c.dom.Node;

 import java.util.Collections;
@@ -47,9 +48,8 @@
   }

   @Override
-  Job makeJobFromHtml(JobCache.Keys keys, Node html) {
-    return Job.jsJob(
-        keys, AncestorChain.instance(makeEmitStaticStmt(html)), null);
+  Job makeJobFromHtml(JobCache.Keys keys, Node html, URI baseUri) {
+    return Job.jsJob(keys, makeEmitStaticStmt(html), baseUri);
   }

   private static Statement makeEmitStaticStmt(Node node) {
=======================================
--- /trunk/src/com/google/caja/plugin/stages/InferFilePositionsStage.java Tue May 19 14:55:02 2009 +++ /trunk/src/com/google/caja/plugin/stages/InferFilePositionsStage.java Mon Jul 12 16:56:22 2010
@@ -50,8 +50,8 @@
 public class InferFilePositionsStage implements Pipeline.Stage<Jobs> {
   public boolean apply(Jobs jobs) {
     for (Job job : jobs.getJobs()) {
-      inferFilePositions(job.getRoot().cast(ParseTreeNode.class).node);
-      inferFilePositions(job.getRoot().cast(ParseTreeNode.class).node);
+      inferFilePositions(job.getRoot());
+      inferFilePositions(job.getRoot());
     }
     return true;
   }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/InlineCssImportsStage.java Mon Jul 12 13:39:16 2010 +++ /trunk/src/com/google/caja/plugin/stages/InlineCssImportsStage.java Mon Jul 12 16:56:22 2010
@@ -86,7 +86,7 @@
 public class InlineCssImportsStage implements Pipeline.Stage<Jobs> {
   public boolean apply(Jobs jobs) {
     for (Job job : jobs.getJobsByType(ContentType.CSS)) {
-      inlineImports(job.getRoot().cast(CssTree.StyleSheet.class).node,
+      inlineImports((CssTree.StyleSheet) job.getRoot(),
                     job.getBaseUri(), MAXIMUM_IMPORT_DEPTH,
                     jobs.getPluginMeta().getUriFetcher(),
                     jobs.getMessageQueue());
=======================================
--- /trunk/src/com/google/caja/plugin/stages/JobCache.java Mon Feb 22 08:26:46 2010 +++ /trunk/src/com/google/caja/plugin/stages/JobCache.java Mon Jul 12 16:56:22 2010
@@ -27,6 +27,10 @@
  */
 public abstract class JobCache {
   public abstract Key forJob(Job j);
+  /**
+ * @return null to indicate nothing in cache which is distinct from the empty
+   *     list.
+   */
   public abstract List<Job> fetch(Key k);
   public abstract void store(Key k, List<Job> derivatives);

=======================================
--- /trunk/src/com/google/caja/plugin/stages/LegacyNamespaceFixupStage.java Mon Feb 22 08:26:46 2010 +++ /trunk/src/com/google/caja/plugin/stages/LegacyNamespaceFixupStage.java Mon Jul 12 16:56:22 2010
@@ -54,7 +54,7 @@
     Fixer(MessageQueue mq) { this.mq = mq; }

     void fix(Job job) {
-      fix(job.getRoot().cast(Dom.class).node.getValue());
+      fix(((Dom) job.getRoot()).getValue());
     }

     private void fix(Node node) {
=======================================
--- /trunk/src/com/google/caja/plugin/stages/OpenTemplateStage.java Tue Dec 29 09:33:01 2009 +++ /trunk/src/com/google/caja/plugin/stages/OpenTemplateStage.java Mon Jul 12 16:56:22 2010
@@ -57,7 +57,7 @@
 public final class OpenTemplateStage implements Pipeline.Stage<Jobs> {
   public boolean apply(Jobs jobs) {
     for (Job job : jobs.getJobsByType(ContentType.JS)) {
-      optimizeOpenTemplate(job.getRoot(), jobs);
+      optimizeOpenTemplate(AncestorChain.instance(job.getRoot()), jobs);
     }
     return jobs.hasNoFatalErrors();
   }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/ResolveUriStage.java Mon Jul 12 13:39:16 2010 +++ /trunk/src/com/google/caja/plugin/stages/ResolveUriStage.java Mon Jul 12 16:56:22 2010
@@ -18,7 +18,6 @@
 import com.google.caja.lang.html.HtmlSchema;
 import com.google.caja.lexer.FilePosition;
 import com.google.caja.lexer.escaping.UriUtil;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.AttribKey;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.ElKey;
@@ -115,13 +114,12 @@
     while (it.hasNext()) {
       Job job = it.next();
       if (job.getType() != ContentType.HTML) { continue; }
-      AncestorChain<Dom> root = job.getRoot().cast(Dom.class);
-      Dom dom = job.getRoot().cast(Dom.class).node;
+      Dom dom = (Dom) job.getRoot();
       Node node = dom.getValue();
       URI baseUri = baseUri(node, job.getBaseUri(), dom.getFilePosition());
       if (baseUri != null) {
         resolveRelativeUrls(node, baseUri, mq);
-        it.set(Job.domJob(job.getCacheKeys(), root, baseUri));
+        it.set(Job.domJob(job.getCacheKeys(), dom, baseUri));
       }
     }
     return true;
=======================================
--- /trunk/src/com/google/caja/plugin/stages/RewriteCssStage.java Tue Dec 29 09:33:01 2009 +++ /trunk/src/com/google/caja/plugin/stages/RewriteCssStage.java Mon Jul 12 16:56:22 2010
@@ -37,7 +37,7 @@
       if (job.getType() != ContentType.CSS) { continue; }

       new CssRuleRewriter(jobs.getPluginMeta()).rewriteCss(
-          job.getRoot().cast(CssTree.StyleSheet.class).node);
+          (CssTree.StyleSheet) job.getRoot());
     }
     return jobs.hasNoFatalErrors();
   }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/RewriteHtmlStage.java Tue Jun 15 18:36:36 2010 +++ /trunk/src/com/google/caja/plugin/stages/RewriteHtmlStage.java Mon Jul 12 16:56:22 2010
@@ -90,7 +90,7 @@
     MessageQueue mq = jobs.getMessageQueue();
     MessageContext mc = jobs.getMessageContext();
     for (Job job : jobs.getJobsByType(ContentType.HTML)) {
-      Node root = ((Dom) job.getRoot().node).getValue();
+      Node root = ((Dom) job.getRoot()).getValue();
       extractBodyInfo(root, job.getCacheKeys(), job.getBaseUri(), jobs);
       HtmlEmbeddedContentFinder finder = new HtmlEmbeddedContentFinder(
           htmlSchema, job.getBaseUri(), mq, mc);
@@ -249,8 +249,7 @@
       }
     }

-    jobs.getJobs().add(Job.cssJob(
-        keys, AncestorChain.instance(stylesheet), c.getBaseUri()));
+    jobs.getJobs().add(Job.cssJob(keys, stylesheet, c.getBaseUri()));
   }

   /**
@@ -327,8 +326,7 @@
                         + "IMPORTS___.htmlEmitter___"
                         + "    ./*...@synthetic*/addBodyClasses(@idents);",
                         "idents", e));
-                jobs.getJobs().add(Job.jsJob(
-                    keys, AncestorChain.instance(s), base));
+                jobs.getJobs().add(Job.jsJob(keys, s, base));
               }
             }
           }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/SanitizeHtmlStage.java Mon Feb 22 08:26:46 2010 +++ /trunk/src/com/google/caja/plugin/stages/SanitizeHtmlStage.java Mon Jul 12 16:56:22 2010
@@ -44,7 +44,7 @@

     boolean valid = true;
     for (Job job : jobs.getJobsByType(ContentType.HTML)) {
-      if (!s.sanitize(job.getRoot().cast(Dom.class).node.getValue())) {
+      if (!s.sanitize(((Dom) job.getRoot()).getValue())) {
         valid = false;
         // Keep going so that we can display error messages for all inputs.
       }
=======================================
--- /trunk/src/com/google/caja/plugin/stages/ValidateCssStage.java Fri Jun 11 11:02:06 2010 +++ /trunk/src/com/google/caja/plugin/stages/ValidateCssStage.java Mon Jul 12 16:56:22 2010
@@ -60,14 +60,13 @@
     v.withInvalidNodeMessageLevel(MessageLevel.WARNING);
     rw.withInvalidNodeMessageLevel(MessageLevel.WARNING);
     for (Job job : jobs.getJobsByType(ContentType.CSS)) {
-      validate(v, rw, job.getRoot().cast(CssTree.class));
+      validate(v, rw, AncestorChain.instance((CssTree) job.getRoot()));
     }

     v.withInvalidNodeMessageLevel(MessageLevel.ERROR);
     rw.withInvalidNodeMessageLevel(MessageLevel.ERROR);
-    /* TODO: why are we not revalidating? */
     for (Job job : jobs.getJobsByType(ContentType.CSS)) {
-      validate(v, rw, job.getRoot().cast(CssTree.class));
+      validate(v, rw, AncestorChain.instance((CssTree) job.getRoot()));
     }

     return jobs.hasNoFatalErrors();
=======================================
--- /trunk/src/com/google/caja/plugin/stages/ValidateJavascriptStage.java Fri Jun 11 11:02:06 2010 +++ /trunk/src/com/google/caja/plugin/stages/ValidateJavascriptStage.java Mon Jul 12 16:56:22 2010
@@ -14,7 +14,6 @@

 package com.google.caja.plugin.stages;

-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.js.ArrayConstructor;
 import com.google.caja.parser.js.Block;
@@ -57,8 +56,9 @@
       JobCache.Keys cacheKeys = job.getCacheKeys();

       URI baseUri = job.getBaseUri();
+      Statement s = (Statement) job.getRoot();
       ParseTreeNode result = new ExpressionSanitizerCaja(mgr, baseUri)
-          .sanitize(uncajoledModule(job.getRoot().cast(Statement.class).node));
+          .sanitize(uncajoledModule(s));
       if (!(result instanceof CajoledModule)) {
         // Rewriter failed to rewrite so returned its input.
         // There should be details on the message queue.
@@ -66,7 +66,7 @@
         continue;
       }
       CajoledModule validated = (CajoledModule) result;
-      it.set(Job.cajoledJob(cacheKeys, AncestorChain.instance(validated)));
+      it.set(Job.cajoledJob(cacheKeys, validated));

       if (cacheKeys.iterator().hasNext()) {
         ArrayConstructor deps = validated.getInlinedModules();
@@ -87,8 +87,7 @@
     // show up in the appropriate caches.
     for (CajoledModule module : mgr.getModuleMap()) {
       String src = module.getSrc();
-      jobs.getJobs().add(Job.cajoledJob(
-          keys.get(src), AncestorChain.instance(module)));
+      jobs.getJobs().add(Job.cajoledJob(keys.get(src), module));
     }

     return jobs.hasNoFatalErrors();
=======================================
--- /trunk/src/com/google/caja/service/HtmlHandler.java Tue Jun 29 09:55:34 2010 +++ /trunk/src/com/google/caja/service/HtmlHandler.java Mon Jul 12 16:56:22 2010
@@ -33,7 +33,6 @@
 import com.google.caja.lexer.InputSource;
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.escaping.UriUtil;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.DomParser;
 import com.google.caja.parser.html.Namespaces;
@@ -149,7 +148,7 @@
             compiler.getGoals().without(PipelineMaker.HTML_SAFE_STATIC));
       }

-      compiler.addInput(AncestorChain.instance(html), inputUri);
+      compiler.addInput(html, inputUri);
       if (okToContinue) {
         okToContinue &= compiler.run();
       }
=======================================
--- /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkRunner.java Tue Dec 29 09:33:01 2009 +++ /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkRunner.java Mon Jul 12 16:56:22 2010
@@ -15,7 +15,6 @@
 package com.google.caja.demos.benchmarks;

 import com.google.caja.lexer.CharProducer;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.plugin.PluginCompiler;
 import com.google.caja.plugin.PluginMeta;
 import com.google.caja.reporting.MessageQueue;
@@ -136,9 +135,9 @@
     CharProducer src = wrapGlobals ?
         fromString(wrapGlobals(plain(fromResource(filename)))):
             fromString(plain(fromResource(filename)));
-    pc.addInput(AncestorChain.instance(valija
-        ? BenchmarkUtils.addUseCajitaDirective(js(src))
-        : js(src)), is.getUri());
+    pc.addInput(
+        valija ? BenchmarkUtils.addUseCajitaDirective(js(src)) : js(src),
+        is.getUri());
     if (!pc.run()) {
       return -1;
     }
=======================================
--- /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkSize.java Fri Jun 11 11:02:06 2010 +++ /trunk/tests/com/google/caja/demos/benchmarks/BenchmarkSize.java Mon Jul 12 16:56:22 2010
@@ -15,7 +15,6 @@
 package com.google.caja.demos.benchmarks;

 import com.google.caja.lexer.ParseException;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.js.Block;
 import com.google.caja.parser.js.CajoledModule;
 import com.google.caja.plugin.PluginCompiler;
@@ -174,7 +173,7 @@
     if (!valija) { js = BenchmarkUtils.addUseCajitaDirective(js); }
     PluginCompiler pc = new PluginCompiler(
         TestBuildInfo.getInstance(), meta, mq);
-    pc.addInput(AncestorChain.instance(js), null);
+    pc.addInput(js, null);
     if (pc.run()) {
       result = pc.getJavascript();
       (valija ? vMemo : cMemo).put(js, result);
=======================================
--- /trunk/tests/com/google/caja/parser/js/ParserTest.java Tue May 25 12:11:32 2010 +++ /trunk/tests/com/google/caja/parser/js/ParserTest.java Mon Jul 12 16:56:22 2010
@@ -645,7 +645,10 @@
     String msg = n + " : " + n.getFilePosition();
     try {
       // require that n start on or after its previous sibling
-      ParseTreeNode prev = nChain.getPrevSibling();
+      int indexInParent = nChain.parent != null
+          ? nChain.parent.node.children().indexOf(nChain.node) : -1;
+      ParseTreeNode prev = indexInParent > 0
+          ? nChain.parent.node.children().get(indexInParent - 1) : null;
       if (prev != null) {
         if (prev instanceof Identifier && n instanceof FunctionConstructor
             && nChain.parent != null
=======================================
--- /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java Fri Jun 11 11:02:06 2010 +++ /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java Mon Jul 12 16:56:22 2010
@@ -15,7 +15,6 @@
 package com.google.caja.plugin;

 import com.google.caja.lexer.FilePosition;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.quasiliteral.CajitaRewriter;
 import com.google.caja.parser.html.Dom;
@@ -231,7 +230,7 @@
         TestBuildInfo.getInstance(), meta, mq);
     compiler.setMessageContext(mc);
     Dom html = new Dom(htmlFragment(fromString("<script>{</script>")));
-    compiler.addInput(AncestorChain.instance(html), is.getUri());
+    compiler.addInput(html, is.getUri());

     boolean passed = compiler.run();
     assertFalse(passed);
@@ -251,8 +250,7 @@
     PluginCompiler compiler = new PluginCompiler(
         TestBuildInfo.getInstance(), meta, mq);
     compiler.setMessageContext(mc);
-    compiler.addInput(
- AncestorChain.instance(html), html.getFilePosition().source().getUri());
+    compiler.addInput(html, html.getFilePosition().source().getUri());

     boolean failed = !compiler.run();

=======================================
--- /trunk/tests/com/google/caja/plugin/stages/DebuggingSymbolsStageTest.java Fri Jun 11 11:02:06 2010 +++ /trunk/tests/com/google/caja/plugin/stages/DebuggingSymbolsStageTest.java Mon Jul 12 16:56:22 2010
@@ -14,7 +14,6 @@

 package com.google.caja.plugin.stages;

-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.js.Block;
 import com.google.caja.parser.js.CajoledModule;
 import com.google.caja.parser.quasiliteral.ModuleManager;
@@ -315,8 +314,7 @@
                        uncajoledModuleBody.toStringDeep(1));

     Jobs jobs = new Jobs(mc, mq, new PluginMeta());
-    jobs.getJobs().add(
- Job.jsJob(null, AncestorChain.instance(uncajoledModuleBody), null));
+    jobs.getJobs().add(Job.jsJob(null, uncajoledModuleBody, null));

     Pipeline<Jobs> pipeline = new Pipeline<Jobs>();
     TestBuildInfo buildInfo = TestBuildInfo.getInstance();
@@ -336,8 +334,8 @@
       fail(sb.toString());
     }

-    CajoledModule cajoledModule =
-        jobs.getJobs().get(0).getRoot().cast(CajoledModule.class).node;
+    CajoledModule cajoledModule = (CajoledModule)
+        jobs.getJobs().get(0).getRoot();

     try {
       String cajoledText = String.format(context, render(cajoledModule));
=======================================
--- /trunk/tests/com/google/caja/plugin/stages/LegacyNamespaceFixupStageTest.java Tue Mar 2 13:55:40 2010 +++ /trunk/tests/com/google/caja/plugin/stages/LegacyNamespaceFixupStageTest.java Mon Jul 12 16:56:22 2010
@@ -15,8 +15,6 @@
 package com.google.caja.plugin.stages;

 import com.google.caja.lexer.InputSource;
-import com.google.caja.parser.AncestorChain;
-import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.DomParser;
 import com.google.caja.plugin.Job;
@@ -117,7 +115,7 @@
     new LegacyNamespaceFixupStage().apply(jobs);
     StringBuilder sb = new StringBuilder();
     for (Job job : jobs.getJobs()) {
-      sb.append(render(job.getRoot().cast(ParseTreeNode.class).node));
+      sb.append(render(job.getRoot()));
       sb.append('\n');
     }
     assertEquals(golden, sb.toString().trim());
@@ -136,9 +134,7 @@

     Job job() {
       assertEquals(stack, Lists.newArrayList(root));
-      return Job.domJob(
-          null, AncestorChain.instance(new Dom(root)),
-          InputSource.UNKNOWN.getUri());
+      return Job.domJob(null, new Dom(root), InputSource.UNKNOWN.getUri());
     }
     NamespaceUnawareBuilder open(String qname) {
       Element el = doc.createElement(qname);
=======================================
--- /trunk/tests/com/google/caja/plugin/stages/OpenTemplateStageTest.java Fri Jun 11 11:02:06 2010 +++ /trunk/tests/com/google/caja/plugin/stages/OpenTemplateStageTest.java Mon Jul 12 16:56:22 2010
@@ -17,7 +17,6 @@
 import com.google.caja.lang.css.CssSchema;
 import com.google.caja.lang.html.HtmlSchema;
 import com.google.caja.lexer.FilePosition;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.js.Block;
 import com.google.caja.parser.js.ExpressionStmt;
@@ -106,7 +105,7 @@
     Block node = js(fromString(input));
     PluginMeta meta = new PluginMeta();
     Jobs jobs = new Jobs(mc, mq, meta);
- jobs.getJobs().add(Job.jsJob(null, AncestorChain.instance(node), null));
+    jobs.getJobs().add(Job.jsJob(null, node, null));

     assertTrue(pipeline.apply(jobs));
     assertEquals(
@@ -114,8 +113,7 @@
         passes, jobs.hasNoErrors());
     assertEquals("" + jobs.getJobs(), 1, jobs.getJobs().size());

-    ParseTreeNode bare = stripBoilerPlate(
-        jobs.getJobs().get(0).getRoot().cast(ParseTreeNode.class).node);
+    ParseTreeNode bare = stripBoilerPlate(jobs.getJobs().get(0).getRoot());
     assertEquals(golden, render(bare));
   }

@@ -134,10 +132,10 @@
       jobs.getJobs().remove(jsJobs);
       Block block = new Block(FilePosition.UNKNOWN);
       for (Job job : jsJobs) {
-        Statement s = job.getRoot().cast(Statement.class).node;
+        Statement s = (Statement) job.getRoot();
         block.appendChild(s);
       }
- jobs.getJobs().add(Job.jsJob(null, AncestorChain.instance(block), null));
+      jobs.getJobs().add(Job.jsJob(null, block, null));
       return true;
     }
   }
=======================================
--- /trunk/tests/com/google/caja/plugin/stages/PipelineStageTestCase.java Thu Jun 17 11:19:37 2010 +++ /trunk/tests/com/google/caja/plugin/stages/PipelineStageTestCase.java Mon Jul 12 16:56:22 2010
@@ -22,7 +22,6 @@
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.TokenConsumer;
 import com.google.caja.lexer.escaping.UriUtil;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.ParseTreeNode;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.plugin.DataUriFetcher;
@@ -97,7 +96,7 @@
     List<JobStub> actualJobs = Lists.newArrayList();
     for (Job job : jobs.getJobs()) {
       StringBuilder sb = new StringBuilder();
-      ParseTreeNode node = job.getRoot().cast(ParseTreeNode.class).node;
+      ParseTreeNode node = job.getRoot();
       TokenConsumer tc = node.makeRenderer(sb, null);
       node.render(new RenderContext(tc));
       tc.noMoreTokens();
@@ -112,24 +111,17 @@
       case HTML:
         outputJobs.getJobs().add(
             Job.domJob(
-                null,
-                AncestorChain.instance(
- new Dom(htmlFragment(fromString(inputJob.content, is)))), + null, new Dom(htmlFragment(fromString(inputJob.content, is))),
                 is.getUri()));
         break;
       case CSS:
         outputJobs.getJobs().add(
-            Job.cssJob(
-                null,
- AncestorChain.instance(css(fromString(inputJob.content, is))),
-                is.getUri()));
+ Job.cssJob(null, css(fromString(inputJob.content, is)), is.getUri())
+            );
         break;
       case JS:
         outputJobs.getJobs().add(
-            Job.jsJob(
-                null,
- AncestorChain.instance(js(fromString(inputJob.content, is))),
-                null));
+            Job.jsJob(null, js(fromString(inputJob.content, is)), null));
         break;
       default:
         throw new IllegalArgumentException(inputJob.type.name());
=======================================
--- /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java Thu Jun 17 11:19:37 2010 +++ /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java Mon Jul 12 16:56:22 2010
@@ -16,7 +16,6 @@

 import com.google.caja.lang.html.HtmlSchema;
 import com.google.caja.lexer.FilePosition;
-import com.google.caja.parser.AncestorChain;
 import com.google.caja.parser.html.Dom;
 import com.google.caja.parser.html.Namespaces;
 import com.google.caja.parser.js.Block;
@@ -241,8 +240,7 @@
         && new RewriteHtmlStage(schema).apply(jobs);
     // Dump the extracted script bits on the queue.
for (Job job : Lists.newArrayList(jobs.getJobsByType(ContentType.HTML))) {
-      Dom dom = job.getRoot().cast(Dom.class).node;
-      extractScripts(dom.getValue(), jobs);
+      extractScripts(((Dom) job.getRoot()).getValue(), jobs);
     }
     return result;
   }
@@ -256,8 +254,7 @@
           int jobNum = jobs.getJobs().size();
           el.setAttributeNS(
               Namespaces.HTML_NAMESPACE_URI, "jobnum", "" + jobNum);
-          jobs.getJobs().add(
-              Job.jsJob(null, AncestorChain.instance(extracted), null));
+          jobs.getJobs().add(Job.jsJob(null, extracted, null));
         }
for (Node c = el.getFirstChild(); c != null; c = c.getNextSibling()) {
           extractScripts(c, jobs);

Reply via email to