Migrate from deprecated SoyTofu to SoySauce

Also add missing dependency on ow2 which is exposed by this migration.

Change-Id: I144334592c981d3ebd8810aa73171f1076680ee9
diff --git a/WORKSPACE b/WORKSPACE
index 685fce3..2b176f4 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -302,3 +302,35 @@
     artifact = "org.eclipse.jetty:jetty-util:" + JETTY_VERSION,
     sha1 = "13e6148bfda7ae511f69ae7e5e3ea898bc9b0e33",
 )
+
+OW2_VERS = "7.0"
+
+maven_jar(
+    name = "ow2-asm",
+    artifact = "org.ow2.asm:asm:" + OW2_VERS,
+    sha1 = "d74d4ba0dee443f68fb2dcb7fcdb945a2cd89912",
+)
+
+maven_jar(
+    name = "ow2-asm-analysis",
+    artifact = "org.ow2.asm:asm-analysis:" + OW2_VERS,
+    sha1 = "4b310d20d6f1c6b7197a75f1b5d69f169bc8ac1f",
+)
+
+maven_jar(
+    name = "ow2-asm-commons",
+    artifact = "org.ow2.asm:asm-commons:" + OW2_VERS,
+    sha1 = "478006d07b7c561ae3a92ddc1829bca81ae0cdd1",
+)
+
+maven_jar(
+    name = "ow2-asm-tree",
+    artifact = "org.ow2.asm:asm-tree:" + OW2_VERS,
+    sha1 = "29bc62dcb85573af6e62e5b2d735ef65966c4180",
+)
+
+maven_jar(
+    name = "ow2-asm-util",
+    artifact = "org.ow2.asm:asm-util:" + OW2_VERS,
+    sha1 = "18d4d07010c24405129a6dbb0e92057f8779fb9d",
+)
diff --git a/java/com/google/gitiles/BaseServlet.java b/java/com/google/gitiles/BaseServlet.java
index 6a2e5eb..91c66bb 100644
--- a/java/com/google/gitiles/BaseServlet.java
+++ b/java/com/google/gitiles/BaseServlet.java
@@ -204,7 +204,7 @@
   protected void renderHtml(
       HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
       throws IOException {
-    renderer.render(req, res, templateName, startHtmlResponse(req, res, soyData));
+    renderer.renderHtml(req, res, templateName, startHtmlResponse(req, res, soyData));
   }
 
   /**
@@ -227,7 +227,8 @@
       HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
       throws IOException {
     req.setAttribute(STREAMING_ATTRIBUTE, true);
-    return renderer.renderStreaming(res, false, templateName, startHtmlResponse(req, res, soyData));
+    return renderer.renderHtmlStreaming(
+        res, false, templateName, startHtmlResponse(req, res, soyData));
   }
 
   /**
@@ -259,7 +260,8 @@
       res.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
       gzip = true;
     }
-    return renderer.renderStreaming(res, gzip, templateName, startHtmlResponse(req, res, soyData));
+    return renderer.renderHtmlStreaming(
+        res, gzip, templateName, startHtmlResponse(req, res, soyData));
   }
 
   private Map<String, ?> startHtmlResponse(
diff --git a/java/com/google/gitiles/DebugRenderer.java b/java/com/google/gitiles/DebugRenderer.java
index 791067b..5e35e57 100644
--- a/java/com/google/gitiles/DebugRenderer.java
+++ b/java/com/google/gitiles/DebugRenderer.java
@@ -21,7 +21,7 @@
 import com.google.common.collect.Streams;
 import com.google.common.hash.HashCode;
 import com.google.template.soy.SoyFileSet;
-import com.google.template.soy.tofu.SoyTofu;
+import com.google.template.soy.jbcsrc.api.SoySauce;
 import java.io.File;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -47,7 +47,7 @@
   }
 
   @Override
-  protected SoyTofu getTofu() {
+  protected SoySauce getSauce() {
     SoyFileSet.Builder builder = SoyFileSet.builder().setCompileTimeGlobals(globals);
     for (URL template : templates.values()) {
       try {
@@ -57,6 +57,6 @@
       }
       builder.add(template);
     }
-    return builder.build().compileToTofu();
+    return builder.build().compileTemplates();
   }
 }
diff --git a/java/com/google/gitiles/DefaultErrorHandlingFilter.java b/java/com/google/gitiles/DefaultErrorHandlingFilter.java
index 89086aa..ec52bb9 100644
--- a/java/com/google/gitiles/DefaultErrorHandlingFilter.java
+++ b/java/com/google/gitiles/DefaultErrorHandlingFilter.java
@@ -103,7 +103,7 @@
   protected void renderHtml(
       HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
       throws IOException {
-    renderer.render(req, res, templateName, startHtmlResponse(req, res, soyData));
+    renderer.renderHtml(req, res, templateName, startHtmlResponse(req, res, soyData));
   }
 
   private Map<String, ?> startHtmlResponse(
diff --git a/java/com/google/gitiles/DefaultRenderer.java b/java/com/google/gitiles/DefaultRenderer.java
index 297350e..0307862 100644
--- a/java/com/google/gitiles/DefaultRenderer.java
+++ b/java/com/google/gitiles/DefaultRenderer.java
@@ -18,13 +18,13 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Resources;
 import com.google.template.soy.SoyFileSet;
-import com.google.template.soy.tofu.SoyTofu;
+import com.google.template.soy.jbcsrc.api.SoySauce;
 import java.net.URL;
 import java.util.Map;
 
 /** Renderer that precompiles Soy and uses static precompiled CSS. */
 public class DefaultRenderer extends Renderer {
-  private final SoyTofu tofu;
+  private final SoySauce sauce;
 
   DefaultRenderer() {
     this("", ImmutableList.<URL>of(), "");
@@ -49,11 +49,11 @@
     for (URL template : templates.values()) {
       builder.add(template);
     }
-    tofu = builder.build().compileToTofu();
+    sauce = builder.build().compileTemplates();
   }
 
   @Override
-  protected SoyTofu getTofu() {
-    return tofu;
+  protected SoySauce getSauce() {
+    return sauce;
   }
 }
diff --git a/java/com/google/gitiles/HtmlDiffFormatter.java b/java/com/google/gitiles/HtmlDiffFormatter.java
index 44d2c18..1467d42 100644
--- a/java/com/google/gitiles/HtmlDiffFormatter.java
+++ b/java/com/google/gitiles/HtmlDiffFormatter.java
@@ -111,7 +111,9 @@
             renderer
                 .newRenderer("gitiles.diffHeader")
                 .setData(ImmutableMap.of("firstParts", parts, "rest", rest, "fileIndex", fileIndex))
-                .render()
+                .renderHtml()
+                .get()
+                .toString()
                 .getBytes(UTF_8));
   }
 
