Package jadex.future

Class IntermediateFuture<E>

java.lang.Object
jadex.future.Future<Collection<E>>
jadex.future.IntermediateFuture<E>
All Implemented Interfaces:
IForwardCommandFuture, IFuture<Collection<E>>, IIntermediateFuture<E>, Supplier<Collection<E>>
Direct Known Subclasses:
TerminableIntermediateDelegationFuture, TerminableIntermediateFuture, Tuple2Future

public class IntermediateFuture<E> extends Future<Collection<E>> implements IIntermediateFuture<E>
Default implementation of an intermediate future.
  • Field Details

    • results

      protected List<E> results
      The intermediate results.
    • intermediate

      protected boolean intermediate
      Flag indicating that addIntermediateResult()has been called.
    • icallers

      protected Map<ISuspendable,String> icallers
      The blocked intermediate callers (caller->state).
    • indices

      protected Map<Thread,Integer> indices
      The index of the next result for a thread.
    • maxresultcnt

      protected int maxresultcnt
      The max result count (if given by the producer).
    • notcommand

      protected jadex.common.ICommand<IResultListener<Collection<E>>> notcommand
  • Constructor Details

    • IntermediateFuture

      public IntermediateFuture()
      Create a future that is already done.
    • IntermediateFuture

      public IntermediateFuture(Collection<E> results)
      Create a future that is already done.
      Parameters:
      results - The results, if any.
    • IntermediateFuture

      public IntermediateFuture(Exception exception)
      Create a future that is already done (failed).
      Parameters:
      exception - The exception.
  • Method Details

    • getIntermediateResults

      public Collection<E> getIntermediateResults()
      Get the intermediate results that are available.
      Specified by:
      getIntermediateResults in interface IIntermediateFuture<E>
      Returns:
      The current intermediate results (copy of the list).
    • addIntermediateResult

      public void addIntermediateResult(E result)
      Add an intermediate result.
    • addIntermediateResultIfUndone

      public boolean addIntermediateResultIfUndone(E result)
      Set the result.
      Parameters:
      result - The result.
      Returns:
      True if result was set.
    • doAddIntermediateResult

      protected boolean doAddIntermediateResult(E result, boolean undone)
      Set the result and schedule listener notifications.
      Returns:
      true, when the result was added (finished and undone otherwise).
    • storeResult

      protected void storeResult(E result, boolean scheduled)
      Add a result.
      Parameters:
      result - The result.
      scheduled - True, if any listener notification has been scheduled for this result. (used for subscription futures to check for lost values)
    • doSetResult

      protected boolean doSetResult(Collection<E> result, boolean undone)
      Set the result. Listener notifications occur on calling thread of this method.
      Overrides:
      doSetResult in class Future<Collection<E>>
      Parameters:
      result - The result.
      undone - The undone flag.
      Returns:
      True, if exception was set.
    • setFinished

      public void setFinished()
      Declare that the future is finished.
    • setFinishedIfUndone

      public boolean setFinishedIfUndone()
      Declare that the future is finished.
    • doSetFinished

      protected boolean doSetFinished(boolean undone)
      Declare that the future is finished.
    • doSetException

      protected boolean doSetException(Exception exception, boolean undone)
      Description copied from class: Future
      Set the exception (internal implementation for normal and if-undone).
      Overrides:
      doSetException in class Future<Collection<E>>
      Parameters:
      exception - The exception.
      undone - The undone flag.
      Returns:
      True, if exception was set.
    • addResultListener

      public void addResultListener(IResultListener<Collection<E>> listener)
      Add a result listener.
      Specified by:
      addResultListener in interface IFuture<E>
      Overrides:
      addResultListener in class Future<Collection<E>>
      Parameters:
      listener - The listener.
    • getNotificationCommand

      protected jadex.common.ICommand<IResultListener<Collection<E>>> getNotificationCommand()
      Get the notification command.
      Overrides:
      getNotificationCommand in class Future<Collection<E>>
    • hasNextIntermediateResult

      public boolean hasNextIntermediateResult()
      Check if there are more results for iteration for the given caller. If there are currently no unprocessed results and future is not yet finished, the caller is blocked until either new results are available and true is returned or the future is finished, thus returning false.
      Specified by:
      hasNextIntermediateResult in interface IIntermediateFuture<E>
      Returns:
      True, when there are more intermediate results for the caller.
    • hasNextIntermediateResult

      public boolean hasNextIntermediateResult(long timeout, boolean realtime)
      Check if there are more results for iteration for the given caller. If there are currently no unprocessed results and future is not yet finished, the caller is blocked until either new results are available and true is returned or the future is finished, thus returning false.
      Specified by:
      hasNextIntermediateResult in interface IIntermediateFuture<E>
      Parameters:
      timeout - The timeout in millis.
      realtime - Flag, if wait should be realtime (in constrast to simulation time).
      Returns:
      True, when there are more intermediate results for the caller.
    • getNextIntermediateResult

      public E getNextIntermediateResult()
      Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
      Specified by:
      getNextIntermediateResult in interface IIntermediateFuture<E>
      Returns:
      The next intermediate result.
      Throws:
      NoSuchElementException - when there are no more intermediate results and the future is finished.
    • getNextIntermediateResult

      public E getNextIntermediateResult(boolean realtime)
      Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
      Returns:
      The next intermediate result.
      Throws:
      NoSuchElementException - when there are no more intermediate results and the future is finished.
    • getNextIntermediateResult

      public E getNextIntermediateResult(long timeout, boolean realtime)
      Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
      Specified by:
      getNextIntermediateResult in interface IIntermediateFuture<E>
      Parameters:
      timeout - The timeout in millis.
      realtime - Flag, if wait should be realtime (in constrast to simulation time).
      Returns:
      The next intermediate result.
      Throws:
      NoSuchElementException - when there are no more intermediate results and the future is finished.
    • setMaxResultCount

      public void setMaxResultCount(int max)
      Set the maximum number of results.
      Parameters:
      max - The maximum number of results.
    • scheduleMaxNotification

      protected boolean scheduleMaxNotification(IResultListener<Collection<E>> lis)
      Schedule max notification
      Parameters:
      lis - The result listener
    • getResultCount

      protected int getResultCount()
      Get the number of results already collected.
      Returns:
      The number of results.
    • doGetNextIntermediateResult

      protected E doGetNextIntermediateResult(int index, long timeout, boolean realtime)
      Perform the get without increasing the index.
    • notifyIntermediateResult

      protected void notifyIntermediateResult(IIntermediateResultListener<E> listener, E result)
      Notify a result listener.
      Parameters:
      listener - The listener.
    • resume

      protected void resume()
      Resume also intermediate waiters.
      Overrides:
      resume in class Future<Collection<E>>
    • resumeIntermediate

      protected void resumeIntermediate()
      Resume after intermediate result.
    • delegateFrom

      public void delegateFrom(IFuture<Collection<E>> source)
      Delegate the result and exception from another future.
      Overrides:
      delegateFrom in class Future<Collection<E>>
      Parameters:
      source - The source future.
    • catchEx

      public IIntermediateFuture<E> catchEx(Consumer<? super Exception> consumer, Class<?> futuretype)
      Description copied from class: Future
      Called on exception.
      Specified by:
      catchEx in interface IFuture<E>
      Overrides:
      catchEx in class Future<Collection<E>>
      Parameters:
      consumer - The function called with the exception.
      futuretype - The function called with the exception.
    • delegateEx

      public <T> IIntermediateFuture<E> delegateEx(Future<T> delegate)
      Called on exception.
      Parameters:
      delegate - The future the exception will be delegated to.
    • then

      public IIntermediateFuture<E> then(Consumer<? super Collection<E>> function)
      Description copied from interface: IFuture
      Applies a function after the result is available, using the result of this Future as input.
      Specified by:
      then in interface IFuture<E>
      Overrides:
      then in class Future<Collection<E>>
      Parameters:
      function - Function that takes the result of this future as input and delivers t.
      Returns:
      Future of the result after the function has been applied.
    • next

      public IIntermediateFuture<? extends E> next(Consumer<? super E> function)
      Called when the next intermediate value is available.
      Specified by:
      next in interface IIntermediateFuture<E>
      Parameters:
      function - Called when value arrives.
      Returns:
      The future for chaining.
    • max

      public IIntermediateFuture<? extends E> max(Consumer<Integer> function)
      Called when the maximum number of results is available.
      Specified by:
      max in interface IIntermediateFuture<E>
      Parameters:
      function - Called when max value arrives.
      Returns:
      The future for chaining.
    • finished

      public IIntermediateFuture<? extends E> finished(Consumer<Void> function)
      Called when the future is finished.
      Specified by:
      finished in interface IIntermediateFuture<E>
      Parameters:
      function - Called when max value arrives.
      Returns:
      The future for chaining.
    • done

      public IIntermediateFuture<? extends E> done(Consumer<? super Exception> consumer)
      Called when the future is done (finished or exception occurred). Exception parameter will be set if the cause was an exception, null otherwise.
      Specified by:
      done in interface IIntermediateFuture<E>
      Parameters:
      consumer - Called future is done.
      Returns:
      The future for chaining.
    • asStream

      public Stream<E> asStream()
      Return a stream of the results of this future. Although this method itself is non-blocking, all terminal stream methods (e.g. forEach) will block until the future is finished!
      Specified by:
      asStream in interface IIntermediateFuture<E>
    • asStream

      public Stream<E> asStream(long timeout, boolean realtime)
      Return a stream of the results of this future. Use the given timeout settings when waiting for elements in the stream. Although this method itself is non-blocking, all terminal stream methods (e.g. forEach) will block until the future is finished!
      Specified by:
      asStream in interface IIntermediateFuture<E>
      Parameters:
      timeout - The timeout in millis.
      realtime - Flag, if wait should be realtime (in constrast to simulation time).