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();