package org.springframework.webflow.persistence;
import javax.sql.DataSource;
import junit.framework.TestCase;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.webflow.engine.EndState;
import org.springframework.webflow.engine.Flow;
import org.springframework.webflow.engine.builder.FlowAssembler;
import org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder;
import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
import org.springframework.webflow.engine.model.builder.DefaultFlowModelHolder;
import org.springframework.webflow.engine.model.builder.xml.XmlFlowModelBuilder;
import org.springframework.webflow.execution.Action;
import org.springframework.webflow.execution.FlowExecution;
import org.springframework.webflow.execution.FlowExecutionListener;
import org.springframework.webflow.execution.factory.StaticFlowExecutionListenerLoader;
import org.springframework.webflow.test.MockExternalContext;
import org.springframework.webflow.test.MockFlowBuilderContext;
public abstract class AbstractFlowManagedPersistenceIntegrationTests extends TestCase {
private FlowExecutionListener persistenceListener;
private FlowExecution flowExecution;
private DataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
protected void setUp() throws Exception {
initDataSource();
populateDataBase();
persistenceListener = createFlowExecutionListener();
ClassPathResource resource = new ClassPathResource("managed-root-flow.xml", getClass());
DefaultFlowModelHolder holder = new DefaultFlowModelHolder(new XmlFlowModelBuilder(resource));
FlowModelFlowBuilder builder = new FlowModelFlowBuilder(holder);
MockFlowBuilderContext context = new MockFlowBuilderContext("managed-root-flow");
FlowAssembler assembler = new FlowAssembler(builder, context);
Flow rootFlow = assembler.assembleFlow();
ClassPathResource childFlowResource = new ClassPathResource("managed-child-flow.xml", getClass());
DefaultFlowModelHolder childFlowHolder = new DefaultFlowModelHolder(new XmlFlowModelBuilder(childFlowResource));
FlowModelFlowBuilder childFlowBuilder = new FlowModelFlowBuilder(childFlowHolder);
MockFlowBuilderContext childFlowContext = new MockFlowBuilderContext("managed-child-flow");
FlowAssembler childFlowAssembler = new FlowAssembler(childFlowBuilder, childFlowContext);
Flow childFlow = childFlowAssembler.assembleFlow();
Flow notManaged = new Flow("notmanaged-child-flow");
new EndState(notManaged, "finish");
context.registerSubflow(childFlow);
context.registerSubflow(notManaged);
Action incrementCountAction = incrementCountAction();
context.registerBean("incrementCountAction", incrementCountAction);
childFlowContext.registerBean("incrementCountAction", incrementCountAction);
Object assertCountAction = assertCountAction();
context.registerBean("assertCountAction", assertCountAction);
childFlowContext.registerBean("assertCountAction", assertCountAction);
FlowExecutionImplFactory factory = new FlowExecutionImplFactory();
factory.setExecutionListenerLoader(new StaticFlowExecutionListenerLoader(persistenceListener));
flowExecution = factory.createFlowExecution(rootFlow);
}
public void testFlowWithSubflow() {
MockExternalContext context = new MockExternalContext();
flowExecution.start(null, context);
context.setEventId("managed");
flowExecution.resume(context);
context.setEventId("finish");
flowExecution.resume(context);
}
public void testManagedFlowWithUnmanagedSubflow() {
MockExternalContext context = new MockExternalContext();
flowExecution.start(null, context);
context.setEventId("notmanaged");
flowExecution.resume(context);
}
/* Methods for subclasses */
protected abstract FlowExecutionListener createFlowExecutionListener() throws Exception;
protected abstract Action incrementCountAction();
protected abstract Object assertCountAction();
protected abstract void assertSessionBound();
/* private helper methods */
private void initDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("org.hsqldb.jdbcDriver");
dmds.setUrl("jdbc:hsqldb:mem:jpa");
dmds.setUsername("sa");
dmds.setPassword("");
dataSource = dmds;
}
private void populateDataBase() throws Exception {
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
databasePopulator.addScript(new ClassPathResource("test-data.sql", this.getClass()));
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(getDataSource());
initializer.setDatabasePopulator(databasePopulator);
initializer.afterPropertiesSet();
}
}