public abstract class abstractcomponent {
public abstract void execute(object arg) throws exception;
} public abstract class abstractaction extends abstractcomponent {
private abstractcomponent nextstep;
public void execute(object arg) throws exception {
this.doexecute(arg);
if(nextstep != null)
nextstep.execute(arg);
}
protected abstract void doexecute(object arg) throws exception;
public void setnextstep(abstractcomponent nextstep) {
this.nextstep = nextstep;
}
public abstractcomponent getnextstep() {
return nextstep;
}
} public abstract class abstractrule extends abstractcomponent {
private abstractcomponent positiveoutcomestep;
private abstractcomponent negativeoutcomestep;
public void execute(object arg) throws exception {
boolean outcome = makedecision(arg);
if(outcome)
positiveoutcomestep.execute(arg);
else
negativeoutcomestep.execute(arg);
}
protected abstract boolean makedecision(object arg) throws exception;public class springruleengine {
private abstractcomponent firststep;
public void setfirststep(abstractcomponent firststep) {
this.firststep = firststep;
}
public void processrequest(object arg) throws exception {
firststep.execute(arg);
}
}
public class loanapplication {
public static final string invalid_state = "sorry we are not doing business in your state";
public static final string invalid_income_expense_ratio = "sorry we cannot provide the loan given this expense/income ratio";
public static final string approved = "your application has been approved";
public static final string insufficient_data = "you did not provide enough information on your application";
public static final string inprogress = "in progress";
public static final string[] statuses =
new string[] {
insufficient_data, invalid_income_expense_ratio, invalid_state, approved, inprogress
};
private string firstname;
private string lastname;
private double income;
private double expences;
private string statecode;
private string status;
public void setstatus(string status) {
if(!arrays.aslist(statuses).contains(status))
throw new illegalargumentexception("invalid status:" + status);
this.status = status;
}
// 其他getters and setters已被省略
} public interface loanapplicationpersistenceinterface {
public void recordapproval(loanapplication application) throws exception;
public void recordrejection(loanapplication application) throws exception;
public void recordincomplete(loanapplication application) throws exception;
} public class loanprocessruleengine extends springruleengine {
public static final springruleengine getengine(string name) {
classpathxmlapplicationcontext context = new classpathxmlapplicationcontext("springruleenginecontext.xml");
return (springruleengine) context.getbean(name);
}
}
public class springruleeng.netest extends testcase {
public void testsuccessfulflow() throws exception {
springruleengine engine = loanprocessruleengine.getengine("sharkysexpressloansapplicationprocessor");
loanapplication application = new loanapplication();
application.setfirstname("john");
application.setlastname("doe");
application.setstatecode("tx");
application.setexpences(4500);
application.setincome(7000);
engine.processrequest(application);
assertequals(loanapplication.approved, application.getstatus());
}
public void testinvalidstate() throws exception {
springruleengine engine = loanprocessruleengine.getengine("sharkysexpressloansapplicationprocessor");
loanapplication application = new loanapplication();
application.setfirstname("john");
application.setlastname("doe");
application.setstatecode("ok");
application.setexpences(4500);
application.setincome(7000);
engine.processrequest(application);
assertequals(loanapplication.invalid_state, application.getstatus());
}
public void testinvalidratio() throws exception {
springruleengine engine = loanprocessruleengine.getengine("sharkysexpressloansapplicationprocessor");
loanapplication application = new loanapplication();
application.setfirstname("john");
application.setlastname("doe");
application.setstatecode("mi");
application.setincome(7000);
application.setexpences(0.80 * 7000); //too high
engine.processrequest(application);
assertequals(loanapplication.invalid_income_expense_ratio, application.getstatus());
}
public void testincompleteapplication() throws exception {
springruleengine engine = loanprocessruleengine.getengine("sharkysexpressloansapplicationprocessor");
loanapplication application = new loanapplication();
engine.processrequest(application);
assertequals(loanapplication.insufficient_data, application.getstatus());
}
public abstract class abstractpersistenceawareaction extends abstractaction {
private loanapplicationpersistenceinterface persistenceservice;
public void setpersistenceservice(loanapplicationpersistenceinterface persistenceservice) {
this.persistenceservice = persistenceservice;
}
public loanapplicationpersistenceinterface getpersistenceservice() {
return persistenceservice;
}
} public class validapplicationrule extends abstractrule {
protected boolean makedecision(object arg) throws exception {
loanapplication application = (loanapplication) arg;
if(application.getexpences() == 0
application.getfirstname() == null
application.getincome() == 0
application.getlastname() == null
application.getstatecode() == null) {
application.setstatus(loanapplication.insufficient_data);
return false;
}
return true;
}
} <!-- 规则引擎处理器 -->
<bean id="sharkysexpressloansapplicationprocessor" class="springruleengine">
<property name="firststep">
<ref bean="validapplicationrule"/>
</property>
</bean>
这个bean简单地指明validapplicationrule为业务处理的第一个步骤。这个组件如下定义:
<!-- validation -->
<bean id="validapplicationrule" class="validapplicationrule">
<property name="positiveoutcomestep">
<ref bean="validstaterule"/>
</property>
<property name="negativeoutcomestep">
<ref bean="rejectionaction"></ref>
</property>
</bean>
public class processrejectionaction extends abstractpersistenceawareaction {
protected void doexecute(object arg) throws exception {
loanapplication application = (loanapplication) arg;
if(loanapplication.insufficient_data.equals(application.getstatus()))
this.getpersistenceservice().recordincomplete(application);
else
this.getpersistenceservice().recordrejection(application);
}
} <!-- rejection -->
<bean id="rejectionaction" class="processrejectionaction">
<property name="persistenceservice">
<ref bean="loanapplicationpersistenceservice"/>
</property>
</bean>
<!-- persistence service -->
<bean id="loanapplicationpersistenceservice" class="mockloanapplicationpersistence"/>
public class validstaterule extends abstractrule {
private list validstates;
protected boolean makedecision(object arg) throws exception {
loanapplication application = (loanapplication) arg;
if(validstates.contains(application.getstatecode())) {
return true;
}
application.setstatus(loanapplication.invalid_state);
return false;
}
public void setvalidstates(list validstates) {
this.validstates = validstates;
}
} <bean id="validstaterule" class="validstaterule">
<property name="validstates">
<list>
<value>tx</value>
<value>mi</value>
</list>
</property>
<property name="positiveoutcomestep">
<ref bean="validincomeexpenseratiorule"/>
</property>
<property name="negativeoutcomestep">
<ref bean="rejectionaction"></ref>
</property>
</bean>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器