package org.beanfuse.rule.engine.impl;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.beanfuse.entity.Model;
import org.beanfuse.model.EntityUtils;
import org.beanfuse.rule.Rule;
import org.beanfuse.rule.engine.RuleExecutor;
import org.beanfuse.rule.engine.RuleExecutorBuilder;
import org.beanfuse.rule.model.RuleConfig;
import org.beanfuse.rule.model.RuleConfigParam;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class DefaultRuleExecutorBuilder implements RuleExecutorBuilder, ApplicationContextAware {
ApplicationContext appContext;
public static final String SPRING = "spring";
public static final String BEAN = "bean";
public RuleExecutor build(Rule rule) {
if (SPRING.equals(rule.getFactory())) {
return (RuleExecutor) appContext.getBean(rule.getServiceName());
} else if (BEAN.equals(rule.getFactory())) {
try {
return (RuleExecutor) Class.forName(rule.getServiceName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
}
public RuleExecutor build(List rules, boolean stopWhenFail) {
CompositeExecutor composite = new CompositeExecutor();
composite.setStopWhenFail(stopWhenFail);
for (Iterator iter = rules.iterator(); iter.hasNext();) {
Rule rule = (Rule) iter.next();
composite.add(build(rule));
}
return composite;
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.appContext = applicationContext;
}
public RuleExecutor build(RuleConfig ruleConfig) {
RuleExecutor executor = build(ruleConfig.getRule());
if (null == executor) {
return null;
}
Map map = new HashMap();
for (Iterator iter = ruleConfig.getParams().iterator(); iter.hasNext();) {
RuleConfigParam param = (RuleConfigParam) iter.next();
map.put(param.getParam().getName(), param.getValue());
}
Model.populate(map, executor);
return executor;
}
}