diff options
author | Jesse Wilson <jessewilson@google.com> | 2010-02-02 11:39:05 -0800 |
---|---|---|
committer | Jesse Wilson <jessewilson@google.com> | 2010-02-10 15:18:15 -0800 |
commit | 2e4c40c282464cb5435b3078b8d375634355dbc1 (patch) | |
tree | c9f6fe174b70c0e8bc7e41ef01c67181f708a354 /xml/src | |
parent | 326600b64610c22fb4a34a62dcd45fe707148ce2 (diff) | |
download | libcore-2e4c40c282464cb5435b3078b8d375634355dbc1.zip libcore-2e4c40c282464cb5435b3078b8d375634355dbc1.tar.gz libcore-2e4c40c282464cb5435b3078b8d375634355dbc1.tar.bz2 |
Fixing some of our XSLT implementation issues.
These changes move our XSLT code to passing 1898/3173 of the OASIS tests.
To contrast, the RI passes 2105/3173 tests.
Highlights:
- Implementing getTextContent() for nodes
- Removing validation during transforms. We don't support validation!
- Fixing attribute constraints to match the spec
- Fixing test suite to not confuse BaseURI from NamespaceURI
Diffstat (limited to 'xml/src')
7 files changed, 90 insertions, 30 deletions
diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java index 9c19835..59a8b78 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/AttrImpl.java @@ -159,11 +159,12 @@ public class AttrImpl extends NodeImpl implements Attr { } if (prefix != null) { - if (namespaceURI == null || !document.isXMLIdentifier(prefix) || "xmlns".equals(prefix)) { - throw new DOMException(DOMException.NAMESPACE_ERR, prefix); - } - - if ("xml".equals(prefix) && !"http://www.w3.org/XML/1998/namespace".equals(namespaceURI)) { + if (namespaceURI == null + || !DocumentImpl.isXMLIdentifier(prefix) + || ("xmlns".equals(prefix) + && !"http://www.w3.org/2000/xmlns/".equals(namespaceURI)) + || ("xml".equals(prefix) + && !"http://www.w3.org/XML/1998/namespace".equals(namespaceURI))) { throw new DOMException(DOMException.NAMESPACE_ERR, prefix); } } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java index 499f518..d6d412b 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java @@ -296,6 +296,10 @@ public class DocumentImpl extends InnerNodeImpl implements Document { return super.insertChildAt(newChild, index); } + @Override public String getTextContent() throws DOMException { + return null; + } + public String getInputEncoding() { throw new UnsupportedOperationException(); // TODO } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java index df40d4b..67947b7 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java @@ -107,4 +107,7 @@ public class DocumentTypeImpl extends LeafNodeImpl implements DocumentType { return systemId; } + @Override public String getTextContent() throws DOMException { + return null; + } } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java index f8ed85e..82cd25e 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java @@ -218,4 +218,35 @@ public abstract class InnerNodeImpl extends LeafNodeImpl { return oldChildImpl; } + public String getTextContent() throws DOMException { + Node child = getFirstChild(); + if (child == null) { + return ""; + } + + Node next = child.getNextSibling(); + if (next == null) { + return hasTextContent(child) ? child.getTextContent() : ""; + } + + StringBuilder buf = new StringBuilder(); + getTextContent(buf); + return buf.toString(); + } + + void getTextContent(StringBuilder buf) throws DOMException { + Node child = getFirstChild(); + while (child != null) { + if (hasTextContent(child)) { + ((NodeImpl) child).getTextContent(buf); + } + child = child.getNextSibling(); + } + } + + final boolean hasTextContent(Node child) { + // TODO: skip text nodes with ignorable whitespace? + return child.getNodeType() != Node.COMMENT_NODE + && child.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE; + } } diff --git a/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java b/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java index bf4d791..b752506 100644 --- a/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java +++ b/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java @@ -190,7 +190,7 @@ public abstract class NodeImpl implements Node { } public String getBaseURI() { - throw new UnsupportedOperationException(); // TODO + return null; // TODO } public short compareDocumentPosition(Node other) @@ -199,7 +199,14 @@ public abstract class NodeImpl implements Node { } public String getTextContent() throws DOMException { - throw new UnsupportedOperationException(); // TODO + return getNodeValue(); + } + + void getTextContent(StringBuilder buf) throws DOMException { + String content = getNodeValue(); + if (content != null) { + buf.append(content); + } } public void setTextContent(String textContent) throws DOMException { diff --git a/xml/src/main/java/org/apache/xml/utils/DOMHelper.java b/xml/src/main/java/org/apache/xml/utils/DOMHelper.java index 76721d0..53d0adc 100644 --- a/xml/src/main/java/org/apache/xml/utils/DOMHelper.java +++ b/xml/src/main/java/org/apache/xml/utils/DOMHelper.java @@ -85,16 +85,23 @@ public class DOMHelper DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); dfactory.setNamespaceAware(true); - dfactory.setValidating(true); - - if (isSecureProcessing) - { - try - { - dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - } - catch (ParserConfigurationException pce) {} - } + // BEGIN android-removed + // If set, DocumentBuilderFactoryImpl.newDocumentBuilder() fails + // because we haven't implemented validation + // dfactory.setValidating(true); + // BEGIN android-removed + + // BEGIN android-removed + // We haven't implemented secure processing + // if (isSecureProcessing) + // { + // try + // { + // dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + // } + // catch (ParserConfigurationException pce) {} + // } + // END android-removed DocumentBuilder docBuilder = dfactory.newDocumentBuilder(); Document outNode = docBuilder.newDocument(); diff --git a/xml/src/test/java/org/apache/harmony/xml/XsltXPathConformanceTestSuite.java b/xml/src/test/java/org/apache/harmony/xml/XsltXPathConformanceTestSuite.java index 7773814..443e415 100644 --- a/xml/src/test/java/org/apache/harmony/xml/XsltXPathConformanceTestSuite.java +++ b/xml/src/test/java/org/apache/harmony/xml/XsltXPathConformanceTestSuite.java @@ -78,7 +78,7 @@ public class XsltXPathConformanceTestSuite { /** Orders element attributes by optional URI and name. */ private static final Comparator<Attr> orderByName = new Comparator<Attr>() { public int compare(Attr a, Attr b) { - int result = compareNullsFirst(a.getBaseURI(), b.getBaseURI()); + int result = compareNullsFirst(a.getNamespaceURI(), b.getNamespaceURI()); return result == 0 ? result : compareNullsFirst(a.getName(), b.getName()); } @@ -322,6 +322,11 @@ public class XsltXPathConformanceTestSuite { this.compareAs = compareAs; } + XsltTest(File principalData, File principalStylesheet, File principal) { + this("standalone", "test", "", "", + principalData, principalStylesheet, principal, "standard", "XML"); + } + public void test() throws Exception { if (purpose != null) { System.out.println("Purpose: " + purpose); @@ -336,8 +341,8 @@ public class XsltXPathConformanceTestSuite { Transformer transformer; try { transformer = transformerFactory.newTransformer(xslt); - assertEquals("Expected transformer creation to fail", - "standard", operation); + assertEquals("Transformer creation completed normally.", + operation, "standard"); } catch (TransformerConfigurationException e) { if (operation.equals("execution-error")) { return; // expected, such as in XSLT-Result-Tree.Attributes__78369 @@ -396,14 +401,17 @@ public class XsltXPathConformanceTestSuite { } private void emitNode(XmlSerializer serializer, Node node) throws IOException { - if (node instanceof Element) { + if (node == null) { + throw new UnsupportedOperationException("Cannot emit null nodes"); + + } else if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; - serializer.startTag(element.getBaseURI(), element.getLocalName()); + serializer.startTag(element.getNamespaceURI(), element.getLocalName()); emitAttributes(serializer, element); emitChildren(serializer, element); - serializer.endTag(element.getBaseURI(), element.getLocalName()); + serializer.endTag(element.getNamespaceURI(), element.getLocalName()); - } else if (node instanceof Text) { + } else if (node.getNodeType() == Node.TEXT_NODE) { // TODO: is it okay to trim whitespace in general? This may cause // false positives for elements like HTML's <pre> tag String trimmed = node.getTextContent().trim(); @@ -411,25 +419,24 @@ public class XsltXPathConformanceTestSuite { serializer.text(trimmed); } - } else if (node instanceof Document) { + } else if (node.getNodeType() == Node.DOCUMENT_NODE) { Document document = (Document) node; serializer.startDocument("UTF-8", true); emitNode(serializer, document.getDocumentElement()); serializer.endDocument(); - } else if (node instanceof ProcessingInstruction) { + } else if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) { ProcessingInstruction processingInstruction = (ProcessingInstruction) node; String data = processingInstruction.getData(); String target = processingInstruction.getTarget(); serializer.processingInstruction(target + " " + data); - } else if (node instanceof Comment) { + } else if (node.getNodeType() == Node.COMMENT_NODE) { // ignore! } else { - Object nodeClass = node != null ? node.getClass() : null; throw new UnsupportedOperationException( - "Cannot serialize nodes of type " + nodeClass); + "Cannot emit " + node + " of type " + node.getNodeType()); } } @@ -458,7 +465,7 @@ public class XsltXPathConformanceTestSuite { * generate one for us, using a predictable pattern. */ } else { - serializer.attribute(attr.getBaseURI(), attr.getLocalName(), attr.getValue()); + serializer.attribute(attr.getNamespaceURI(), attr.getLocalName(), attr.getValue()); } } } |