You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2015/09/05 10:46:05 UTC
svn commit: r1701358 - in /webservices/axiom/trunk:
aspects/core-aspects/src/main/java/org/apache/axiom/core/
aspects/dom-aspects/src/main/java/org/apache/axiom/dom/
aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/
axiom-api/sr...
Author: veithen
Date: Sat Sep 5 08:46:04 2015
New Revision: 1701358
URL: http://svn.apache.org/r1701358
Log:
Implement a smarter way to skip document whitespace in DOOM.
Added:
webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java (with props)
webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java (with props)
Modified:
webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj
webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMChildNodeSupport.aj
webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/AxiomNodeFactorySupport.aj
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMHierarchyException.java
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java
webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java
webservices/axiom/trunk/testing/dom-testsuite/src/main/java/org/apache/axiom/ts/dom/builder/TestWhitespaceAroundDocumentElement.java
Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj Sat Sep 5 08:46:04 2015
@@ -89,6 +89,14 @@ public aspect CoreChildNodeSupport {
return previousSibling;
}
+ public final CoreChildNode CoreChildNode.coreGetPreviousSibling(NodeFilter filter) {
+ CoreChildNode sibling = coreGetPreviousSibling();
+ while (sibling != null && !filter.accept(sibling)) {
+ sibling = sibling.coreGetPreviousSibling();
+ }
+ return sibling;
+ }
+
public final void CoreChildNode.coreSetPreviousSibling(CoreChildNode previousSibling) {
this.previousSibling = previousSibling;
}
@@ -113,6 +121,14 @@ public aspect CoreChildNodeSupport {
return nextSibling;
}
+ public final CoreChildNode CoreChildNode.coreGetNextSibling(NodeFilter filter) {
+ CoreChildNode sibling = coreGetNextSibling();
+ while (sibling != null && !filter.accept(sibling)) {
+ sibling = sibling.coreGetNextSibling();
+ }
+ return sibling;
+ }
+
public final void CoreChildNode.coreInsertSiblingAfter(CoreChildNode sibling) {
CoreParentNode parent = coreGetParent();
// TODO: don't use OMException here
Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj Sat Sep 5 08:46:04 2015
@@ -118,11 +118,27 @@ public aspect CoreParentNodeSupport {
return firstChild;
}
+ public final CoreChildNode CoreParentNode.coreGetFirstChild(NodeFilter filter) {
+ CoreChildNode child = coreGetFirstChild();
+ while (child != null && !filter.accept(child)) {
+ child = child.coreGetNextSibling();
+ }
+ return child;
+ }
+
public final CoreChildNode CoreParentNode.coreGetLastChild() {
build();
return coreGetLastKnownChild();
}
+ public final CoreChildNode CoreParentNode.coreGetLastChild(NodeFilter filter) {
+ CoreChildNode child = coreGetLastChild();
+ while (child != null && !filter.accept(child)) {
+ child = child.coreGetPreviousSibling();
+ }
+ return child;
+ }
+
public final void CoreParentNode.coreAppendChild(CoreChildNode child, boolean fromBuilder) {
CoreParentNode parent = child.coreGetParent();
if (!fromBuilder) {
Added: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java?rev=1701358&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java (added)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java Sat Sep 5 08:46:04 2015
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.core;
+
+public interface NodeFilter {
+ boolean accept(CoreNode node);
+}
Propchange: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMChildNodeSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMChildNodeSupport.aj?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMChildNodeSupport.aj (original)
+++ webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMChildNodeSupport.aj Sat Sep 5 08:46:04 2015
@@ -26,10 +26,10 @@ public aspect DOMChildNodeSupport {
}
public final Node DOMChildNode.getNextSibling() {
- return (Node)coreGetNextSibling();
+ return (Node)coreGetNextSibling(DocumentWhitespaceFilter.INSTANCE);
}
public final Node DOMChildNode.getPreviousSibling() {
- return (Node)coreGetPreviousSibling();
+ return (Node)coreGetPreviousSibling(DocumentWhitespaceFilter.INSTANCE);
}
}
Modified: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj (original)
+++ webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj Sat Sep 5 08:46:04 2015
@@ -55,11 +55,11 @@ public aspect DOMParentNodeSupport {
}
public final Node DOMParentNode.getFirstChild() {
- return (Node)coreGetFirstChild();
+ return (Node)coreGetFirstChild(DocumentWhitespaceFilter.INSTANCE);
}
public final Node DOMParentNode.getLastChild() {
- return (Node)coreGetLastChild();
+ return (Node)coreGetLastChild(DocumentWhitespaceFilter.INSTANCE);
}
public final boolean DOMParentNode.hasChildNodes() {
Added: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java?rev=1701358&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java (added)
+++ webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java Sat Sep 5 08:46:04 2015
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.dom;
+
+import org.apache.axiom.core.CoreCharacterDataNode;
+import org.apache.axiom.core.CoreDocument;
+import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.core.NodeFilter;
+import org.apache.axiom.core.NodeType;
+
+final class DocumentWhitespaceFilter implements NodeFilter {
+ final static DocumentWhitespaceFilter INSTANCE = new DocumentWhitespaceFilter();
+
+ private DocumentWhitespaceFilter() {}
+
+ public boolean accept(CoreNode node) {
+ return node.coreGetNodeType() != NodeType.CHARACTER_DATA
+ || !(((CoreCharacterDataNode)node).coreGetParent() instanceof CoreDocument);
+ }
+}
Propchange: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DocumentWhitespaceFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/AxiomNodeFactorySupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/AxiomNodeFactorySupport.aj?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/AxiomNodeFactorySupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/AxiomNodeFactorySupport.aj Sat Sep 5 08:46:04 2015
@@ -88,9 +88,6 @@ public aspect AxiomNodeFactorySupport {
return node;
}
- public void AxiomNodeFactory.validateOMTextParent(OMContainer parent) {
- }
-
private AxiomText AxiomNodeFactory.createAxiomText(OMContainer parent, Object content, int type, boolean fromBuilder) {
AxiomText node;
switch (type) {
@@ -112,7 +109,6 @@ public aspect AxiomNodeFactorySupport {
throw new IllegalArgumentException("Invalid node type");
}
if (parent != null) {
- validateOMTextParent(parent);
((OMContainerEx)parent).addChild(node, fromBuilder);
}
node.coreSetCharacterData(content, Policies.DETACH_POLICY);
Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMHierarchyException.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMHierarchyException.java?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMHierarchyException.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/OMHierarchyException.java Sat Sep 5 08:46:04 2015
@@ -20,16 +20,7 @@
package org.apache.axiom.om;
/**
- * Thrown if an object model operation would lead to a hierarchy that is not allowed in the
- * given object model implementation.
- * <p>
- * If this exception is encountered by a builder when creating an OM node from an event received
- * by the parser and if the corresponding content can be ignored (i.e. is not semantically
- * relevant), the builder should ignore the exception and skip the event. An example is whitespace
- * appearing before or after the root element of a document. This would be represented as an
- * {@link OMText} node below the {@link OMDocument}. If the OM implementation doesn't allow text
- * nodes as children of a document (as for example in DOM), it should throw this exception so
- * that the builder can discard the event.
+ * Thrown if an object model operation would lead to a hierarchy that is not allowed.
*/
public class OMHierarchyException extends OMException {
private static final long serialVersionUID = 8391435427221729190L;
Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/StAXOMBuilder.java Sat Sep 5 08:46:04 2015
@@ -27,7 +27,6 @@ import org.apache.axiom.om.OMDocument;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMException;
import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMHierarchyException;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMXMLBuilderFactory;
import org.apache.axiom.om.impl.OMContainerEx;
@@ -237,17 +236,7 @@ public class StAXOMBuilder extends StAXB
target = null;
break;
case XMLStreamConstants.SPACE:
- try {
- OMNode node = createOMText(XMLStreamConstants.SPACE);
- if (node == null) {
- continue;
- }
- } catch (OMHierarchyException ex) {
- // The OM implementation doesn't allow text nodes at the current
- // position in the tree. Since it is only whitespace, we can safely
- // skip this event.
- continue;
- }
+ createOMText(XMLStreamConstants.SPACE);
break;
case XMLStreamConstants.COMMENT:
createComment();
Modified: webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java (original)
+++ webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMFactory.java Sat Sep 5 08:46:04 2015
@@ -47,8 +47,6 @@ import org.apache.axiom.dom.DOMNamespace
import org.apache.axiom.dom.DOMNodeFactory;
import org.apache.axiom.dom.DOMProcessingInstruction;
import org.apache.axiom.dom.DOMText;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMHierarchyException;
import org.apache.axiom.om.OMMetaFactory;
import org.apache.axiom.om.impl.common.AxiomAttribute;
import org.apache.axiom.om.impl.common.AxiomCDATASection;
@@ -136,13 +134,6 @@ public class OMDOMFactory implements Axi
return metaFactory;
}
- public final void validateOMTextParent(OMContainer parent) {
- if (parent instanceof DocumentImpl) {
- throw new OMHierarchyException(
- "DOM doesn't support text nodes as children of a document");
- }
- }
-
public final <T extends CoreNode> T createNode(Class<T> type) {
CoreNode node;
if (type == CoreCDATASection.class || type == AxiomCDATASection.class || type == DOMCDATASection.class) {
Modified: webservices/axiom/trunk/testing/dom-testsuite/src/main/java/org/apache/axiom/ts/dom/builder/TestWhitespaceAroundDocumentElement.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/dom-testsuite/src/main/java/org/apache/axiom/ts/dom/builder/TestWhitespaceAroundDocumentElement.java?rev=1701358&r1=1701357&r2=1701358&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/dom-testsuite/src/main/java/org/apache/axiom/ts/dom/builder/TestWhitespaceAroundDocumentElement.java (original)
+++ webservices/axiom/trunk/testing/dom-testsuite/src/main/java/org/apache/axiom/ts/dom/builder/TestWhitespaceAroundDocumentElement.java Sat Sep 5 08:46:04 2015
@@ -18,6 +18,8 @@
*/
package org.apache.axiom.ts.dom.builder;
+import static com.google.common.truth.Truth.assertThat;
+
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -25,13 +27,13 @@ import javax.xml.parsers.DocumentBuilder
import org.apache.axiom.ts.dom.DOMTestCase;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
/**
- * Test that whitespace around the document element is discarded. Indeed, DOM doesn't allow text
- * nodes as children of a document and we need to check that the builder silently discards the
- * corresponding events received from the parser.
+ * Test that whitespace around the document element is discarded (or not visible). Indeed, DOM
+ * doesn't allow text nodes as children of a document.
*/
public class TestWhitespaceAroundDocumentElement extends DOMTestCase {
public TestWhitespaceAroundDocumentElement(DocumentBuilderFactory dbf) {
@@ -39,11 +41,21 @@ public class TestWhitespaceAroundDocumen
}
protected void runTest() throws Throwable {
- Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader("<!-- --> <root/> ")));
+ Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(" <!-- --> <root/> ")));
Node child = doc.getFirstChild();
do {
- assertFalse(child instanceof Text);
+ assertThat(child).isNotInstanceOf(Text.class);
child = child.getNextSibling();
} while (child != null);
+
+ child = doc.getLastChild();
+ do {
+ assertThat(child).isNotInstanceOf(Text.class);
+ child = child.getPreviousSibling();
+ } while (child != null);
+
+ NodeList children = doc.getChildNodes();
+ assertThat(children.getLength()).isEqualTo(2);
+ assertThat(children.item(1)).isSameAs(doc.getDocumentElement());
}
}