package org.squirrelframework.foundation.fsm.impl;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.squirrelframework.foundation.fsm.Condition;
import org.squirrelframework.foundation.fsm.MvelScriptManager;
class MvelConditionImpl<C> implements Condition<C> {
private static final Logger logger = LoggerFactory.getLogger(MvelConditionImpl.class);
private final String mvelExpression;
private final String name;
private final MvelScriptManager scriptManager;
private final String script;
MvelConditionImpl(String script, MvelScriptManager scriptManager) {
String[] arrays = StringUtils.split(script, MvelScriptManager.SEPARATOR_CHARS);
if(arrays.length==2) {
this.name = arrays[0].trim();
this.mvelExpression = arrays[1].trim();
} else {
this.name = "_NoName_";
this.mvelExpression = arrays[0].trim();
}
this.script = script;
this.scriptManager = scriptManager;
scriptManager.compile(mvelExpression);
}
@Override
public boolean isSatisfied(C context) {
try {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put(MvelScriptManager.VAR_CONTEXT, context);
return scriptManager.evalBoolean(mvelExpression, variables);
} catch (Exception e) {
logger.error("Evaluate \""+mvelExpression+"\" failed with "+e.getMessage()+(e.getCause()!=null ? ", which caused by "+e.getCause().getMessage() : ""));
return false;
}
}
@Override
public String name() {
return name;
}
@Override
final public String toString() {
return "mvel#"+script;
}
}