001: /*****************************************************************************
002: * Source code information
003: * -----------------------
004: * Original author Ian Dickinson, HP Labs Bristol
005: * Author email ian.dickinson@hp.com
006: * Package Jena 2
007: * Web http://sourceforge.net/projects/jena/
008: * Created 04-Dec-2003
009: * Filename $RCSfile: SimpleXMLPathIterator.java,v $
010: * Revision $Revision: 1.8 $
011: * Release status $State: Exp $
012: *
013: * Last modified on $Date: 2008/01/02 12:09:42 $
014: * by $Author: andy_seaborne $
015: *
016: * (c) Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
017: * [See end of file]
018: *****************************************************************************/package com.hp.hpl.jena.util.xml;
019:
020: // Imports
021: ///////////////
022: import java.util.*;
023:
024: import org.w3c.dom.*;
025:
026: /**
027: * <p>
028: * An iterator over all of the results of evaluating a simple XML path.
029: * </p>
030: *
031: * @author Ian Dickinson, HP Labs (<a href="mailto:Ian.Dickinson@hp.com" >email</a>)
032: * @version CVS $Id: SimpleXMLPathIterator.java,v 1.8 2008/01/02 12:09:42 andy_seaborne Exp $
033: */
034: public class SimpleXMLPathIterator implements Iterator {
035: // Constants
036: //////////////////////////////////
037:
038: // Static variables
039: //////////////////////////////////
040:
041: // Instance variables
042: //////////////////////////////////
043:
044: /** The stack of iterators we use to search down the paths */
045: protected List m_stack;
046:
047: /** The simple path we are evaluating */
048: protected SimpleXMLPath m_path;
049:
050: /** Flag for whether the latest evaluation of the path has been prepared */
051: protected boolean m_prepared = false;
052:
053: /** The value of the final iterator on the path */
054: protected Object m_result;
055:
056: /** The length of the path */
057: protected int m_len;
058:
059: // Constructors
060: //////////////////////////////////
061:
062: public SimpleXMLPathIterator(SimpleXMLPath path, Node node) {
063: m_path = path;
064: m_len = path.getPathComponents().size();
065: m_stack = new ArrayList(m_len);
066:
067: // put the first stage on the stack
068: m_stack.add(path.getPathComponent(0).getAll(node));
069: prepare();
070: }
071:
072: // External signature methods
073: //////////////////////////////////
074:
075: /**
076: * Not supported.
077: */
078: public void remove() {
079: throw new UnsupportedOperationException(
080: "Cannot remove from SimpleXMLPathIterator");
081: }
082:
083: /**
084: * Answer true if there is at least one more value
085: */
086: public boolean hasNext() {
087: prepare();
088: return m_result != null;
089: }
090:
091: /**
092: * Answer the next value in the iterator
093: */
094: public Object next() {
095: prepare();
096:
097: if (m_result == null) {
098: throw new NoSuchElementException(
099: "No more values on this SimpleXMLPath");
100: }
101:
102: m_prepared = false;
103: return m_result;
104: }
105:
106: // Internal implementation methods
107: //////////////////////////////////
108:
109: /** Prepare the next value in the sequence */
110: protected void prepare() {
111: if (!m_prepared) {
112: evaluate();
113: m_prepared = true;
114: }
115: }
116:
117: /**
118: * <p>Evaluate the next traversal through the path, terminating either with a
119: * valid result in m_result, or a failure to find any (more) paths, and m_result
120: * is null.</p>
121: *
122: */
123: protected void evaluate() {
124: // search for a route through to the end of the path
125: int i = 0;
126: m_result = null;
127:
128: // find the tidemark
129: for (; i < min(m_len, m_stack.size())
130: && (m_stack.get(i) != null); i++)
131: ;
132: i--;
133:
134: while (i >= 0 && i < min(m_len, m_stack.size())) {
135: Iterator j = (Iterator) m_stack.get(i);
136:
137: if (j == null) {
138: // go back a stage
139: i--;
140: } else if (!j.hasNext()) {
141: // finished iterator
142: m_stack.add(i, null);
143: m_result = null;
144: i--;
145: } else {
146: // there is a valid stage here
147: m_result = j.next();
148: i++;
149:
150: if (i < m_len) {
151: // advance the stack along the path
152: m_stack.add(i, m_path.getPathComponent(i).getAll(
153: (Node) m_result));
154: }
155: }
156: }
157: }
158:
159: /** Answer the minimum of two ints */
160: private int min(int x, int y) {
161: return (x < y) ? x : y;
162: }
163:
164: //==============================================================================
165: // Inner class definitions
166: //==============================================================================
167:
168: }
169:
170: /*
171: * (c) Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
172: * All rights reserved.
173: *
174: * Redistribution and use in source and binary forms, with or without
175: * modification, are permitted provided that the following conditions
176: * are met:
177: * 1. Redistributions of source code must retain the above copyright
178: * notice, this list of conditions and the following disclaimer.
179: * 2. Redistributions in binary form must reproduce the above copyright
180: * notice, this list of conditions and the following disclaimer in the
181: * documentation and/or other materials provided with the distribution.
182: * 3. The name of the author may not be used to endorse or promote products
183: * derived from this software without specific prior written permission.
184: *
185: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
186: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
187: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
189: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
190: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
191: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
192: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
193: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
194: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
195: */
|