001: /**********************************************************************
002: Copyright (c) 2004 Andy Jefferson and others. All rights reserved.
003: Licensed under the Apache License, Version 2.0 (the "License");
004: you may not use this file except in compliance with the License.
005: You may obtain a copy of the License at
006:
007: http://www.apache.org/licenses/LICENSE-2.0
008:
009: Unless required by applicable law or agreed to in writing, software
010: distributed under the License is distributed on an "AS IS" BASIS,
011: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: See the License for the specific language governing permissions and
013: limitations under the License.
014:
015:
016: Contributors:
017: ...
018: **********************************************************************/package org.jpox.sco;
019:
020: import java.util.ArrayList;
021: import java.util.Iterator;
022: import java.util.List;
023: import java.util.ListIterator;
024:
025: import org.jpox.StateManager;
026: import org.jpox.store.scostore.ListStore;
027:
028: /**
029: * An iterator for a SCO List object. Takes in the delegate and the backing
030: * store, and provides iteration through the objects.
031: * Only accessible from package to provide protection.
032: *
033: * @version $Revision: 1.8 $
034: */
035: public class SCOListIterator implements ListIterator {
036: private final ListIterator iter;
037: private Object last = null;
038:
039: /** The index in the owner SCO. */
040: private int currentIndex = -1;
041:
042: /** The owning SCO that we are really iterating. */
043: private List ownerSCO;
044:
045: /**
046: * Constructor taking the delegate, backing store and any start index.
047: * @param sco Owner SCO
048: * @param sm State Manager of SCO List to iterate
049: * @param theDelegate The delegate list
050: * @param theStore The backing store (connected to the DB)
051: * @param useDelegate whether to use a delegate
052: * @param startIndex The start index position
053: */
054: public SCOListIterator(List sco, StateManager sm, List theDelegate,
055: ListStore theStore, boolean useDelegate, int startIndex) {
056: ownerSCO = sco;
057:
058: // Populate our entries list
059: ArrayList entries = new ArrayList();
060:
061: Iterator i = null;
062: if (useDelegate) {
063: i = theDelegate.iterator();
064: } else {
065: if (theStore != null) {
066: i = theStore.iterator(sm);
067: } else {
068: i = theDelegate.iterator();
069: }
070: }
071: while (i.hasNext()) {
072: entries.add(i.next());
073: }
074:
075: if (startIndex >= 0) {
076: iter = entries.listIterator(startIndex);
077: } else {
078: iter = entries.listIterator();
079: }
080: currentIndex = startIndex;
081: }
082:
083: public void add(Object o) {
084: currentIndex = iter.nextIndex();
085:
086: ownerSCO.add(currentIndex, o);
087: last = null;
088: }
089:
090: public boolean hasNext() {
091: return iter.hasNext();
092: }
093:
094: public boolean hasPrevious() {
095: return iter.hasPrevious();
096: }
097:
098: public Object next() {
099: currentIndex++;
100: return last = iter.next();
101: }
102:
103: public int nextIndex() {
104: return iter.nextIndex();
105: }
106:
107: public Object previous() {
108: currentIndex--;
109: return last = iter.previous();
110: }
111:
112: public int previousIndex() {
113: return iter.previousIndex();
114: }
115:
116: public void remove() {
117: if (last == null) {
118: throw new IllegalStateException();
119: }
120:
121: ownerSCO.remove(currentIndex);
122: last = null;
123: currentIndex--;
124: }
125:
126: public synchronized void set(Object o) {
127: if (last == null) {
128: throw new IllegalStateException("No entry to replace");
129: }
130:
131: ownerSCO.set(currentIndex, o);
132: iter.set(o);
133:
134: last = o;
135: }
136: }
|