package ee.telekom.workflow.graph.node.event;
import ee.telekom.workflow.graph.Environment;
import ee.telekom.workflow.graph.GraphEngine;
import ee.telekom.workflow.graph.GraphInstance;
import ee.telekom.workflow.graph.Token;
import ee.telekom.workflow.graph.node.AbstractNode;
import ee.telekom.workflow.graph.node.input.ConstantMapping;
import ee.telekom.workflow.graph.node.input.InputMapping;
import ee.telekom.workflow.graph.node.output.OutputMapping;
/**
* Catch event, pausing execution until the arrival of a signal from an external source.
*/
public class CatchSignal extends AbstractNode{
private InputMapping<String> signalMapping;
private OutputMapping resultMapping;
public CatchSignal( int id, String signal ){
this( id, null, ConstantMapping.of( signal ), null );
}
public CatchSignal( int id, String name, String signal ){
this( id, name, ConstantMapping.of( signal ), null );
}
public CatchSignal( int id, String name, String signal, OutputMapping resultMapping ){
this( id, name, ConstantMapping.of( signal ), resultMapping );
}
public CatchSignal( int id, String signal, OutputMapping resultMapping ){
this( id, null, ConstantMapping.of( signal ), resultMapping );
}
public CatchSignal( int id, String name, InputMapping<String> signal, OutputMapping resultMapping ){
super( id, name );
this.signalMapping = signal;
this.resultMapping = resultMapping;
}
public InputMapping<String> getSignalMapping(){
return signalMapping;
}
public OutputMapping getResultMapping(){
return resultMapping;
}
@Override
public void execute( GraphEngine engine, Token token ){
GraphInstance instance = token.getInstance();
String signal = signalMapping.evaluate( instance );
engine.addSignalItem( instance, token, signal );
}
@Override
public void cancel( GraphEngine engine, Token token ){
engine.cancelWorkItem( token );
}
@Override
public void store( Environment environment, Object result ){
if( resultMapping != null ){
resultMapping.map( environment, result );
}
}
}