package uk.co.acuminous.julez.test;
import java.util.concurrent.TimeUnit;
import javax.jms.QueueConnectionFactory;
import javax.sql.DataSource;
import org.junit.After;
import org.springframework.jdbc.core.JdbcTemplate;
import uk.co.acuminous.julez.event.Event;
import uk.co.acuminous.julez.event.handler.JmsEventHandler;
import uk.co.acuminous.julez.event.source.JdbcEventRepository;
import uk.co.acuminous.julez.event.source.JmsEventSource;
import uk.co.acuminous.julez.mapper.TransformingMapper;
import uk.co.acuminous.julez.mapper.TwoWayMapper;
import uk.co.acuminous.julez.marshalling.json.JsonEventTranslator;
import uk.co.acuminous.julez.transformer.DefaultColumnNameTransformer;
public class EnterpriseTest {
protected QueueConnectionFactory connectionFactory;
protected DataSource dataSource;
protected JmsEventSource jmsEventSource;
protected JmsEventHandler jmsEventHandler;
protected JdbcEventRepository jdbcEventRepository;
@After
public void nuke() {
JmsTestUtils.nukeBroker();
JdbcTestUtils.nukeDatabase();
}
protected void initJmsInfrastructure() {
JmsTestUtils.createBroker();
connectionFactory = JmsTestUtils.getConnectionFactory();
// The json event translator marshalls / unmarshalls the event to and from json
JsonEventTranslator marshaller = new JsonEventTranslator();
// The JMS event handler writes events asynchronously to the queue
jmsEventHandler = new JmsEventHandler(connectionFactory, marshaller);
// The JMS event source re-raises events pulled asynchronously from the queue
jmsEventSource = new JmsEventSource(connectionFactory, marshaller);
jmsEventSource.setShutdownDelay(500, TimeUnit.MILLISECONDS);
jmsEventSource.listen();
}
protected void initDatabaseInfrastructure() {
dataSource = JdbcTestUtils.getDataSource();
createEventTable();
// The column mapper enables mapping from event data property names to jdbc column names
TwoWayMapper columnMapper = getColumnMapper();
// The JDBC event repository can be queried for events, or asked to re-raise them
jdbcEventRepository = new JdbcEventRepository(dataSource, columnMapper);
}
protected void createEventTable() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(
"CREATE TABLE event (" +
"id VARCHAR(36), " +
"timestamp VARCHAR(255), " +
"type VARCHAR(255), " +
"PRIMARY KEY (id)" +
")");
}
protected TransformingMapper getColumnMapper() {
return new TransformingMapper(new DefaultColumnNameTransformer(), Event.ID, Event.TIMESTAMP, Event.TYPE);
}
}