Author: gvanmatre Date: Sun May 21 23:03:35 2006 New Revision: 408578 URL: http://svn.apache.org/viewvc?rev=408578&view=rev Log: Added simple namespace support to the clay parser.
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java URL: http://svn.apache.org/viewvc/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java?rev=408578&r1=408577&r2=408578&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java (original) +++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java Sun May 21 23:03:35 2006 @@ -19,6 +19,7 @@ package org.apache.shale.clay.parser; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -260,5 +261,60 @@ this.isComment = isComment; } + + /** + * <p>Finds matching nodes by <code>name</code> searching thru all the children.</p> + */ + public List getNodesByName(String name) { + List nodes = new ArrayList(); + findNodesByName(this, name, nodes); + return nodes; + } + + /** + * <p>Recursively walks down the tree looking for nodes matching the <code>name</code>.</p> + */ + private void findNodesByName(Node node, String name, List nodes) { + if (node.getName() != null && node.getName().equals(name)) + nodes.add(node); + + Iterator ni = node.getChildren().iterator(); + while (ni.hasNext()) { + Node child = (Node) ni.next(); + if (child.getName() != null && child.getName().equals(name)) + nodes.add(child); + if (!child.getChildren().isEmpty()) + findNodesByName(child, name, nodes); + } + + } + + /** + * <p>Walks up the tree looking for a uri namespace matching the <code>prefix</code>. + * A <code>null</code> prefix will search for the default uri namespace.</p> + */ + public String getNamespaceURI(String prefix) { + StringBuffer attributeName = new StringBuffer("xmlns"); + if (prefix != null && prefix.length() > 0) + attributeName.append(":").append(prefix); + + String uri = null; + + if ((uri = (String) attributes.get(attributeName.toString())) != null) { + return uri; + } + + Node parent = getParent(); + while (parent != null) { + if ((uri = (String) parent.getAttributes().get(attributeName.toString())) != null) { + return uri; + } else { + parent = parent.getParent(); + } + } + + + return null; + } } Modified: struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java URL: http://svn.apache.org/viewvc/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java?rev=408578&r1=408577&r2=408578&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java (original) +++ struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java Sun May 21 23:03:35 2006 @@ -694,5 +694,63 @@ nodes.size() == 2); } + + + public void testNameSpace() { + Parser p = new Parser(); + StringBuffer doc = new StringBuffer(); + doc.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>") + .append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" ") + .append("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">") + .append("<html xmlns=\"http://www.w3.org/1999/xhtml\" ") + .append("xmlns:clay=\"http://struts.apache.org/dtds/shale-clay\" ") + .append("xml:lang=\"en\" ") + .append("lang=\"en\">") + .append("<head>") + .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>") + .append("<title>Test</title>") + .append("</head>") + .append("<body>") + .append("<clay:component jsfid=\"outputText\" value=\"testing\"/>") + .append("<div xmlns:clay=\"http://apache.struts.org/dtds/shale-clay\">") + .append("<clay:component jsfid=\"outputText\" value=\"testing\"/>") + .append("</div>") + .append("</body>") + .append("</html>"); + + + List roots = p.parse(doc); + assertEquals(3, roots.size()); + Node root = (Node) roots.get(2); + assertNotNull(root); + + List nodes = root.getNodesByName("component"); + assertEquals(2, nodes.size()); + + Node clayComponent = (Node) nodes.get(0); + assertEquals("prefix", "clay", clayComponent.getQname()); + + // clay namespace + String uri = clayComponent.getNamespaceURI(clayComponent.getQname()); + assertEquals("uri", "http://struts.apache.org/dtds/shale-clay", uri); + + // default namespace + uri = clayComponent.getNamespaceURI(null); + assertEquals("uri", "http://www.w3.org/1999/xhtml", uri); + + + clayComponent = (Node) nodes.get(1); + assertEquals("prefix", "clay", clayComponent.getQname()); + + // clay namespace + uri = clayComponent.getNamespaceURI(clayComponent.getQname()); + assertEquals("uri", "http://apache.struts.org/dtds/shale-clay", uri); + + // default namespace + uri = clayComponent.getNamespaceURI(null); + assertEquals("uri", "http://www.w3.org/1999/xhtml", uri); + + + } }