package org.openrosa.client.jr.core.services.storage; import org.openrosa.client.jr.core.util.externalizable.Externalizable; /** * Interface for iterating through a set of records from an IStorageUtility */ public interface IStorageIterator { /** * NOTE: if the underlying IStorageUtility is modified while this iterator is being iterated through, * any calls to nextID() or nextRecord() after the modification will throw a StorageModifiedException * (this is a RuntimeException). To prevent this from happening, you can lock the entire StorageUtility * *before* calling iterate(), and release the lock only after you have iterated through all records. * However, this will prevent all other threads from access the StorageUtility for the entire duration * of the iteration. Also, it will not protect against you modifying the storage in the same thread you * are doing the iteration in. * * Also, if you call nextID(), then call StorageUtility.read() yourself, there is a very slight risk that * another thread will change or invalidate the record with that ID in between your call to nextID() and * read(). To prevent against that, you can lock the StorageUtility before calling nextID and release it * after calling read(). This risk does not exist when calling nextRecord(). */ /** * Number of records in the set * * @return number of records */ int numRecords (); /** * Return the ID of the next record in the set. Advance the iteration cursor by one. * * @return ID of next record * @throws StorageModifiedException if the underlying StorageUtility has been modified since this iterator * was created * @throws IllegalStateException if all records have already been iterated through */ int nextID (); /** * Return the next record in the set. Advance the iteration cursor by one. * * @return object representation of next record * @throws StorageModifiedException if the underlying StorageUtility has been modified since this iterator * was created * @throws IllegalStateException if all records have already been iterated through */ Externalizable nextRecord (); /** * Return whether the set has more records to iterate through * * @return true if there are more records to iterate though. */ boolean hasMore (); }