/**
*
*/
package org.springmodules.jsr94.core;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.rules.Handle;
import javax.rules.InvalidHandleException;
import javax.rules.InvalidRuleSessionException;
import javax.rules.StatefulRuleSession;
import javax.rules.StatelessRuleSession;
import junit.framework.TestCase;
import org.springmodules.jsr94.Jsr94TransactionManager;
import org.springmodules.jsr94.rulesource.RuleSource;
import org.springmodules.jsr94.support.StatefulRuleSessionCallback;
import org.springmodules.jsr94.support.StatelessRuleSessionCallback;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* Tests the Jsr94Template class
*
* @author janm
*/
public class Jsr94TemplateTests extends TestCase {
private Handle browserHandle;
private static String URI = "test";
private ApplicationContext context = new ClassPathXmlApplicationContext("org/springmodules/jsr94/rulesource.xml");
/**
* Gets the Jsr94Template for the given source
*
* @param ruleSourceBeanName
* @return A Jsr94Template instance
*/
private Jsr94Template getTemplate(String ruleSourceBeanName) {
RuleSource source = (RuleSource) context.getBean(ruleSourceBeanName);
return new Jsr94Template(source);
}
/**
* Tests the executeStateless method
*/
public void testStateless() {
List result = (List) getTemplate("ruleSource").executeStateless(URI, null, new StatelessRuleSessionCallback() {
public Object execute(StatelessRuleSession session) throws InvalidRuleSessionException, RemoteException {
List inputList = new ArrayList();
inputList.add("Gecko");
return session.executeRules(inputList);
}
});
assertTrue("result must contain Gecko", result.contains("Gecko"));
assertTrue("result must contain a:Gecko", result.contains("a:Gecko"));
}
/**
* Tests the executeStateful method within a transaction
*/
public void testStatefulInTransaction() {
final Jsr94Template template = getTemplate("ruleSource");
final Jsr94TransactionManager transactionManager = new Jsr94TransactionManager();
transactionManager.setRuleSource(template.getRuleSource());
final TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
List result = (List) txTemplate.execute(new TransactionCallback() {
/* (non-Javadoc)
* @see org.springframework.transaction.support.TransactionCallback#doInTransaction(org.springframework.transaction.TransactionStatus)
*/
public Object doInTransaction(TransactionStatus status) {
List result = (List) template.executeStateful(URI, null, new StatefulRuleSessionCallback() {
public Object execute(StatefulRuleSession session) throws InvalidRuleSessionException, InvalidHandleException, RemoteException {
browserHandle = session.addObject("Gecko");
session.executeRules();
return session.getObjects();
}
});
result = (List) template.executeStateful(URI, null, new StatefulRuleSessionCallback() {
public Object execute(StatefulRuleSession session) throws InvalidRuleSessionException, InvalidHandleException, RemoteException {
session.removeObject(browserHandle);
session.addObject("MSIE");
session.executeRules();
return session.getObjects();
}
});
return result;
}
});
assertTrue("result must contain MSIE", result.contains("MSIE"));
assertTrue("result must contain a:MSIE", result.contains("a:MSIE"));
assertTrue("result must contain a:Gecko", result.contains("a:Gecko"));
}
/**
* Tests the executeStateful method outside a transaction
*/
public void testStatefulOutsideTransaction() {
final Jsr94Template template = getTemplate("ruleSource");
List result = (List) template.executeStateful(URI, null, new StatefulRuleSessionCallback() {
public Object execute(StatefulRuleSession session) throws InvalidRuleSessionException, InvalidHandleException, RemoteException {
browserHandle = session.addObject("Gecko");
session.executeRules();
return session.getObjects();
}
});
result = (List) template.executeStateful(URI, null, new StatefulRuleSessionCallback() {
public Object execute(StatefulRuleSession session) throws InvalidRuleSessionException, InvalidHandleException, RemoteException {
try {
session.removeObject(browserHandle);
fail("Cannot remove browserHandle from a new session");
}
catch (InvalidRuleSessionException ex) {
// expected
}
return null;
}
});
}
/**
* Tests stateful execution in objects created in bean factory
*/
public void testStateful() {
BusinessBean bean = (BusinessBean) context.getBean("businessBean");
bean.statefulInTransaction();
bean.statefulOutsideTransaction();
}
}