Author: lryan
Date: Wed Nov 19 16:49:11 2008
New Revision: 719144
URL: http://svn.apache.org/viewvc?rev=719144&view=rev
Log:
Fix NullPointerException reading non existent attribute on script tags.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DomUtil.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DomUtil.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DomUtil.java?rev=719144&r1=719143&r2=719144&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DomUtil.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DomUtil.java
Wed Nov 19 16:49:11 2008
@@ -19,7 +19,9 @@
package org.apache.shindig.gadgets.parse;
import com.google.common.collect.Lists;
+
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
@@ -46,9 +48,9 @@
return null;
}
- public static List<Node> getElementsByTagNameCaseInsensitive(Document doc,
+ public static List<Element> getElementsByTagNameCaseInsensitive(Document doc,
final Set<String> lowerCaseNames) {
- final List<Node> result = Lists.newArrayList();
+ final List<Element> result = Lists.newArrayList();
NodeIterator nodeIterator = ((DocumentTraversal) doc)
.createNodeIterator(doc, NodeFilter.SHOW_ELEMENT,
new NodeFilter() {
@@ -60,7 +62,7 @@
}
}, false);
for (Node n = nodeIterator.nextNode(); n != null ; n =
nodeIterator.nextNode()) {
- result.add(n);
+ result.add((Element)n);
}
return result;
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java?rev=719144&r1=719143&r2=719144&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
Wed Nov 19 16:49:11 2008
@@ -115,22 +115,23 @@
}
// Get ALL interesting tags
- List<Node> nodeList =
+ List<Element> tagList =
DomUtil.getElementsByTagNameCaseInsensitive(content.getDocument(),
TAGS);
- Node head =
DomUtil.getFirstNamedChildNode(content.getDocument().getDocumentElement(),
"head");
+ Element head = (Element)DomUtil.getFirstNamedChildNode(
+ content.getDocument().getDocumentElement(), "head");
boolean mutated = false;
// 1st step. Rewrite links in all embedded style tags. Convert @import
statements into
- // links and add them to the node list.
+ // links and add them to the tag list.
// Move all style and link tags into head and concat the link tags
- mutated = rewriteStyleTags(head, nodeList, feature, gadgetUri,
contentBase);
+ mutated = rewriteStyleTags(head, tagList, feature, gadgetUri, contentBase);
// Concat script links
- mutated |= rewriteJsTags(nodeList, feature, gadgetUri, contentBase);
+ mutated |= rewriteJsTags(tagList, feature, gadgetUri, contentBase);
// Rewrite links in images, embeds etc
- mutated |= rewriteContentReferences(nodeList, feature, gadgetUri,
contentBase);
+ mutated |= rewriteContentReferences(tagList, feature, gadgetUri,
contentBase);
if (mutated) {
MutableContent.notifyEdit(content.getDocument());
@@ -139,7 +140,7 @@
return RewriterResults.cacheableIndefinitely();
}
- protected boolean rewriteStyleTags(Node head, List<Node> nodeList,
+ protected boolean rewriteStyleTags(Element head, List<Element> elementList,
ContentRewriterFeature feature, Uri gadgetUri, Uri contentBase) {
if (!feature.getIncludedTags().contains("style")) {
return false;
@@ -147,21 +148,22 @@
boolean mutated = false;
// Filter to just style tags
- Iterable<Node> styleTags = Lists.newArrayList(Iterables.filter(nodeList,
new Predicate<Node>() {
- public boolean apply(@Nullable Node node) {
- return node.getNodeName().equalsIgnoreCase("style");
+ Iterable<Element> styleTags =
Lists.newArrayList(Iterables.filter(elementList,
+ new Predicate<Element>() {
+ public boolean apply(@Nullable Element element) {
+ return element.getNodeName().equalsIgnoreCase("style");
}
}));
LinkRewriter linkRewriter = createLinkRewriter(gadgetUri, feature);
- for (Node styleNode : styleTags) {
+ for (Element styleTag : styleTags) {
mutated |= true;
- if (styleNode.getParentNode() != head) {
- styleNode.getParentNode().removeChild(styleNode);
- head.appendChild(styleNode);
+ if (styleTag.getParentNode() != head) {
+ styleTag.getParentNode().removeChild(styleTag);
+ head.appendChild(styleTag);
}
- String styleText = styleNode.getTextContent();
+ String styleText = styleTag.getTextContent();
StringWriter sw = new StringWriter(styleText.length());
List<String> extractedUrls = CssRewriter.rewrite(new
StringReader(styleText),
contentBase, linkRewriter, sw, true);
@@ -169,10 +171,10 @@
if (styleText.length() == 0 || (styleText.length() < 25 &&
styleText.replace("<!--", "").replace("//-->", "").
replace("-->", "").trim().length() == 0)) {
- styleNode.getParentNode().removeChild(styleNode);
- nodeList.remove(styleNode);
+ styleTag.getParentNode().removeChild(styleTag);
+ elementList.remove(styleTag);
} else {
- styleNode.setTextContent(styleText);
+ styleTag.setTextContent(styleText);
}
for (String extractedUrl : extractedUrls) {
// Add extracted urls as link elements to head
@@ -181,20 +183,19 @@
newLink.setAttribute("type", "text/css");
newLink.setAttribute("href", extractedUrl);
head.appendChild(newLink);
- nodeList.add(newLink);
+ elementList.add(newLink);
}
}
// Filter to just stylesheet link tags
- List<Node> linkTags = Lists.newArrayList(Iterables.filter(nodeList, new
Predicate<Node>() {
- public boolean apply(@Nullable Node node) {
- return node.getNodeName().equalsIgnoreCase("link") &&
- (node.getAttributes().getNamedItem("rel").
- getNodeValue().equalsIgnoreCase("stylesheet") ||
- node.getAttributes().getNamedItem("type").
- getNodeValue().toLowerCase().contains("css"));
- }
- }));
+ List<Element> linkTags = Lists.newArrayList(Iterables.filter(elementList,
+ new Predicate<Element>() {
+ public boolean apply(@Nullable Element element) {
+ return element.getNodeName().equalsIgnoreCase("link") &&
+ ("stylesheet".equalsIgnoreCase(element.getAttribute("rel")) ||
+
element.getAttribute("type").toLowerCase().contains("css"));
+ }
+ }));
String concatBase = getConcatBase(gadgetUri.toJavaUri(), feature,
"text/css");
@@ -216,7 +217,7 @@
"&fp=" + feature.getFingerprint() +'&';
}
- protected boolean rewriteJsTags(List<Node> nodeList, ContentRewriterFeature
feature,
+ protected boolean rewriteJsTags(List<Element> elementList,
ContentRewriterFeature feature,
Uri gadgetUri, Uri contentBase) {
if (!feature.getIncludedTags().contains("script")) {
return false;
@@ -224,22 +225,23 @@
boolean mutated = false;
// Filter to just script tags
- List<Node> scriptNodes = Lists.newArrayList(Iterables.filter(nodeList, new
Predicate<Node>() {
- public boolean apply(@Nullable Node node) {
+ List<Element> scriptTags = Lists.newArrayList(Iterables.filter(elementList,
+ new Predicate<Element>() {
+ public boolean apply(@Nullable Element node) {
return node.getNodeName().equalsIgnoreCase("script");
}
}));
String concatBase = getConcatBase(gadgetUri.toJavaUri(), feature,
"text/javascript");
- List<Node> concatenateable = new ArrayList<Node>();
- for (int i = 0; i < scriptNodes.size(); i++) {
- Node scriptTag = scriptNodes.get(i);
- Node nextSciptTag = null;
- if (i + 1 < scriptNodes.size()) {
- nextSciptTag = scriptNodes.get(i+1);
+ List<Element> concatenateable = new ArrayList<Element>();
+ for (int i = 0; i < scriptTags.size(); i++) {
+ Element scriptTag = scriptTags.get(i);
+ Element nextSciptTag = null;
+ if (i + 1 < scriptTags.size()) {
+ nextSciptTag = scriptTags.get(i+1);
}
- Node src = scriptTag.getAttributes().getNamedItem("src");
- if (src != null && feature.shouldRewriteURL(src.getNodeValue())) {
+ if (scriptTag.hasAttribute("src") &&
+ feature.shouldRewriteURL(scriptTag.getAttribute("src"))) {
mutated = true;
concatenateable.add(scriptTag);
if (nextSciptTag == null ||
@@ -257,8 +259,8 @@
return mutated;
}
- protected boolean rewriteContentReferences(List<Node> nodeList,
ContentRewriterFeature feature,
- Uri gadgetUri, Uri contentBase) {
+ protected boolean rewriteContentReferences(List<Element> elementList,
+ ContentRewriterFeature feature, Uri gadgetUri, Uri contentBase) {
boolean mutated = false;
LinkRewriter rewriter = createLinkRewriter(gadgetUri, feature);
@@ -266,13 +268,13 @@
tagNames.retainAll(feature.getIncludedTags());
// Filter to just style tags
- Iterable<Node> tags = Iterables.filter(nodeList, new Predicate<Node>() {
- public boolean apply(@Nullable Node node) {
+ Iterable<Element> tags = Iterables.filter(elementList, new
Predicate<Element>() {
+ public boolean apply(@Nullable Element node) {
return tagNames.contains(node.getNodeName().toLowerCase());
}
});
- for (Node node : tags) {
+ for (Element node : tags) {
NamedNodeMap attributes = node.getAttributes();
Set<String> rewriteable =
LINKING_TAG_ATTRS.get(node.getNodeName().toLowerCase());
for (int i = 0; i < attributes.getLength(); i++) {
@@ -287,23 +289,20 @@
}
private static void concatenateTags(final ContentRewriterFeature feature,
- List<Node> tags, String concatBase, Uri
contentBase,
+ List<Element> tags, String concatBase, Uri
contentBase,
final String attr) {
// Filter out excluded URLs
- tags = Lists.newArrayList(Iterables.filter(tags, new Predicate<Node>() {
- public boolean apply(@Nullable Node node) {
- Node item = node.getAttributes().getNamedItem(attr);
- return (item != null && feature.shouldRewriteURL(item.getNodeValue()));
+ tags = Lists.newArrayList(Iterables.filter(tags, new Predicate<Element>() {
+ public boolean apply(@Nullable Element element) {
+ return (element.hasAttribute(attr) &&
feature.shouldRewriteURL(element.getAttribute(attr)));
}
}));
// Eliminate duplicates while maintaining order
LinkedHashSet<Uri> nodeRefList = Sets.newLinkedHashSet();
- for (Node tag : tags) {
+ for (Element tag : tags) {
try {
- nodeRefList.add(
- contentBase.resolve(
-
Uri.parse(tag.getAttributes().getNamedItem(attr).getNodeValue())));
+
nodeRefList.add(contentBase.resolve(Uri.parse(tag.getAttribute(attr))));
} catch (IllegalArgumentException e) {
// Same behavior as JavascriptTagMerger
// Perhaps switch to ignoring script src instead?
@@ -315,8 +314,7 @@
for (int i = 0; i < tags.size(); i++) {
if (i < concatented.size()) {
// Set new URLs into existing tags
- tags.get(i).getAttributes().getNamedItem(attr).setNodeValue(
- concatented.get(i).toString());
+ tags.get(i).setAttribute(attr, concatented.get(i).toString());
} else {
// Remove remainder
tags.get(i).getParentNode().removeChild(tags.get(i));
@@ -357,12 +355,12 @@
}
- private Node getNextSiblingElement(Node n) {
+ private Element getNextSiblingElement(Element elem) {
+ Node n = elem;
n = n.getNextSibling();
while (n != null && n.getNodeType() != Node.ELEMENT_NODE) {
n = n.getNextSibling();
}
- return n;
+ return (Element)n;
}
-
}