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 2016/01/30 21:46:13 UTC

svn commit: r1727756 - 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/fom-aspects/src/main/java/org/apache/axiom/fom/ aspects/om-aspects/src/main/ja...

Author: veithen
Date: Sat Jan 30 20:46:13 2016
New Revision: 1727756

URL: http://svn.apache.org/viewvc?rev=1727756&view=rev
Log:
Eliminate OMChildrenLocalNameIterator and OMChildrenNamespaceIterator.

Removed:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMChildrenLocalNameIterator.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/OMChildrenNamespaceIterator.java
Modified:
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
    webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java
    webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java
    webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java
    webservices/axiom/trunk/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj
    webservices/axiom/trunk/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java Sat Jan 30 20:46:13 2016
@@ -21,30 +21,32 @@ package org.apache.axiom.core;
 import java.util.ConcurrentModificationException;
 import java.util.NoSuchElementException;
 
-public abstract class AbstractNodeIterator<T> implements NodeIterator<T> {
+public abstract class AbstractNodeIterator<T extends CoreNode,S> implements NodeIterator<S> {
     private final CoreParentNode startNode;
     private final Axis axis;
     private final Class<T> type;
+    private final Mapper<? super T,S> mapper;
     private final Semantics semantics;
-    private CoreNode currentNode;
+    private T currentNode;
     
     /**
      * The parent of the current node. This is used to detect concurrent modifications.
      */
     private CoreParentNode currentParent;
     
-    private CoreNode nextNode;
+    private T nextNode;
     private boolean hasNext;
     private int depth;
     
-    public AbstractNodeIterator(CoreParentNode startNode, Axis axis, Class<T> type, Semantics semantics) {
+    public AbstractNodeIterator(CoreParentNode startNode, Axis axis, Class<T> type, Mapper<? super T,S> mapper, Semantics semantics) {
         this.startNode = startNode;
         this.axis = axis;
         this.type = type;
+        this.mapper = mapper;
         this.semantics = semantics;
     }
 
-    protected abstract boolean matches(CoreNode node) throws CoreModelException;
+    protected abstract boolean matches(T node) throws CoreModelException;
 
     public final boolean hasNext() {
         if (!hasNext) {
@@ -53,7 +55,7 @@ public abstract class AbstractNodeIterat
                 throw new ConcurrentModificationException("The current node has been removed using a method other than Iterator#remove()");
             }
             try {
-                do {
+                while (true) {
                     // Get to the next node
                     switch (axis) {
                         case CHILDREN:
@@ -98,22 +100,32 @@ public abstract class AbstractNodeIterat
                                 }
                             }
                     }
-                } while (node != null && !matches(node));
+                    if (node == null) {
+                        nextNode = null;
+                        break;
+                    }
+                    if (type.isInstance(node)) {
+                        T candidate = type.cast(node);
+                        if (matches(candidate)) {
+                            nextNode = candidate;
+                            break;
+                        }
+                    }
+                }
             } catch (CoreModelException ex) {
                 throw semantics.toUncheckedException(ex);
             }
-            nextNode = node;
             hasNext = true;
         }
         return nextNode != null;
     }
 
-    public final T next() {
+    public final S next() {
         if (hasNext()) {
             currentNode = nextNode;
             currentParent = currentNode instanceof CoreChildNode ? ((CoreChildNode)currentNode).coreGetParent() : null;
             hasNext = false;
-            return type.cast(currentNode);
+            return mapper.map(currentNode);
         } else {
             throw new NoSuchElementException();
         }

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java Sat Jan 30 20:46:13 2016
@@ -35,5 +35,7 @@ public interface CoreParentNode extends
     void coreSetState(int state);
     void build();
 
-    <T extends CoreElement> NodeIterator<T> coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Semantics semantics);
+    <T> NodeIterator<T> coreGetNodes(Axis axis, Mapper<? super CoreNode,T> mapper, Semantics semantics);
+
+    <T extends CoreElement,S> NodeIterator<S> coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Mapper<? super T,S> mapper, Semantics semantics);
 }

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=1727756&r1=1727755&r2=1727756&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 Jan 30 20:46:13 2016
@@ -295,8 +295,8 @@ public aspect CoreParentNodeSupport {
         }
     }
     
