01: /*
02: ItsNat Java Web Application Framework
03: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
04: Author: Jose Maria Arranz Santamaria
05:
06: This program is free software: you can redistribute it and/or modify
07: it under the terms of the GNU Affero General Public License as published by
08: the Free Software Foundation, either version 3 of the License, or
09: (at your option) any later version. See the GNU Affero General Public
10: License for more details. See the copy of the GNU Affero General Public License
11: included in this program. If not, see <http://www.gnu.org/licenses/>.
12: */
13:
14: package org.itsnat.impl.core.domutil;
15:
16: import java.util.Iterator;
17: import java.util.NoSuchElementException;
18: import org.itsnat.impl.core.util.*;
19: import org.w3c.dom.Element;
20:
21: /**
22: * Esta clase es debida a que a través de un iterador es más
23: * eficaz recorrer la lista que a través de índices enteros
24: *
25: * @author jmarranz
26: */
27: public class ElementListFreeIteratorImpl implements Iterator {
28: protected ElementListFreeInternal list;
29: protected Element currElem;
30: protected Element nextElem;
31: protected int nextIndex;
32: protected int currIndex;
33:
34: /**
35: * Creates a new instance of ElementListFreeIteratorImpl
36: */
37: public ElementListFreeIteratorImpl(ElementListFreeInternal list,
38: int nextIndex) {
39: this .list = list;
40: this .currElem = null;
41: this .nextElem = list.getElementAt(nextIndex); // Si la lista es nula no da error, devuelve null
42:
43: this .nextIndex = nextIndex;
44: this .currIndex = -1; // Se necesita un next() o previous() para definirse
45: }
46:
47: public ElementListFreeIteratorImpl(ElementListFreeInternal list) {
48: this (list, 0);
49: }
50:
51: public boolean hasNext() {
52: return (nextElem != null);
53: }
54:
55: public Object next() {
56: if (nextElem == null)
57: throw new NoSuchElementException();
58:
59: this .nextIndex++;
60: this .currIndex = nextIndex - 1;
61:
62: this .currElem = nextElem;
63: this .nextElem = list.getNextSiblingElement(currIndex, currElem); // Devuelve null si no hay más
64:
65: return currElem;
66: }
67:
68: public void remove() {
69: if (currIndex == -1)
70: throw new IllegalStateException(); // No se puede borrar dos veces o bien no se ha llamado nunca a next() o previous()
71: list.removeElement(currIndex, currElem);
72: this .currElem = nextElem; // Para el next() da igual pero para el previous() permite que nextElem se defina correctamente
73:
74: nextIndex--;
75: currIndex = -1; // Necesita un next() o previous() para actualizarse
76: }
77: }
|