package org.arefgard.icerya.flow.node;

import java.util.Map;

import org.arefgard.icerya.flow.core.UsecaseFlow;
import org.arefgard.icerya.flow.core.UsecaseFlowFactory;

/**
 * ユースケースの包含を表すノード。
 * 
 * @author Takashi Yamashina
 * @since 1.0.0
 */
public class IncludeNode extends Node {
	
	/** 次に遷移するノード */
	private String nextTo;
	/** 包含するユースケースフローのパス */
	private String path;
	/** 包含するユースケースフローの名前 */
	private String flowName = "_main";
	/** 包含元ユースケースフローの状態を保持するか */
	private boolean inherit;
	
	public boolean isInherit() {
		return inherit;
	}
	public void setInherit(boolean inherit) {
		this.inherit = inherit;
	}
	public String getNextTo() {
		return nextTo;
	}
	public void setNextTo(String nextTo) {
		this.nextTo = nextTo;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public String getFlowName() {
		return flowName;
	}
	public void setFlowName(String flowName) {
		this.flowName = flowName;
	}
	/**
	 * ユースケースフローを呼び出す。
	 * <br/>
	 * <br/>
	 * inheritフィールドがtrueの場合には、包含元のユースケースフローの状態を
	 * 包含先のユースケースに渡す。
	 * 
	 * @param params ユースケースフローの状態
	 * @throws Exception 包含するユースケースフローが例外をthrowした場合
	 */
	public void call(Map<String, Object> params) throws Exception {
		UsecaseFlow subUcFlow = UsecaseFlowFactory.create(path);
		Flow subFlow = subUcFlow.getFlow(this.flowName);
		if(inherit) {
			subFlow.execute(params);
		}else {
			subFlow.execute();
		}
	}
	
}
