package foundation.engine; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.monitor.Progressor; public abstract class Engine implements Runnable { protected static Logger logger; private Object lock; private String operator; private Object[] args; protected EngineState state; protected Progressor progressor; static { logger = LogManager.getLogger(Engine.class); } public Engine() { this.lock = new Object(); this.state = EngineState.Idle; this.progressor = new Progressor();; } public boolean exec(String operator, Object... args) throws Exception { if (state == EngineState.Idle) { synchronized (lock) { if (state == EngineState.Idle) { this.state = EngineState.Working; try { this.operator = operator; this.args = args; sameThreadRun(operator, args); Thread thread = new Thread(this); thread.start(); return false; } catch (Exception e) { state = EngineState.Idle; throw e; } } else { return false; } } } else { return false; } } public boolean syncExec(String operator, Object... args) throws Exception { if (state == EngineState.Idle) { synchronized (lock) { if (state == EngineState.Idle) { this.state = EngineState.Working; try { this.operator = operator; this.args = args; sameThreadRun(operator, args); newThreadRun(operator, args); state = EngineState.Idle; return false; } catch (Exception e) { state = EngineState.Idle; throw e; } } else { return false; } } } else { return false; } } @Override public void run() { try { newThreadRun(operator, args); } finally { state = EngineState.Idle; } } protected abstract void sameThreadRun(String operator, Object... args) throws Exception; protected abstract void newThreadRun(String operator, Object... args); public boolean isEquals(Object obj, String operator) { if (obj == null) { return false; } String code = String.valueOf(obj); return code.equalsIgnoreCase(operator); } public EngineState getState() { return state; } public void setStatus(EngineState state) { this.state = state; } public boolean isWorking() { return EngineState.Working == state; } public boolean isIdle() { return EngineState.Idle == state; } public Progressor getProgressor() { return progressor; } }