-    public final <T> NodeIterator<T> CoreParentNode.coreGetNodes(Axis axis, Class<T> type, Semantics semantics) {
-        return new AbstractNodeIterator<T>(this, axis, type, semantics) {
+    public final <T> NodeIterator<T> CoreParentNode.coreGetNodes(Axis axis, Mapper<? super CoreNode,T> mapper, Semantics semantics) {
+        return new AbstractNodeIterator<CoreNode,T>(this, axis, CoreNode.class, mapper, semantics) {
             @Override
             protected boolean matches(CoreNode node) throws CoreModelException {
                 return true;
@@ -304,8 +304,8 @@ public aspect CoreParentNodeSupport {
         };
     }
     
-    public final <T extends CoreElement> NodeIterator<T> CoreParentNode.coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Semantics semantics) {
-        return new ElementsIterator<T>(this, axis, type, matcher, namespaceURI, name, semantics);
+    public final <T extends CoreElement,S> NodeIterator<S> CoreParentNode.coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Mapper<? super T,S> mapper, Semantics semantics) {
+        return new ElementsIterator<T,S>(this, axis, type, matcher, namespaceURI, name, mapper, semantics);
     }
 
     public final <T> void CoreParentNode.cloneChildrenIfNecessary(ClonePolicy<T> policy, T options, CoreNode clone) {

Modified: webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java (original)
+++ webservices/axiom/trunk/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java Sat Jan 30 20:46:13 2016
@@ -18,22 +18,20 @@
  */
 package org.apache.axiom.core;
 
-final class ElementsIterator<T extends CoreElement> extends AbstractNodeIterator<T> {
-    private final Class<T> type;
+final class ElementsIterator<T extends CoreElement,S> extends AbstractNodeIterator<T,S> {
     private final ElementMatcher<? super T> matcher;
     private final String namespaceURI;
     private final String name;
 
-    public ElementsIterator(CoreParentNode startNode, Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Semantics semantics) {
-        super(startNode, axis, type, semantics);
-        this.type = type;
+    public ElementsIterator(CoreParentNode startNode, Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, Mapper<? super T,S> mapper, Semantics semantics) {
+        super(startNode, axis, type, mapper, semantics);
         this.matcher = matcher;
         this.namespaceURI = namespaceURI;
         this.name = name;
     }
 
     @Override
-    protected final boolean matches(CoreNode node) throws CoreModelException {
-        return type.isInstance(node) && matcher.matches(type.cast(node), namespaceURI, name);
+    protected final boolean matches(T node) throws CoreModelException {
+        return matcher.matches(node, namespaceURI, name);
     }
 }

Modified: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java (original)
+++ webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java Sat Jan 30 20:46:13 2016
@@ -21,10 +21,12 @@ package org.apache.axiom.dom;
 import java.util.Iterator;
 
 import org.apache.axiom.core.Axis;
+import org.apache.axiom.core.CoreElement;
 import org.apache.axiom.core.ElementMatcher;
+import org.apache.axiom.core.Mapper;
 import org.w3c.dom.Node;
 
-public class ElementsByTagName extends NodeListImpl {
+public class ElementsByTagName extends NodeListImpl implements Mapper<CoreElement,Node> {
     private final DOMParentNode node;
     private final String tagname;
     
@@ -36,9 +38,13 @@ public class ElementsByTagName extends N
     @Override
     protected Iterator<? extends Node> createIterator() {
         if (tagname.equals("*")) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreElement.class, ElementMatcher.ANY, null, null, this, DOMSemantics.INSTANCE);
         } else {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.BY_NAME, null, tagname, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreElement.class, ElementMatcher.BY_NAME, null, tagname, this, DOMSemantics.INSTANCE);
         }
     }
+
+    public Node map(CoreElement element) {
+        return (Node)element;
+    }
 }

Modified: webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java (original)
+++ webservices/axiom/trunk/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java Sat Jan 30 20:46:13 2016
@@ -21,10 +21,13 @@ package org.apache.axiom.dom;
 import java.util.Iterator;
 
 import org.apache.axiom.core.Axis;
+import org.apache.axiom.core.CoreElement;
+import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.ElementMatcher;
+import org.apache.axiom.core.Mapper;
 import org.w3c.dom.Node;
 
-public class ElementsByTagNameNS extends NodeListImpl {
+public class ElementsByTagNameNS extends NodeListImpl implements Mapper<CoreElement,Node> {
     private final DOMParentNode node;
     private final String namespaceURI;
     private final String localName;
@@ -41,13 +44,17 @@ public class ElementsByTagNameNS extends
         boolean localNameWildcard = localName.equals("*");
         if (nsWildcard && localNameWildcard) {
             // TODO: there seems to be no unit test checking whether the iterator should return DOM1 elements!
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreElement.class, ElementMatcher.ANY, null, null, this, DOMSemantics.INSTANCE);
         } else if (nsWildcard) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_LOCAL_NAME, null, localName, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreNSAwareElement.class, ElementMatcher.BY_LOCAL_NAME, null, localName, this, DOMSemantics.INSTANCE);
         } else if (localNameWildcard) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_NAMESPACE_URI, namespaceURI, null, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreNSAwareElement.class, ElementMatcher.BY_NAMESPACE_URI, namespaceURI, null, this, DOMSemantics.INSTANCE);
         } else {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_QNAME, namespaceURI, localName, DOMSemantics.INSTANCE);
+            return node.coreGetElements(Axis.DESCENDANTS, CoreNSAwareElement.class, ElementMatcher.BY_QNAME, namespaceURI, localName, this, DOMSemantics.INSTANCE);
         }
     }
