Author: nbelaevski
Date: 2008-11-06 18:29:40 -0500 (Thu, 06 Nov 2008)
New Revision: 11052
Removed:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXEndElementEvent.java
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXStartElementEvent.java
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXTextEvent.java
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ResponseWriterContentHandler.java
trunk/framework/impl/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/HtmlParser.java
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/nekko/NekkoParser.java
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/tidy/TidyParser.java
trunk/framework/impl/src/test/java/org/ajax4jsf/io/parser/FastParserTest.java
Log:
Parsers: Head SAX Events changed to Node
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ResponseWriterContentHandler.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ResponseWriterContentHandler.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/ResponseWriterContentHandler.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -21,9 +21,7 @@
package org.ajax4jsf.context;
-import java.util.ArrayList;
-import java.util.List;
-
+import javax.faces.FacesException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -51,8 +49,7 @@
node = document.createElement("head");
document.appendChild(node);
} catch (ParserConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ throw new FacesException(e.getLocalizedMessage(), e);
}
this.linkClass = linkClass;
Deleted: trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXEndElementEvent.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXEndElementEvent.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXEndElementEvent.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -1,49 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.ajax4jsf.context;
-
-
-/**
- * Created 19.07.2008
- * @author Nick Belaevski
- * @since 3.2.2
- */
-
-public class SAXEndElementEvent {
-
- private String name;
-
- public SAXEndElementEvent(String name) {
- super();
-
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "</" + name + ">";
- }
-}
Deleted:
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXStartElementEvent.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXStartElementEvent.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXStartElementEvent.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -1,80 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.ajax4jsf.context;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created 19.07.2008
- * @author Nick Belaevski
- * @since 3.2.2
- */
-
-public class SAXStartElementEvent {
-
- private String name;
-
- private Map<String, String> attributes;
-
- /**
- * Constructor that parses string into map for usage in unit tests
- * @param name
- * @param attributesString
- */
- public SAXStartElementEvent(String name, String attributesString) {
- super();
- this.name = name;
-
- Map<String, String> attributes = null;
- if (attributesString != null) {
- attributes = new HashMap<String, String>();
- String[] split = attributesString.split(",");
- for (String s : split) {
- String[] split2 = s.split("=");
-
- attributes.put(split2[0], split2[1]);
- }
- }
-
- this.attributes = attributes;
- }
-
- public SAXStartElementEvent(String name, Map<String, String> attributes) {
- super();
- this.name = name;
- this.attributes = attributes;
- }
-
- public String getName() {
- return name;
- }
-
- public Map<String, String> getAttributes() {
- return attributes;
- }
-
- @Override
- public String toString() {
- return "<" + name + " " + attributes + " >";
- }
-}
Deleted: trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXTextEvent.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXTextEvent.java 2008-11-06
19:11:19 UTC (rev 11051)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/context/SAXTextEvent.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -1,46 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.ajax4jsf.context;
-
-/**
- * Created 19.07.2008
- * @author Nick Belaevski
- * @since 3.2.2
- */
-
-public class SAXTextEvent {
- private String text;
-
- public SAXTextEvent(String text) {
- super();
- this.text = text;
- }
-
- public String getText() {
- return text;
- }
-
- @Override
- public String toString() {
- return "'" + text + "'";
- }
-}
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -27,16 +27,19 @@
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Field;
-import java.util.LinkedList;
-import java.util.Map;
-import org.ajax4jsf.context.SAXEndElementEvent;
-import org.ajax4jsf.context.SAXStartElementEvent;
-import org.ajax4jsf.context.SAXTextEvent;
import org.ajax4jsf.io.FastBufferReader;
import org.ajax4jsf.webapp.HtmlParser;
+import org.ajax4jsf.xml.serializer.Method;
+import org.ajax4jsf.xml.serializer.OutputPropertiesFactory;
+import org.ajax4jsf.xml.serializer.Serializer;
+import org.ajax4jsf.xml.serializer.SerializerFactory;
+import org.ajax4jsf.xml.serializer.TreeWalker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Node;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
/**
* Simplified and fast HTML parsed - for find insertion point of
<html><head>
@@ -57,7 +60,7 @@
private String mimeType;
- private Object[] headEvents;
+ private Node[] headEvents;
public void parse(Reader in, Writer out) throws IOException {
boolean haveHtml = false;
@@ -183,62 +186,25 @@
}
if (headEvents != null && headEvents.length > 0) {
- LinkedList<Boolean> closedStack = new LinkedList<Boolean>();
+ Serializer serializer = SerializerFactory.getSerializer(
+ OutputPropertiesFactory.getDefaultMethodProperties(Method.XHTML));
- for (Object event : headEvents) {
- if (event instanceof SAXStartElementEvent) {
- SAXStartElementEvent startElementEvent = (SAXStartElementEvent) event;
+ serializer.setWriter(out);
+
+ ContentHandler contentHandler = serializer.asContentHandler();
+ TreeWalker walker = new TreeWalker(contentHandler);
- if (!closedStack.isEmpty() && Boolean.FALSE.equals(closedStack.peek())) {
- out.write('>');
- closedStack.set(0, Boolean.TRUE);
- }
-
- out.write('<');
- out.write(startElementEvent.getName());
-
- for (Map.Entry<String, String> entry :
startElementEvent.getAttributes().entrySet()) {
- String name = entry.getKey();
- String value = entry.getValue();
- out.write(' ');
- out.write(name);
- out.write("='");
- out.write(value);
- out.write('\'');
- }
-
- closedStack.addFirst(Boolean.FALSE);
- } else if (event instanceof SAXTextEvent) {
- SAXTextEvent textEvent = (SAXTextEvent) event;
-
- if (!closedStack.isEmpty() && Boolean.FALSE.equals(closedStack.peek())) {
- out.write('>');
- closedStack.set(0, Boolean.TRUE);
- }
-
- out.write(textEvent.getText());
-
- } else if (event instanceof SAXEndElementEvent) {
- SAXEndElementEvent endElementEvent = (SAXEndElementEvent) event;
- String elementName = endElementEvent.getName();
-
- if (Boolean.FALSE.equals(closedStack.removeFirst())) {
- if ("script".equals(elementName)) {
- out.write('>');
- out.write("</");
- out.write(elementName);
- out.write('>');
- } else {
- out.write(" />");
- }
- } else {
- out.write("</");
- out.write(elementName);
- out.write('>');
- }
- } else {
- throw new IllegalArgumentException();
+ try {
+ contentHandler.startDocument();
+
+ for (Node node : headEvents) {
+ walker.traverseFragment(node);
}
+
+ contentHandler.endDocument();
+
+ } catch (SAXException e) {
+ throw new IOException(e.getMessage());
}
}
@@ -286,7 +252,7 @@
return true;
}
- public void setHeadEvents(Object[] events) {
+ public void setHeadNodes(Node[] events) {
this.headEvents = events;
}
}
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java 2008-11-06
19:11:19 UTC (rev 11051)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -45,6 +45,7 @@
import org.ajax4jsf.renderkit.AjaxContainerRenderer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Node;
public abstract class BaseXMLFilter {
public static final String AJAX_EXPIRED = "Ajax-Expired";
@@ -202,7 +203,7 @@
}
String viewId = (String) request
.getAttribute(AjaxViewHandler.VIEW_ID_KEY);
- Object[] headEvents = (Object[]) request
+ Node[] headEvents = (Node[]) request
.getAttribute(AjaxContext.HEAD_EVENTS_PARAMETER);
HtmlParser parser = null;
@@ -359,7 +360,7 @@
try {
// Setup scripts and styles
- parser.setHeadEvents(headEvents);
+ parser.setHeadNodes(headEvents);
// Process parsing.
long startTimeMills = System.currentTimeMillis();
servletResponseWrapper.parseContent(output, parser);
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/HtmlParser.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/HtmlParser.java 2008-11-06
19:11:19 UTC (rev 11051)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/HtmlParser.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -26,6 +26,8 @@
import java.io.Reader;
import java.io.Writer;
+import org.w3c.dom.Node;
+
public interface HtmlParser {
public abstract void parseHtml(InputStream input, Writer output)
@@ -48,7 +50,7 @@
*/
public abstract void setMoveElements(boolean move);
- public abstract void setHeadEvents(Object[] events);
+ public abstract void setHeadNodes(Node[] events);
public abstract void setDoctype(String doctype);
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/nekko/NekkoParser.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/nekko/NekkoParser.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/nekko/NekkoParser.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -26,8 +26,6 @@
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringReader;
-import java.util.LinkedList;
-import java.util.Map;
import java.util.Properties;
import javax.servlet.ServletException;
@@ -36,9 +34,6 @@
import javax.xml.parsers.ParserConfigurationException;
import org.ajax4jsf.application.AjaxViewHandler;
-import org.ajax4jsf.context.SAXEndElementEvent;
-import org.ajax4jsf.context.SAXStartElementEvent;
-import org.ajax4jsf.context.SAXTextEvent;
import org.ajax4jsf.webapp.BaseXMLFilter;
import org.ajax4jsf.webapp.HtmlParser;
import org.ajax4jsf.xml.serializer.Method;
@@ -65,8 +60,12 @@
import org.cyberneko.html.filters.Purifier;
import org.cyberneko.html.filters.Writer;
import org.cyberneko.html.parsers.DOMFragmentParser;
+import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -94,7 +93,7 @@
private DocumentFragment fragment = null;
- private Object[] headEvents;
+ private Node[] headEvents;
private String _viewState;
@@ -416,51 +415,75 @@
super.endElement(element, augs);
}
- private void insertResources(String prefix, String uri) {
- headParsed = true;
-
- if (headEvents != null && headEvents.length > 0) {
- Augmentations augs = null;
- LinkedList<QName> stack = new LinkedList<QName>();
- int depth = 0;
+ private XMLString createXMLString(String string) {
+ char[] cs = string.toCharArray();
+ return new XMLString(cs, 0, cs.length);
+ }
+
+ private void addNode(Node node, String prefix, String uri, Augmentations augs) {
+ switch (node.getNodeType()) {
+ case Node.TEXT_NODE:
+ String charData = ((CharacterData) node).getData();
+ characters(createXMLString(charData), augs);
+
+ break;
- for (Object event : headEvents) {
- if (event instanceof SAXStartElementEvent) {
- SAXStartElementEvent startElementEvent = (SAXStartElementEvent) event;
+ case Node.COMMENT_NODE:
+ charData = ((CharacterData) node).getData();
+ comment(createXMLString(charData), augs);
+
+ break;
+
+ case Node.CDATA_SECTION_NODE:
+ charData = ((CharacterData) node).getData();
+ startCDATA(augs);
+ characters(createXMLString(charData), augs);
+ endCDATA(augs);
- String elementName = startElementEvent.getName();
- QName element = new QName(prefix, elementName, elementName, uri);
- stack.add(element);
+ break;
- XMLAttributes attrs = new XMLAttributesImpl();
- for (Map.Entry<String, String> entry :
startElementEvent.getAttributes().entrySet()) {
-
- String name = entry.getKey();
- String value = entry.getValue();
- attrs.addAttribute(new QName(prefix, name, name, uri), "CDATA", value);
- }
+ case Node.ELEMENT_NODE:
+ QName name = new QName(prefix, node.getNodeName(), node.getNodeName(), uri);
+ XMLAttributes attrs = new XMLAttributesImpl();
+
+ NamedNodeMap attributes = node.getAttributes();
+ if (attributes != null) {
+ int l = attributes.getLength();
+
+ for (int i = 0; i < l; i++) {
+ Node attributeNode = attributes.item(i);
+ attrs.addAttribute(new QName(prefix, attributeNode.getNodeName(),
+ attributeNode.getNodeName(), uri), "CDATA",
+ attributeNode.getNodeValue());
+ }
+
+ }
- if (depth++ == 0) {
- augs = new HTMLAugmentations();
- }
+ startElement(name, attrs, augs);
- super.startElement(element, attrs, augs);
- } else if (event instanceof SAXTextEvent) {
- SAXTextEvent textEvent = (SAXTextEvent) event;
+ NodeList childNodes = node.getChildNodes();
+ int nodesLength = childNodes.getLength();
+ for (int i = 0; i < nodesLength; i++) {
+ addNode(childNodes.item(i), prefix, uri, augs);
+ }
+
+ endElement(name, augs);
+
+ break;
+
+ default:
+ throw new IllegalArgumentException("Node type " + node.getNodeType() +
" is not supported!");
+ }
+ }
+
+ private void insertResources(String prefix, String uri) {
+ headParsed = true;
+
+ if (headEvents != null && headEvents.length > 0) {
+ Augmentations augs = new HTMLAugmentations();
- char[] ch = textEvent.getText().toCharArray();
-
- super.characters(new XMLString(ch, 0, ch.length), augs);
-
- } else if (event instanceof SAXEndElementEvent) {
- super.endElement(stack.removeLast(), augs);
-
- if (--depth == 0) {
- augs = null;
- }
- } else {
- throw new IllegalArgumentException();
- }
+ for (Node node : headEvents) {
+ addNode(node, prefix, uri, augs);
}
}
}
@@ -774,7 +797,7 @@
return false;
}
- public void setHeadEvents(Object[] headEvents) {
+ public void setHeadNodes(Node[] headEvents) {
this.headEvents = headEvents;
}
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/tidy/TidyParser.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/tidy/TidyParser.java 2008-11-06
19:11:19 UTC (rev 11051)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/tidy/TidyParser.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -27,14 +27,10 @@
import java.io.Reader;
import java.io.Writer;
import java.util.LinkedList;
-import java.util.Map;
import java.util.Properties;
import org.ajax4jsf.Messages;
import org.ajax4jsf.application.AjaxViewHandler;
-import org.ajax4jsf.context.SAXEndElementEvent;
-import org.ajax4jsf.context.SAXStartElementEvent;
-import org.ajax4jsf.context.SAXTextEvent;
import org.ajax4jsf.org.w3c.tidy.Lexer;
import org.ajax4jsf.org.w3c.tidy.Node;
import org.ajax4jsf.org.w3c.tidy.Tidy;
@@ -43,8 +39,11 @@
import org.ajax4jsf.webapp.HtmlParser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
/**
@@ -64,7 +63,7 @@
private String _outputEncoding;
- private Object[] headEvents;
+ private org.w3c.dom.Node[] headEvents;
private static final String[] _htmlTypes = { "text/html" };
@@ -88,6 +87,63 @@
tidy.setMessageListener(this);
}
+ private org.w3c.dom.Node importNode(Document document, org.w3c.dom.Node node, boolean
recursive) {
+
+ switch (node.getNodeType()) {
+ case org.w3c.dom.Node.ELEMENT_NODE:
+ Element element = document.createElement(node.getNodeName());
+
+ NamedNodeMap attributes = node.getAttributes();
+ if (attributes != null) {
+ int length = attributes.getLength();
+ for (int i = 0; i < length; i++) {
+ element.setAttributeNode((Attr) importNode(
+ document, attributes.item(i), recursive));
+ }
+ }
+
+ if (recursive) {
+ NodeList childNodes = node.getChildNodes();
+ if (childNodes != null) {
+ int length = childNodes.getLength();
+ for (int i = 0; i < length; i++) {
+ element.appendChild(importNode(document, childNodes.item(i), recursive));
+ }
+ }
+ }
+
+ return element;
+
+ case org.w3c.dom.Node.ATTRIBUTE_NODE:
+ Attr attr = document.createAttribute(node.getNodeName());
+ attr.setNodeValue(node.getNodeValue());
+
+ return attr;
+
+ case org.w3c.dom.Node.TEXT_NODE:
+ String charData = ((CharacterData) node).getData();
+
+ return document.createTextNode(charData);
+
+ case org.w3c.dom.Node.CDATA_SECTION_NODE:
+ charData = ((CharacterData) node).getData();
+
+ return document.createCDATASection(charData);
+ case org.w3c.dom.Node.COMMENT_NODE:
+ charData = ((CharacterData) node).getData();
+
+ return document.createComment(charData);
+ case org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE:
+ case org.w3c.dom.Node.DOCUMENT_NODE:
+ case org.w3c.dom.Node.ENTITY_NODE:
+ case org.w3c.dom.Node.ENTITY_REFERENCE_NODE:
+ case org.w3c.dom.Node.NOTATION_NODE:
+ case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
+ default:
+ throw new IllegalArgumentException("Unsupported node type: " +
node.getNodeType());
+ }
+ }
+
/*
* (non-Javadoc)
*
@@ -163,33 +219,9 @@
child = null;
}
- LinkedList<Element> nodesStack = new LinkedList<Element>();
-
- for (Object event : headEvents) {
- if (event instanceof SAXStartElementEvent) {
- SAXStartElementEvent startElement = (SAXStartElementEvent) event;
-
- Element element = document.createElement(startElement.getName());
- for (Map.Entry<String, String> attributeEntry :
startElement.getAttributes().entrySet()) {
- element.setAttribute(attributeEntry.getKey(), attributeEntry.getValue());
- }
-
- if (nodesStack.isEmpty()) {
- head.insertBefore(element, child);
- } else {
- nodesStack.peek().appendChild(element);
- }
- nodesStack.addFirst(element);
-
- } else if (event instanceof SAXTextEvent) {
- SAXTextEvent textEvent = (SAXTextEvent) event;
-
- nodesStack.peek().appendChild(document.createTextNode(textEvent.getText()));
-
- } else if (event instanceof SAXEndElementEvent) {
- nodesStack.removeFirst();
- } else {
- throw new IllegalArgumentException();
+ if (headEvents != null) {
+ for (org.w3c.dom.Node node : headEvents) {
+ head.insertBefore(importNode(document, node, true), child);
}
}
}
@@ -393,7 +425,7 @@
_viewState = viewState;
}
- public void setHeadEvents(Object[] headEvents) {
+ public void setHeadNodes(org.w3c.dom.Node[] headEvents) {
this.headEvents = headEvents;
}
}
Modified: trunk/framework/impl/src/test/java/org/ajax4jsf/io/parser/FastParserTest.java
===================================================================
---
trunk/framework/impl/src/test/java/org/ajax4jsf/io/parser/FastParserTest.java 2008-11-06
19:11:19 UTC (rev 11051)
+++
trunk/framework/impl/src/test/java/org/ajax4jsf/io/parser/FastParserTest.java 2008-11-06
23:29:40 UTC (rev 11052)
@@ -25,10 +25,13 @@
import java.io.StringReader;
import java.io.StringWriter;
+import javax.xml.parsers.DocumentBuilderFactory;
+
import junit.framework.TestCase;
-import org.ajax4jsf.context.SAXEndElementEvent;
-import org.ajax4jsf.context.SAXStartElementEvent;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
public class FastParserTest extends TestCase {
@@ -36,7 +39,7 @@
/*
* Test method for 'org.ajax4jsf.io.parser.FastHtmlParser.parse(Reader,
Writer)'
*/
- public void testParse() {
+ public void testParse() throws Exception {
String toParse="<?xml version=\"1.0\" encoding=\"UTF-8\"
?>\n" +
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
@@ -58,7 +61,7 @@
assertTrue(indexOf3>indexOf2);
}
- public void testParseWithHead() {
+ public void testParseWithHead() throws Exception {
String toParse="<?xml version=\"1.0\" encoding=\"UTF-8\"
?>\n" +
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
@@ -73,7 +76,7 @@
assertTrue(resultString.indexOf("</head>")==resultString.lastIndexOf("</head>"));
}
- public void testParseWithHeadTitle() {
+ public void testParseWithHeadTitle() throws Exception {
String toParse="<?xml version=\"1.0\" encoding=\"UTF-8\"
?>\n" +
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
@@ -95,7 +98,7 @@
assertTrue(resultString.indexOf("</head>")>resultString.lastIndexOf("<link"));
}
- public void testParseWithHeadTitleMeta() {
+ public void testParseWithHeadTitleMeta() throws Exception {
String toParse="<?xml version=\"1.0\" encoding=\"UTF-8\"
?>\n" +
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
@@ -118,22 +121,27 @@
assertTrue(resultString.indexOf("<meta")>resultString.lastIndexOf("</script"));
assertTrue(resultString.indexOf("<meta")>resultString.lastIndexOf("<link"));
}
-
+
/**
* @param toParse
* @return
*/
- private String parseString(String toParse) {
+ private String parseString(String toParse) throws Exception {
FastHtmlParser parser = new FastHtmlParser();
StringReader in = new StringReader(toParse);
StringWriter out = new StringWriter();
- Object[] headEvents = new Object[] {
- new SAXStartElementEvent("script", "src=/some/script.js"),
- new SAXEndElementEvent("script"),
- new SAXStartElementEvent("link", "href=/some/script.js"),
- new SAXEndElementEvent("link")
- };
- parser.setHeadEvents(headEvents);
+ Document document = DocumentBuilderFactory.newInstance().
+ newDocumentBuilder().newDocument();
+
+ Element scriptNode = document.createElement("script");
+ scriptNode.setAttribute("src", "/some/script.js");
+
+ Element linkNode = document.createElement("link");
+ linkNode.setAttribute("href", "/some/script.css");
+
+ parser.setHeadNodes(new Node[] {
+ scriptNode, linkNode
+ });
try {
parser.parse(in,out);
} catch (IOException e) {