Author: lindner Date: Mon Oct 19 20:14:38 2009 New Revision: 826796 URL: http://svn.apache.org/viewvc?rev=826796&view=rev Log: SHINDIG-1189 | Patch from Jasvir Nagra | Output of cajoling is not cached
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=826796&r1=826795&r2=826796&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java (original) +++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java Mon Oct 19 20:14:38 2009 @@ -18,11 +18,6 @@ */ package org.apache.shindig.gadgets.servlet; -import org.apache.shindig.gadgets.Gadget; -import org.apache.shindig.gadgets.parse.HtmlSerialization; -import org.apache.shindig.gadgets.parse.HtmlSerializer; -import org.apache.shindig.gadgets.rewrite.MutableContent; - import com.google.caja.lexer.ExternalReference; import com.google.caja.lexer.InputSource; import com.google.caja.lexer.escaping.Escaping; @@ -42,8 +37,16 @@ import com.google.caja.reporting.SnippetProducer; import com.google.caja.util.Pair; import com.google.common.collect.Maps; +import com.google.inject.Inject; import org.apache.commons.lang.StringUtils; +import org.apache.shindig.common.cache.Cache; +import org.apache.shindig.common.cache.CacheProvider; +import org.apache.shindig.common.util.HashUtil; +import org.apache.shindig.gadgets.Gadget; +import org.apache.shindig.gadgets.parse.HtmlSerialization; +import org.apache.shindig.gadgets.parse.HtmlSerializer; +import org.apache.shindig.gadgets.rewrite.MutableContent; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -58,7 +61,16 @@ import java.util.logging.Logger; public class CajaContentRewriter implements org.apache.shindig.gadgets.rewrite.GadgetRewriter { + public static final String CAJOLED_DOCUMENTS = "cajoledDocuments"; + private final Logger logger = Logger.getLogger(CajaContentRewriter.class.getName()); + private Cache<String, Element> cajoledCache; + + @Inject + public void setCacheProvider(CacheProvider cacheProvider) { + cajoledCache = cacheProvider.createCache(CAJOLED_DOCUMENTS); + System.err.println("Cajoled cache created" + cajoledCache); + } public void rewrite(Gadget gadget, MutableContent content) { if (gadget.getSpec().getModulePrefs().getFeatures().containsKey("caja") || @@ -99,29 +111,44 @@ } } }; - + String key = HashUtil.rawChecksum(content.getContent().getBytes()); + Document doc = content.getDocument(); + Node root = doc.createDocumentFragment(); + root.appendChild(doc.getDocumentElement()); + Element cajoledOutput = null; + if (null != cajoledCache) { + cajoledOutput = cajoledCache.getElement(key); + if (null != cajoledOutput) { + createContainerFor(doc, doc.adoptNode(cajoledOutput)); + content.documentChanged(); + HtmlSerialization.attach(doc, new CajaHtmlSerializer(), null); + return; + } + } MessageQueue mq = new SimpleMessageQueue(); BuildInfo bi = BuildInfo.getInstance(); DefaultGadgetRewriter rw = new DefaultGadgetRewriter(bi, mq); rw.setValijaMode(true); InputSource is = new InputSource(retrievedUri); - Document doc = content.getDocument(); - Node root = doc.createDocumentFragment(); - root.appendChild(doc.getDocumentElement()); boolean safe = false; + try { - Pair<Node, Element> htmlAndJs = rw.rewriteContent(retrievedUri, root, - cb); + Pair<Node, Element> htmlAndJs = rw.rewriteContent(retrievedUri, root, cb); Node html = htmlAndJs.a; Element script = htmlAndJs.b; - Element cajoledOutput = doc.createElement("div"); + cajoledOutput = doc.createElement("div"); cajoledOutput.setAttribute("id", "cajoled-output"); cajoledOutput.setAttribute("classes", "g___"); + cajoledOutput.setAttribute("style", "position: relative;"); + cajoledOutput.appendChild(doc.adoptNode(html)); cajoledOutput.appendChild(tameCajaClientApi(doc)); cajoledOutput.appendChild(doc.adoptNode(script)); - + + if (cajoledCache != null) { + cajoledCache.addElement(key, cajoledOutput); + } createContainerFor(doc, cajoledOutput); content.documentChanged(); safe = true; @@ -131,6 +158,7 @@ // Content is only used to produce useful snippets with error messages createContainerFor(doc, formatErrors(doc, is, content.getContent(), mq)); logException(e, mq); + safe = true; } finally { if (!safe) { // Fail safe @@ -140,7 +168,7 @@ } } - private void createContainerFor(Document doc, Element el) { + private void createContainerFor(Document doc, Node el) { Element docEl = doc.createElement("html"); Element head = doc.createElement("head"); Element body = doc.createElement("body");