+
+    public Node map(CoreElement element) {
+        return (Node)element;
+    }
 }

Modified: webservices/axiom/trunk/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj (original)
+++ webservices/axiom/trunk/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj Sat Jan 30 20:46:13 2016
@@ -24,6 +24,7 @@ import org.apache.abdera.model.Category;
 import org.apache.abdera.util.Constants;
 import org.apache.axiom.core.Axis;
 import org.apache.axiom.core.ElementMatcher;
+import org.apache.axiom.core.Mapper;
 
 public aspect CategoryContainerMixin {
     private static final ElementMatcher<AbderaCategory> CATEGORY_BY_SCHEME = new ElementMatcher<AbderaCategory>() {
@@ -51,10 +52,16 @@ public aspect CategoryContainerMixin {
         return _getChildrenAsSet(Constants.CATEGORY);
     }
 
+    private static final Mapper<AbderaCategory,Category> categoryMapper = new Mapper<AbderaCategory,Category>() {
+        public Category map(AbderaCategory category) {
+            return category;
+        }
+    };
+    
     public final List<Category> CategoryContainer.getCategories(String scheme) {
         // TODO: we should probably set detachPolicy to null
         return new FOMList<Category>(coreGetElements(
                 Axis.CHILDREN, AbderaCategory.class, CATEGORY_BY_SCHEME, null, scheme,
-                FOMSemantics.INSTANCE));
+                categoryMapper, FOMSemantics.INSTANCE));
     }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj Sat Jan 30 20:46:13 2016
@@ -30,6 +30,10 @@ import javax.xml.transform.sax.SAXResult
 import javax.xml.transform.sax.SAXSource;
 
 import org.apache.axiom.core.Axis;
+import org.apache.axiom.core.CoreNSAwareElement;
+import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.core.ElementMatcher;
+import org.apache.axiom.core.Mapper;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.DeferredParsingException;
 import org.apache.axiom.om.NodeUnavailableException;
@@ -189,16 +193,32 @@ public aspect AxiomContainerSupport {
         coreRemoveChildren(AxiomSemantics.INSTANCE);
     }
     
