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;
|
}
|
|
}
|