package ee.telekom.workflow.graph;
import java.util.List;
import ee.telekom.workflow.core.workitem.WorkItem;
/**
* A {@link GraphInstance} represents an executing instance of a {@link Graph}.
*/
public interface GraphInstance{
/**
* A {@link GraphInstance} may be assigned an external id to associate it
* with externally persisted state, buisness data, etc.
*
* @return the graph instance's external id
*/
Long getExternalId();
/**
* @return the graph being executed
*/
Graph getGraph();
/**
* @return the graph instance's {@link Environment}
*/
Environment getEnvironment();
/**
* @return the list of all tokens (both active and inactive) in the graph
* instance
*/
List<Token> getTokens();
/**
* @return the list of all active tokens in the graph instance
*/
List<Token> getActiveTokens();
/**
* {@link Token}s are created with a tree-like parent-child relation-ship.
* Each token has exactly one parent and may have zero to many child tokens.
* Child tokens are mainly created at fork nodes which produce 1-N outgoing
* tokens. When a token is cancelled, all it's child tokens are cancelled as
* well.
*
* @return the list of all active child tokens of the given parent token
*/
List<Token> getActiveChildTokens( Token parent );
/**
* Adds a token to the graph instance.
*
* @param token
* the token to be added
*/
void addToken( Token token );
/**
* A {@link GraphInstance} is completed if it does not contain any active
* tokens.
*
* @return true, if the graph instance is completed.
*/
boolean isCompleted();
/**
* A {@link Token} has a graph instance specific id. It is a graph
* instance's task to provide a sequence for such id numbers.
*
* @return a new token id, as used when creating a new token
*/
int nextTokenId();
/**
* When a token execution reaches a wait state, it produces a
* {@link WorkItem} which describes the work that needs to be completed in
* order to continue the token's execution.
* <p>
* This node is not intended to be called directly from a node's
* {@link Node#execute(GraphEngine, Token)} method. They should rather call
* methods such as
* {@link GraphEngine#addSignalItem(GraphInstance, Token, String)} which
* also notify {@link GraphWorkItemEventListener}s in addition to calling this
* method.
*
* @param workItem
* the work item to be added to the instance
*/
void addWorkItem( GraphWorkItem workItem );
/**
* A token can be associated with 0 or 1 active work items. A work item is
* considered active if its status is neither
* {@link WorkItemStatus#COMPLETED} nor {@link WorkItemStatus#CANCELLED}.
*
* @param token
* the token of which to find the active work item
* @return the active work item associated with the given token or
* <code>null</code> if no such work item exists
*/
GraphWorkItem getActiveWorkItem( Token token );
/**
* @return a list of all work items (both active and inactive) in the graph
* instance
*/
List<GraphWorkItem> getWorkItems();
/**
* Adds the given event into the instance's history log.
* @param event information on an execution event
*/
void addToHistory( String event );
/**
* Returns the instance's history log.
* @return the instance's history log.
*/
String getHistory();
/**
* A {@link GraphInstance} keeps a queue of tokens for which the engine
* should attempt to proceed execution. This method peeks the top of this
* queue, i.e. it returns the queue's head but does not remove it.
*
* @return the token to continue execution with or <code>null</code> if
* currently no token can be executed
*/
Token getFirstFromExecutionQueue();
/**
* Adds a token to the execution queue.
*
* @param token
* the token to be added
*/
void addToExecutionQueue( Token token );
/**
* Removes the head of the execution queue.
*/
void removeFirstFromExecutionQueue();
}