+    private static final Mapper<CoreNode,OMNode> childrenMapper = new Mapper<CoreNode,OMNode>() {
+        public OMNode map(CoreNode node) {
+            return (OMNode)node;
+        }
+    };
+    
     public Iterator<OMNode> AxiomContainer.getChildren() {
-        return coreGetNodes(Axis.CHILDREN, OMNode.class, AxiomSemantics.INSTANCE);
+        return coreGetNodes(Axis.CHILDREN, childrenMapper, AxiomSemantics.INSTANCE);
     }
 
+    private static final Mapper<CoreNSAwareElement,OMElement> childElementMapper = new Mapper<CoreNSAwareElement,OMElement>() {
+        public OMElement map(CoreNSAwareElement element) {
+            return (OMElement)element;
+        }
+    };
+    
     public Iterator<OMElement> AxiomContainer.getChildrenWithLocalName(String localName) {
-        return new OMChildrenLocalNameIterator(getFirstOMChild(), localName);
+        return coreGetElements(Axis.CHILDREN, CoreNSAwareElement.class,
+                ElementMatcher.BY_LOCAL_NAME, null, localName,
+                childElementMapper, AxiomSemantics.INSTANCE);
     }
 
     public Iterator<OMElement> AxiomContainer.getChildrenWithNamespaceURI(String uri) {
-        return new OMChildrenNamespaceIterator(getFirstOMChild(), uri);
+        return coreGetElements(Axis.CHILDREN, CoreNSAwareElement.class,
+                ElementMatcher.BY_NAMESPACE_URI, uri, null,
+                childElementMapper, AxiomSemantics.INSTANCE);
     }
 
     public Iterator<OMElement> AxiomContainer.getChildrenWithName(QName elementQName) {
@@ -227,8 +247,14 @@ public aspect AxiomContainerSupport {
         return it;
     }
     
+    private static final Mapper<CoreNode,OMSerializable> descendantsMapper = new Mapper<CoreNode,OMSerializable>() {
+        public OMSerializable map(CoreNode node) {
+            return (OMSerializable)node;
+        }
+    };
+    
     public Iterator<OMSerializable> AxiomContainer.getDescendants(boolean includeSelf) {
-        return coreGetNodes(includeSelf ? Axis.DESCENDANTS_OR_SELF : Axis.DESCENDANTS, OMSerializable.class, AxiomSemantics.INSTANCE);
+        return coreGetNodes(includeSelf ? Axis.DESCENDANTS_OR_SELF : Axis.DESCENDANTS, descendantsMapper, AxiomSemantics.INSTANCE);
     }
 
     public OMElement AxiomContainer.getFirstChildWithName(QName elementQName) throws OMException {

Modified: webservices/axiom/trunk/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java?rev=1727756&r1=1727755&r2=1727756&view=diff
==============================================================================
--- webservices/axiom/trunk/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java (original)
+++ webservices/axiom/trunk/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java Sat Jan 30 20:46:13 2016
@@ -59,6 +59,8 @@ import org.apache.axiom.core.Axis;
 import org.apache.axiom.core.CoreChildNode;
 import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.ElementMatcher;
+import org.apache.axiom.core.IdentityMapper;
+import org.apache.axiom.core.Mapper;
 import org.apache.axiom.fom.AbderaElement;
 import org.apache.axiom.fom.FOMList;
 import org.apache.axiom.fom.FOMSemantics;
@@ -222,9 +224,11 @@ public class FOMElement extends FOMChild
         return (T)this;
     }
 
+    private static final IdentityMapper<AbderaElement> abderaElementMapper = new IdentityMapper<AbderaElement>();
+    
     public final Iterator<AbderaElement> _getChildrenWithName(QName qname) {
         return coreGetElements(Axis.CHILDREN, AbderaElement.class, ElementMatcher.BY_QNAME,
-                qname.getNamespaceURI(), qname.getLocalPart(), FOMSemantics.INSTANCE);
+                qname.getNamespaceURI(), qname.getLocalPart(), abderaElementMapper, FOMSemantics.INSTANCE);
     }
 
     public <E extends Element> List<E> _getChildrenAsSet(QName qname) {