blob: 4a70c32bccb9f591b2137aca3f3179bf53e4097e [file] [log] [blame]
/*
* Copyright 2002-2005 Sascha Weinreuter
*
* Licensed 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.intellij.plugins.xpathView.support.jaxen;
import com.intellij.psi.PsiElement;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* A generic iterator over PSI nodes.
*
* <p>Concrete subclasses must implement the {@link #getFirstNode}
* and {@link #getNextNode} methods for a specific iteration
* strategy.</p>
*/
public abstract class NodeIterator implements Iterator {
public NodeIterator(PsiElement contextNode) {
node = getFirstNode(contextNode);
while (!isXPathNode(node))
node = getNextNode(node);
}
/**
* @see Iterator#hasNext
*/
public boolean hasNext() {
return (node != null);
}
/**
* @see Iterator#next
*/
public Object next() {
if (node == null)
throw new NoSuchElementException();
PsiElement ret = node;
node = getNextNode(node);
while (!isXPathNode(node))
node = getNextNode(node);
return ret;
}
/**
* @see Iterator#remove
*/
public void remove() {
throw new UnsupportedOperationException();
}
/**
* Get the first node for iteration.
*
* <p>This method must derive an initial node for iteration
* from a context node.</p>
*
* @param contextNode The starting node.
* @return The first node in the iteration.
* @see #getNextNode
*/
protected abstract PsiElement getFirstNode(PsiElement contextNode);
/**
* Get the next node for iteration.
*
* <p>This method must locate a following node from the
* current context node.</p>
*
* @param contextNode The current node in the iteration.
* @return The following node in the iteration, or null
* if there is none.
* @see #getFirstNode
*/
protected abstract PsiElement getNextNode(PsiElement contextNode);
/**
* Test whether a node is usable by XPath.
*
* @param node The DOM node to test.
* @return true if the node is usable, false if it should be
* skipped.
*/
private boolean isXPathNode(PsiElement node) {
// null is usable, because it means end
if (node == null)
return true;
// TODO: FIXME
return true;
}
private PsiElement node;
}