StateWaitActive.java 5.26 KB
package th.co.ais.ssbsrfc.state;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;

import th.co.ais.ssbsrfc.config.Constant;
import th.co.ais.ssbsrfc.config.StateConfig;
import th.co.ais.ssbsrfc.control.FlowManager;
import th.co.ais.ssbsrfc.control.SubStateManager;
import th.co.ais.ssbsrfc.instance.EC02Instance;
import th.co.ais.ssbsrfc.instance.ManageTime;
import th.co.ais.ssbsrfc.utils.Global;
import th.co.ais.ssbsrfc.utils.Log;
import ec02.af.abstracts.AbstractAF;
import ec02.af.data.EquinoxRawData;
import ec02.af.data.GlobalData;
import ec02.af.interfaces.IAFState;
import ec02.utils.AppLog;

public class StateWaitActive implements IAFState {
	
	private String eqxState = null;
	private ArrayList<EquinoxRawData> eqxRawDataList = new ArrayList<EquinoxRawData>();

	@Override
	public String doAction(AbstractAF abstractAF, Object instance, ArrayList<EquinoxRawData> eqxRawDataList) {
		AppLog.d("[### StateWaitActive ###]");
		EC02Instance ec02Instance = (EC02Instance) instance;
		Global.getConfigEC02(abstractAF, ec02Instance);
		// MultiFlow new
		if (StateConfig.isMultiFlow) {
			FlowManager flowManager = new FlowManager(abstractAF, ec02Instance);
			// E01
			if (abstractAF.getUtils().getGlobalData().isRecieve() ) {
				GlobalData e01 = abstractAF.getUtils().getGlobalData();
				String invoke = e01.getTransactionId();
				ec02Instance.getAFInstance().listTimeoutRemove(invoke);
				EquinoxRawData equinoxRawData = new EquinoxRawData();
				equinoxRawData.setInvoke(invoke);
				flowManager.start(equinoxRawData);
				this.subStateManager(abstractAF, ec02Instance, null);
				flowManager.end(StateConfig.STATE_ACTIVE, this.eqxState, eqxRawDataList, this.eqxRawDataList);
			} else if (eqxRawDataList.isEmpty()) { // TIMEOUT
				ManageTime mt = new ManageTime();
				mt.setListTimeout(ec02Instance.getAFInstance().getGlobalListTimeout());
				List<String> listTimeout = mt.getState(false);
				ec02Instance.getAFInstance().setGlobalListTimeout(mt.getListTimeout());
				for (String unique : listTimeout) {
					EquinoxRawData equinoxRawData = new EquinoxRawData();
					equinoxRawData.getRawDataAttributes().put("unique", unique);
					equinoxRawData.setRet("4");
					flowManager.start(equinoxRawData);
					this.subStateManager(abstractAF, ec02Instance, null);
					flowManager.end(StateConfig.STATE_ACTIVE, this.eqxState, eqxRawDataList, this.eqxRawDataList);
				}
			}
			// CASE SUCCESS, ERROR, REJECT, ABORT
			else {
				for(EquinoxRawData equinoxRawData : eqxRawDataList) {
					flowManager.start(equinoxRawData);
					this.subStateManager(abstractAF, ec02Instance, equinoxRawData);
					flowManager.end(StateConfig.STATE_ACTIVE, this.eqxState, eqxRawDataList, this.eqxRawDataList);
				}
			}
			ec02Instance.setEqxRawDataList(this.eqxRawDataList);
			this.checkEqxState(ec02Instance);
		} else {
			// E01, TIMEOUT
			if (abstractAF.getUtils().getGlobalData().isRecieve() || eqxRawDataList.isEmpty()) {
				this.subStateManager(abstractAF, ec02Instance, null);
			} else {  // CASE SUCCESS, ERROR, REJECT, ABORT
				for(EquinoxRawData equinoxRawData : eqxRawDataList) {
					this.subStateManager(abstractAF, ec02Instance, equinoxRawData);
				}
			}
			
			int count = ec02Instance.getAFInstance().getListTimeout().size();
			if (count > 0 && ec02Instance.getTimeout() == null) {
				ManageTime mt = new ManageTime(ec02Instance);
				mt.setListTimeout(ec02Instance.getAFInstance().getListTimeout());
				String timeout = mt.getCalTime();
				if (timeout == null) {
					timeout = "0";
				}
				ec02Instance.setTimeout(timeout);
			}
			Log.detailLog(ec02Instance, abstractAF, StateConfig.STATE_ACTIVE, this.eqxState, eqxRawDataList, this.eqxRawDataList);
			Log.summaryLog(ec02Instance, abstractAF);
			ec02Instance.setEqxRawDataList(this.eqxRawDataList);
			this.checkEqxState(ec02Instance);
		}
		AppLog.d("[### END StateWaitActive ###]");
		return this.eqxState;
	}
	
	public void subStateManager(AbstractAF abstractAF,EC02Instance ec02Instance, EquinoxRawData equinoxRawData)
	{
		String currentState = ec02Instance.getAFInstance().getCurrentState();
		if (currentState.equals(StateConfig.SSTATE_END)) {
			String eventType = equinoxRawData.getRawEventType();
			currentState = StateConfig.getSubStateFromEventType(eventType);
		}
		
		SubStateManager subStateManager = new SubStateManager(currentState);
		List<EquinoxRawData> eqxList = subStateManager.doActionSubState(abstractAF, ec02Instance, equinoxRawData);
		for(EquinoxRawData eqx : eqxList) {
			String type = eqx.getType();
			String invoke = eqx.getInvoke();
			if (type.equals("request") && (invoke.length() > 0 || invoke != null)) {
				ec02Instance.getAFInstance().putDicInvoke(invoke, Global.getInvokeForManageFlow(ec02Instance));
			}
			this.eqxRawDataList.add(eqx);
		}
		
		// END
		currentState = ec02Instance.getAFInstance().getCurrentState();
		if (currentState.equals("END")) {
			this.eqxState = StateConfig.STATE_IDLE;
		} else {
			this.eqxState = StateConfig.STATE_ACTIVE;
		}
	}
	
	public void checkEqxState(EC02Instance ec02Instance)
	{
		if (!ArrayUtils.contains(Constant.arrSingleFlow, ec02Instance.getAFInstance().getFlow())) {
			int count = ec02Instance.getAFInstance().getListFlow().size();
			if (count > 0 && this.eqxState.equals(StateConfig.STATE_IDLE)) {
				this.eqxState = StateConfig.STATE_ACTIVE;
			}
		}
	}
}