import com.infoteria.asteria.flowengine2.execute.ExecuteContext;
import com.infoteria.asteria.flowengine2.flow.InputConnector;
import com.infoteria.asteria.flowlibrary2.FlowException;
import com.infoteria.asteria.flowlibrary2.component.SimpleComponent;
import com.infoteria.asteria.flowlibrary2.stream.StreamType;

/**
 * コンポーネントの各メソッドが実行されたときにログを出力するコンポーネント
 */
public class MethodLogComponent extends SimpleComponent {
	
	public static final String COMPONENT_NAME = "MethodLog";
	public String getComponentName() { return COMPONENT_NAME;}
	
	public MethodLogComponent() {
		getInputConnector().setAcceptLinkCount(1);
		//getInputConnector().setAcceptContainer(true);
		//getInputConnector().setExpandContainer(false);
		getInputConnector().setAcceptType(StreamType.ALL);
		getOutputConnector().setAcceptType(StreamType.ALL);
	}
	
	public void init(ExecuteContext context) throws FlowException {
		context.info("init");
	}
	
	public void term(ExecuteContext context) {
		context.info("term");
	}
	
	public boolean execute(ExecuteContext context) throws FlowException {
		context.info("execute");
		passStream();
		return false;
		//executeLoopメソッドも実行させたいのでここではfalseを返すことにします。
	}
	
	public int executeLoop(ExecuteContext context) throws FlowException {
		context.info("executeLoop");
		passStream();
		return LOOP_END;
		//1回ループ処理を実行したら、もうループさせたくないのでLOOP_ENDを返します。
		//ここで常にLOOP_CONTINUEを返すようなコードを書くとフローが無限ループして永遠に終わりません。
	}
	
	/**
	//commit、rollbackメソッドはASTERIA3の頃にはありましたがWARPになって廃止されました
	//これらのメソッドを実装してもそのままではフローの実行エンジンからコールされることはありません。
	public void commit(ExecuteContext context) throws FlowException {
		context.info("commit");
	}
	
	public void rollback(ExecuteContext context) throws FlowException {
		context.info("rollback");
	}
	*/
	
	public void endFlow(ExecuteContext context) {
		context.info("endFlow");
	}
	
	public boolean cancel() {
		System.out.println("cancel");//System.out.printlnはasteria-console.logに出力されます。
		return true;
	}
	
	/** ループの起点となる可能性のあるコンポーネントではloopPossibilityをオーバーライドしてtrueを返します。 */
	public boolean loopPossibility() {
		return true;
	}
	
}
