You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by zh...@apache.org on 2010/06/19 01:36:47 UTC
svn commit: r956154 - in /shindig/trunk/java:
common/src/main/java/org/apache/shindig/common/util/
gadgets/src/main/java/org/apache/shindig/gadgets/parse/
gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/
gadgets/src/main/java/org/apache/shi...
Author: zhoresh
Date: Fri Jun 18 23:36:47 2010
New Revision: 956154
URL: http://svn.apache.org/viewvc?rev=956154&view=rev
Log:
Use hex checksum for cache keys
http://codereview.appspot.com/1723043/show
Modified:
shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/HashUtil.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java
Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/HashUtil.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/HashUtil.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/HashUtil.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/HashUtil.java Fri Jun 18 23:36:47 2010
@@ -34,17 +34,7 @@ public final class HashUtil {
* @return The checksum.
*/
public static String checksum(byte[] data) {
- MessageDigest md;
- try {
- md = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException noMD5) {
- try {
- md = MessageDigest.getInstance("SHA");
- } catch (NoSuchAlgorithmException noSha) {
- throw new RuntimeException("No suitable MessageDigest found!");
- }
- }
- byte[] hash = md.digest(data);
+ byte[] hash = getMessageDigest().digest(data);
// Convert to hex. possibly change to base64 in the future for smaller
// signatures.
StringBuilder hexString = new StringBuilder(hash.length * 2 + 2);
@@ -61,6 +51,10 @@ public final class HashUtil {
* @return The checksum.
*/
public static String rawChecksum(byte[] data) {
+ return new String(getMessageDigest().digest(data));
+ }
+
+ private static MessageDigest getMessageDigest() {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
@@ -71,6 +65,6 @@ public final class HashUtil {
throw new RuntimeException("No suitable MessageDigest found!");
}
}
- return new String(md.digest(data));
+ return md;
}
}
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java Fri Jun 18 23:36:47 2010
@@ -51,7 +51,7 @@ public abstract class GadgetHtmlParser {
private Cache<String, DocumentFragment> fragmentCache;
private Provider<HtmlSerializer> serializerProvider = new DefaultSerializerProvider();
protected final DOMImplementation documentFactory;
-
+
protected GadgetHtmlParser(DOMImplementation documentFactory) {
this.documentFactory = documentFactory;
}
@@ -83,10 +83,10 @@ public abstract class GadgetHtmlParser {
boolean shouldCache = shouldCache();
if (shouldCache) {
// TODO - Consider using the source if its under a certain size
- key = HashUtil.rawChecksum(source.getBytes());
+ key = HashUtil.checksum(source.getBytes());
document = documentCache.getElement(key);
}
-
+
if (document == null) {
try {
document = parseDomImpl(source);
@@ -95,19 +95,19 @@ public abstract class GadgetHtmlParser {
} catch (DOMException e) {
// DOMException is a RuntimeException
document = errorDom(e);
- HtmlSerialization.attach(document, serializerProvider.get(), source);
+ HtmlSerialization.attach(document, serializerProvider.get(), source);
return document;
}
HtmlSerialization.attach(document, serializerProvider.get(), source);
Node html = document.getDocumentElement();
-
+
Node head = null;
Node body = null;
LinkedList<Node> beforeHead = Lists.newLinkedList();
LinkedList<Node> beforeBody = Lists.newLinkedList();
-
+
while (html.hasChildNodes()) {
Node child = html.removeChild(html.getFirstChild());
if (child.getNodeType() == Node.ELEMENT_NODE &&
@@ -135,14 +135,14 @@ public abstract class GadgetHtmlParser {
body.appendChild(child);
}
}
-
+
// Ensure head tag exists
if (head == null) {
// beforeHead contains all elements that should be prepended to <body>. Switch them.
LinkedList<Node> temp = beforeBody;
beforeBody = beforeHead;
beforeHead = temp;
-
+
// Add as first element
head = document.createElement("head");
html.insertBefore(head, html.getFirstChild());
@@ -150,7 +150,7 @@ public abstract class GadgetHtmlParser {
// Re-append head node.
html.appendChild(head);
}
-
+
// Ensure body tag exists.
if (body == null) {
// Add immediately after head.
@@ -160,13 +160,13 @@ public abstract class GadgetHtmlParser {
// Re-append body node.
html.appendChild(body);
}
-
+
// Leftovers: nodes before the first <head> node found and the first <body> node found.
// Prepend beforeHead to the front of <head>, and beforeBody to beginning of <body>,
// in the order they were found in the document.
prependToNode(head, beforeHead);
prependToNode(body, beforeBody);
-
+
// One exception. <style>/<link rel="stylesheet" nodes from <body> end up at the end of <head>,
// since doing so is HTML compliant and can never break rendering due to ordering concerns.
LinkedList<Node> styleNodes = Lists.newLinkedList();
@@ -178,20 +178,20 @@ public abstract class GadgetHtmlParser {
styleNodes.add(bodyKid);
}
}
-
+
for (Node styleNode : styleNodes) {
head.appendChild(body.removeChild(styleNode));
}
-
+
// Finally, reprocess all script nodes for OpenSocial purposes, as these
// may be interpreted (rightly, from the perspective of HTML) as containing text only.
reprocessScriptForOpenSocial(html);
-
+
if (shouldCache) {
documentCache.addElement(key, document);
}
}
-
+
if (shouldCache) {
Document copy = (Document)document.cloneNode(true);
HtmlSerialization.copySerializer(document, copy);
@@ -199,19 +199,19 @@ public abstract class GadgetHtmlParser {
}
return document;
}
-
+
protected void transferChildren(Node to, Node from) {
while (from.hasChildNodes()) {
to.appendChild(from.removeChild(from.getFirstChild()));
}
}
-
+
protected void prependToNode(Node to, LinkedList<Node> from) {
while (!from.isEmpty()) {
to.insertBefore(from.removeLast(), to.getFirstChild());
}
}
-
+
private boolean isStyleElement(Element elem) {
return "style".equalsIgnoreCase(elem.getNodeName()) ||
("link".equalsIgnoreCase(elem.getNodeName()) &&
@@ -220,25 +220,25 @@ public abstract class GadgetHtmlParser {
}
/**
- * Parses a snippet of markup and appends the result as children to the
+ * Parses a snippet of markup and appends the result as children to the
* provided node.
- *
+ *
* @param source markup to be parsed
* @param result Node to append results to
* @throws GadgetException
*/
public void parseFragment(String source, Node result) throws GadgetException {
boolean shouldCache = shouldCache();
- String key = null;
+ String key = null;
if (shouldCache) {
- key = HashUtil.rawChecksum(source.getBytes());
+ key = HashUtil.checksum(source.getBytes());
DocumentFragment cachedFragment = fragmentCache.getElement(key);
if (cachedFragment != null) {
copyFragment(cachedFragment, result);
return;
}
}
-
+
DocumentFragment fragment = null;
try {
fragment = parseFragmentImpl(source);
@@ -247,7 +247,7 @@ public abstract class GadgetHtmlParser {
appendParseException(result, e);
return;
}
-
+
reprocessScriptForOpenSocial(fragment);
if (shouldCache) {
fragmentCache.addElement(key, fragment);
@@ -261,9 +261,9 @@ public abstract class GadgetHtmlParser {
for (int i = 0; i < nodes.getLength(); i++) {
Node clone = destDoc.importNode(nodes.item(i), true);
dest.appendChild(clone);
- }
+ }
}
-
+
protected Document errorDom(DOMException e) {
// Create a bare-bones DOM whose body is just error text.
// We do this to echo information to the developer that originally
@@ -279,16 +279,16 @@ public abstract class GadgetHtmlParser {
doc.appendChild(html);
return doc;
}
-
+
private void appendParseException(Node node, DOMException e) {
node.appendChild(node.getOwnerDocument().createTextNode(
GadgetException.Code.HTML_PARSE_ERROR.toString() + ": " + e.toString()));
}
-
+
protected boolean shouldCache() {
return documentCache != null && documentCache.getCapacity() != 0;
}
-
+
private void reprocessScriptForOpenSocial(Node root) throws GadgetException {
LinkedList<Node> nodeQueue = Lists.newLinkedList();
nodeQueue.add(root);
@@ -327,7 +327,7 @@ public abstract class GadgetHtmlParser {
}
}
}
-
+
// Enqueue children for inspection.
NodeList children = next.getChildNodes();
for (int i = 0; i < children.getLength(); ++i) {
@@ -335,7 +335,7 @@ public abstract class GadgetHtmlParser {
}
}
}
-
+
/**
* TODO: remove the need for parseDomImpl as a parsing method. Gadget HTML is
* tag soup handled in custom fashion, or is a legitimate fragment. In either case,
@@ -352,7 +352,7 @@ public abstract class GadgetHtmlParser {
* @return a DocumentFragment containing the parsed elements
* @throws GadgetException
*/
- protected abstract DocumentFragment parseFragmentImpl(String source)
+ protected abstract DocumentFragment parseFragmentImpl(String source)
throws GadgetException;
private static class DefaultSerializerProvider implements Provider<HtmlSerializer> {
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssLexerParser.java Fri Jun 18 23:36:47 2010
@@ -69,7 +69,7 @@ public class CajaCssLexerParser {
String key = null;
if (shouldCache) {
// TODO - Consider using the source if its under a certain size
- key = HashUtil.rawChecksum(content.getBytes());
+ key = HashUtil.checksum(content.getBytes());
parsedCss = parsedCssCache.getElement(key);
}
if (parsedCss == null) {
@@ -183,6 +183,7 @@ public class CajaCssLexerParser {
this.uri = uri;
}
+ @Override
public String toString() {
return "@import url('" + uri + "');\n";
}
@@ -204,6 +205,7 @@ public class CajaCssLexerParser {
this.uri = uri;
}
+ @Override
public String toString() {
return "url('" + uri + "')";
}
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java Fri Jun 18 23:36:47 2010
@@ -77,7 +77,7 @@ public class CajaCssParser {
String key = null;
if (shouldCache) {
// TODO - Consider using the source if its under a certain size
- key = HashUtil.rawChecksum(content.getBytes());
+ key = HashUtil.checksum(content.getBytes());
parsedCss = parsedCssCache.getElement(key);
}
if (parsedCss == null) {
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java Fri Jun 18 23:36:47 2010
@@ -65,7 +65,7 @@ public class CajaContentRewriter impleme
public static final String CAJOLED_DOCUMENTS = "cajoledDocuments";
private static final Logger LOG = Logger.getLogger(CajaContentRewriter.class.getName());
-
+
private final Cache<String, Element> cajoledCache;
private final RequestPipeline requestPipeline;
private final HtmlSerializer htmlSerializer;
@@ -81,25 +81,25 @@ public class CajaContentRewriter impleme
public void rewrite(Gadget gadget, MutableContent mc) {
if (!cajaEnabled(gadget)) return;
-
+
Document doc = mc.getDocument();
-
+
// Serialize outside of MutableContent, to prevent a re-parse.
String docContent = HtmlSerialization.serialize(doc);
- String cacheKey = HashUtil.rawChecksum(docContent.getBytes());
+ String cacheKey = HashUtil.checksum(docContent.getBytes());
Node root = doc.createDocumentFragment();
root.appendChild(doc.getDocumentElement());
-
+
Node cajoledData = null;
if (cajoledCache != null) {
Element cajoledOutput = cajoledCache.getElement(cacheKey);
if (cajoledOutput != null) {
cajoledData = doc.adoptNode(cajoledOutput);
createContainerFor(doc, cajoledData);
- mc.documentChanged();
+ mc.documentChanged();
}
}
-
+
if (cajoledData == null) {
UriFetcher fetcher = makeFetcher(gadget);
UriPolicy policy = makePolicy(gadget);
@@ -109,23 +109,23 @@ public class CajaContentRewriter impleme
DefaultGadgetRewriter rw = new DefaultGadgetRewriter(bi, mq);
InputSource is = new InputSource(javaGadgetUri);
boolean safe = false;
-
+
try {
Pair<Node, Element> htmlAndJs =
rw.rewriteContent(javaGadgetUri, root, fetcher, policy, null);
Node html = htmlAndJs.a;
Element script = htmlAndJs.b;
-
+
Element 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));
-
- Element messagesNode = formatErrors(doc, is, docContent, mq,
+
+ Element messagesNode = formatErrors(doc, is, docContent, mq,
/* is invisible */ false);
cajoledOutput.appendChild(messagesNode);
if (cajoledCache != null) {
@@ -140,7 +140,7 @@ public class CajaContentRewriter impleme
} catch (GadgetRewriteException e) {
// There were cajoling errors
// Content is only used to produce useful snippets with error messages
- createContainerFor(doc,
+ createContainerFor(doc,
formatErrors(doc, is, docContent, mq, true /* visible */));
logException(e, mq);
safe = true;
@@ -153,12 +153,12 @@ public class CajaContentRewriter impleme
}
}
}
-
+
private boolean cajaEnabled(Gadget gadget) {
return (gadget.getAllFeatures().contains("caja") ||
"1".equals(gadget.getContext().getParameter("caja")));
}
-
+
private UriFetcher makeFetcher(Gadget gadget) {
final Uri gadgetUri = gadget.getContext().getUrl();
final String container = gadget.getContext().getContainer();
@@ -231,7 +231,7 @@ public class CajaContentRewriter impleme
// Ignore LINT messages
if (MessageLevel.LINT.compareTo(msg.getMessageLevel()) <= 0) {
String snippet = sp.getSnippet(msg);
- String messageText = msg.getMessageLevel().name() + ' ' +
+ String messageText = msg.getMessageLevel().name() + ' ' +
html(msg.format(mc)) + ':' + snippet;
Element li = doc.createElement("li");
li.appendChild(doc.createTextNode(messageText));
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java?rev=956154&r1=956153&r2=956154&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java Fri Jun 18 23:36:47 2010
@@ -40,7 +40,7 @@ import com.google.inject.Inject;
*/
public class TemplateLibraryFactory {
private static final String PARSED_XML_CACHE = "parsedXml";
-
+
private final RequestPipeline pipeline;
private final Cache<String, Element> parsedXmlCache;
@@ -54,7 +54,7 @@ public class TemplateLibraryFactory {
this.parsedXmlCache = cacheProvider.createCache(PARSED_XML_CACHE);
}
}
-
+
public TemplateLibrary loadTemplateLibrary(GadgetContext context, Uri uri) throws GadgetException {
HttpRequest request = new HttpRequest(uri);
// 5 minute TTL.
@@ -63,27 +63,27 @@ public class TemplateLibraryFactory {
if (response.getHttpStatusCode() != HttpResponse.SC_OK) {
int retcode = response.getHttpStatusCode();
if (retcode == HttpResponse.SC_INTERNAL_SERVER_ERROR) {
- // Convert external "internal error" to gateway error:
+ // Convert external "internal error" to gateway error:
retcode = HttpResponse.SC_BAD_GATEWAY;
}
throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
"Unable to retrieve template library xml. HTTP error " +
- response.getHttpStatusCode(), retcode);
+ response.getHttpStatusCode(), retcode);
}
-
+
String content = response.getResponseAsString();
try {
String key = null;
Element element = null;
if (!context.getIgnoreCache()) {
try {
- key = HashUtil.rawChecksum(content.getBytes("UTF-8"));
+ key = HashUtil.checksum(content.getBytes("UTF-8"));
element = parsedXmlCache.getElement(key);
} catch (UnsupportedEncodingException e) {
// this won't happen, but if it does, cache won't be used.
}
}
-
+
if (element == null) {
element = XmlUtil.parse(content);
if (key != null) {
@@ -97,5 +97,5 @@ public class TemplateLibraryFactory {
HttpResponse.SC_BAD_REQUEST);
}
}
-
+
}