diff --git a/java/com/google/gitiles/LogSoyData.java b/java/com/google/gitiles/LogSoyData.java
index 96ef6ae..dc782ab 100644
--- a/java/com/google/gitiles/LogSoyData.java
+++ b/java/com/google/gitiles/LogSoyData.java
@@ -22,7 +22,8 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gitiles.CommitData.Field;
-import com.google.template.soy.tofu.SoyTofu;
+import com.google.template.soy.data.LoggingAdvisingAppendable;
+import com.google.template.soy.jbcsrc.api.SoySauce;
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Map;
@@ -74,35 +75,43 @@
     variant = firstNonNull(config.getString("logFormat", pretty, "variant"), pretty);
   }
 
+  private void renderHtml(SoySauce.Renderer renderer, LoggingAdvisingAppendable out)
+      throws IOException {
+    if (!renderer.renderHtml(out).result().isDone()) {
+      throw new IOException("failed to render HTML");
+    }
+  }
+
   public void renderStreaming(
       Paginator paginator,
       @Nullable String revision,
       Renderer renderer,
-      Writer out,
+      Writer writer,
       DateFormatter df,
       FooterBehavior footerBehavior)
       throws IOException {
-    renderer
-        .newRenderer("gitiles.logEntriesHeader")
-        .setData(toHeaderSoyData(paginator, revision))
-        .render(out);
-    out.flush();
+    LoggingAdvisingAppendable out = LoggingAdvisingAppendable.delegating(writer);
+    renderHtml(
+        renderer
+            .newRenderer("gitiles.logEntriesHeader")
+            .setData(toHeaderSoyData(paginator, revision)),
+        out);
 
-    SoyTofu.Renderer entryRenderer = renderer.newRenderer("gitiles.logEntryWrapper");
+    SoySauce.Renderer entryRenderer = renderer.newRenderer("gitiles.logEntryWrapper");
     boolean renderedEntries = false;
     for (RevCommit c : paginator) {
-      entryRenderer.setData(toEntrySoyData(paginator, c, df)).render(out);
-      out.flush();
+      renderHtml(entryRenderer.setData(toEntrySoyData(paginator, c, df)), out);
       renderedEntries = true;
     }
     if (!renderedEntries) {
-      renderer.newRenderer("gitiles.emptyLog").render(out);
+      renderHtml(renderer.newRenderer("gitiles.emptyLog"), out);
     }
 
-    renderer
-        .newRenderer("gitiles.logEntriesFooter")
-        .setData(toFooterSoyData(paginator, revision, footerBehavior))
-        .render(out);
+    renderHtml(
+        renderer
+            .newRenderer("gitiles.logEntriesFooter")
+            .setData(toFooterSoyData(paginator, revision, footerBehavior)),
+        out);
   }
 
   private Map<String, Object> toHeaderSoyData(Paginator paginator, @Nullable String revision) {
diff --git a/java/com/google/gitiles/Renderer.java b/java/com/google/gitiles/Renderer.java
index bc85290..dbd5590 100644
--- a/java/com/google/gitiles/Renderer.java
+++ b/java/com/google/gitiles/Renderer.java
@@ -29,7 +29,7 @@
 import com.google.common.html.types.LegacyConversions;
 import com.google.common.io.ByteStreams;
 import com.google.common.net.HttpHeaders;
-import com.google.template.soy.tofu.SoyTofu;
+import com.google.template.soy.jbcsrc.api.SoySauce;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -147,16 +147,17 @@
     return h.hash();
   }
 
