Interface RemoteIterator<T extends List<?>>
- Type Parameters:
T- A collection type that is provided by this iterator. All of these collections have to be sorted, otherwise the iterator does not have a well-defined order for iterating.
- All Superinterfaces:
AutoCloseable,Closeable,de.aristaflow.adept2.model.communication.ServerSideProxy
- All Known Implementing Classes:
AbstractRemoteIterator,AbstractTimeTrackingRemoteIterator,CachingRemoteIterator,EmptyRemoteIterator,MemoryBasedCopyingRemoteIterator,ResultSetRemoteIterator,TransformingRemoteIterator
RemoteIterator allows to retrieve parts of collections instead of whole
collections. This shortens the retrieval time since such collections need not be fully created
before the method corresponding requesting method can return. Additionally, less data needs to be
transfered initially to a client. However, partial retrieval may lead to inconsistencies in case
the underlying data of the iterator is changed while iterating. For instance, some elements of
the original result may be removed while iterating, other elements may be added at an arbitrary
position in the collection and therefore missed when iterating. The elements returned by a remote iterator may be
AutoCloseable. In such cases, the
remote iterator is responsible for closing these elements.
This may happen in two variants: either when closing the remote iterator itself,
which means caching all iterated elements internally, or when progressing the iteration by
calling getNext(int), getNext(int, int) or getPrevious(int). In this
case only the elements of a traversal need to be cached. Each time traversal proceeds, the
elements of the previous traversal will be closed. Since iterators occupy resources while they are being used (for instance keeping a database connection open or holding data directly in memory), they have an alive time. As soon as the time passed, the iterator will be closed (dropped) which releases all occupied resources. Afterwards the iterator will not be usable any more; data retrieval methods will throw an
IllegalStateException on server side itself) and all methods will throw a
ServiceConnectionException on client side. If this alive time is insufficient, users
may try to extend the remaining alive time. However, this does not need to succeed since the
underlying resources of the iterator may not be able to extend their alive time, for instance
pooled database connections. To improve resource handling, users may close an iterator any time and should do so as early as possible.
Implementations of remote iterators may perform internal optimisations which are most adequate
for the corresponding purpose. For instance, iterators may be lazy and provide only the necessary
data (which requires an open connection to the corresponding data source), they may be eager and
provide all data at once (although this is not advised since this contradicts to the original
purpose of an iterator of not providing all data at once). Implementations may also be in-between
that is prefetching some results but not all. Additionally, already retrieved results may be
cached but this is also not required. However, caching is an easy way to detect inconsistencies
in partial data already returned with partial data retrieved later.
To prevent inconsistencies, a remote iterator may be based on a snapshot of the data. Such an
iterator returns exactly the temporal state of the data when requesting the iterator. This can be
done by either retrieving the complete data eagerly or by support of the underlying data source,
for instance temporal databases or the restrictive usage of database transactions which prevents
concurrent write accesses to the underlying data.
Usually the configuration parameters for an iterator (alive time, whether to use a snapshot,...) are provided as parameters to the method returning the iterator. However, the iterator itself may have other values set. This should be checked by the user. Especially the alive time can differ due to restrictions on the resources used by the iterator implementation for instance using time-restricted pooled database connections.
-
Nested Class Summary
Nested classes/interfaces inherited from interface de.aristaflow.adept2.model.communication.ServerSideProxy
de.aristaflow.adept2.model.communication.ServerSideProxy.LegacySspCloser, de.aristaflow.adept2.model.communication.ServerSideProxy.ServerSideProxyRemover -
Field Summary
Fields inherited from interface de.aristaflow.adept2.model.communication.ServerSideProxy
DEFAULT_ALIVE_TIME -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()Explicitly closes this iterator which allows to release occupied memory and resources.booleanGets whether this remote iterator closes elements ofAutoCloseabletype when traversing to the next elements.default voiddrop()Deprecated, for removal: This API element is subject to removal in a future version.getAll()Gets all elements of this iterator at once.getNext(int count) Gets the next specified amount of elements of this iterator.getNext(int count, int start) Gets the next specified amount of elements of this iterator starting at the designated index (0-based).getPrevious(int count) Gets the previous specified amount of elements of this iterator.longGets the time in milliseconds this iterator will still be valid and does allow access to the underlying data.booleanGets whether this iterator only allows iterating in forward direction, that is calls togetNext(int)but not togetNext(int, int)andgetPrevious(int).booleanGets whether this iterator is a snapshot and therefore its contents is not subject of change while iterating.longkeepAlive(long aliveTime) Keeps this iterator alive for the designated time span (in milliseconds).
-
Method Details
-
getNext
Gets the next specified amount of elements of this iterator. The returned data will be consistent within the returned list (but not necessarily with respect to previous or later retrievals) due to the usage of synchronisation.- Parameters:
count- The amount of elements to retrieve in forward direction. This has to be > 0.- Returns:
- The next n elements of this iterator, where n is the specified count. In case of an
insufficient amount of next elements remaining only the available elements will be
returned. If there are no more next elements,
nullwill be returned.
AutoCloseables will be coupled to thisRemoteIterator, so do not close them; clone them if required longer than until automatic closing which may happen when traversing or when closing thisRemoteIterator. - Throws:
DataSourceException- If there are problems accessing the underlying data source, aDataSourceExceptionwill be thrown.DataConsistencyException- If there are problems retrieving any of the next elements via the identifying attribute of the elements (for instance the primary key of a specific element identifying the next position) is not available any more, aDataConsistencyExceptionwill be thrown.IllegalArgumentException- If count is non-positive (<= 0), anIllegalArgumentExceptionwill be thrown.IllegalStateException- If this iterator has been closed (explicitly or implicitly), anIllegalStateExceptionwill be thrown on server side.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
getNext
Gets the next specified amount of elements of this iterator starting at the designated index (0-based). The returned data will be consistent within the returned list (but not necessarily with respect to previous or later retrievals) due to the usage of synchronisation.
Afterwards the cursor to the current element will be set to the index start + count, that is, getNext(n) will be the same as calling getNext(n, start + count).- Parameters:
count- The amount of elements to retrieve in forward direction. This has to be > 0.start- The index of the element from which to retrieve the next count elements. 0 is the index of the first element. This has to be >= 0 and it must not be bigger than the amounts of elements in this iterator.- Returns:
- The next n elements of this iterator, where n is the specified count. In case of an
insufficient amount of next elements remaining only the available elements will be
returned. If there are no more next elements,
nullwill be returned.
AutoCloseables will be coupled to thisRemoteIterator, so do not close them; clone them if required longer than until automatic closing which may happen when traversing or when closing thisRemoteIterator. - Throws:
DataSourceException- If there are problems accessing the underlying data source, aDataSourceExceptionwill be thrown.DataConsistencyException- If there are problems retrieving any of the next elements via the identifying attribute of the elements (for instance the primary key of a specific element identifying the next position) is not available any more, aDataConsistencyExceptionwill be thrown.IllegalArgumentException- If count is non-positive (<= 0) or start is negative (< 0) or it refers to an index that is bigger than the amount of elements of this iterator, anIllegalArgumentExceptionwill be thrown. A forward only iterator will be reset to the last element, a non-forward only iterator will be reset to the first element.IllegalStateException- If this iterator has been closed (explicitly or implicitly), anIllegalStateExceptionwill be thrown on server side.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.UnsupportedOperationException- If this iterator is forward only, anUnsupportedOperationExceptionwill be thrown.
-
getPrevious
Gets the previous specified amount of elements of this iterator. The returned data will be consistent within the returned list (but not necessarily with respect to previous or later retrievals) due to the usage of synchronisation.- Parameters:
count- The amount of elements to retrieve in backward direction. This has to be > 0.- Returns:
- The previous n elements of this iterator, where n is the specified count. The order
corresponds to the one in the underlying data structure, that is previous elements in
the returned list are also previous elements in the data structure. In case of an
insufficient amount of previous elements remaining only the available elements will be
returned. If there are no more previous elements,
nullwill be returned.
AutoCloseables will be coupled to thisRemoteIterator, so do not close them; clone them if required longer than until automatic closing which may happen when traversing or when closing thisRemoteIterator. - Throws:
DataSourceException- If there are problems accessing the underlying data source, aDataSourceExceptionwill be thrown.DataConsistencyException- If there are problems retrieving any of the previous next elements via the identifying attribute of the elements (for instance the primary key of a specific element identifying the next position) is not available any more or if this iterator is forward only, aDataConsistencyExceptionwill be thrown.IllegalArgumentException- If this iterator does not have any previous elements or count is non-positive (<= 0), anIllegalArgumentExceptionwill be thrown.IllegalStateException- If this iterator has been closed (explicitly or implicitly), anIllegalStateExceptionwill be thrown on server side.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.UnsupportedOperationException- If this iterator is forward only, anUnsupportedOperationExceptionwill be thrown.
-
getAll
Gets all elements of this iterator at once. The returned data will be consistent (does not contain elements of different versions) due to the usage of synchronisation. Note that calling this method may take a lot of time.
Calling this method will reset the iterator before the first element if this iterator is not forward only. If this iterator is forward only and does not cache retrieved elements internally, this method will not work but throw aDataSourceExceptionsince the already returned elements may not be retrieved any more.- Returns:
- All elements of this iterator at once.
AutoCloseables will be coupled to thisRemoteIterator, so do not close them; clone them if required longer than until automatic closing which may happen when traversing or when closing thisRemoteIterator. - Throws:
DataSourceException- If there are problems accessing the underlying data source or this iterator is forward only and currently not positioned before the first element, aDataSourceExceptionwill be thrown.DataConsistencyException- If there are problems retrieving any of the elements via the identifying attribute of the elements (for instance the primary key of a specific element identifying the next position) is not available any more, aDataConsistencyExceptionwill be thrown.IllegalStateException- If this iterator has been closed (explicitly or implicitly), anIllegalStateExceptionwill be thrown on server side.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
isSnapshot
Gets whether this iterator is a snapshot and therefore its contents is not subject of change while iterating. However, the contents may be outdated while iterating.- Returns:
- Whether this iterator is a snapshot providing stable but maybe outdated data.
- Throws:
DataSourceException- If there are problems accessing the underlying data source, aDataSourceExceptionwill be thrown.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
isForwardOnly
Gets whether this iterator only allows iterating in forward direction, that is calls togetNext(int)but not togetNext(int, int)andgetPrevious(int). This can be restricted by the underlying data structure, for instance aResultSet.- Returns:
- Whether this iterator only allows iterating in forward direction.
- Throws:
DataSourceException- If there are problems accessing the underlying data source, aDataSourceExceptionwill be thrown.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
closeOnTraversal
boolean closeOnTraversal()Gets whether this remote iterator closes elements ofAutoCloseabletype when traversing to the next elements. If so, all elements of the previous traversal will be closed. That is, each call togetNext(int),getNext(int, int)orgetPrevious(int)will cache all elements and close them with the next call to eithergetNext(int),getNext(int, int)orgetPrevious(int). Otherwise the elements will be closed when closing this remote iterator.- Returns:
- Whether this remote iterator closes elements when traversing to the next elements.
-
getRemainingAliveTime
long getRemainingAliveTime()Gets the time in milliseconds this iterator will still be valid and does allow access to the underlying data. Afterwards the iterator will beclosedautomatically to save memory and resources.
A negative value indicates a closed iterator. Such an iterator cannot bekept alive. Note that this alive time does not need to correspond to the original alive time requested- Specified by:
getRemainingAliveTimein interfacede.aristaflow.adept2.model.communication.ServerSideProxy- Returns:
- The time this iterator remains valid and can be used. Afterwards the iterator will be
closed.Long.MIN_VALUEfor an already closed remote iterator. - Throws:
de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has beenclosed(explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
keepAlive
Keeps this iterator alive for the designated time span (in milliseconds). This allows to continue using this iterator. However, note that extending the usage time significantly impacts resource occupation.
Note that extending the time need not be successful. The underlying iterator implementation may not be able to extend the alive time of all used resource, for instance pooled database connections.A 0 or a negative value is equal to
closedthis iterator.- Specified by:
keepAlivein interfacede.aristaflow.adept2.model.communication.ServerSideProxy- Parameters:
aliveTime- The time in milliseconds to keep this iterator alive that is not to close it automatically.- Returns:
- The relative time this iterator will be kept alive longer. 0 indicates immediate
closing. A negative value represents the failure of extending the alive time, check
getRemainingAliveTime()in this case whether extending the keep alive time has been successful or not. - Throws:
IOException- If there are problems accessing the underlying data source, anIOExceptionwill be thrown.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has beenclosed(explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
close
Explicitly closes this iterator which allows to release occupied memory and resources. Closing will be done implicitly after the alive time has elapsed.
This method may be called several times. Implementors have to take care of this.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Specified by:
closein interfacede.aristaflow.adept2.model.communication.ServerSideProxy- Throws:
IOException- If there are problems accessing the underlying data source, anIOExceptionwill be thrown.de.aristaflow.adept2.model.communication.ServiceConnectionException- If this iterator has been closed (explicitly or implicitly), aServiceConnectionExceptionwill be thrown on client side.
-
drop
Deprecated, for removal: This API element is subject to removal in a future version.Useclose()instead.- Throws:
IOException
-
close()instead.