package com.easyooo.framework.rule;
import com.easyooo.framework.common.util.MapUtil;
import com.easyooo.framework.rule.impl.AroundRuleEngine;
import com.easyooo.framework.rule.impl.JavaRuleEngine;
import com.easyooo.framework.rule.impl.UnsupportRuleEngine;
import com.easyooo.framework.rule.js.JavaScriptRuleEngine;
/**
* 规则引擎的代理实现,通常使用该类实现规则,而不直接使用规则引擎
*
* @author Killer
*/
public class RuleEngineProxy{
private Rule rule;
private RuleContext context ;
public RuleEngineProxy(Rule rule){
this(rule, new RuleContext(MapUtil.gmap()));
}
public RuleEngineProxy(Rule rule, RuleContext context){
this.rule = rule;
this.context = context;
}
public void setContext(RuleContext context) {
this.context = context;
}
public <T> T eval() throws RuleException {
RuleEngine engine = newEngineImpl(rule.getLanguage());
engine.setContext(context);
return engine.eval(rule);
}
public <T> T eval(Object... dataMap) throws RuleException {
RuleEngine engine = newEngineImpl(rule.getLanguage());
engine.setContext(context);
return engine.eval(rule, dataMap);
}
public boolean verifySyntax() throws RuleException {
RuleEngine engine = newEngineImpl(rule.getLanguage());
engine.setContext(context);
return engine.verifySyntax(rule);
}
private RuleEngine newEngineImpl(Language lang){
RuleEngine delegate = null;
switch (lang) {
case JAVA :
case GROOVY:
delegate = new JavaRuleEngine();
break;
case JAVASCRIPT:
delegate = new JavaScriptRuleEngine();
break;
}
if(delegate != null){
return new AroundRuleEngine(delegate);
}else{
return new UnsupportRuleEngine();
}
}
}