package ee.telekom.workflow.graph.core;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.apache.commons.lang3.ObjectUtils;
import ee.telekom.workflow.graph.Graph;
import ee.telekom.workflow.graph.GraphInstance;
import ee.telekom.workflow.graph.GraphWorkItem;
import ee.telekom.workflow.graph.Token;
import ee.telekom.workflow.graph.WorkItemStatus;
public class GraphInstanceImpl implements GraphInstance{
private Long externalId;
private Graph graph;
private EnvironmentImpl environment = new EnvironmentImpl();
private List<Token> tokens = new LinkedList<Token>();
private int tokenIdSequence = 0;
private List<GraphWorkItem> workItems = new ArrayList<>();
private StringBuilder history = new StringBuilder();
private Queue<Token> queue = new LinkedList<>();
public GraphInstanceImpl(){
}
public GraphInstanceImpl( Graph graph ){
this.graph = graph;
}
@Override
public Long getExternalId(){
return externalId;
}
@Override
public Graph getGraph(){
return graph;
}
@Override
public EnvironmentImpl getEnvironment(){
return environment;
}
@Override
public List<Token> getTokens(){
return tokens;
}
@Override
public List<Token> getActiveTokens(){
List<Token> result = new LinkedList<Token>();
for( Token token : tokens ){
if( token.isActive() ){
result.add( token );
}
}
return result;
}
@Override
public List<Token> getActiveChildTokens( Token parent ){
List<Token> result = new LinkedList<Token>();
for( Token token : tokens ){
if( ObjectUtils.equals( token.getParent(), parent ) && token.isActive() ){
result.add( token );
}
}
return result;
}
@Override
public void addToken( Token token ){
tokens.add( token );
}
@Override
public boolean isCompleted(){
for( Token token : tokens ){
if( token.isActive() ){
return false;
}
}
return true;
}
@Override
public int nextTokenId(){
return ++tokenIdSequence;
}
@Override
public void addWorkItem( GraphWorkItem workItem ){
workItems.add( workItem );
}
@Override
public GraphWorkItem getActiveWorkItem( Token token ){
for( GraphWorkItem wi : workItems ){
if( wi.getToken().getId() == token.getId()
&& !WorkItemStatus.COMPLETED.equals( wi.getStatus() )
&& !WorkItemStatus.CANCELLED.equals( wi.getStatus() ) ){
return wi;
}
}
return null;
}
public void setExternalId( Long externalId ){
this.externalId = externalId;
}
public void setGraph( Graph graph ){
this.graph = graph;
}
public void setEnvironment( EnvironmentImpl environment ){
this.environment = environment;
}
public void setTokens( List<Token> tokens ){
this.tokens = tokens;
}
public int getTokenIdSequence(){
return tokenIdSequence;
}
public void setTokenIdSquence( int tokenIdSequence ){
this.tokenIdSequence = tokenIdSequence;
}
@Override
public List<GraphWorkItem> getWorkItems(){
return workItems;
}
public void setWorkItems( List<GraphWorkItem> workItems ){
this.workItems = workItems;
}
@Override
public void addToHistory( String event ){
history.append( event ).append( "|" );
}
public void setHistory( String history ){
this.history = new StringBuilder( history );
}
public String getHistory(){
return history.toString();
}
@Override
public Token getFirstFromExecutionQueue(){
return queue.peek();
}
@Override
public void addToExecutionQueue( Token token ){
queue.offer( token );
}
@Override
public void removeFirstFromExecutionQueue(){
queue.poll();
}
}