    1   /*
    2    * Copyright 1999-2004 The Apache Software Foundation
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jxpath.ri.model.jdom;
    17
    18  import java.util.ArrayList;
    19  import java.util.HashSet;
    20  import java.util.List;
    21  import java.util.Set;
    22
    23  import org.apache.commons.jxpath.ri.model.NodeIterator;
    24  import org.apache.commons.jxpath.ri.model.NodePointer;
    25  import org.jdom.Document;
    26  import org.jdom.Element;
    27  import org.jdom.Namespace;
    28
    29  /***
    30   * An iterator of namespaces of a DOM Node.
    31   *
    32   * @author Dmitri Plotnikov
    33   * @version $Revision: 1.9 $ $Date: 2004/04/01 02:55:31 $
    34   */
    35  public class JDOMNamespaceIterator implements NodeIterator {
    36      private NodePointer parent;
    37      private List namespaces;
    38      private Set prefixes;
    39      private int position = 0;
    40
    41      public JDOMNamespaceIterator(NodePointer parent) {
    42          this.parent = parent;
    43          Object node = parent.getNode();
    44          if (node instanceof Document) {
    45              node = ((Document)node).getRootElement();
    46          }
    47          if (node instanceof Element) {
    48              namespaces = new ArrayList();
    49              prefixes = new HashSet();
    50              collectNamespaces((Element) node);
    51          }
    52      }
    53
    54      private void collectNamespaces(Element element) {
    55          Namespace ns = element.getNamespace();
    56          if (ns != null && !prefixes.contains(ns.getPrefix())) {
    57              namespaces.add(ns);
    58              prefixes.add(ns.getPrefix());
    59          }
    60          List others = element.getAdditionalNamespaces();
    61          for (int i = 0; i < others.size(); i++) {
    62              ns = (Namespace) others.get(i);
    63              if (ns != null && !prefixes.contains(ns.getPrefix())) {
    64                  namespaces.add(ns);
    65                  prefixes.add(ns.getPrefix());
    66              }
    67          }
    68          Object parent = element.getParent();
    69          if (parent instanceof Element) {
    70              collectNamespaces((Element)parent);
    71          }
    72      }
    73
    74      public NodePointer getNodePointer() {
    75          if (position == 0) {
    76              if (!setPosition(1)) {
    77                  return null;
    78              }
    79              position = 0;
    80          }
    81          int index = position - 1;
    82          if (index < 0) {
    83              index = 0;
    84          }
    85          Namespace ns = (Namespace) namespaces.get(index);
    86          return new JDOMNamespacePointer(parent, ns.getPrefix(), ns.getURI());
    87      }
    88
    89      public int getPosition() {
    90          return position;
    91      }
    92
    93      public boolean setPosition(int position) {
    94          if (namespaces == null) {
    95              return false;
    96          }
    97          this.position = position;
    98          return position >= 1 && position <= namespaces.size();
    99      }
    100 }