Author: lryan
Date: Tue Aug 18 18:36:29 2009
New Revision: 805532
URL: http://svn.apache.org/viewvc?rev=805532&view=rev
Log:
Applied patch from Jasvir Nagra to avoid reparsing document while Cajoling.
SHINDIG-1146. Includes update to Caja r3638
Modified:
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
incubator/shindig/trunk/pom.xml
Modified:
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js?rev=805532&r1=805531&r2=805532&view=diff
==============================================================================
---
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
(original)
+++
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
Tue Aug 18 18:36:29 2009
@@ -201,6 +201,8 @@
if (gadgets.views)
gadgets.views.getCurrentView
= taming.views.getCurrentView(gadgets.views.getCurrentView);
+
+ if (opensocial)
opensocial.newDataRequest = taming.newDataRequest(imports.$v,
opensocial.newDataRequest);
if (gadgets.MiniMessage)
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=805532&r1=805531&r2=805532&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
Tue Aug 18 18:36:29 2009
@@ -21,8 +21,10 @@
import org.apache.commons.lang.StringUtils;
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.rewrite.MutableContent;
+
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -32,16 +34,13 @@
import java.util.Map;
import java.util.logging.Logger;
-import com.google.caja.lexer.CharProducer;
import com.google.caja.lexer.ExternalReference;
-import com.google.caja.lexer.FilePosition;
import com.google.caja.lexer.InputSource;
import com.google.caja.lexer.escaping.Escaping;
import com.google.caja.opensocial.DefaultGadgetRewriter;
import com.google.caja.opensocial.GadgetRewriteException;
import com.google.caja.opensocial.UriCallback;
import com.google.caja.opensocial.UriCallbackException;
-import com.google.caja.parser.html.Nodes;
import com.google.caja.reporting.BuildInfo;
import com.google.caja.reporting.Message;
import com.google.caja.reporting.MessageContext;
@@ -49,6 +48,7 @@
import com.google.caja.reporting.MessageQueue;
import com.google.caja.reporting.SimpleMessageQueue;
import com.google.caja.reporting.SnippetProducer;
+import com.google.caja.util.Pair;
import com.google.common.collect.Maps;
public class CajaContentRewriter implements
org.apache.shindig.gadgets.rewrite.GadgetRewriter {
@@ -90,36 +90,52 @@
DefaultGadgetRewriter rw = new DefaultGadgetRewriter(bi, mq);
rw.setValijaMode(true);
InputSource is = new InputSource(retrievedUri);
- String origContent = content.getContent();
- CharProducer input = CharProducer.Factory.create(
- new StringReader(origContent),
- FilePosition.instance(is, 5, 5, 5));
- StringBuilder output = new StringBuilder();
-
Document doc = content.getDocument();
+ Node root = doc.createDocumentFragment();
+ root.appendChild(doc.getDocumentElement());
+ boolean safe = false;
try {
- StringBuilder htmlAndJs = new StringBuilder();
- rw.rewriteContent(retrievedUri, input, cb, htmlAndJs);
- int splitPoint = htmlAndJs.indexOf("<script");
- String script = htmlAndJs.substring(splitPoint);
- String html = htmlAndJs.substring(0, splitPoint);
- String htmlElement =
- "<div id=\"cajoled-output\" class=\"g___\">" +
- html +
- "</div>";
- output.append(htmlElement);
- output.append(tameCajaClientApi());
- output.append(script);
- } catch (Exception e) {
- content.setContent(messagesToHtml(doc, is, origContent, mq));
- throwCajolingException(e, mq);
- return;
+ Pair<Node, Element> htmlAndJs = rw.rewriteContent(retrievedUri, root,
+ cb);
+ Node html = htmlAndJs.a;
+ Element script = htmlAndJs.b;
+
+ Element cajoledOutput = doc.createElement("div");
+ cajoledOutput.setAttribute("id", "cajoled-output");
+ cajoledOutput.setAttribute("classes", "g___");
+ cajoledOutput.appendChild(doc.adoptNode(html));
+ cajoledOutput.appendChild(tameCajaClientApi(doc));
+ cajoledOutput.appendChild(doc.adoptNode(script));
+
+ createContainerFor(doc, cajoledOutput);
+ content.documentChanged();
+ safe = true;
+ } catch (GadgetRewriteException e) {
+ // There were cajoling errors
+ // Content is only used to produce useful snippets with error messages
+ createContainerFor(doc, formatErrors(doc, is, content.getContent(),
mq));
+ logException(e, mq);
+ } finally {
+ if (!safe) {
+ // Fail safe
+ content.setContent("");
+ }
}
- content.setContent(output.toString());
}
}
- private String messagesToHtml(Document doc, InputSource is, CharSequence
orig, MessageQueue mq) {
+ private void createContainerFor(Document doc, Element el) {
+ Element docEl = doc.createElement("html");
+ Element head = doc.createElement("head");
+ Element body = doc.createElement("body");
+ doc.appendChild(docEl);
+ docEl.appendChild(head);
+ docEl.appendChild(body);
+ body.appendChild(el);
+ }
+
+ private Element formatErrors(Document doc, InputSource is,
+ CharSequence orig, MessageQueue mq) {
MessageContext mc = new MessageContext();
Map<InputSource, CharSequence> originalSrc = Maps.newHashMap();
originalSrc.put(is, orig);
@@ -131,10 +147,10 @@
// Ignore LINT messages
if (MessageLevel.LINT.compareTo(msg.getMessageLevel()) <= 0) {
String snippet = sp.getSnippet(msg);
-
messageText.append(msg.getMessageLevel().name())
.append(" ")
.append(html(msg.format(mc)));
+
if (!StringUtils.isEmpty(snippet)) {
messageText.append("\n").append(snippet);
}
@@ -142,7 +158,7 @@
}
Element errElement = doc.createElement("pre");
errElement.appendChild(doc.createTextNode(messageText.toString()));
- return messageText.toString();
+ return errElement;
}
private static String html(CharSequence s) {
@@ -151,25 +167,22 @@
return sb.toString();
}
- private String tameCajaClientApi() {
- return "<script>___.enableCaja()</script>";
+ private Element tameCajaClientApi(Document doc) {
+ Element scriptElement = doc.createElement("script");
+ scriptElement.setAttribute("type", "text/javascript");
+ scriptElement.appendChild(doc.createTextNode("___.enableCaja()"));
+ return scriptElement;
}
- private void throwCajolingException(Exception cause, MessageQueue mq) {
+ private void logException(Exception cause, MessageQueue mq) {
StringBuilder errbuilder = new StringBuilder();
MessageContext mc = new MessageContext();
-
if (cause != null) {
errbuilder.append(cause).append('\n');
}
-
for (Message m : mq.getMessages()) {
errbuilder.append(m.format(mc)).append('\n');
}
-
logger.info("Unable to cajole gadget: " + errbuilder);
-
- // throw new GadgetException(
- // GadgetException.Code.MALFORMED_FOR_SAFE_INLINING,
errbuilder.toString());
}
}
Modified: incubator/shindig/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/pom.xml?rev=805532&r1=805531&r2=805532&view=diff
==============================================================================
--- incubator/shindig/trunk/pom.xml (original)
+++ incubator/shindig/trunk/pom.xml Tue Aug 18 18:36:29 2009
@@ -1247,7 +1247,7 @@
<dependency>
<groupId>caja</groupId>
<artifactId>caja</artifactId>
- <version>r3574</version>
+ <version>r3638</version>
<scope>compile</scope>
</dependency>
<dependency>