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);
     }
   }
-  
+
 }