Author: rbaxter85
Date: Mon Feb  3 02:08:35 2014
New Revision: 1563756

URL: http://svn.apache.org/r1563756
Log:
Null pointer exception in gadget template processing
SHINDIG-1893
Committed For ChunYan Zhang
https://reviews.apache.org/r/17228/

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibraryFactory.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java?rev=1563756&r1=1563755&r2=1563756&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
 Mon Feb  3 02:08:35 2014
@@ -122,16 +122,23 @@ public class DefaultTemplateProcessor im
         new TemplateELResolver(templateContext),
         new ElementELResolver());
 
-    DocumentFragment result = 
template.getOwnerDocument().createDocumentFragment();
-    processChildNodes(result, template);
+    DocumentFragment result = null;
+    synchronized (template) {
+      result = template.getOwnerDocument().createDocumentFragment();
+      processChildNodes(result, template);
+    }
     return result;
   }
 
   /** Process the children of an element or document. */
   public void processChildNodes(Node result, Node source) {
-    NodeList nodes = source.getChildNodes();
-    for (int i = 0; i < nodes.getLength(); i++) {
-      processNode(result, nodes.item(i));
+    Node current = null;
+    synchronized (source) {
+      current = source.getFirstChild();
+      while (current != null) {
+        processNode(result, current);
+        current = current.getNextSibling();
+      }
     }
   }
 
@@ -167,6 +174,9 @@ public class DefaultTemplateProcessor im
    * @param textContent the text content being processed
    */
   private void processText(Node result, String textContent) {
+    if (textContent == null) {
+      return;
+    }
     Document ownerDocument = result.getOwnerDocument();
 
     int start = 0;
@@ -235,16 +245,18 @@ public class DefaultTemplateProcessor im
    * Process repeater state, if needed, on an element.
    */
   private void processElement(final Node result, final Element element) {
-    Attr repeat = element.getAttributeNode(ATTRIBUTE_REPEAT);
-    if (repeat != null) {
-      Iterable<?> dataList = evaluate(repeat.getValue(), Iterable.class, null);
-      processRepeat(result, element, dataList, new Runnable() {
-        public void run() {
-          processElementInner(result, element);
-        }
-      });
-    } else {
-      processElementInner(result, element);
+    synchronized (element) {
+      Attr repeat = element.getAttributeNode(ATTRIBUTE_REPEAT);
+      if (repeat != null) {
+        Iterable<?> dataList = evaluate(repeat.getValue(), Iterable.class, 
null);
+        processRepeat(result, element, dataList, new Runnable() {
+          public void run() {
+            processElementInner(result, element);
+          }
+        });
+      } else {
+        processElementInner(result, element);
+      }
     }
   }
 
@@ -347,7 +359,9 @@ public class DefaultTemplateProcessor im
       // document before being adopted by the target document.
       Element resultNode;
       if (element.getOwnerDocument() != result.getOwnerDocument()) {
-        resultNode = (Element)result.getOwnerDocument().importNode(element, 
false);
+        synchronized (element) {
+          resultNode = (Element)result.getOwnerDocument().importNode(element, 
false);
+        }
       } else {
         resultNode = (Element)element.cloneNode(false);
       }

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=1563756&r1=1563755&r2=1563756&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
 Mon Feb  3 02:08:35 2014
@@ -87,8 +87,9 @@ public class TemplateLibraryFactory {
           parsedXmlCache.addElement(key, element);
         }
       }
-
-      return new XmlTemplateLibrary(uri, element, content);
+      synchronized(element){
+        return new XmlTemplateLibrary(uri, element, content);
+      }
     } catch (XmlException e) {
       throw new GadgetException(GadgetException.Code.MALFORMED_XML_DOCUMENT, e,
           HttpResponse.SC_BAD_REQUEST);

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java?rev=1563756&r1=1563755&r2=1563756&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
 Mon Feb  3 02:08:35 2014
@@ -130,15 +130,13 @@ public class XmlTemplateLibrary implemen
 
   private Set<TagHandler> parseLibraryDocument(Element root) throws 
GadgetException {
     ImmutableSet.Builder<TagHandler> handlers = ImmutableSet.builder();
-
-    NodeList nodes = root.getChildNodes();
-    for (int i = 0; i < nodes.getLength(); i++) {
-      Node node = nodes.item(i);
-      if (!(node instanceof Element)) {
+    Node childNode = root.getFirstChild();
+    while(childNode != null) {
+      if (!(childNode instanceof Element)) {
+        childNode = childNode.getNextSibling();
         continue;
       }
-
-      Element element = (Element) node;
+      Element element = (Element) childNode;
       if (NAMESPACE_TAG.equals(element.getLocalName())) {
         processNamespace(element);
       } else if (STYLE_TAG.equals(element.getLocalName())) {
@@ -150,6 +148,7 @@ public class XmlTemplateLibrary implemen
       } else if (TEMPLATEDEF_TAG.equals(element.getLocalName())) {
         processTemplateDef(handlers, element);
       }
+      childNode = childNode.getNextSibling();
     }
 
     return handlers.build();
@@ -157,11 +156,13 @@ public class XmlTemplateLibrary implemen
 
   private void processTemplateDef(Builder<TagHandler> handlers, Element 
defElement)
       throws TemplateParserException {
-    Attr tagAttribute = defElement.getAttributeNode(TAG_ATTRIBUTE);
-    if (tagAttribute == null) {
-      throw new TemplateParserException("Missing tag attribute on 
TemplateDef");
+    Attr tagAttribute = null;
+    synchronized (defElement) {
+      tagAttribute =  defElement.getAttributeNode(TAG_ATTRIBUTE);
+      if (tagAttribute == null) {
+        throw new TemplateParserException("Missing tag attribute on 
TemplateDef");
+      }
     }
-
     ImmutableSet.Builder<TemplateResource> resources = ImmutableSet.builder();
 
     Element scriptElement = (Element) 
DomUtil.getFirstNamedChildNode(defElement, JAVASCRIPT_TAG);
@@ -216,15 +217,16 @@ public class XmlTemplateLibrary implemen
     if ((nsPrefix != null) || (nsUri != null)) {
       throw new TemplateParserException("Duplicate Namespace elements");
     }
+    synchronized (namespaceNode) {
+      nsPrefix = namespaceNode.getAttribute("prefix");
+      if ("".equals(nsPrefix)) {
+        throw new TemplateParserException("Missing prefix attribute on 
Namespace");
+      }
 
-    nsPrefix = namespaceNode.getAttribute("prefix");
-    if ("".equals(nsPrefix)) {
-      throw new TemplateParserException("Missing prefix attribute on 
Namespace");
-    }
-
-    nsUri = namespaceNode.getAttribute("url");
-    if ("".equals(nsUri)) {
-      throw new TemplateParserException("Missing url attribute on Namespace");
+      nsUri = namespaceNode.getAttribute("url");
+      if ("".equals(nsUri)) {
+        throw new TemplateParserException("Missing url attribute on 
Namespace");
+      }
     }
   }
 
@@ -236,7 +238,10 @@ public class XmlTemplateLibrary implemen
     if (nameParts.length != 2) {
       return null;
     }
-    String namespaceUri = template.lookupNamespaceURI(nameParts[0]);
+    String namespaceUri = "";
+    synchronized (template) {
+      namespaceUri = template.lookupNamespaceURI(nameParts[0]);
+    }
     if (!nsPrefix.equals(nameParts[0]) || !nsUri.equals(namespaceUri)) {
       throw new TemplateParserException(
           "Can't create tags in undeclared namespace: " + nameParts[0]);
@@ -259,12 +264,12 @@ public class XmlTemplateLibrary implemen
    */
   private void bypassTemplateSanitization(Element template) {
     SanitizingGadgetRewriter.bypassSanitization(template, false);
-    NodeList children = template.getChildNodes();
-    for (int i = 0; i < children.getLength(); i++) {
-      Node node = children.item(i);
-      if (node instanceof Element) {
-        bypassTemplateSanitization((Element) node);
+    Node childNode = template.getFirstChild();
+    while(childNode != null) {
+      if (childNode instanceof Element) {
+        bypassTemplateSanitization((Element) childNode);
       }
+      childNode = childNode.getNextSibling();
     }
   }
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java?rev=1563756&r1=1563755&r2=1563756&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
 Mon Feb  3 02:08:35 2014
@@ -192,12 +192,12 @@ public class FlashTagHandler extends Abs
   void ensureSwfobject(Document doc, TemplateProcessor processor) {
     // TODO: This should probably be a function of the rewriter.
     Element head = (Element) 
DomUtil.getFirstNamedChildNode(doc.getDocumentElement(), "head");
-    NodeList childNodes = head.getChildNodes();
-    for (int i = 0; i < childNodes.getLength(); i++) {
-      Node node = childNodes.item(i);
-      if (node.getUserData(SWFOBJECT) != null) {
+    Node childNode = head.getFirstChild();
+    while(childNode != null) {
+      if (childNode.getUserData(SWFOBJECT) != null) {
         return;
       }
+      childNode = childNode.getNextSibling();
     }
     Element swfobject = doc.createElement("script");
     swfobject.setAttribute("type", "text/javascript");

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java?rev=1563756&r1=1563755&r2=1563756&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
 Mon Feb  3 02:08:35 2014
@@ -65,7 +65,9 @@ public class TemplateBasedTagHandler ext
 
   /** Process the template content in the new EL state */
   protected void processTemplate(Node result, Element tagInstance, 
TemplateProcessor processor) {
-    processor.processChildNodes(result, templateDefinition);
+    synchronized (result) {
+      processor.processChildNodes(result, templateDefinition);
+    }
   }
 
   /**
@@ -74,25 +76,26 @@ public class TemplateBasedTagHandler ext
   protected Map<String, Object> computeMy(Element tagInstance, Node 
processedContent,
       TemplateProcessor processor) {
     Map<String, Object> myMap = Maps.newHashMap();
-
-    NodeList children = processedContent.getChildNodes();
-
-    for (int i = 0;  i < children.getLength(); i++) {
-      Node child = children.item(i);
-      if (child instanceof Element) {
-        Element el = (Element) child;
+    Node clonedSource;
+    synchronized (processedContent) {
+      clonedSource = processedContent.cloneNode(true);
+    }
+    int children = clonedSource.getChildNodes().getLength();
+    Node childNode = clonedSource.getFirstChild();
+    while(childNode != null) {
+      if (childNode instanceof Element) {
+        Element el = (Element) childNode;
         String name = el.getLocalName();
         // TODO: why???  There should always be a local name.
         if (name == null) {
           name = el.getNodeName();
         }
-
         ElementWrapper wrapper = new ElementWrapper(el);
         Object previous = myMap.get(name);
         if (previous == null) {
           myMap.put(name, wrapper);
         } else if (previous instanceof ElementWrapper) {
-          List<ElementWrapper> bucket = 
Lists.newArrayListWithCapacity(children.getLength());
+          List<ElementWrapper> bucket = 
Lists.newArrayListWithCapacity(children);
           bucket.add((ElementWrapper) previous);
           bucket.add(wrapper);
           myMap.put(name, bucket);
@@ -103,6 +106,7 @@ public class TemplateBasedTagHandler ext
            bucket.add(wrapper);
         }
       }
+      childNode = childNode.getNextSibling();
     }
 
     NamedNodeMap atts = tagInstance.getAttributes();


Reply via email to