package org.arefgard.icerya.flow.core;

import java.util.Map;

import org.arefgard.icerya.flow.exception.UsecaseFlowDefinitionParseException;
import org.arefgard.icerya.flow.exception.UsecaseFlowException;

/**
 * ユースケースフローを生成するファクトリ。
 * 
 * @author Takashi Yamashina
 * @since 1.0.0
 */
public class UsecaseFlowFactory {
	
	/** ユースケースフローのキャッシュ */
	private static Map<String, UsecaseFlow> cache = new java.util.HashMap<String, UsecaseFlow>();
	
	/**
	 * ユースケースフローを生成する。
	 * <br/>
	 * <br/>
	 * ユースケースフロー定義ファイルをパースして、ユースケースフローオブジェクトを生成する。
	 * 同一パスのユースケースがキャッシュされていれば、それを返す。
	 * 
	 * @param path ユースケースフローのパス
	 * @return ユースケースフローのオブジェクト
	 * @throws UsecaseFlowException ユースケースフローオブジェクトの生成に失敗した場合
	 */
	public synchronized static UsecaseFlow create(String path) throws UsecaseFlowException {
		
		UsecaseFlow result = null;
		if(cache.containsKey(path)) {
			// キャッシュされている
			result = cache.get(path);
		}else {
			try {
			result = new UsecaseFlow();
			UsecaseFlowDefinitionReader reader = new UsecaseFlowDefinitionReader(result);
			reader.parse(path);
			cache.put(path, result);
			}catch(Exception e) {
				throw new UsecaseFlowDefinitionParseException("PATH[" + path + "] is illegal path.", e);
			}
		}
		return result;

	}
}