-  public String render(String templateName, Map<String, ?> soyData) {
-    return newRenderer(templateName).setData(soyData).render();
+  public String renderHtml(String templateName, Map<String, ?> soyData) {
+    return newRenderer(templateName).setData(soyData).renderHtml().get().toString();
   }
 
-  void render(
+  void renderHtml(
       HttpServletRequest req, HttpServletResponse res, String templateName, Map<String, ?> soyData)
       throws IOException {
     res.setContentType("text/html");
     res.setCharacterEncoding("UTF-8");
-    byte[] data = newRenderer(templateName).setData(soyData).render().getBytes(UTF_8);
+    byte[] data =
+        newRenderer(templateName).setData(soyData).renderHtml().get().toString().getBytes(UTF_8);
     if (BaseServlet.acceptsGzipEncoding(req)) {
       res.addHeader(HttpHeaders.VARY, HttpHeaders.ACCEPT_ENCODING);
       res.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
@@ -166,15 +167,15 @@
     res.getOutputStream().write(data);
   }
 
-  OutputStream renderStreaming(HttpServletResponse res, String templateName, Map<String, ?> soyData)
-      throws IOException {
-    return renderStreaming(res, false, templateName, soyData);
+  OutputStream renderHtmlStreaming(
+      HttpServletResponse res, String templateName, Map<String, ?> soyData) throws IOException {
+    return renderHtmlStreaming(res, false, templateName, soyData);
   }
 
-  OutputStream renderStreaming(
+  OutputStream renderHtmlStreaming(
       HttpServletResponse res, boolean gzip, String templateName, Map<String, ?> soyData)
       throws IOException {
-    String html = newRenderer(templateName).setData(soyData).render();
+    String html = newRenderer(templateName).setData(soyData).renderHtml().get().toString();
     int id = html.indexOf(PLACEHOLDER);
     checkArgument(id >= 0, "Template must contain %s", PLACEHOLDER);
 
@@ -211,17 +212,17 @@
     };
   }
 
-  SoyTofu.Renderer newRenderer(String templateName) {
+  SoySauce.Renderer newRenderer(String templateName) {
     ImmutableMap.Builder<String, Object> staticUrls = ImmutableMap.builder();
     for (String key : STATIC_URL_GLOBALS.keySet()) {
       staticUrls.put(
           key.replaceFirst("^gitiles\\.", ""),
           LegacyConversions.riskilyAssumeTrustedResourceUrl(globals.get(key)));
     }
-    return getTofu()
-        .newRenderer(templateName)
-        .setIjData(ImmutableMap.of("staticUrls", staticUrls.build()));
+    return getSauce()
+        .renderTemplate(templateName)
+        .setIj(ImmutableMap.of("staticUrls", staticUrls.build()));
   }
 
-  protected abstract SoyTofu getTofu();
+  protected abstract SoySauce getSauce();
 }
diff --git a/lib/BUILD b/lib/BUILD
index ab56df4..a8d6b51 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -21,4 +21,9 @@
     "guava",
     "guava-failureaccess",
     "prettify",
+    "ow2-asm",
+    "ow2-asm-analysis",
+    "ow2-asm-commons",
+    "ow2-asm-tree",
+    "ow2-asm-util",
 ]]
diff --git a/lib/soy/BUILD b/lib/soy/BUILD
index 5666b8c..edef66a 100644
--- a/lib/soy/BUILD
+++ b/lib/soy/BUILD
@@ -10,6 +10,11 @@
     runtime_deps = [
         "@html-types//jar",
         "@icu4j//jar",
+        "@ow2-asm-analysis//jar",
+        "@ow2-asm-commons//jar",
+        "@ow2-asm-tree//jar",
+        "@ow2-asm-util//jar",
+        "@ow2-asm//jar",
         "@protobuf//jar",
     ],
 )