From 8912b20da8c11f79ee55504853925af14d485f67 Mon Sep 17 00:00:00 2001 From: Shaun Francis Date: Mon, 15 Apr 2019 11:05:26 +0100 Subject: [PATCH] Simplify datasource usage and setup --- CHANGELOG.md | 5 + .../source/core/SnapshotAwareEventSource.java | 12 +- .../core/SnapshotAwareEventSourceFactory.java | 16 +-- .../SnapshotAwareEventSourceProducer.java | 13 +- .../SnapshotAwareAggregateServiceIT.java | 31 ++--- .../SnapshotAwareEventSourceFactoryTest.java | 27 ++-- .../SnapshotAwareEventSourceProducerTest.java | 36 +++-- .../core/SnapshotAwareEventSourceTest.java | 39 +++++- .../EventBufferJdbcRepository.java | 23 ++-- .../StreamStatusJdbcRepository.java | 23 ++-- .../EventBufferJdbcRepositoryIT.java | 39 +++--- .../StreamStatusJdbcRepositoryIT.java | 89 ++++++------ .../StreamStatusJdbcRepositoryTest.java | 32 +++-- .../prepublish/EventPrePublisher.java | 6 +- .../prepublish/EventPrePublisherTest.java | 8 +- .../prepublish/EventPublishIT.java | 17 +-- .../published-event-processor/pom.xml | 2 +- ...sor.java => ActiveStreamsRepublisher.java} | 21 ++- .../MissingDataSourceNameException.java | 7 + .../PublishedEventProcessor.java | 6 +- .../PublishedEventsProcessor.java | 6 +- ...T.java => ActiveStreamsRepublisherIT.java} | 128 ++++++++++-------- ...java => ActiveStreamsRepublisherTest.java} | 57 ++++++-- .../PublishedEventProcessorIT.java | 69 +++++----- .../PublishedEventProcessorTest.java | 10 +- .../PublishedEventsProcessorIT.java | 76 +++++------ .../PublishedEventsProcessorTest.java | 8 +- .../TestEventJdbcRepository.java | 19 ++- .../TestEventStreamJdbcRepository.java | 30 ---- .../jdbc/JdbcBasedEventRepository.java | 2 +- .../jdbc/event/EventJdbcRepository.java | 73 +++++----- .../event/EventJdbcRepositoryFactory.java | 19 +-- .../jdbc/event/PublishedEventFinder.java | 24 +++- .../event/PublishedEventFinderFactory.java | 23 ++++ ...itory.java => PublishedEventInserter.java} | 2 +- .../EventStreamJdbcRepository.java | 59 +++----- .../EventStreamJdbcRepositoryFactory.java | 25 ++-- .../jdbc/JdbcBasedEventRepositoryTest.java | 13 +- .../event/EventJdbcRepositoryFactoryTest.java | 36 ++--- .../jdbc/event/EventJdbcRepositoryIT.java | 16 +-- .../jdbc/event/EventJdbcRepositoryTest.java | 33 ++--- .../PublishedEventFinderFactoryTest.java | 42 ++++++ .../jdbc/event/PublishedEventFinderIT.java | 34 +++-- ...t.java => PublishedEventInserterTest.java} | 10 +- .../EventStreamJdbcRepositoryFactoryTest.java | 34 ++--- .../EventStreamJdbcRepositoryIT.java | 20 ++- .../EventStreamJdbcRepositoryTest.java | 50 ++----- .../source/api/EventStreamPageIT.java | 29 ++-- .../source/api/EventsPageIT.java | 30 ++-- event-sourcing/event-source/pom.xml | 2 +- ...ultPublishedEventSourceTransformation.java | 11 +- .../source/core/EventSourceProducer.java | 8 +- .../EventSourceTransformationProducer.java | 16 ++- .../source/core/JdbcBasedEventSource.java | 8 +- .../source/core/JdbcEventSourceFactory.java | 15 +- .../core/JdbcPublishedEventSourceFactory.java | 17 ++- ...ublishedEventSourceTransformationTest.java | 10 +- .../source/core/EventSourceProducerTest.java | 36 +++-- ...EventSourceTransformationProducerTest.java | 29 +++- .../source/core/JdbcBasedEventSourceTest.java | 6 +- .../core/JdbcEventSourceFactoryTest.java | 23 ++-- .../JdbcPublishedEventSourceFactoryTest.java | 21 ++- .../it/SubscriptionEventInterceptorIT.java | 6 +- pom.xml | 4 +- .../ProcessedEventTrackingRepository.java | 14 +- .../ProcessedEventTrackingRepositoryIT.java | 9 +- .../OpenEjbEventStoreDataSourceProvider.java | 19 +++ 67 files changed, 917 insertions(+), 766 deletions(-) rename event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/{ActiveStreamsProcessor.java => ActiveStreamsRepublisher.java} (63%) create mode 100644 event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/MissingDataSourceNameException.java rename event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/{ActiveStreamsProcessorIT.java => ActiveStreamsRepublisherIT.java} (78%) rename event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/{ActiveStreamsProcessorTest.java => ActiveStreamsRepublisherTest.java} (52%) delete mode 100644 event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventStreamJdbcRepository.java create mode 100644 event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactory.java rename event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/{PublishedEventJdbcRepository.java => PublishedEventInserter.java} (98%) create mode 100644 event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactoryTest.java rename event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/{PublishedEventJdbcRepositoryTest.java => PublishedEventInserterTest.java} (91%) create mode 100644 test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/OpenEjbEventStoreDataSourceProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 516e5f098..50bcb37d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to ## [Unreleased] +## [2.0.0-M14] - 2019-04-15 +### Changed +- Simplify datasource usage and setup +- Update framework to 6.0.0-M14 + ## [2.0.0-M13] - 2019-04-15 ### Changed - Remove deprecated github_token entry from travis.yml diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSource.java b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSource.java index 8b35f0f4c..c289cc6a2 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSource.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSource.java @@ -1,7 +1,6 @@ package uk.gov.justice.services.eventsourcing.source.core; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.source.core.snapshot.SnapshotService; import java.util.UUID; @@ -15,24 +14,21 @@ public class SnapshotAwareEventSource implements EventSource { private final EventStreamManager eventStreamManager; private final SnapshotService snapshotService; private final EventRepository eventRepository; - private final EventConverter eventConverter; - private final String name; + private final String eventSourceName; public SnapshotAwareEventSource(final EventStreamManager eventStreamManager, final EventRepository eventRepository, final SnapshotService snapshotService, - final EventConverter eventConverter, - final String name) { + final String eventSourceName) { this.eventStreamManager = eventStreamManager; this.eventRepository = eventRepository; this.snapshotService = snapshotService; - this.eventConverter = eventConverter; - this.name = name; + this.eventSourceName = eventSourceName; } @Override public EventStream getStreamById(final UUID streamId) { - return new SnapshotAwareEnvelopeEventStream(streamId, eventStreamManager, snapshotService, name); + return new SnapshotAwareEnvelopeEventStream(streamId, eventStreamManager, snapshotService, eventSourceName); } @Override diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactory.java b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactory.java index 28b2d2c5e..8a8a5dc7c 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactory.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactory.java @@ -2,15 +2,16 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.source.core.snapshot.SnapshotService; import javax.inject.Inject; +import javax.sql.DataSource; public class SnapshotAwareEventSourceFactory { @@ -26,19 +27,17 @@ public class SnapshotAwareEventSourceFactory { @Inject private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory; - @Inject - private EventConverter eventConverter; - @Inject private SnapshotService snapshotService; @Inject - private PublishedEventFinder publishedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; - public EventSource create(final String jndiDatasource, final String eventSourceName) { + public EventSource create(final DataSource dataSource, final String eventSourceName) { - final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource); - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); + final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); + final PublishedEventFinder publishedEventFinder = publishedEventFinderFactory.create(dataSource); final EventRepository eventRepository = eventRepositoryFactory.eventRepository( eventJdbcRepository, @@ -51,7 +50,6 @@ public EventSource create(final String jndiDatasource, final String eventSourceN eventStreamManager, eventRepository, snapshotService, - eventConverter, eventSourceName); } } diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducer.java b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducer.java index 29b60f22e..d6fa64e95 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducer.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/main/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducer.java @@ -4,6 +4,7 @@ import uk.gov.justice.services.cdi.QualifierAnnotationExtractor; import uk.gov.justice.services.eventsourcing.source.core.annotation.EventSourceName; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.domain.eventsource.Location; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; @@ -24,14 +25,16 @@ public class SnapshotAwareEventSourceProducer { @Inject - QualifierAnnotationExtractor qualifierAnnotationExtractor; + private QualifierAnnotationExtractor qualifierAnnotationExtractor; @Inject - EventSourceDefinitionRegistry eventSourceDefinitionRegistry; + private EventSourceDefinitionRegistry eventSourceDefinitionRegistry; @Inject - SnapshotAwareEventSourceFactory snapshotAwareEventSourceFactory; + private SnapshotAwareEventSourceFactory snapshotAwareEventSourceFactory; + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; /** * @@ -70,7 +73,9 @@ private EventSource createEventSourceFrom(final EventSourceDefinition eventSourc final Optional dataSourceOptional = location.getDataSource(); return dataSourceOptional - .map(dataSource -> snapshotAwareEventSourceFactory.create(dataSource, eventSourceDefinition.getName())) + .map(dataSource -> snapshotAwareEventSourceFactory.create( + jdbcDataSourceProvider.getDataSource(dataSource), + eventSourceDefinition.getName())) .orElseThrow(() -> new CreationException( format("No DataSource specified for EventSource '%s' specified in event-sources.yaml", eventSourceDefinition.getName()) )); diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/core/aggregate/SnapshotAwareAggregateServiceIT.java b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/core/aggregate/SnapshotAwareAggregateServiceIT.java index 526498c9e..ca964937b 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/core/aggregate/SnapshotAwareAggregateServiceIT.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/core/aggregate/SnapshotAwareAggregateServiceIT.java @@ -46,6 +46,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.source.core.EventAppender; import uk.gov.justice.services.eventsourcing.source.core.EventSource; @@ -60,21 +61,20 @@ import uk.gov.justice.services.eventsourcing.source.core.exception.EventStreamException; import uk.gov.justice.services.eventsourcing.source.core.snapshot.DefaultSnapshotService; import uk.gov.justice.services.eventsourcing.source.core.snapshot.DefaultSnapshotStrategy; -import uk.gov.justice.services.jdbc.persistence.DefaultJdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.messaging.DefaultJsonObjectEnvelopeConverter; import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.justice.services.messaging.jms.DefaultEnvelopeConverter; import uk.gov.justice.services.messaging.jms.JmsEnvelopeSender; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; +import uk.gov.justice.services.test.utils.persistence.OpenEjbEventStoreDataSourceProvider; import uk.gov.justice.subscription.ParserProducer; import uk.gov.justice.subscription.SubscriptionHelper; import uk.gov.justice.subscription.YamlFileFinder; import uk.gov.justice.subscription.domain.eventsource.DefaultEventSourceDefinitionFactory; -import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; -import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistryProducer; import uk.gov.justice.subscription.yaml.parser.YamlParser; import uk.gov.justice.subscription.yaml.parser.YamlSchemaLoader; @@ -90,13 +90,10 @@ import java.util.UUID; import java.util.stream.Stream; -import javax.annotation.Resource; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.jms.Destination; -import javax.naming.InitialContext; -import javax.sql.DataSource; import org.apache.openejb.jee.WebApp; import org.apache.openejb.junit.ApplicationComposer; @@ -128,8 +125,8 @@ public class SnapshotAwareAggregateServiceIT { private static final long SNAPSHOT_THRESHOLD = 25L; private static final String FRAMEWORK_CONTEXT_NAME = "framework"; - @Resource(name = "openejb/Resource/frameworkeventstore") - private DataSource dataSource; + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; @Inject private SnapshotRepository snapshotRepository; @@ -149,23 +146,20 @@ public class SnapshotAwareAggregateServiceIT { @Inject private DefaultSnapshotService snapshotService; - @Inject - private EventSourceDefinitionRegistry eventSourceDefinitionRegistry; - @Module @org.apache.openejb.testing.Classes(cdi = true, value = { ObjectInputStreamStrategy.class, CustomClassLoaderObjectInputStreamStrategy.class, DefaultObjectInputStreamStrategy.class, SnapshotJdbcRepository.class, - JdbcDataSourceProvider.class, - DefaultJdbcDataSourceProvider.class, + OpenEjbEventStoreDataSourceProvider.class, EventStreamJdbcRepositoryFactory.class, EventRepositoryFactory.class, TestEventInsertionStrategyProducer.class, EventJdbcRepositoryFactory.class, - JdbcRepositoryHelper.class, + JdbcResultSetStreamer.class, + PreparedStatementWrapperFactory.class, LoggerProducer.class, EventConverter.class, @@ -209,6 +203,7 @@ public class SnapshotAwareAggregateServiceIT { DefaultEventSourceDefinitionFactory.class, SubscriptionHelper.class, + PublishedEventFinderFactory.class, PublishedEventFinder.class }) @@ -230,10 +225,6 @@ public Properties configuration() { @Before public void init() throws Exception { - final EventSourceDefinition defaultEventSourceDefinition = eventSourceDefinitionRegistry.getDefaultEventSourceDefinition(); - final String jndiName = defaultEventSourceDefinition.getLocation().getDataSource().get(); - final InitialContext initialContext = new InitialContext(); - initialContext.bind(jndiName, dataSource); new DatabaseCleaner().cleanEventStoreTables(FRAMEWORK_CONTEXT_NAME); defaultAggregateService.register(new EventFoundEvent(EventA.class, "context.eventA")); } @@ -494,7 +485,7 @@ private void createEventStreamAndApply(final UUID streamId private int rowCount(final String sql, final Object arg) { - try (final Connection connection = dataSource.getConnection(); + try (final Connection connection = jdbcDataSourceProvider.getDataSource("don't care").getConnection(); final PreparedStatement preparedStatement = connection.prepareStatement(sql)) { preparedStatement.setObject(1, arg); diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactoryTest.java b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactoryTest.java index b9977304a..1e4989ec2 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactoryTest.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceFactoryTest.java @@ -9,13 +9,16 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.source.core.snapshot.SnapshotService; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; + +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,10 +26,8 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; - @RunWith(MockitoJUnitRunner.class) public class SnapshotAwareEventSourceFactoryTest { - private static final String EVENT_SOURCE_NAME = "eventSourceName"; @Mock private EventStreamManagerFactory eventStreamManagerFactory; @@ -44,10 +45,10 @@ public class SnapshotAwareEventSourceFactoryTest { private SnapshotService snapshotService; @Mock - private EventConverter eventConverter; + private JdbcDataSourceProvider jdbcDataSourceProvider; @Mock - private PublishedEventFinder publishedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; @InjectMocks private SnapshotAwareEventSourceFactory snapshotAwareEventSourceFactory; @@ -62,26 +63,28 @@ public void shouldCreateSnapshotAwareEventSource() throws Exception { final EventStreamJdbcRepository eventStreamJdbcRepository = mock(EventStreamJdbcRepository.class); final EventRepository eventRepository = mock(EventRepository.class); final EventStreamManager eventStreamManager = mock(EventStreamManager.class); + final DataSource dataSource = mock(DataSource.class); + final PublishedEventFinder publishedEventFinder = mock(PublishedEventFinder.class); - when(eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource)).thenReturn(eventJdbcRepository); - when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource)).thenReturn(eventStreamJdbcRepository); + when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); + when(eventJdbcRepositoryFactory.eventJdbcRepository(dataSource)).thenReturn(eventJdbcRepository); + when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource)).thenReturn(eventStreamJdbcRepository); + when(publishedEventFinderFactory.create(dataSource)).thenReturn(publishedEventFinder); when(eventRepositoryFactory.eventRepository( eventJdbcRepository, eventStreamJdbcRepository, publishedEventFinder)).thenReturn(eventRepository); - when(eventStreamManagerFactory.eventStreamManager(eventRepository, EVENT_SOURCE_NAME)).thenReturn(eventStreamManager); + when(eventStreamManagerFactory.eventStreamManager(eventRepository, eventSourceName)).thenReturn(eventStreamManager); - final EventSource eventSource = snapshotAwareEventSourceFactory.create(jndiDatasource, eventSourceName); + final EventSource eventSource = snapshotAwareEventSourceFactory.create(dataSource, eventSourceName); assertThat(eventSource, is(instanceOf(SnapshotAwareEventSource.class))); - assertThat(getValueOfField(eventSource, "eventStreamManager", EventStreamManager.class), is(eventStreamManager)); assertThat(getValueOfField(eventSource, "eventRepository", EventRepository.class), is(eventRepository)); assertThat(getValueOfField(eventSource, "snapshotService", SnapshotService.class), is(snapshotService)); - assertThat(getValueOfField(eventSource, "eventConverter", EventConverter.class), is(eventConverter)); - assertThat(getValueOfField(eventSource, "name", String.class), is(eventSourceName)); + assertThat(getValueOfField(eventSource, "eventSourceName", String.class), is(eventSourceName)); } } diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducerTest.java b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducerTest.java index 7cd3da5ab..0604386dd 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducerTest.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceProducerTest.java @@ -12,6 +12,7 @@ import uk.gov.justice.services.cdi.QualifierAnnotationExtractor; import uk.gov.justice.services.eventsourcing.source.core.annotation.EventSourceName; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.domain.eventsource.Location; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; @@ -20,6 +21,7 @@ import javax.enterprise.inject.CreationException; import javax.enterprise.inject.spi.InjectionPoint; +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,7 +33,6 @@ @RunWith(MockitoJUnitRunner.class) public class SnapshotAwareEventSourceProducerTest { - @Mock private QualifierAnnotationExtractor qualifierAnnotationExtractor; @@ -41,64 +42,74 @@ public class SnapshotAwareEventSourceProducerTest { @Mock private SnapshotAwareEventSourceFactory snapshotAwareEventSourceFactory; + @Mock + private JdbcDataSourceProvider jdbcDataSourceProvider; + @InjectMocks private SnapshotAwareEventSourceProducer snapshotAwareEventSourceProducer; @Test public void shouldCreateDefaultEventSourceDefinitionWhenEventSourceNameIsEmpty() throws Exception { + final String jndiDataSourceName = "jndiDataSourceName"; final EventSourceDefinition eventSourceDefinition = eventSourceDefinition() .withName("defaultEventSource") .withDefault(true) - .withLocation(new Location("", "", Optional.of("dataSource"))) + .withLocation(new Location("", "", Optional.of(jndiDataSourceName))) .build(); final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); + final DataSource dataSource = mock(DataSource.class); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(""); when(eventSourceDefinitionRegistry.getDefaultEventSourceDefinition()).thenReturn(eventSourceDefinition); - when(snapshotAwareEventSourceFactory.create(eventSourceDefinition.getLocation().getDataSource().get(), eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); + when(snapshotAwareEventSourceFactory.create(dataSource, eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); assertThat(snapshotAwareEventSourceProducer.eventSource(), is(jdbcBasedEventSource)); } @Test public void shouldCreateDefaultEventSourceWhenNoEventSourceNameQualifierSet() throws Exception { + + final String jndiDataSourceName = "jndiDataSourceName"; final EventSourceDefinition eventSourceDefinition = eventSourceDefinition() .withName("defaultEventSource") .withDefault(true) - .withLocation(new Location("", "", Optional.of("dataSource"))) + .withLocation(new Location("", "", Optional.of(jndiDataSourceName))) .build(); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); + final DataSource dataSource = mock(DataSource.class); when(eventSourceDefinitionRegistry.getDefaultEventSourceDefinition()).thenReturn(eventSourceDefinition); - when(snapshotAwareEventSourceFactory.create(eventSourceDefinition.getLocation().getDataSource().get(), eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); + when(snapshotAwareEventSourceFactory.create(dataSource, eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); assertThat(snapshotAwareEventSourceProducer.eventSource(), is(jdbcBasedEventSource)); - - } @Test public void shouldCreateAnEventSourceUsingTheEventSourceNameAnnotation() throws Exception { final String eventSourceName = "eventSourceName"; - final String dataSource = "my-data-source"; + final String jndiDataSourceName = "jndiDataSourceName"; final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); final EventSourceDefinition eventSourceDefinition = mock(EventSourceDefinition.class); final Location location = mock(Location.class); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); + final DataSource dataSource = mock(DataSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(eventSourceName); when(eventSourceDefinitionRegistry.getEventSourceDefinitionFor(eventSourceName)).thenReturn(Optional.of(eventSourceDefinition)); when(eventSourceDefinition.getName()).thenReturn(eventSourceName); when(eventSourceDefinition.getLocation()).thenReturn(location); - when(location.getDataSource()).thenReturn(of(dataSource)); + when(location.getDataSource()).thenReturn(of(jndiDataSourceName)); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); when(snapshotAwareEventSourceFactory.create(dataSource, eventSourceName)).thenReturn(jdbcBasedEventSource); assertThat(snapshotAwareEventSourceProducer.eventSource(injectionPoint), is(jdbcBasedEventSource)); @@ -130,12 +141,13 @@ public void shouldFailIfNoEventSourceFoundInTheEventSourceRegistry() throws Exce public void shouldFailIfNoDataSourceNameFoundInEventSourcesYaml() throws Exception { final String eventSourceName = "eventSourceName"; - final String dataSourceName = "my-data-source"; + final String jndiDataSourceName = "jndiDataSourceName"; final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); final EventSourceDefinition eventSourceDefinition = mock(EventSourceDefinition.class); final Location location = mock(Location.class); + final DataSource dataSource = mock(DataSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(eventSourceName); @@ -143,13 +155,13 @@ public void shouldFailIfNoDataSourceNameFoundInEventSourcesYaml() throws Excepti when(eventSourceDefinition.getName()).thenReturn(eventSourceName); when(eventSourceDefinition.getLocation()).thenReturn(location); when(location.getDataSource()).thenReturn(empty()); - when(eventSourceDefinition.getName()).thenReturn(dataSourceName); + when(eventSourceDefinition.getName()).thenReturn(jndiDataSourceName); try { snapshotAwareEventSourceProducer.eventSource(injectionPoint); fail(); } catch (final CreationException expected) { - assertThat(expected.getMessage(), is("No DataSource specified for EventSource 'my-data-source' specified in event-sources.yaml")); + assertThat(expected.getMessage(), is("No DataSource specified for EventSource 'jndiDataSourceName' specified in event-sources.yaml")); } verifyZeroInteractions(snapshotAwareEventSourceFactory); diff --git a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceTest.java b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceTest.java index 0a0467845..10cc48c61 100644 --- a/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceTest.java +++ b/aggregate-snapshot/aggregate-snapshot-service/src/test/java/uk/gov/justice/services/eventsourcing/source/core/SnapshotAwareEventSourceTest.java @@ -7,6 +7,7 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import uk.gov.justice.services.eventsourcing.repository.jdbc.DefaultEventStreamMetadata; @@ -16,6 +17,7 @@ import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.Test; @@ -35,19 +37,46 @@ public class SnapshotAwareEventSourceTest { @Mock private JdbcBasedEventRepository eventRepository; - @Mock - private EventConverter eventConverter; - @InjectMocks private SnapshotAwareEventSource snapshotAwareEventSource; @Test - public void shouldReturnEventStream() { - EnvelopeEventStream eventStream = (EnvelopeEventStream) snapshotAwareEventSource.getStreamById(STREAM_ID); + public void shouldGetEventStreamById() { + final EnvelopeEventStream eventStream = (EnvelopeEventStream) snapshotAwareEventSource.getStreamById(STREAM_ID); assertThat(eventStream.getId(), equalTo(STREAM_ID)); } + @Test + public void shouldGetAStreamOfEventStreams() throws Exception { + + final UUID streamId_1 = randomUUID(); + final UUID streamId_2 = randomUUID(); + + final long position_1 = 23; + final long position_2 = 24; + + final EventStreamMetadata eventStreamMetadata_1 = mock(EventStreamMetadata.class); + final EventStreamMetadata eventStreamMetadata_2 = mock(EventStreamMetadata.class); + + when(eventStreamMetadata_1.getStreamId()).thenReturn(streamId_1); + when(eventStreamMetadata_1.getPosition()).thenReturn(position_1); + when(eventStreamMetadata_2.getStreamId()).thenReturn(streamId_2); + when(eventStreamMetadata_2.getPosition()).thenReturn(position_2); + + when(eventRepository.getStreams()).thenReturn(Stream.of(eventStreamMetadata_1, eventStreamMetadata_2)); + + final List eventStreams = snapshotAwareEventSource.getStreams().collect(toList()); + + assertThat(eventStreams.size(), is(2)); + + assertThat(eventStreams.get(0).getId(), is(streamId_1)); + assertThat(eventStreams.get(0).getPosition(), is(position_1)); + + assertThat(eventStreams.get(1).getId(), is(streamId_2)); + assertThat(eventStreams.get(1).getPosition(), is(position_2)); + } + @Test public void shouldGetEventStreamsFromPosition() { final UUID streamId = randomUUID(); diff --git a/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepository.java b/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepository.java index 6ddf19861..eb1fd6eae 100644 --- a/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepository.java +++ b/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepository.java @@ -3,8 +3,9 @@ import static java.lang.String.format; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider; import java.sql.ResultSet; @@ -31,7 +32,10 @@ public class EventBufferJdbcRepository { private static final String SOURCE = "source"; @Inject - private JdbcRepositoryHelper jdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; + + @Inject + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Inject private ViewStoreJdbcDataSourceProvider dataSourceProvider; @@ -40,9 +44,12 @@ public class EventBufferJdbcRepository { public EventBufferJdbcRepository() {} - public EventBufferJdbcRepository(final DataSource dataSource, final JdbcRepositoryHelper jdbcRepositoryHelper) { + public EventBufferJdbcRepository(final JdbcResultSetStreamer jdbcResultSetStreamer, + final PreparedStatementWrapperFactory preparedStatementWrapperFactory, + final DataSource dataSource) { + this.jdbcResultSetStreamer = jdbcResultSetStreamer; this.dataSource = dataSource; - this.jdbcRepositoryHelper = jdbcRepositoryHelper; + this.preparedStatementWrapperFactory = preparedStatementWrapperFactory; } @@ -53,7 +60,7 @@ private void initialiseDataSource() { public void insert(final EventBufferEvent bufferedEvent) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, INSERT)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, INSERT)) { ps.setObject(1, bufferedEvent.getStreamId()); ps.setLong(2, bufferedEvent.getPosition()); ps.setString(3, bufferedEvent.getEvent()); @@ -66,11 +73,11 @@ public void insert(final EventBufferEvent bufferedEvent) { public Stream findStreamByIdAndSource(final UUID id, final String source) { try { - final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SELECT_STREAM_BUFFER_BY_STREAM_ID_AND_SOURCE); + final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SELECT_STREAM_BUFFER_BY_STREAM_ID_AND_SOURCE); ps.setObject(1, id); ps.setString(2, source); - return jdbcRepositoryHelper.streamOf(ps, entityFromFunction()); + return jdbcResultSetStreamer.streamOf(ps, entityFromFunction()); } catch (SQLException e) { throw new JdbcRepositoryException(format("Exception while returning buffered events, streamId: %s", id), e); @@ -79,7 +86,7 @@ public Stream findStreamByIdAndSource(final UUID id, final Str public void remove(final EventBufferEvent eventBufferEvent) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, DELETE_BY_STREAM_ID_POSITION)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, DELETE_BY_STREAM_ID_POSITION)) { ps.setObject(1, eventBufferEvent.getStreamId()); ps.setLong(2, eventBufferEvent.getPosition()); ps.setString(3, eventBufferEvent.getSource()); diff --git a/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepository.java b/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepository.java index 91dda3ab4..df8a968ba 100644 --- a/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepository.java +++ b/event-buffer/event-buffer-core/src/main/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepository.java @@ -3,8 +3,8 @@ import static java.lang.String.format; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider; import java.sql.ResultSet; @@ -27,7 +27,6 @@ public class StreamStatusJdbcRepository { private static final String LATEST_POSITION_COLUMN = "version"; private static final String SOURCE = "source"; - /** * Statements */ @@ -38,18 +37,18 @@ public class StreamStatusJdbcRepository { private static final String UPDATE_UNKNOWN_SOURCE = "UPDATE stream_status SET source=? WHERE stream_id=? and source = 'unknown'"; @Inject - JdbcRepositoryHelper jdbcRepositoryHelper; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Inject - ViewStoreJdbcDataSourceProvider dataSourceProvider; + private ViewStoreJdbcDataSourceProvider dataSourceProvider; - DataSource dataSource; + private DataSource dataSource; public StreamStatusJdbcRepository() {} - public StreamStatusJdbcRepository(final DataSource dataSource, final JdbcRepositoryHelper jdbcRepositoryHelper) { + public StreamStatusJdbcRepository(final DataSource dataSource, final PreparedStatementWrapperFactory preparedStatementWrapperFactory) { this.dataSource = dataSource; - this.jdbcRepositoryHelper = jdbcRepositoryHelper; + this.preparedStatementWrapperFactory = preparedStatementWrapperFactory; } @PostConstruct @@ -64,7 +63,7 @@ private void initialiseDataSource() { * @param subscription the status of the stream to insert */ public void insert(final Subscription subscription) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, INSERT)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, INSERT)) { ps.setLong(1, subscription.getPosition()); ps.setObject(2, subscription.getStreamId()); ps.setString(3, subscription.getSource()); @@ -81,7 +80,7 @@ public void insert(final Subscription subscription) { * @param subscription the status of the stream to insert */ public void insertOrDoNothing(final Subscription subscription) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, INSERT_ON_CONFLICT_DO_NOTHING)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, INSERT_ON_CONFLICT_DO_NOTHING)) { ps.setLong(1, subscription.getPosition()); ps.setObject(2, subscription.getStreamId()); ps.setString(3, subscription.getSource()); @@ -98,7 +97,7 @@ public void insertOrDoNothing(final Subscription subscription) { * @param subscription the event to insert */ public void update(final Subscription subscription) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, UPDATE)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, UPDATE)) { ps.setLong(1, subscription.getPosition()); ps.setString(2, subscription.getSource()); ps.setObject(3, subscription.getStreamId()); @@ -116,7 +115,7 @@ public void update(final Subscription subscription) { * @return a {@link Subscription}. */ public Optional findByStreamIdAndSource(final UUID streamId, final String source) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SELECT_BY_STREAM_ID_AND_SOURCE)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SELECT_BY_STREAM_ID_AND_SOURCE)) { ps.setObject(1, streamId); ps.setObject(2, source); return subscriptionFrom(ps); @@ -139,7 +138,7 @@ protected Subscription entityFrom(final ResultSet rs) throws SQLException { } public void updateSource(final UUID streamId, final String source) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, UPDATE_UNKNOWN_SOURCE)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, UPDATE_UNKNOWN_SOURCE)) { ps.setString(1, source); ps.setObject(2, streamId); ps.executeUpdate(); diff --git a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepositoryIT.java b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepositoryIT.java index 05ebe0762..548ae61f5 100644 --- a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepositoryIT.java +++ b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/streambuffer/EventBufferJdbcRepositoryIT.java @@ -8,7 +8,8 @@ import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertThat; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.TestEventStoreDataSourceFactory; @@ -20,16 +21,18 @@ import org.junit.Before; import org.junit.Test; - public class EventBufferJdbcRepositoryIT { - private EventBufferJdbcRepository jdbcRepository; + private EventBufferJdbcRepository eventBufferJdbcRepository; @Before public void initDatabase() throws Exception { final DataSource dataSource = new TestEventStoreDataSourceFactory() .createDataSource("frameworkviewstore"); - jdbcRepository = new EventBufferJdbcRepository(dataSource, new JdbcRepositoryHelper()); + eventBufferJdbcRepository = new EventBufferJdbcRepository( + new JdbcResultSetStreamer(), + new PreparedStatementWrapperFactory(), + dataSource); new DatabaseCleaner().cleanViewStoreTables("framework", "stream_buffer", "stream_status"); } @@ -40,12 +43,12 @@ public void shouldInsertAndReturnStreamOfEvents() { final UUID id2 = randomUUID(); final String source = "source"; - jdbcRepository.insert(new EventBufferEvent(id1, 2L, "eventVersion_2", source)); - jdbcRepository.insert(new EventBufferEvent(id1, 1L, "eventVersion_1", source)); - jdbcRepository.insert(new EventBufferEvent(id1, 3L, "eventVersion_3", source)); - jdbcRepository.insert(new EventBufferEvent(id2, 1L, "eventVersion_1", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 2L, "eventVersion_2", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 1L, "eventVersion_1", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 3L, "eventVersion_3", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id2, 1L, "eventVersion_1", source)); - final List events = jdbcRepository.findStreamByIdAndSource(id1, source) + final List events = eventBufferJdbcRepository.findStreamByIdAndSource(id1, source) .collect(toList()); assertThat(events, hasSize(3)); @@ -72,12 +75,12 @@ public void shouldNotReturnEventsIfTheyHaveADifferentSource() { final UUID id2 = randomUUID(); final String source = "source"; - jdbcRepository.insert(new EventBufferEvent(id1, 2L, "eventVersion_2", "a-different-source")); - jdbcRepository.insert(new EventBufferEvent(id1, 1L, "eventVersion_1", source)); - jdbcRepository.insert(new EventBufferEvent(id1, 3L, "eventVersion_3", source)); - jdbcRepository.insert(new EventBufferEvent(id2, 1L, "eventVersion_1", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 2L, "eventVersion_2", "a-different-source")); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 1L, "eventVersion_1", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id1, 3L, "eventVersion_3", source)); + eventBufferJdbcRepository.insert(new EventBufferEvent(id2, 1L, "eventVersion_1", source)); - final List events = jdbcRepository.findStreamByIdAndSource(id1, source) + final List events = eventBufferJdbcRepository.findStreamByIdAndSource(id1, source) .collect(toList()); assertThat(events, hasSize(2)); @@ -99,12 +102,12 @@ public void shouldRemoveFromBuffer() { final String source = "someOtherSource"; final EventBufferEvent eventBufferEvent = new EventBufferEvent(id1, 2L, "someOtherEvent", source); - jdbcRepository.insert(eventBufferEvent); + eventBufferJdbcRepository.insert(eventBufferEvent); - assertThat(jdbcRepository.findStreamByIdAndSource(id1, source).collect(toList()), hasItem(eventBufferEvent)); + assertThat(eventBufferJdbcRepository.findStreamByIdAndSource(id1, source).collect(toList()), hasItem(eventBufferEvent)); - jdbcRepository.remove(eventBufferEvent); + eventBufferJdbcRepository.remove(eventBufferEvent); - assertThat(jdbcRepository.findStreamByIdAndSource(id1, source).collect(toList()), empty()); + assertThat(eventBufferJdbcRepository.findStreamByIdAndSource(id1, source).collect(toList()), empty()); } } diff --git a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryIT.java b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryIT.java index b4c9b8799..133e1428c 100644 --- a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryIT.java +++ b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryIT.java @@ -8,8 +8,8 @@ import static org.junit.Assert.assertTrue; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.TestEventStoreDataSourceFactory; @@ -29,19 +29,18 @@ public class StreamStatusJdbcRepositoryIT { private static final long INITIAL_POSITION = 0L; - private StreamStatusJdbcRepository jdbcRepository; + private StreamStatusJdbcRepository streamStatusJdbcRepository; private DataSource dataSource; - private JdbcRepositoryHelper jdbcRepositoryHelper; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory = new PreparedStatementWrapperFactory(); @Before public void initDatabase() throws Exception { dataSource = new TestEventStoreDataSourceFactory() .createDataSource("frameworkviewstore"); - jdbcRepositoryHelper = new JdbcRepositoryHelper(); - jdbcRepository = new StreamStatusJdbcRepository(dataSource, jdbcRepositoryHelper); + streamStatusJdbcRepository = new StreamStatusJdbcRepository(dataSource, preparedStatementWrapperFactory); new DatabaseCleaner().cleanViewStoreTables("framework", "stream_status", "stream_buffer"); } @@ -54,13 +53,13 @@ public void shouldNotCreateSeparateInitialSubscriptinForTheNewSourceWhenWeHaveEx initialiseBuffer(streamId, source); final Subscription subscription = new Subscription(streamId, 2L, source); - jdbcRepository.update(subscription); + streamStatusJdbcRepository.update(subscription); initialiseBuffer(streamId, "sjp"); final int count = countByStreamId(streamId); assertThat(count, is(1)); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, "sjp"); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, "sjp"); assertThat(result.get().getSource(), is("sjp")); assertThat(result.get().getPosition(), is(2L)); @@ -75,7 +74,7 @@ public void shouldCreateSeparateInitialSubscriptionForTheNewSourceWhenWeHaveNoEx final int count = countByStreamId(streamId); assertThat(count, is(1)); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source); assertThat(result.get().getSource(), is(source)); assertThat(result.get().getPosition(), is(0L)); @@ -89,13 +88,13 @@ public void shouldAppendToExistingSubscriptionForTheNewSourceWhenWeHaveExistingE initialiseBuffer(streamId, source); final Subscription subscription = new Subscription(streamId, 2L, source); - jdbcRepository.update(subscription); + streamStatusJdbcRepository.update(subscription); initialiseBuffer(streamId, source); final int count = countByStreamId(streamId); assertThat(count, is(1)); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source); assertThat(result.get().getSource(), is("sjp")); assertThat(result.get().getPosition(), is(2L)); @@ -107,12 +106,12 @@ public void shouldUpdateSourceWhenUnknown() throws Exception { final String source = "unknown"; final UUID streamId = randomUUID(); - jdbcRepository.insert(subscriptionOf(streamId, 1L, source)); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, source)); final Subscription subscription = new Subscription(streamId, 2L, source); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source); assertThat(result.get().getSource(), is(source)); assertThat(result.get().getPosition(), is(2L)); } @@ -121,13 +120,13 @@ public void shouldUpdateSourceWhenUnknown() throws Exception { public void shouldUpdateSourceWhenNotUnknown() throws Exception { final UUID streamId = randomUUID(); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "unknown")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "unknown")); final String source = "sjp"; final Subscription subscription = new Subscription(streamId, 2L, source); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source); assertThat(result.get().getSource(), is(source)); assertThat(result.get().getPosition(), is(2L)); } @@ -138,9 +137,9 @@ public void shouldInsertAndReturnSubscription() throws Exception { final long version = 4L; final String source = "source"; - jdbcRepository.insert(subscriptionOf(id, version, source)); + streamStatusJdbcRepository.insert(subscriptionOf(id, version, source)); - final Optional result = jdbcRepository.findByStreamIdAndSource(id, source); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(id, source); assertTrue(result.isPresent()); assertThat(result.get().getPosition(), is(version)); assertThat(result.get().getSource(), is(source)); @@ -149,19 +148,19 @@ public void shouldInsertAndReturnSubscription() throws Exception { @Test public void shouldReturnOptionalNotPresentIfStatusNotFound() throws Exception { - Optional result = jdbcRepository.findByStreamIdAndSource(randomUUID(), "source"); + Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(randomUUID(), "source"); assertFalse(result.isPresent()); } @Test public void shouldUpdateVersionForSameStreamIdWithMultipleSources() throws Exception { final UUID id = randomUUID(); - jdbcRepository.insert(subscriptionOf(id, 4L, "source 4")); - jdbcRepository.update(subscriptionOf(id, 5L, "source 4")); - jdbcRepository.insert(subscriptionOf(id, 4L, "source 5")); - jdbcRepository.update(subscriptionOf(id, 5L, "source 5")); + streamStatusJdbcRepository.insert(subscriptionOf(id, 4L, "source 4")); + streamStatusJdbcRepository.update(subscriptionOf(id, 5L, "source 4")); + streamStatusJdbcRepository.insert(subscriptionOf(id, 4L, "source 5")); + streamStatusJdbcRepository.update(subscriptionOf(id, 5L, "source 5")); - final Optional result = jdbcRepository.findByStreamIdAndSource(id, "source 5"); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(id, "source 5"); assertTrue(result.isPresent()); assertThat(result.get().getPosition(), is(5L)); assertThat(result.get().getSource(), is("source 5")); @@ -171,13 +170,13 @@ public void shouldUpdateVersionForSameStreamIdWithMultipleSources() throws Excep @Test public void shouldNotUpdateVersionForANewSourceField() throws Exception { final UUID streamId = randomUUID(); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); final String source3 = "source3"; final Subscription subscription = new Subscription(streamId, 1L, source3); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source3); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source3); assertThat(result, is(Optional.empty())); } @@ -185,13 +184,13 @@ public void shouldNotUpdateVersionForANewSourceField() throws Exception { public void shouldUpdateVersionForAnExistingSourceField() throws Exception { final UUID streamId = randomUUID(); final String source3 = "source3"; - jdbcRepository.insert(subscriptionOf(streamId, 4L, source3)); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source4")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 4L, source3)); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source4")); final Subscription subscription = new Subscription(streamId, 5L, source3); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, source3); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source3); assertTrue(result.isPresent()); assertThat(result.get().getPosition(), is(5L)); assertThat(result.get().getSource(), is(source3)); @@ -201,15 +200,15 @@ public void shouldUpdateVersionForAnExistingSourceField() throws Exception { @Test public void shouldUpdateNewVersionNumberForExistingSourceWhenMultipleSourceEventsExist() throws Exception { final UUID streamId = randomUUID(); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source1")); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); - jdbcRepository.insert(subscriptionOf(streamId, 2L, "source3")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source1")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 2L, "source3")); final String existingSource = "source2"; final Subscription subscription = new Subscription(streamId, 2L, existingSource); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, existingSource); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, existingSource); assertTrue(result.isPresent()); assertThat(result.get().getPosition(), is(2L)); assertThat(result.get().getSource(), is(existingSource)); @@ -218,15 +217,15 @@ public void shouldUpdateNewVersionNumberForExistingSourceWhenMultipleSourceEvent @Test public void shouldNotUpdateNewVersionNumberForNewSourceWhenMultipleSourceEventsExist() throws Exception { final UUID streamId = randomUUID(); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source1")); - jdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); - jdbcRepository.insert(subscriptionOf(streamId, 2L, "source3")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source1")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 1L, "source2")); + streamStatusJdbcRepository.insert(subscriptionOf(streamId, 2L, "source3")); final String newSource = "source4"; final Subscription subscription = new Subscription(streamId, 1L, newSource); - jdbcRepository.update(subscription); - final Optional result = jdbcRepository.findByStreamIdAndSource(streamId, newSource); + streamStatusJdbcRepository.update(subscription); + final Optional result = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, newSource); assertThat(result, is(Optional.empty())); } @@ -235,13 +234,13 @@ private Subscription subscriptionOf(final UUID id, final Long version, final Str } private long initialiseBuffer(final UUID streamId, final String source) { - jdbcRepository.updateSource(streamId, source); - final Optional currentStatus = jdbcRepository.findByStreamIdAndSource(streamId, source); + streamStatusJdbcRepository.updateSource(streamId, source); + final Optional currentStatus = streamStatusJdbcRepository.findByStreamIdAndSource(streamId, source); if (!currentStatus.isPresent()) { //this is to address race condition //in case of primary key violation the exception gets thrown, event goes back into topic and the transaction gets retried - jdbcRepository + streamStatusJdbcRepository .insert(new Subscription(streamId, INITIAL_POSITION, source)); return INITIAL_POSITION; @@ -257,7 +256,7 @@ private long initialiseBuffer(final UUID streamId, final String source) { * @return a int. */ public int countByStreamId(final UUID streamId) { - try (final PreparedStatementWrapper ps = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, COUNT_BY_STREAM_ID)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, COUNT_BY_STREAM_ID)) { ps.setObject(1, streamId); final ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { diff --git a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryTest.java b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryTest.java index cd8423fde..0172d899f 100644 --- a/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryTest.java +++ b/event-buffer/event-buffer-core/src/test/java/uk/gov/justice/services/event/buffer/core/repository/subscription/StreamStatusJdbcRepositoryTest.java @@ -4,7 +4,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -18,31 +18,35 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class StreamStatusJdbcRepositoryTest { - @InjectMocks - private StreamStatusJdbcRepository repository; + @SuppressWarnings("unused") + @Spy + private PreparedStatementWrapperFactory preparedStatementWrapperFactory = new PreparedStatementWrapperFactory(); @Mock - DataSource dataSource; + private DataSource dataSource; @Mock - Connection connection; + private Connection connection; @Mock - DatabaseMetaData dbMetadata; + private DatabaseMetaData databaseMetaData; @Mock - PreparedStatement statement; + private PreparedStatement preparedStatement; + + @InjectMocks + private StreamStatusJdbcRepository streamStatusJdbcRepository; @Before public void setUp() throws Exception { when(dataSource.getConnection()).thenReturn(connection); - when(connection.getMetaData()).thenReturn(dbMetadata); - repository.jdbcRepositoryHelper = new JdbcRepositoryHelper(); + when(connection.getMetaData()).thenReturn(databaseMetaData); } @Test @@ -52,15 +56,15 @@ public void shouldAttemptToInsert() throws Exception { final String source = "a source"; when(connection.prepareStatement("INSERT INTO stream_status (version, stream_id, source) VALUES (?, ?, ?) ON CONFLICT DO NOTHING")) - .thenReturn(statement); + .thenReturn(preparedStatement); final UUID streamId = randomUUID(); final long version = 1l; - repository.insertOrDoNothing(new Subscription(streamId, version, source)); + streamStatusJdbcRepository.insertOrDoNothing(new Subscription(streamId, version, source)); - verify(statement).setLong(1, version); - verify(statement).setObject(2, streamId); - verify(statement).executeUpdate(); + verify(preparedStatement).setLong(1, version); + verify(preparedStatement).setObject(2, streamId); + verify(preparedStatement).executeUpdate(); } } diff --git a/event-sourcing/event-publisher/event-publisher-process/src/main/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisher.java b/event-sourcing/event-publisher/event-publisher-process/src/main/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisher.java index ee58690f5..16b069b78 100644 --- a/event-sourcing/event-publisher/event-publisher-process/src/main/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisher.java +++ b/event-sourcing/event-publisher/event-publisher-process/src/main/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisher.java @@ -8,7 +8,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.messaging.Metadata; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; @@ -31,7 +31,7 @@ public class EventPrePublisher { private PrePublishRepository prePublishRepository; @Inject - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; @Inject private UtcClock clock; @@ -62,7 +62,7 @@ public void prePublish(final Event event) { eventNumber, previousEventNumber); - publishedEventJdbcRepository.insertPublishedEvent(publishedEvent, connection); + publishedEventInserter.insertPublishedEvent(publishedEvent, connection); prePublishRepository.addToPublishQueueTable(eventId, clock.now(), connection); } catch (final SQLException e) { diff --git a/event-sourcing/event-publisher/event-publisher-process/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisherTest.java b/event-sourcing/event-publisher/event-publisher-process/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisherTest.java index 6462a9769..b089ee8ca 100644 --- a/event-sourcing/event-publisher/event-publisher-process/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisherTest.java +++ b/event-sourcing/event-publisher/event-publisher-process/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPrePublisherTest.java @@ -15,7 +15,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.messaging.Metadata; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; @@ -46,7 +46,7 @@ public class EventPrePublisherTest { private PrePublishRepository prePublishRepository; @Mock - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; @Mock private UtcClock clock; @@ -96,8 +96,8 @@ public void shouldAddSequenceNumberIntoTheEventMetadataAndSetItForPublishing() t eventPrePublisher.prePublish(event); - final InOrder inOrder = inOrder(publishedEventJdbcRepository, prePublishRepository); - inOrder.verify(publishedEventJdbcRepository).insertPublishedEvent(publishedEvent, connection); + final InOrder inOrder = inOrder(publishedEventInserter, prePublishRepository); + inOrder.verify(publishedEventInserter).insertPublishedEvent(publishedEvent, connection); inOrder.verify(prePublishRepository).addToPublishQueueTable(eventId, now, connection); } diff --git a/event-sourcing/event-publisher/event-publisher-timer/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPublishIT.java b/event-sourcing/event-publisher/event-publisher-timer/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPublishIT.java index b3401515f..96d71267b 100644 --- a/event-sourcing/event-publisher/event-publisher-timer/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPublishIT.java +++ b/event-sourcing/event-publisher/event-publisher-timer/src/test/java/uk/gov/justice/services/eventsourcing/prepublish/EventPublishIT.java @@ -30,7 +30,7 @@ import uk.gov.justice.services.eventsourcing.publishing.PublisherTimerConfig; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.eventsourcing.util.jee.timer.TimerCanceler; import uk.gov.justice.services.eventsourcing.util.jee.timer.TimerConfigFactory; import uk.gov.justice.services.eventsourcing.util.jee.timer.TimerServiceManager; @@ -46,7 +46,7 @@ import uk.gov.justice.services.messaging.logging.DefaultTraceLogger; import uk.gov.justice.services.test.utils.core.eventsource.EventStoreInitializer; import uk.gov.justice.services.test.utils.core.messaging.Poller; -import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; +import uk.gov.justice.services.test.utils.persistence.OpenEjbEventStoreDataSourceProvider; import uk.gov.justice.subscription.EventSourcesParser; import uk.gov.justice.subscription.ParserProducer; import uk.gov.justice.subscription.SubscriptionHelper; @@ -63,7 +63,6 @@ import java.util.Properties; import java.util.UUID; -import javax.annotation.Resource; import javax.inject.Inject; import javax.sql.DataSource; @@ -81,11 +80,8 @@ @RunWith(ApplicationComposer.class) public class EventPublishIT { - @Resource(name = "openejb/Resource/frameworkeventstore") - private DataSource dataSource; - @Inject - private TestJdbcDataSourceProvider testJdbcDataSourceProvider; + private JdbcDataSourceProvider jdbcDataSourceProvider; @Inject private DummyEventPublisher dummyEventPublisher; @@ -99,9 +95,8 @@ public class EventPublishIT { @Before public void initializeDatabase() throws Exception { - + final DataSource dataSource = jdbcDataSourceProvider.getDataSource("don't care"); eventStoreInitializer.initializeEventStore(dataSource); - testJdbcDataSourceProvider.setDataSource(dataSource); } @Module @@ -117,7 +112,7 @@ public void initializeDatabase() throws Exception { EventDestinationResolver.class, StringToJsonObjectConverter.class, JdbcDataSourceProvider.class, - TestJdbcDataSourceProvider.class, + OpenEjbEventStoreDataSourceProvider.class, EventSourceDefinitionRegistry.class, EventDestinationResolver.class, DefaultEventDestinationResolver.class, @@ -154,7 +149,7 @@ public void initializeDatabase() throws Exception { PrePublishTimerBean.class, PrePublishTimerConfig.class, SubscriptionHelper.class, - PublishedEventJdbcRepository.class, + PublishedEventInserter.class, ShutteringFlagProducerBean.class }) diff --git a/event-sourcing/event-publisher/published-event-processor/pom.xml b/event-sourcing/event-publisher/published-event-processor/pom.xml index 0ddcf7ef7..489ed490d 100644 --- a/event-sourcing/event-publisher/published-event-processor/pom.xml +++ b/event-sourcing/event-publisher/published-event-processor/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - linked-event-processor + published-event-processor diff --git a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessor.java b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisher.java similarity index 63% rename from event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessor.java rename to event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisher.java index 025417017..9405399d8 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessor.java +++ b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisher.java @@ -4,14 +4,15 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStream; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.DefaultEventSourceDefinitionFactory; -import java.util.Optional; import java.util.stream.Stream; import javax.inject.Inject; +import javax.sql.DataSource; -public class ActiveStreamsProcessor { +public class ActiveStreamsRepublisher { @Inject private PublishedEventsProcessor publishedEventsProcessor; @@ -25,16 +26,22 @@ public class ActiveStreamsProcessor { @Inject private DefaultEventSourceDefinitionFactory defaultEventSourceDefinitionFactory; + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; + public void populatePublishedEvents() { - final Optional dataSource; - dataSource = defaultEventSourceDefinitionFactory.createDefaultEventSource().getLocation().getDataSource(); + final String defaultDataSourceJndiName = defaultEventSourceDefinitionFactory.createDefaultEventSource() + .getLocation() + .getDataSource() + .orElseThrow(() -> new MissingDataSourceNameException("Unable to create DataSource. Default DataSource name not found in event source definition.")); + + final DataSource defaultDataSource = jdbcDataSourceProvider.getDataSource(defaultDataSourceJndiName); - final String jndiDatasource = dataSource.get(); - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(defaultDataSource); try (final Stream activeStreams = eventStreamJdbcRepository.findActive()) { activeStreams.forEach(stream -> { - publishedEventsProcessor.populatePublishedEvents(stream.getStreamId(), eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource)); + publishedEventsProcessor.populatePublishedEvents(stream.getStreamId(), eventJdbcRepositoryFactory.eventJdbcRepository(defaultDataSource)); }); } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/MissingDataSourceNameException.java b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/MissingDataSourceNameException.java new file mode 100644 index 000000000..23c1c26d4 --- /dev/null +++ b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/MissingDataSourceNameException.java @@ -0,0 +1,7 @@ +package uk.gov.justice.services.eventsourcing.publishedevent; + +public class MissingDataSourceNameException extends RuntimeException { + public MissingDataSourceNameException(final String message) { + super(message); + } +} diff --git a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessor.java b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessor.java index b8d5b0f09..2805ed81a 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessor.java +++ b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessor.java @@ -8,7 +8,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.messaging.Metadata; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; @@ -35,7 +35,7 @@ public class PublishedEventProcessor { private PublishedEventFactory publishedEventFactory; @Inject - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; public void createPublishedEvent(final Event event) throws PublishedEventSQLException { @@ -56,7 +56,7 @@ public void createPublishedEvent(final Event event) throws PublishedEventSQLExce final PublishedEvent publishedEvent = publishedEventFactory.create(event, updatedMetadata, eventNumber, previousEventNumber); try (final Connection connection = subscriptionDataSourceProvider.getEventStoreDataSource().getConnection()) { - publishedEventJdbcRepository.insertPublishedEvent(publishedEvent, connection); + publishedEventInserter.insertPublishedEvent(publishedEvent, connection); } catch (final SQLException e) { throw new PublishedEventSQLException(format("Unable to insert PublishedEvent with id '%s'", event.getId()), e); diff --git a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessor.java b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessor.java index 025f26039..bd588e353 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessor.java +++ b/event-sourcing/event-publisher/published-event-processor/src/main/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessor.java @@ -2,7 +2,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; import java.sql.Connection; @@ -21,7 +21,7 @@ public class PublishedEventsProcessor { private PublishedEventProcessor publishedEventProcessor; @Inject - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; public void populatePublishedEvents(final UUID streamId, final EventJdbcRepository eventJdbcRepository) { @@ -34,7 +34,7 @@ public void populatePublishedEvents(final UUID streamId, final EventJdbcReposito public void truncatePublishedEvents() throws PublishedEventSQLException { try (final Connection connection = subscriptionDataSourceProvider.getEventStoreDataSource().getConnection()) { - publishedEventJdbcRepository.truncate(connection); + publishedEventInserter.truncate(connection); } catch (final SQLException e) { throw new PublishedEventSQLException("Failed to truncate Linked Events table", e); } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorIT.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherIT.java similarity index 78% rename from event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorIT.java rename to event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherIT.java index a31e714d1..d69414fce 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorIT.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherIT.java @@ -21,9 +21,11 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.core.eventsource.EventStoreInitializer; import uk.gov.justice.services.test.utils.persistence.FrameworkTestDataSourceFactory; import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; @@ -40,52 +42,96 @@ import java.util.Optional; import java.util.UUID; +import javax.inject.Inject; import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; -public class ActiveStreamsProcessorIT { +public class ActiveStreamsRepublisherIT { + private final DataSource eventStoreDataSource = new FrameworkTestDataSourceFactory().createEventStoreDataSource(); + private final TestEventInserter testEventInserter = new TestEventInserter(); private final TestEventStreamInserter testEventStreamInserter = new TestEventStreamInserter(); + private final EventFactory eventFactory = new EventFactory(); - private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory = new EventStreamJdbcRepositoryFactory(); - private EventJdbcRepositoryFactory eventJdbcRepositoryFactory = new EventJdbcRepositoryFactory(); - private final ActiveStreamsProcessor activeStreamsProcessor = new ActiveStreamsProcessor(); - private final PublishedEventsProcessor publishedEventsProcessor = new PublishedEventsProcessor(); + + private final EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory = new EventStreamJdbcRepositoryFactory(); + private final EventJdbcRepositoryFactory eventJdbcRepositoryFactory = new EventJdbcRepositoryFactory(); + private final PublishedEventProcessor publishedEventProcessor = new PublishedEventProcessor(); + private final PublishedEventsProcessor publishedEventsProcessor = new PublishedEventsProcessor(); + + private final ActiveStreamsRepublisher activeStreamsRepublisher = new ActiveStreamsRepublisher(); @Before public void initDatabase() throws Exception { new EventStoreInitializer().initializeEventStore(eventStoreDataSource); - setField(activeStreamsProcessor, "publishedEventsProcessor", publishedEventsProcessor); - setField(activeStreamsProcessor, "eventJdbcRepositoryFactory", eventJdbcRepositoryFactory); - setField(activeStreamsProcessor, "eventStreamJdbcRepositoryFactory", eventStreamJdbcRepositoryFactory); - setField(activeStreamsProcessor, "defaultEventSourceDefinitionFactory", new DefaultEventSourceDefinitionFactory()); + setField(activeStreamsRepublisher, "publishedEventsProcessor", publishedEventsProcessor); + setField(activeStreamsRepublisher, "eventStreamJdbcRepositoryFactory", eventStreamJdbcRepositoryFactory); + setField(activeStreamsRepublisher, "eventJdbcRepositoryFactory", eventJdbcRepositoryFactory); + setField(activeStreamsRepublisher, "defaultEventSourceDefinitionFactory", new DefaultEventSourceDefinitionFactory()); + setField(activeStreamsRepublisher, "jdbcDataSourceProvider", (JdbcDataSourceProvider) jndiName -> eventStoreDataSource); + setUpPublishedEventProcessor(publishedEventProcessor); setUpPublishedEventsProcessor(publishedEventsProcessor, publishedEventProcessor); + setUpEventStreamJdbcRepositoryFactory(); + } + + @Test + public void shouldPopulatePublishedEvents() throws Exception { + + final String name = "example.first-event"; + final long sequenceId = 1L; + final long eventNumber = 1L; + final UUID streamId = randomUUID(); + final UUID eventId = randomUUID(); + final Event event = eventFactory.createEvent(streamId, eventId, name, sequenceId, eventNumber); + testEventInserter.insertIntoEventLog(event); + + final long positionInStream = 1l; + final boolean active = true; + testEventStreamInserter.insertIntoEventStream(streamId, positionInStream, active, ZonedDateTime.now()); + + try (final Connection connection = eventStoreDataSource.getConnection()) { + + activeStreamsRepublisher.populatePublishedEvents(); + final Optional publishedEventOptional = new EventFetcherRepository().getPublishedEvent(eventId, connection); + + if (publishedEventOptional.isPresent()) { + final PublishedEvent actual = publishedEventOptional.get(); + assertThat(actual.getId(), is(event.getId())); + assertThat(actual.getName(), is(name)); + assertThat(actual.getPreviousEventNumber(), is(0L)); + assertThat(actual.getEventNumber().get(), is(1L)); + assertThat(actual.getSequenceId(), is(sequenceId)); + } else { + fail(); + } + } } private SubscriptionDataSourceProvider setUpSubscriptionDataSourceProvider() throws MalformedURLException { + final SubscriptionDataSourceProvider subscriptionDataSourceProvider = new SubscriptionDataSourceProvider(); final TestJdbcDataSourceProvider testJdbcDataSourceProvider = new TestJdbcDataSourceProvider(); - testJdbcDataSourceProvider.setDataSource(eventStoreDataSource); - setField(subscriptionDataSourceProvider, "jdbcDataSourceProvider", testJdbcDataSourceProvider); + final EventSourceDefinitionRegistry eventSourceDefinitionRegistry = new EventSourceDefinitionRegistry(); final URL url = getFromClasspath("yaml/event-sources.yaml"); final Location location = new Location(null, null, of(url.toString())); + + testJdbcDataSourceProvider.setDataSource(eventStoreDataSource); eventSourceDefinitionRegistry.register(new EventSourceDefinition("", true, location)); + + setField(subscriptionDataSourceProvider, "jdbcDataSourceProvider", testJdbcDataSourceProvider); setField(subscriptionDataSourceProvider, "eventSourceDefinitionRegistry", eventSourceDefinitionRegistry); setField(eventJdbcRepositoryFactory, "eventInsertionStrategy", new AnsiSQLEventLogInsertionStrategy()); - setField(eventJdbcRepositoryFactory, "jdbcRepositoryHelper", new JdbcRepositoryHelper()); - setField(eventJdbcRepositoryFactory, "jdbcDataSourceProvider", testJdbcDataSourceProvider); - - setField(eventStreamJdbcRepositoryFactory, "eventStreamJdbcRepositoryHelper", new JdbcRepositoryHelper()); - setField(eventStreamJdbcRepositoryFactory, "jdbcDataSourceProvider", testJdbcDataSourceProvider); + setField(eventJdbcRepositoryFactory, "jdbcResultSetStreamer", new JdbcResultSetStreamer()); + setField(eventJdbcRepositoryFactory, "preparedStatementWrapperFactory", new PreparedStatementWrapperFactory()); return subscriptionDataSourceProvider; } @@ -93,61 +139,31 @@ private SubscriptionDataSourceProvider setUpSubscriptionDataSourceProvider() thr private void setUpPublishedEventsProcessor(final PublishedEventsProcessor publishedEventsProcessor, final PublishedEventProcessor publishedEventProcessor) throws MalformedURLException { - setField(publishedEventsProcessor, "publishedEventJdbcRepository", new PublishedEventJdbcRepository()); + setField(publishedEventsProcessor, "publishedEventInserter", new PublishedEventInserter()); setField(publishedEventsProcessor, "publishedEventProcessor", publishedEventProcessor); setField(publishedEventsProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); } private void setUpPublishedEventProcessor(final PublishedEventProcessor publishedEventProcessor) throws MalformedURLException { + final EventConverter eventConverter = new EventConverter(); + setField(publishedEventProcessor, "metadataEventNumberUpdater", new MetadataEventNumberUpdater()); setField(publishedEventProcessor, "eventConverter", eventConverter); setField(publishedEventProcessor, "prePublishRepository", new PrePublishRepository()); setField(publishedEventProcessor, "publishedEventFactory", new PublishedEventFactory()); - setField(publishedEventProcessor, "publishedEventJdbcRepository", new PublishedEventJdbcRepository()); + setField(publishedEventProcessor, "publishedEventInserter", new PublishedEventInserter()); setField(eventConverter, "stringToJsonObjectConverter", new StringToJsonObjectConverter()); setField(publishedEventProcessor, "eventConverter", eventConverter); setField(publishedEventProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); - } + private void setUpEventStreamJdbcRepositoryFactory() { + setField(eventStreamJdbcRepositoryFactory, "jdbcResultSetStreamer", new JdbcResultSetStreamer()); + setField(eventStreamJdbcRepositoryFactory, "preparedStatementWrapperFactory", new PreparedStatementWrapperFactory()); + } private URL getFromClasspath(final String name) throws MalformedURLException { return get(getClass().getClassLoader().getResource(name).getPath()).toUri().toURL(); } - - - @Test - public void shouldPopulatePublishedEvents() throws Exception { - - final String name = "example.first-event"; - final long sequenceId = 1L; - final long eventNumber = 1L; - final UUID streamId = randomUUID(); - final UUID eventId = randomUUID(); - final Event event = eventFactory.createEvent(streamId, eventId, name, sequenceId, eventNumber); - testEventInserter.insertIntoEventLog(event); - - final long positionInStream = 1l; - final boolean active = true; - testEventStreamInserter.insertIntoEventStream(streamId, positionInStream, active, ZonedDateTime.now()); - - try (final Connection connection = eventStoreDataSource.getConnection()) { - - activeStreamsProcessor.populatePublishedEvents(); - - final Optional publishedEventOptional = new EventFetcherRepository().getPublishedEvent(eventId, connection); - - if (publishedEventOptional.isPresent()) { - final PublishedEvent actual = publishedEventOptional.get(); - assertThat(actual.getId(), is(event.getId())); - assertThat(actual.getName(), is(name)); - assertThat(actual.getPreviousEventNumber(), is(0L)); - assertThat(actual.getEventNumber().get(), is(1L)); - assertThat(actual.getSequenceId(), is(sequenceId)); - } else { - fail(); - } - } - } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorTest.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherTest.java similarity index 52% rename from event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorTest.java rename to event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherTest.java index 3f6fbb38f..d5d5f8de3 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsProcessorTest.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/ActiveStreamsRepublisherTest.java @@ -1,7 +1,14 @@ package uk.gov.justice.services.eventsourcing.publishedevent; import static java.time.ZonedDateTime.now; +import static java.util.Optional.empty; +import static java.util.Optional.of; +import static java.util.UUID.randomUUID; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import static org.mockito.Answers.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -11,12 +18,15 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.DatasourceException; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.DefaultEventSourceDefinitionFactory; import java.sql.SQLException; import java.util.UUID; import java.util.stream.Stream; +import javax.sql.DataSource; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -24,7 +34,7 @@ import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) -public class ActiveStreamsProcessorTest { +public class ActiveStreamsRepublisherTest { @Mock(answer = RETURNS_DEEP_STUBS) private DefaultEventSourceDefinitionFactory defaultEventSourceDefinitionFactory; @@ -43,32 +53,53 @@ public class ActiveStreamsProcessorTest { @Mock private PublishedEventsProcessor publishedEventsProcessors; + @Mock + private JdbcDataSourceProvider jdbcDataSourceProvider; + @InjectMocks - private ActiveStreamsProcessor activeStreamsProcessor; + private ActiveStreamsRepublisher activeStreamsRepublisher; @Test public void shouldProcessActiveStreams() throws SQLException, DatasourceException { - final UUID streamId1 = UUID.randomUUID(); - final UUID streamId2 = UUID.randomUUID(); - final UUID streamId3 = UUID.randomUUID(); - final EventStream eventStream1 = new EventStream(streamId1, 1L, true, now()); - final EventStream eventStream2 = new EventStream(streamId2, 1L, true, now()); - final EventStream eventStream3 = new EventStream(streamId3, 1L, true, now()); + final String defaultDataSourceJndiName = "defaultDataSourceJndiName"; + + final UUID streamId1 = randomUUID(); + final UUID streamId2 = randomUUID(); + final UUID streamId3 = randomUUID(); + + final Stream eventStreams = Stream.of( + new EventStream(streamId1, 1L, true, now()), + new EventStream(streamId2, 1L, true, now()), + new EventStream(streamId3, 1L, true, now())); - when(defaultEventSourceDefinitionFactory.createDefaultEventSource().getLocation().getDataSource()).thenReturn(java.util.Optional.of("")); + final DataSource defaultDataSource = mock(DataSource.class); - when(eventJdbcRepositoryFactory.eventJdbcRepository("")).thenReturn(eventJdbcRepository); - when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository("")).thenReturn(eventStreamJdbcRepository); + when(defaultEventSourceDefinitionFactory.createDefaultEventSource().getLocation().getDataSource()).thenReturn(of(defaultDataSourceJndiName)); + when(jdbcDataSourceProvider.getDataSource(defaultDataSourceJndiName)).thenReturn(defaultDataSource); - final Stream eventStreams = Stream.of(eventStream1, eventStream2, eventStream3); + when(eventJdbcRepositoryFactory.eventJdbcRepository(defaultDataSource)).thenReturn(eventJdbcRepository); + when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(defaultDataSource)).thenReturn(eventStreamJdbcRepository); when(eventStreamJdbcRepository.findActive()).thenReturn(eventStreams); - activeStreamsProcessor.populatePublishedEvents(); + activeStreamsRepublisher.populatePublishedEvents(); verify(publishedEventsProcessors).populatePublishedEvents(streamId1, eventJdbcRepository); verify(publishedEventsProcessors).populatePublishedEvents(streamId2, eventJdbcRepository); verify(publishedEventsProcessors).populatePublishedEvents(streamId3, eventJdbcRepository); } + + @Test + public void shouldThrowExceptionIfNoDefaultDataSourceNameFound() throws Exception { + + when(defaultEventSourceDefinitionFactory.createDefaultEventSource().getLocation().getDataSource()).thenReturn(empty()); + + try { + activeStreamsRepublisher.populatePublishedEvents(); + fail(); + } catch (final MissingDataSourceNameException expected) { + assertThat(expected.getMessage(), is("Unable to create DataSource. Default DataSource name not found in event source definition.")); + } + } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorIT.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorIT.java index 678d226ef..00da62f34 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorIT.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorIT.java @@ -19,9 +19,10 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.core.eventsource.EventStoreInitializer; import uk.gov.justice.services.test.utils.persistence.FrameworkTestDataSourceFactory; import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; @@ -57,6 +58,33 @@ public void initDatabase() throws Exception { setUpPublishedEventProcessor(); } + @Test + public void shouldFetchAnEventById() throws Exception { + + final String name = "example.first-event"; + final long sequenceId = 1L; + final long eventNumber = 1L; + final Event event = eventFactory.createEvent(name, sequenceId, eventNumber); + + testEventInserter.insertIntoEventLog(event); + publishedEventProcessor.createPublishedEvent(event); + try (final Connection connection = eventStoreDataSource.getConnection()) { + + final Optional publishedEventOptional = eventFetcherRepository.getPublishedEvent(event.getId(), connection); + + if (publishedEventOptional.isPresent()) { + final PublishedEvent actual = publishedEventOptional.get(); + assertThat(actual.getId(), is(event.getId())); + assertThat(actual.getName(), is(name)); + assertThat(actual.getPreviousEventNumber(), is(0L)); + assertThat(actual.getSequenceId(), is(sequenceId)); + + } else { + fail(); + } + } + } + private URL getFromClasspath(final String name) throws MalformedURLException { return get(getClass().getClassLoader().getResource(name).getPath()).toUri().toURL(); } @@ -73,12 +101,8 @@ private SubscriptionDataSourceProvider setUpSubscriptionDataSourceProvider() thr setField(subscriptionDataSourceProvider, "eventSourceDefinitionRegistry", eventSourceDefinitionRegistry); setField(eventJdbcRepositoryFactory, "eventInsertionStrategy", new AnsiSQLEventLogInsertionStrategy()); - setField(eventJdbcRepositoryFactory, "jdbcRepositoryHelper", new JdbcRepositoryHelper()); - setField(eventJdbcRepositoryFactory, "jdbcDataSourceProvider", testJdbcDataSourceProvider); - - setField(eventStreamJdbcRepositoryFactory, "eventStreamJdbcRepositoryHelper", new JdbcRepositoryHelper()); - setField(eventStreamJdbcRepositoryFactory, "jdbcDataSourceProvider", testJdbcDataSourceProvider); - + setField(eventJdbcRepositoryFactory, "jdbcResultSetStreamer", new JdbcResultSetStreamer()); + setField(eventJdbcRepositoryFactory, "preparedStatementWrapperFactory", new PreparedStatementWrapperFactory()); return subscriptionDataSourceProvider; } @@ -88,36 +112,9 @@ private void setUpPublishedEventProcessor() throws MalformedURLException { setField(publishedEventProcessor, "eventConverter", eventConverter); setField(publishedEventProcessor, "prePublishRepository", new PrePublishRepository()); setField(publishedEventProcessor, "publishedEventFactory", new PublishedEventFactory()); - setField(publishedEventProcessor, "publishedEventJdbcRepository", new PublishedEventJdbcRepository()); + setField(publishedEventProcessor, "publishedEventInserter", new PublishedEventInserter()); setField(publishedEventProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); setField(eventConverter, "stringToJsonObjectConverter", new StringToJsonObjectConverter()); } - - @Test - public void shouldFetchAnEventById() throws Exception { - - final String name = "example.first-event"; - final long sequenceId = 1L; - final long eventNumber = 1L; - final Event event = eventFactory.createEvent(name, sequenceId, eventNumber); - - testEventInserter.insertIntoEventLog(event); - publishedEventProcessor.createPublishedEvent(event); - try (final Connection connection = eventStoreDataSource.getConnection()) { - - final Optional publishedEventOptional = eventFetcherRepository.getPublishedEvent(event.getId(), connection); - - if (publishedEventOptional.isPresent()) { - final PublishedEvent actual = publishedEventOptional.get(); - assertThat(actual.getId(), is(event.getId())); - assertThat(actual.getName(), is(name)); - assertThat(actual.getPreviousEventNumber(), is(0L)); - assertThat(actual.getSequenceId(), is(sequenceId)); - - } else { - fail(); - } - } - } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorTest.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorTest.java index 3dd88bb77..22a13d94d 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorTest.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventProcessorTest.java @@ -18,7 +18,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.messaging.Metadata; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; @@ -52,7 +52,7 @@ public class PublishedEventProcessorTest { private PublishedEventFactory publishedEventFactory; @Mock - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; @InjectMocks private PublishedEventProcessor publishedEventProcessor; @@ -78,7 +78,7 @@ public void shouldCreatePublishedEvent() throws Exception { publishedEventProcessor.createPublishedEvent(event); - verify(publishedEventJdbcRepository).insertPublishedEvent(publishedEvent, connection); + verify(publishedEventInserter).insertPublishedEvent(publishedEvent, connection); } @Test @@ -106,7 +106,7 @@ public void shouldThrowExceptionIfGettingPreviousEventNumberFails() throws Excep assertThat(expected.getMessage(), is("Unable to get previous event number for event with id 'df7958f4-ce50-45a1-a8ee-501d55475e69'")); } - verifyZeroInteractions(publishedEventJdbcRepository); + verifyZeroInteractions(publishedEventInserter); } @Test @@ -130,7 +130,7 @@ public void shouldThrowExceptionIfInsertingPublishedEventFails() throws Exceptio when(metadataEventNumberUpdater.updateMetadataJson(metadata, previousEventNumber, eventNumber)).thenReturn(updatedMetadata); when(publishedEventFactory.create(event, updatedMetadata, eventNumber, previousEventNumber)).thenReturn(publishedEvent); - doThrow(sqlException).when(publishedEventJdbcRepository).insertPublishedEvent(publishedEvent, connection); + doThrow(sqlException).when(publishedEventInserter).insertPublishedEvent(publishedEvent, connection); try { publishedEventProcessor.createPublishedEvent(event); diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorIT.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorIT.java index 16961ead4..b7b1f7f55 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorIT.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorIT.java @@ -19,7 +19,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEvent; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.services.test.utils.core.eventsource.EventStoreInitializer; import uk.gov.justice.services.test.utils.persistence.FrameworkTestDataSourceFactory; import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider; @@ -44,6 +44,7 @@ @RunWith(MockitoJUnitRunner.class) public class PublishedEventsProcessorIT { + private final DataSource eventStoreDataSource = new FrameworkTestDataSourceFactory().createEventStoreDataSource(); private final TestEventInserter testEventInserter = new TestEventInserter(); private final TestEventStreamInserter testEventStreamInserter = new TestEventStreamInserter(); @@ -56,44 +57,7 @@ public class PublishedEventsProcessorIT { public void initDatabase() throws Exception { new EventStoreInitializer().initializeEventStore(eventStoreDataSource); setUpPublishedEventProcessor(publishedEventProcessor, eventConverter); - setUpPublishedEventsProcessor(eventConverter); - } - - private SubscriptionDataSourceProvider setUpSubscriptionDataSourceProvider() throws MalformedURLException { - final SubscriptionDataSourceProvider subscriptionDataSourceProvider = new SubscriptionDataSourceProvider(); - final TestJdbcDataSourceProvider testJdbcDataSourceProvider = new TestJdbcDataSourceProvider(); - testJdbcDataSourceProvider.setDataSource(eventStoreDataSource); - setField(subscriptionDataSourceProvider, "jdbcDataSourceProvider", testJdbcDataSourceProvider); - final EventSourceDefinitionRegistry eventSourceDefinitionRegistry = new EventSourceDefinitionRegistry(); - final URL url = getFromClasspath("yaml/event-sources.yaml"); - final Location location = new Location(null, null, of(url.toString())); - eventSourceDefinitionRegistry.register(new EventSourceDefinition("", true, location)); - setField(subscriptionDataSourceProvider, "eventSourceDefinitionRegistry", eventSourceDefinitionRegistry); - return subscriptionDataSourceProvider; - } - - - private void setUpPublishedEventsProcessor(EventConverter eventConverter) throws MalformedURLException { - setField(publishedEventsProcessor, "publishedEventJdbcRepository", new PublishedEventJdbcRepository()); - setField(publishedEventsProcessor, "publishedEventProcessor", publishedEventProcessor); - setField(publishedEventsProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); - } - - private void setUpPublishedEventProcessor(PublishedEventProcessor publishedEventProcessor, EventConverter eventConverter) throws MalformedURLException { - setField(publishedEventProcessor, "metadataEventNumberUpdater", new MetadataEventNumberUpdater()); - setField(publishedEventProcessor, "eventConverter", eventConverter); - setField(publishedEventProcessor, "prePublishRepository", new PrePublishRepository()); - setField(publishedEventProcessor, "publishedEventFactory", new PublishedEventFactory()); - setField(publishedEventProcessor, "publishedEventJdbcRepository", new PublishedEventJdbcRepository()); - setField(publishedEventProcessor, "eventConverter", eventConverter); - setField(eventConverter, "stringToJsonObjectConverter", new StringToJsonObjectConverter()); - setField(publishedEventProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); - - - } - - private URL getFromClasspath(final String name) throws MalformedURLException { - return get(getClass().getClassLoader().getResource(name).getPath()).toUri().toURL(); + setUpPublishedEventsProcessor(); } @Test @@ -148,4 +112,38 @@ public void shouldPopulatePublishedEvents() throws Exception { } } } + + private SubscriptionDataSourceProvider setUpSubscriptionDataSourceProvider() throws MalformedURLException { + final SubscriptionDataSourceProvider subscriptionDataSourceProvider = new SubscriptionDataSourceProvider(); + final TestJdbcDataSourceProvider testJdbcDataSourceProvider = new TestJdbcDataSourceProvider(); + testJdbcDataSourceProvider.setDataSource(eventStoreDataSource); + setField(subscriptionDataSourceProvider, "jdbcDataSourceProvider", testJdbcDataSourceProvider); + final EventSourceDefinitionRegistry eventSourceDefinitionRegistry = new EventSourceDefinitionRegistry(); + final URL url = getFromClasspath("yaml/event-sources.yaml"); + final Location location = new Location(null, null, of(url.toString())); + eventSourceDefinitionRegistry.register(new EventSourceDefinition("", true, location)); + setField(subscriptionDataSourceProvider, "eventSourceDefinitionRegistry", eventSourceDefinitionRegistry); + return subscriptionDataSourceProvider; + } + + private void setUpPublishedEventsProcessor() throws MalformedURLException { + setField(publishedEventsProcessor, "publishedEventInserter", new PublishedEventInserter()); + setField(publishedEventsProcessor, "publishedEventProcessor", publishedEventProcessor); + setField(publishedEventsProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); + } + + private void setUpPublishedEventProcessor(final PublishedEventProcessor publishedEventProcessor, final EventConverter eventConverter) throws MalformedURLException { + setField(publishedEventProcessor, "metadataEventNumberUpdater", new MetadataEventNumberUpdater()); + setField(publishedEventProcessor, "eventConverter", eventConverter); + setField(publishedEventProcessor, "prePublishRepository", new PrePublishRepository()); + setField(publishedEventProcessor, "publishedEventFactory", new PublishedEventFactory()); + setField(publishedEventProcessor, "publishedEventInserter", new PublishedEventInserter()); + setField(publishedEventProcessor, "eventConverter", eventConverter); + setField(eventConverter, "stringToJsonObjectConverter", new StringToJsonObjectConverter()); + setField(publishedEventProcessor, "subscriptionDataSourceProvider", setUpSubscriptionDataSourceProvider()); + } + + private URL getFromClasspath(final String name) throws MalformedURLException { + return get(getClass().getClassLoader().getResource(name).getPath()).toUri().toURL(); + } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorTest.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorTest.java index a8dd1aa29..51617c1fc 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorTest.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/PublishedEventsProcessorTest.java @@ -11,7 +11,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.Event; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventJdbcRepository; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventInserter; import uk.gov.justice.subscription.registry.SubscriptionDataSourceProvider; import java.sql.Connection; @@ -37,7 +37,7 @@ public class PublishedEventsProcessorTest { private PublishedEventProcessor publishedEventProcessor; @Mock - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; @InjectMocks private PublishedEventsProcessor publishedEventsProcessor; @@ -72,7 +72,7 @@ public void shouldTruncateEvents() throws Exception { publishedEventsProcessor.truncatePublishedEvents(); - verify(publishedEventJdbcRepository).truncate(connection); + verify(publishedEventInserter).truncate(connection); } @Test @@ -83,7 +83,7 @@ public void shouldThrowPublishedEventSQLExceptionOnFailure() throws Exception { final Connection connection = mock(Connection.class); when(subscriptionDataSourceProvider.getEventStoreDataSource().getConnection()).thenReturn(connection); - when(publishedEventJdbcRepository.truncate(connection)).thenThrow(sqlException); + when(publishedEventInserter.truncate(connection)).thenThrow(sqlException); try { publishedEventsProcessor.truncatePublishedEvents(); diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventJdbcRepository.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventJdbcRepository.java index cf8b3cd68..36e001026 100644 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventJdbcRepository.java +++ b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventJdbcRepository.java @@ -5,27 +5,24 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.PostgresSQLEventLogInsertionStrategy; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import javax.sql.DataSource; public class TestEventJdbcRepository extends EventJdbcRepository { - protected final DataSource dbsource; + protected final DataSource dataSource; - public TestEventJdbcRepository(final DataSource datasource) { + public TestEventJdbcRepository(final DataSource dataSource) { super( new PostgresSQLEventLogInsertionStrategy(), - new JdbcRepositoryHelper(), - jndiName -> datasource, - "java:/app/EventDeQueuerExecutorIT/DS.frameworkeventstore", + new JdbcResultSetStreamer(), + new PreparedStatementWrapperFactory(), + dataSource, getLogger(TestEventJdbcRepository.class) ); - this.dbsource = datasource; - } - - protected DataSource getDataSource() { - return dbsource; + this.dataSource = dataSource; } } diff --git a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventStreamJdbcRepository.java b/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventStreamJdbcRepository.java deleted file mode 100644 index c1836e6d3..000000000 --- a/event-sourcing/event-publisher/published-event-processor/src/test/java/uk/gov/justice/services/eventsourcing/publishedevent/TestEventStreamJdbcRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package uk.gov.justice.services.eventsourcing.publishedevent; - -import static org.slf4j.LoggerFactory.getLogger; - -import uk.gov.justice.services.common.util.UtcClock; -import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; - -import javax.sql.DataSource; - -public class TestEventStreamJdbcRepository extends EventStreamJdbcRepository { - - private final DataSource dbsource; - - public TestEventStreamJdbcRepository(final DataSource dataSource) { - super( - new JdbcRepositoryHelper(), - jndiName -> dataSource, - new UtcClock(), - "java:/app/EventDeQueuerExecutorIT/DS.frameworkeventstore", - getLogger(EventStreamJdbcRepository.class) - ); - - this.dbsource = dataSource; - } - - public DataSource getDatasource() { - return dbsource; - } -} diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepository.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepository.java index 62b7e978d..131aec0cd 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepository.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepository.java @@ -170,7 +170,7 @@ public long getStreamPosition(final UUID streamId) { @Override public Stream findEventsSince(final long eventNumber) { - return publishedEventFinder.findEventsSince(eventNumber, eventStreamJdbcRepository.getDataSource()); + return publishedEventFinder.findEventsSince(eventNumber); } private Function toEventStreamMetadata() { diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepository.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepository.java index 4e1490fa4..c23549066 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepository.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepository.java @@ -2,15 +2,15 @@ import static java.lang.String.format; -import static java.util.Optional.ofNullable; +import static java.util.Optional.of; import static uk.gov.justice.services.common.converter.ZonedDateTimes.fromSqlTimestamp; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventInsertionStrategy; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidPositionException; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.ResultSet; import java.sql.SQLException; @@ -61,23 +61,21 @@ public class EventJdbcRepository { private static final long NO_EXISTING_VERSION = 0L; - private final String jndiDatasource; - private final Logger logger; private final EventInsertionStrategy eventInsertionStrategy; - private final JdbcRepositoryHelper jdbcRepositoryHelper; - private final JdbcDataSourceProvider jdbcDataSourceProvider; - - private DataSource dataSource; + private final JdbcResultSetStreamer jdbcResultSetStreamer; + private final PreparedStatementWrapperFactory preparedStatementWrapperFactory; + private final DataSource dataSource; + private final Logger logger; public EventJdbcRepository(final EventInsertionStrategy eventInsertionStrategy, - final JdbcRepositoryHelper jdbcRepositoryHelper, - final JdbcDataSourceProvider jdbcDataSourceProvider, - final String jndiDatasource, + final JdbcResultSetStreamer jdbcResultSetStreamer, + final PreparedStatementWrapperFactory preparedStatementWrapperFactory, + final DataSource dataSource, final Logger logger) { this.eventInsertionStrategy = eventInsertionStrategy; - this.jdbcRepositoryHelper = jdbcRepositoryHelper; - this.jdbcDataSourceProvider = jdbcDataSourceProvider; - this.jndiDatasource = jndiDatasource; + this.jdbcResultSetStreamer = jdbcResultSetStreamer; + this.preparedStatementWrapperFactory = preparedStatementWrapperFactory; + this.dataSource = dataSource; this.logger = logger; } @@ -88,7 +86,7 @@ public EventJdbcRepository(final EventInsertionStrategy eventInsertionStrategy, * @throws InvalidPositionException if the version already exists or is null. */ public void insert(final Event event) throws InvalidPositionException { - try (final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), eventInsertionStrategy.insertStatement())) { + try (final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, eventInsertionStrategy.insertStatement())) { eventInsertionStrategy.insert(preparedStatementWrapper, event); } catch (final SQLException e) { logger.error("Error persisting event to the database", e); @@ -105,10 +103,10 @@ public void insert(final Event event) throws InvalidPositionException { */ public Stream findByStreamIdOrderByPositionAsc(final UUID streamId) { try { - final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_BY_STREAM_ID); + final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID); preparedStatementWrapper.setObject(1, streamId); - return jdbcRepositoryHelper.streamOf(preparedStatementWrapper, entityFromFunction()); + return jdbcResultSetStreamer.streamOf(preparedStatementWrapper, entityFromFunction()); } catch (final SQLException e) { logger.warn(FAILED_TO_READ_STREAM, streamId, e); throw new JdbcRepositoryException(format(READING_STREAM_EXCEPTION, streamId), e); @@ -126,11 +124,11 @@ public Stream findByStreamIdOrderByPositionAsc(final UUID streamId) { public Stream findByStreamIdFromPositionOrderByPositionAsc(final UUID streamId, final Long position) { try { - final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_BY_STREAM_ID_AND_POSITION); + final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION); preparedStatementWrapper.setObject(1, streamId); preparedStatementWrapper.setLong(2, position); - return jdbcRepositoryHelper.streamOf(preparedStatementWrapper, entityFromFunction()); + return jdbcResultSetStreamer.streamOf(preparedStatementWrapper, entityFromFunction()); } catch (final SQLException e) { logger.warn(FAILED_TO_READ_STREAM, streamId, e); throw new JdbcRepositoryException(format(READING_STREAM_EXCEPTION, streamId), e); @@ -141,12 +139,12 @@ public Stream findByStreamIdFromPositionOrderByPositionAsc(final UUID str final Long versionFrom, final Integer pageSize) { try { - final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_BY_STREAM_ID_AND_POSITION_BY_PAGE); + final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION_BY_PAGE); preparedStatementWrapper.setObject(1, streamId); preparedStatementWrapper.setLong(2, versionFrom); preparedStatementWrapper.setInt(3, pageSize); - return jdbcRepositoryHelper.streamOf(preparedStatementWrapper, entityFromFunction()); + return jdbcResultSetStreamer.streamOf(preparedStatementWrapper, entityFromFunction()); } catch (final SQLException e) { logger.warn(FAILED_TO_READ_STREAM, streamId, e); throw new JdbcRepositoryException(format(READING_STREAM_EXCEPTION, streamId), e); @@ -160,9 +158,9 @@ public Stream findByStreamIdFromPositionOrderByPositionAsc(final UUID str */ public Stream findAll() { try { - return jdbcRepositoryHelper - .streamOf(jdbcRepositoryHelper - .preparedStatementWrapperOf(getDataSource(), SQL_FIND_ALL), entityFromFunction()); + return jdbcResultSetStreamer + .streamOf(preparedStatementWrapperFactory + .preparedStatementWrapperOf(dataSource, SQL_FIND_ALL), entityFromFunction()); } catch (final SQLException e) { throw new JdbcRepositoryException(READING_STREAM_ALL_EXCEPTION, e); } @@ -175,7 +173,7 @@ public Stream findAll() { * @return current position streamId for the stream. Returns 0 if stream doesn't exist. */ public long getStreamSize(final UUID streamId) { - try (final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_LATEST_POSITION)) { + try (final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_LATEST_POSITION)) { preparedStatementWrapper.setObject(1, streamId); final ResultSet resultSet = preparedStatementWrapper.executeQuery(); @@ -200,7 +198,7 @@ public long getStreamSize(final UUID streamId) { */ public Stream getStreamIds() { try { - final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_DISTINCT_STREAM_ID); + final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_DISTINCT_STREAM_ID); return streamFrom(preparedStatementWrapper); } catch (final SQLException e) { throw new JdbcRepositoryException(READING_STREAM_ALL_EXCEPTION, e); @@ -208,20 +206,13 @@ public Stream getStreamIds() { } - private DataSource getDataSource() { - if (null == dataSource) { - dataSource = jdbcDataSourceProvider.getDataSource(jndiDatasource); - } - - return dataSource; - } - private Stream streamFrom(final PreparedStatementWrapper preparedStatementWrapper) throws SQLException { - return jdbcRepositoryHelper.streamOf(preparedStatementWrapper, e -> { + return jdbcResultSetStreamer.streamOf(preparedStatementWrapper, resultSet -> { try { - return (UUID) e.getObject(COL_STREAM_ID); - } catch (final SQLException e1) { - throw jdbcRepositoryHelper.handled(e1, preparedStatementWrapper); + return (UUID) resultSet.getObject(COL_STREAM_ID); + } catch (final SQLException e) { + preparedStatementWrapper.close(); + throw new JdbcRepositoryException(e); } }); } @@ -236,7 +227,7 @@ private Function entityFromFunction() { resultSet.getString(COL_METADATA), resultSet.getString(COL_PAYLOAD), fromSqlTimestamp(resultSet.getTimestamp(COL_TIMESTAMP)), - ofNullable(resultSet.getLong(COL_EVENT_NUMBER)) + of(resultSet.getLong(COL_EVENT_NUMBER)) ); } catch (final SQLException e) { throw new JdbcRepositoryException(e); @@ -247,7 +238,7 @@ private Function entityFromFunction() { public void clear(final UUID streamId) { final long eventCount = getStreamSize(streamId); - try (final PreparedStatementWrapper preparedStatementWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_DELETE_STREAM)) { + try (final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_DELETE_STREAM)) { preparedStatementWrapper.setObject(1, streamId); final int deletedRows = preparedStatementWrapper.executeUpdate(); diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactory.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactory.java index d8506e538..875e49849 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactory.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactory.java @@ -3,30 +3,31 @@ import static org.slf4j.LoggerFactory.getLogger; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventInsertionStrategy; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.sql.DataSource; @ApplicationScoped public class EventJdbcRepositoryFactory { @Inject - EventInsertionStrategy eventInsertionStrategy; + private EventInsertionStrategy eventInsertionStrategy; @Inject - JdbcRepositoryHelper jdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; @Inject - JdbcDataSourceProvider jdbcDataSourceProvider; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; - public EventJdbcRepository eventJdbcRepository(final String jndiDatasource) { + public EventJdbcRepository eventJdbcRepository(final DataSource dataSource) { return new EventJdbcRepository( eventInsertionStrategy, - jdbcRepositoryHelper, - jdbcDataSourceProvider, - jndiDatasource, + jdbcResultSetStreamer, + preparedStatementWrapperFactory, + dataSource, getLogger(EventJdbcRepository.class)); } } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinder.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinder.java index 7b8f72537..e9286ee49 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinder.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinder.java @@ -4,8 +4,9 @@ import static uk.gov.justice.services.common.converter.ZonedDateTimes.fromSqlTimestamp; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.ResultSet; import java.sql.SQLException; @@ -13,7 +14,6 @@ import java.util.function.Function; import java.util.stream.Stream; -import javax.inject.Inject; import javax.sql.DataSource; public class PublishedEventFinder { @@ -30,18 +30,28 @@ public class PublishedEventFinder { private static final String EVENT_NUMBER = "event_number"; private static final String PREVIOUS_EVENT_NUMBER = "previous_event_number"; - @Inject - private JdbcRepositoryHelper jdbcRepositoryHelper; + private final JdbcResultSetStreamer jdbcResultSetStreamer; + private final PreparedStatementWrapperFactory preparedStatementWrapperFactory; + private final DataSource dataSource; - public Stream findEventsSince(final long eventNumber, final DataSource dataSource) { + public PublishedEventFinder( + final JdbcResultSetStreamer jdbcResultSetStreamer, + final PreparedStatementWrapperFactory preparedStatementWrapperFactory, + final DataSource dataSource) { + this.jdbcResultSetStreamer = jdbcResultSetStreamer; + this.preparedStatementWrapperFactory = preparedStatementWrapperFactory; + this.dataSource = dataSource; + } + + public Stream findEventsSince(final long eventNumber) { try { - final PreparedStatementWrapper psWrapper = jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_ALL_SINCE); + final PreparedStatementWrapper psWrapper = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_ALL_SINCE); psWrapper.setLong(1, eventNumber); - return jdbcRepositoryHelper.streamOf(psWrapper, asPublishedEvent()); + return jdbcResultSetStreamer.streamOf(psWrapper, asPublishedEvent()); } catch (final SQLException e) { throw new JdbcRepositoryException(format("Failed to find events since event_number %d", eventNumber), e); } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactory.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactory.java new file mode 100644 index 000000000..49a27cc63 --- /dev/null +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactory.java @@ -0,0 +1,23 @@ +package uk.gov.justice.services.eventsourcing.repository.jdbc.event; + +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; + +import javax.inject.Inject; +import javax.sql.DataSource; + +public class PublishedEventFinderFactory { + + @Inject + private JdbcResultSetStreamer jdbcResultSetStreamer; + + @Inject + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; + + public PublishedEventFinder create(final DataSource dataSource) { + return new PublishedEventFinder( + jdbcResultSetStreamer, + preparedStatementWrapperFactory, + dataSource); + } +} diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepository.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserter.java similarity index 98% rename from event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepository.java rename to event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserter.java index 50186e6e3..f70c919e1 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepository.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserter.java @@ -6,7 +6,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; -public class PublishedEventJdbcRepository { +public class PublishedEventInserter { private static final String TRUNCATE_LINKED_EVENT = "TRUNCATE published_event"; private static final String TRUNCATE_PREPUBLISH_QUEUE = "TRUNCATE pre_publish_queue"; diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepository.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepository.java index 298f1ec25..1eee5b37f 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepository.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepository.java @@ -7,10 +7,10 @@ import uk.gov.justice.services.common.util.UtcClock; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidStreamIdException; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.OptimisticLockingRetryException; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.ResultSet; import java.sql.SQLException; @@ -20,8 +20,6 @@ import javax.sql.DataSource; -import org.slf4j.Logger; - public class EventStreamJdbcRepository { private static final String SQL_FIND_BY_POSITION = "SELECT * FROM event_stream WHERE position_in_stream>=? ORDER BY position_in_stream ASC"; @@ -41,24 +39,19 @@ public class EventStreamJdbcRepository { private static final String COL_DATE_CREATED = "date_created"; private static final String EVENT_STREAM_EXCEPTION_MESSAGE = "Exception while deleting stream %s"; - private final Logger logger; - private final JdbcRepositoryHelper eventStreamJdbcRepositoryHelper; - private final JdbcDataSourceProvider jdbcDataSourceProvider; + private final JdbcResultSetStreamer jdbcResultSetStreamer; private final UtcClock clock; - private final String jndiDatasource; - - private DataSource dataSource; + private final PreparedStatementWrapperFactory preparedStatementWrapperFactory; + private final DataSource dataSource; - public EventStreamJdbcRepository(final JdbcRepositoryHelper eventStreamJdbcRepositoryHelper, - final JdbcDataSourceProvider jdbcDataSourceProvider, - final UtcClock clock, - final String jndiDatasource, - final Logger logger) { + public EventStreamJdbcRepository(final JdbcResultSetStreamer jdbcResultSetStreamer, + final PreparedStatementWrapperFactory preparedStatementWrapperFactory, + final DataSource dataSource, + final UtcClock clock) { - this.eventStreamJdbcRepositoryHelper = eventStreamJdbcRepositoryHelper; - this.jdbcDataSourceProvider = jdbcDataSourceProvider; - this.jndiDatasource = jndiDatasource; - this.logger = logger; + this.jdbcResultSetStreamer = jdbcResultSetStreamer; + this.preparedStatementWrapperFactory = preparedStatementWrapperFactory; + this.dataSource = dataSource; this.clock = clock; } @@ -68,7 +61,7 @@ public void insert(final UUID streamId) { public void insert(final UUID streamId, final boolean active) { if (!isExistingStream(streamId)) { - try (final PreparedStatementWrapper ps = eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_INSERT_EVENT_STREAM)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM)) { ps.setObject(1, streamId); ps.setTimestamp(2, toSqlTimestamp(clock.now())); ps.setBoolean(3, active); @@ -84,7 +77,7 @@ public void insert(final UUID streamId, final boolean active) { } public void markActive(final UUID streamId, final boolean active) { - try (final PreparedStatementWrapper ps = eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_UPDATE_EVENT_STREAM_ACTIVE)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_UPDATE_EVENT_STREAM_ACTIVE)) { ps.setBoolean(1, active); ps.setObject(2, streamId); @@ -95,7 +88,7 @@ public void markActive(final UUID streamId, final boolean active) { } public void delete(final UUID streamId) { - try (final PreparedStatementWrapper ps = eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_DELETE_EVENT_STREAM)) { + try (final PreparedStatementWrapper ps = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_DELETE_EVENT_STREAM)) { ps.setObject(1, streamId); ps.executeUpdate(); @@ -106,7 +99,7 @@ public void delete(final UUID streamId) { public Stream findAll() { try { - return eventStreamJdbcRepositoryHelper.streamOf(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_ALL), + return jdbcResultSetStreamer.streamOf(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_ALL), entityFromFunction()); } catch (SQLException e) { throw new JdbcRepositoryException(READING_STREAM_EXCEPTION, e); @@ -116,7 +109,7 @@ public Stream findAll() { public Stream findActive() { try { - return eventStreamJdbcRepositoryHelper.streamOf(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_ALL_ACTIVE), + return jdbcResultSetStreamer.streamOf(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_ALL_ACTIVE), entityFromFunction()); } catch (SQLException e) { throw new JdbcRepositoryException(READING_STREAM_EXCEPTION, e); @@ -125,25 +118,17 @@ public Stream findActive() { public Stream findEventStreamWithPositionFrom(final long position) { try { - final PreparedStatementWrapper preparedStatementWrapper = eventStreamJdbcRepositoryHelper - .preparedStatementWrapperOf(getDataSource(), SQL_FIND_BY_POSITION); + final PreparedStatementWrapper preparedStatementWrapper = preparedStatementWrapperFactory + .preparedStatementWrapperOf(dataSource, SQL_FIND_BY_POSITION); preparedStatementWrapper.setLong(1, position); - return eventStreamJdbcRepositoryHelper.streamOf(preparedStatementWrapper, entityFromFunction()); + return jdbcResultSetStreamer.streamOf(preparedStatementWrapper, entityFromFunction()); } catch (SQLException e) { throw new JdbcRepositoryException(READING_STREAM_EXCEPTION, e); } } - public DataSource getDataSource() { - if (null == dataSource) { - dataSource = jdbcDataSourceProvider.getDataSource(jndiDatasource); - } - - return dataSource; - } - private boolean isExistingStream(final UUID streamId) { - try (final PreparedStatementWrapper psquery = eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_EVENT_STREAM)) { + try (final PreparedStatementWrapper psquery = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)) { psquery.setObject(1, streamId); return psquery.executeQuery().next(); } catch (final SQLException e) { @@ -152,7 +137,7 @@ private boolean isExistingStream(final UUID streamId) { } public long getPosition(final UUID streamId) { - try (final PreparedStatementWrapper psquery = eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(getDataSource(), SQL_FIND_POSITION_BY_STREAM)) { + try (final PreparedStatementWrapper psquery = preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_POSITION_BY_STREAM)) { psquery.setObject(1, streamId); ResultSet resultSet = psquery.executeQuery(); if (resultSet.next()) { diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactory.java b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactory.java index 119aa4a5b..c2e50db98 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactory.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/main/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactory.java @@ -1,32 +1,31 @@ package uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream; -import static org.slf4j.LoggerFactory.getLogger; - import uk.gov.justice.services.common.util.UtcClock; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.sql.DataSource; @ApplicationScoped public class EventStreamJdbcRepositoryFactory { @Inject - JdbcRepositoryHelper eventStreamJdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; @Inject - JdbcDataSourceProvider jdbcDataSourceProvider; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Inject - UtcClock clock; + private UtcClock clock; + + public EventStreamJdbcRepository eventStreamJdbcRepository(final DataSource dataSource) { - public EventStreamJdbcRepository eventStreamJdbcRepository(final String jndiDatasource) { return new EventStreamJdbcRepository( - eventStreamJdbcRepositoryHelper, - jdbcDataSourceProvider, - clock, - jndiDatasource, - getLogger(EventStreamJdbcRepository.class)); + jdbcResultSetStreamer, + preparedStatementWrapperFactory, + dataSource, + clock); } } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepositoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepositoryTest.java index f37c8a483..f54a8edfc 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepositoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/JdbcBasedEventRepositoryTest.java @@ -37,8 +37,6 @@ import java.util.UUID; import java.util.stream.Stream; -import javax.sql.DataSource; - import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -414,14 +412,11 @@ public void shouldStoreEventStream() { public void shouldUseThePublishedEventFinderToFindEventsToCatchup() throws Exception { final long eventNumber = 23L; - final Stream publishedEventStream = of(mock(PublishedEvent.class)); - final DataSource dataSource = mock(DataSource.class); - when(eventStreamJdbcRepository.getDataSource()).thenReturn(dataSource); - when(publishedEventFinder.findEventsSince(eventNumber, dataSource)).thenReturn(publishedEventStream); + when(publishedEventFinder.findEventsSince(eventNumber)).thenReturn(publishedEventStream); - assertThat(publishedEventFinder.findEventsSince(eventNumber, dataSource), is(publishedEventStream)); + assertThat(publishedEventFinder.findEventsSince(eventNumber), is(publishedEventStream)); } private EventStream buildEventStreamFor(final UUID streamId, final Long sequence) { @@ -436,11 +431,9 @@ private Event eventOf(final UUID streamId) { public void shouldFindEventsSince() throws Exception { final Long eventNumber = 348374L; - final DataSource dataSource = mock(DataSource.class); final Stream publishedEventStream = of(mock(PublishedEvent.class)); - when(eventStreamJdbcRepository.getDataSource()).thenReturn(dataSource); - when(publishedEventFinder.findEventsSince(eventNumber, dataSource)).thenReturn(publishedEventStream); + when(publishedEventFinder.findEventsSince(eventNumber)).thenReturn(publishedEventStream); assertThat(jdbcBasedEventRepository.findEventsSince(eventNumber), is(publishedEventStream)); } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactoryTest.java index 038ddd9a4..91d028e25 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryFactoryTest.java @@ -3,11 +3,12 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.getValueOfField; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventInsertionStrategy; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import javax.sql.DataSource; @@ -25,38 +26,27 @@ public class EventJdbcRepositoryFactoryTest { private EventInsertionStrategy eventInsertionStrategy; @Mock - private JdbcRepositoryHelper jdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; @Mock - private JdbcDataSourceProvider jdbcDataSourceProvider; - - @Mock - private DataSource datasource; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @InjectMocks private EventJdbcRepositoryFactory eventJdbcRepositoryFactory; @Test public void shouldProduceEventJdbcRepository() throws Exception { - final String jndiDatasource = "java:/app/example/DS.frameworkeventstore"; - final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource); - - assertThat(eventJdbcRepository, is(notNullValue())); + final DataSource dataSource = mock(DataSource.class); - final EventInsertionStrategy eventInsertionStrategyField = getValueOfField(eventJdbcRepository, "eventInsertionStrategy", EventInsertionStrategy.class); - assertThat(eventInsertionStrategyField, is(eventInsertionStrategy)); + final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); - final JdbcRepositoryHelper jdbcRepositoryHelperField = getValueOfField(eventJdbcRepository, "jdbcRepositoryHelper", JdbcRepositoryHelper.class); - assertThat(jdbcRepositoryHelperField, is(jdbcRepositoryHelper)); - - final JdbcDataSourceProvider jdbcDataSourceProviderField = getValueOfField(eventJdbcRepository, "jdbcDataSourceProvider", JdbcDataSourceProvider.class); - assertThat(jdbcDataSourceProviderField, is(jdbcDataSourceProvider)); - - final String jndiDatasourceField = getValueOfField(eventJdbcRepository, "jndiDatasource", String.class); - assertThat(jndiDatasourceField, is(jndiDatasource)); + assertThat(eventJdbcRepository, is(notNullValue())); - final Logger loggerField = getValueOfField(eventJdbcRepository, "logger", Logger.class); - assertThat(loggerField, is(notNullValue())); + assertThat(getValueOfField(eventJdbcRepository, "eventInsertionStrategy", EventInsertionStrategy.class), is(eventInsertionStrategy)); + assertThat(getValueOfField(eventJdbcRepository, "jdbcResultSetStreamer", JdbcResultSetStreamer.class), is(jdbcResultSetStreamer)); + assertThat(getValueOfField(eventJdbcRepository, "preparedStatementWrapperFactory", PreparedStatementWrapperFactory.class), is(preparedStatementWrapperFactory)); + assertThat(getValueOfField(eventJdbcRepository, "dataSource", DataSource.class), is(dataSource)); + assertThat(getValueOfField(eventJdbcRepository, "logger", Logger.class), is(notNullValue())); } } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryIT.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryIT.java index d409b1caa..77a0a4918 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryIT.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryIT.java @@ -13,8 +13,8 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.AnsiSQLEventLogInsertionStrategy; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidPositionException; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; -import uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.TestEventStoreDataSourceFactory; @@ -42,17 +42,15 @@ public class EventJdbcRepositoryIT { @Before public void initialize() throws Exception { + + dataSource = new TestEventStoreDataSourceFactory().createDataSource("frameworkeventstore"); jdbcRepository = new EventJdbcRepository( new AnsiSQLEventLogInsertionStrategy(), - new JdbcRepositoryHelper(), - null, - "tests", + new JdbcResultSetStreamer(), + new PreparedStatementWrapperFactory(), + dataSource, mock(Logger.class)); - dataSource = new TestEventStoreDataSourceFactory() - .createDataSource("frameworkeventstore"); - ReflectionUtil.setField(jdbcRepository, "dataSource", dataSource); - new DatabaseCleaner().cleanEventStoreTables(FRAMEWORK_CONTEXT_NAME); } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryTest.java index 54b67627a..5e6984536 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/EventJdbcRepositoryTest.java @@ -12,18 +12,17 @@ import static uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository.SQL_FIND_BY_STREAM_ID_AND_POSITION_BY_PAGE; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventInsertionStrategy; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.SQLException; import java.util.UUID; import javax.sql.DataSource; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; @@ -35,33 +34,27 @@ public class EventJdbcRepositoryTest { private EventInsertionStrategy eventInsertionStrategy; @Mock - private JdbcRepositoryHelper jdbcRepositoryHelper; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Mock - private JdbcDataSourceProvider jdbcDataSourceProvider; + private DataSource dataSource; @Mock private Logger logger; - private String jndiDatasource; + @InjectMocks private EventJdbcRepository eventJdbcRepository; - @Before - public void setup() throws Exception { - eventJdbcRepository = new EventJdbcRepository(eventInsertionStrategy, jdbcRepositoryHelper, jdbcDataSourceProvider, jndiDatasource, logger); - } @Test public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInInsert() throws Exception { final UUID streamId = randomUUID(); - final DataSource dataSource = mock(DataSource.class); final SQLException sqlException = new SQLException(); final String statement = "STATEMENT"; final Event event = mock(Event.class); - when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); when(eventInsertionStrategy.insertStatement()).thenReturn(statement); - when(jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, statement)).thenThrow(sqlException); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, statement)).thenThrow(sqlException); when(event.getSequenceId()).thenReturn(5L); when(event.getStreamId()).thenReturn(streamId); @@ -77,11 +70,9 @@ public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInInsert() throws Ex @Test public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInFindByStreamIdOrderByPositionAsc() throws Exception { final UUID streamId = randomUUID(); - final DataSource dataSource = mock(DataSource.class); final SQLException sqlException = new SQLException(); - when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); - when(jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID)).thenThrow(sqlException); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID)).thenThrow(sqlException); try { eventJdbcRepository.findByStreamIdOrderByPositionAsc(streamId); @@ -96,11 +87,9 @@ public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInFindByStreamIdOrde public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInFindByStreamIdFromPositionOrderByPositionAsc() throws Exception { final UUID streamId = randomUUID(); final long position = 2L; - final DataSource dataSource = mock(DataSource.class); final SQLException sqlException = new SQLException(); - when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); - when(jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION)).thenThrow(sqlException); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION)).thenThrow(sqlException); try { eventJdbcRepository.findByStreamIdFromPositionOrderByPositionAsc(streamId, position); @@ -116,11 +105,9 @@ public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInFindByStreamIdFrom final UUID streamId = randomUUID(); final long position = 2L; final int pageSize = 10; - final DataSource dataSource = mock(DataSource.class); final SQLException sqlException = new SQLException(); - when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); - when(jdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION_BY_PAGE)).thenThrow(sqlException); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_BY_STREAM_ID_AND_POSITION_BY_PAGE)).thenThrow(sqlException); try { eventJdbcRepository.findByStreamIdFromPositionOrderByPositionAsc(streamId, position, pageSize); @@ -130,4 +117,4 @@ public void shouldLogAndThrowExceptionIfSqlExceptionIsThrownInFindByStreamIdFrom verify(logger).warn("Failed to read stream {}", streamId, sqlException); } } -} \ No newline at end of file +} diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactoryTest.java new file mode 100644 index 000000000..1d79853cf --- /dev/null +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderFactoryTest.java @@ -0,0 +1,42 @@ +package uk.gov.justice.services.eventsourcing.repository.jdbc.event; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.getValueOfField; + +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class PublishedEventFinderFactoryTest { + + @Mock + private JdbcResultSetStreamer jdbcResultSetStreamer; + + @Mock + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; + + @InjectMocks + private PublishedEventFinderFactory publishedEventFinderFactory; + + @Test + public void shouldCreateAPublishedEventFinder() throws Exception { + + final DataSource dataSource = mock(DataSource.class); + + final PublishedEventFinder publishedEventFinder = publishedEventFinderFactory.create(dataSource); + + assertThat(getValueOfField(publishedEventFinder, "jdbcResultSetStreamer", JdbcResultSetStreamer.class), is(jdbcResultSetStreamer)); + assertThat(getValueOfField(publishedEventFinder, "preparedStatementWrapperFactory", PreparedStatementWrapperFactory.class), is(preparedStatementWrapperFactory)); + assertThat(getValueOfField(publishedEventFinder, "dataSource", DataSource.class), is(dataSource)); + } +} diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderIT.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderIT.java index 4391c7508..9c8f5ccf6 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderIT.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventFinderIT.java @@ -5,7 +5,8 @@ import static org.junit.Assert.assertThat; import static uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventBuilder.publishedEventBuilder; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.TestEventStoreDataSourceFactory; @@ -18,28 +19,25 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Spy; -import org.mockito.runners.MockitoJUnitRunner; -@RunWith(MockitoJUnitRunner.class) public class PublishedEventFinderIT { - private PublishedEventJdbcRepository publishedEventJdbcRepository = new PublishedEventJdbcRepository(); + private PublishedEventInserter publishedEventInserter = new PublishedEventInserter(); private DataSource dataSource; - @Spy - @SuppressWarnings("unused") - private JdbcRepositoryHelper jdbcRepositoryHelper = new JdbcRepositoryHelper(); - - @InjectMocks private PublishedEventFinder publishedEventFinder; @Before public void initialize() throws Exception { dataSource = new TestEventStoreDataSourceFactory().createDataSource("frameworkeventstore"); new DatabaseCleaner().cleanEventStoreTables("framework"); + + final JdbcResultSetStreamer jdbcResultSetStreamer = new JdbcResultSetStreamer(); + final PreparedStatementWrapperFactory preparedStatementWrapperFactory = new PreparedStatementWrapperFactory(); + publishedEventFinder = new PublishedEventFinder( + jdbcResultSetStreamer, + preparedStatementWrapperFactory, + dataSource); } @After @@ -58,14 +56,14 @@ public void shouldGetEventsSinceEventNumber() throws Exception { final Connection connection = dataSource.getConnection(); - publishedEventJdbcRepository.insertPublishedEvent(event_1, connection); - publishedEventJdbcRepository.insertPublishedEvent(event_2, connection); - publishedEventJdbcRepository.insertPublishedEvent(event_3, connection); - publishedEventJdbcRepository.insertPublishedEvent(event_4, connection); - publishedEventJdbcRepository.insertPublishedEvent(event_5, connection); + publishedEventInserter.insertPublishedEvent(event_1, connection); + publishedEventInserter.insertPublishedEvent(event_2, connection); + publishedEventInserter.insertPublishedEvent(event_3, connection); + publishedEventInserter.insertPublishedEvent(event_4, connection); + publishedEventInserter.insertPublishedEvent(event_5, connection); - final List publishedEvents = publishedEventFinder.findEventsSince(3, dataSource) + final List publishedEvents = publishedEventFinder.findEventsSince(3) .collect(toList()); assertThat(publishedEvents.size(), is(2)); diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepositoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserterTest.java similarity index 91% rename from event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepositoryTest.java rename to event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserterTest.java index d7ed3c6cc..5fc48d417 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventJdbcRepositoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/event/PublishedEventInserterTest.java @@ -24,12 +24,12 @@ @RunWith(MockitoJUnitRunner.class) -public class PublishedEventJdbcRepositoryTest { +public class PublishedEventInserterTest { private final DataSource eventStoreDataSource = new FrameworkTestDataSourceFactory().createEventStoreDataSource(); @InjectMocks - private PublishedEventJdbcRepository publishedEventJdbcRepository; + private PublishedEventInserter publishedEventInserter; @Before public void initDatabase() throws Exception { @@ -52,7 +52,7 @@ public void shouldInsertPublishedEvent() throws Exception { ); try (final Connection connection = eventStoreDataSource.getConnection()) { - publishedEventJdbcRepository.insertPublishedEvent(publishedEvent, connection); + publishedEventInserter.insertPublishedEvent(publishedEvent, connection); } try (final Connection connection = eventStoreDataSource.getConnection(); @@ -92,10 +92,10 @@ public void shouldTrucatePublishedEventTable() throws Exception { ); try (final Connection connection = eventStoreDataSource.getConnection()) { - publishedEventJdbcRepository.insertPublishedEvent(publishedEvent, connection); + publishedEventInserter.insertPublishedEvent(publishedEvent, connection); } try (final Connection connection = eventStoreDataSource.getConnection()) { - publishedEventJdbcRepository.truncate(connection); + publishedEventInserter.truncate(connection); } try (final Connection connection = eventStoreDataSource.getConnection(); diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactoryTest.java index f4c4941ed..2ee41d6fa 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryFactoryTest.java @@ -3,58 +3,48 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.getValueOfField; import uk.gov.justice.services.common.util.UtcClock; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import javax.sql.DataSource; -import org.hamcrest.CoreMatchers; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import org.slf4j.Logger; @RunWith(MockitoJUnitRunner.class) public class EventStreamJdbcRepositoryFactoryTest { @Mock - private JdbcRepositoryHelper eventStreamJdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; @Mock - private JdbcDataSourceProvider jdbcDataSourceProvider; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Mock private UtcClock clock; - @Mock - private DataSource datasource; - @InjectMocks private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory; @Test public void shouldProduceEventStreamJdbcRepository() throws Exception { - final String jndiDatasource = "java:/app/example/DS.eventstore"; - - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); - - assertThat(eventStreamJdbcRepository, is(CoreMatchers.notNullValue())); - final JdbcRepositoryHelper eventStreamJdbcRepositoryHelperField = getValueOfField(eventStreamJdbcRepository, "eventStreamJdbcRepositoryHelper", JdbcRepositoryHelper.class); - assertThat(eventStreamJdbcRepositoryHelperField, is(eventStreamJdbcRepositoryHelper)); + final DataSource dataSource = mock(DataSource.class); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); - final JdbcDataSourceProvider jdbcDataSourceProviderField = getValueOfField(eventStreamJdbcRepository, "jdbcDataSourceProvider", JdbcDataSourceProvider.class); - assertThat(jdbcDataSourceProviderField, is(jdbcDataSourceProvider)); + assertThat(eventStreamJdbcRepository, is(notNullValue())); - final String jndiDatasourceField = getValueOfField(eventStreamJdbcRepository, "jndiDatasource", String.class); - assertThat(jndiDatasourceField, is(jndiDatasource)); + assertThat(getValueOfField(eventStreamJdbcRepository, "jdbcResultSetStreamer", JdbcResultSetStreamer.class), is(jdbcResultSetStreamer)); + assertThat(getValueOfField(eventStreamJdbcRepository, "preparedStatementWrapperFactory", PreparedStatementWrapperFactory.class), is(preparedStatementWrapperFactory)); - final Logger loggerField = getValueOfField(eventStreamJdbcRepository, "logger", Logger.class); - assertThat(loggerField, is(notNullValue())); + assertThat(getValueOfField(eventStreamJdbcRepository, "dataSource", DataSource.class), is(dataSource)); + assertThat(getValueOfField(eventStreamJdbcRepository, "clock", UtcClock.class), is(clock)); } } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryIT.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryIT.java index d6f77637a..deee3f745 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryIT.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryIT.java @@ -8,12 +8,11 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; import uk.gov.justice.services.common.util.UtcClock; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidPositionException; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; -import uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.TestEventStoreDataSourceFactory; @@ -27,7 +26,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; public class EventStreamJdbcRepositoryIT { @@ -38,16 +36,14 @@ public class EventStreamJdbcRepositoryIT { @Before public void initialize() throws Exception { - jdbcRepository = new EventStreamJdbcRepository( - new JdbcRepositoryHelper(), - null, - new UtcClock(), - "tests", - mock(Logger.class)); - dataSource = new TestEventStoreDataSourceFactory() .createDataSource("frameworkeventstore"); - ReflectionUtil.setField(jdbcRepository, "dataSource", dataSource); + + jdbcRepository = new EventStreamJdbcRepository( + new JdbcResultSetStreamer(), + new PreparedStatementWrapperFactory(), + dataSource, + new UtcClock()); new DatabaseCleaner().cleanEventStoreTables(FRAMEWORK_CONTEXT_NAME); } diff --git a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryTest.java b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryTest.java index 26768e73a..0502bbcfd 100644 --- a/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryTest.java +++ b/event-sourcing/event-repository/event-repository-jdbc/src/test/java/uk/gov/justice/services/eventsourcing/repository/jdbc/eventstream/EventStreamJdbcRepositoryTest.java @@ -7,14 +7,12 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.setField; import uk.gov.justice.services.common.converter.ZonedDateTimes; import uk.gov.justice.services.common.util.UtcClock; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.OptimisticLockingRetryException; -import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import java.sql.SQLException; import java.time.ZonedDateTime; @@ -22,14 +20,12 @@ import javax.sql.DataSource; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import org.slf4j.Logger; @RunWith(MockitoJUnitRunner.class) public class EventStreamJdbcRepositoryTest { @@ -38,19 +34,11 @@ public class EventStreamJdbcRepositoryTest { private static final String SQL_INSERT_EVENT_STREAM = "INSERT INTO event_stream (stream_id, date_created, active) values (?, ?, ?) ON CONFLICT DO NOTHING"; @Mock - private Logger logger; - - @Mock - private JdbcRepositoryHelper eventStreamJdbcRepositoryHelper; - - @Mock - private JdbcDataSourceProvider jdbcDataSourceProvider; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; @Mock private UtcClock clock; - private final String jndiDatasource = "jndiDatasource"; - @Mock private DataSource dataSource; @@ -60,19 +48,13 @@ public class EventStreamJdbcRepositoryTest { @InjectMocks private EventStreamJdbcRepository repository; - @Before - public void setup() { - setField(repository, "jndiDatasource", jndiDatasource); - when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); - } - @Test public void insertActiveStreamSuccessfully() throws SQLException { - when(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); when(queryPreparedStatementWrapper.executeQuery().next()).thenReturn(false); - when(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM)).thenReturn(insertPreparedStatementWrapper); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM)).thenReturn(insertPreparedStatementWrapper); final ZonedDateTime streamCreationTimestamp = ZonedDateTime.now(); when(clock.now()).thenReturn(streamCreationTimestamp); when(insertPreparedStatementWrapper.executeUpdate()).thenReturn(1); @@ -80,10 +62,9 @@ public void insertActiveStreamSuccessfully() throws SQLException { final UUID streamId = randomUUID(); repository.insert(streamId); - verify(jdbcDataSourceProvider).getDataSource(jndiDatasource); - verify(eventStreamJdbcRepositoryHelper).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); + verify(preparedStatementWrapperFactory).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); verify(queryPreparedStatementWrapper).setObject(1, streamId); - verify(eventStreamJdbcRepositoryHelper).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); + verify(preparedStatementWrapperFactory).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); verify(insertPreparedStatementWrapper).setObject(1, streamId); verify(insertPreparedStatementWrapper).setTimestamp(2, ZonedDateTimes.toSqlTimestamp(streamCreationTimestamp)); verify(insertPreparedStatementWrapper).setBoolean(3, true); @@ -93,11 +74,11 @@ public void insertActiveStreamSuccessfully() throws SQLException { @Test public void insertExistingStreamAndRecordOptimisticLockingException() throws SQLException { - when(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); // indicates stream doesn't exist when(queryPreparedStatementWrapper.executeQuery().next()).thenReturn(false); - when(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM)).thenReturn(insertPreparedStatementWrapper); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM)).thenReturn(insertPreparedStatementWrapper); final ZonedDateTime streamCreationTimestamp = ZonedDateTime.now(); when(clock.now()).thenReturn(streamCreationTimestamp); // not able to insert stream as another transaction inserted a stream with the same identifier after the check above @@ -108,10 +89,9 @@ public void insertExistingStreamAndRecordOptimisticLockingException() throws SQL repository.insert(streamId); fail("Exception should be thrown when 0 records are updated"); } catch (OptimisticLockingRetryException e) { - verify(jdbcDataSourceProvider).getDataSource(jndiDatasource); - verify(eventStreamJdbcRepositoryHelper).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); + verify(preparedStatementWrapperFactory).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); verify(queryPreparedStatementWrapper).setObject(1, streamId); - verify(eventStreamJdbcRepositoryHelper).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); + verify(preparedStatementWrapperFactory).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); verify(insertPreparedStatementWrapper).setObject(1, streamId); verify(insertPreparedStatementWrapper).setTimestamp(2, ZonedDateTimes.toSqlTimestamp(streamCreationTimestamp)); verify(insertPreparedStatementWrapper).setBoolean(3, true); @@ -122,20 +102,18 @@ public void insertExistingStreamAndRecordOptimisticLockingException() throws SQL @Test public void insertExistingStreamAndReturnWithoutException() throws SQLException { - when(eventStreamJdbcRepositoryHelper.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); + when(preparedStatementWrapperFactory.preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM)).thenReturn(queryPreparedStatementWrapper); // indicates stream already exists when(queryPreparedStatementWrapper.executeQuery().next()).thenReturn(true); - final UUID streamId = randomUUID(); repository.insert(streamId); - verify(jdbcDataSourceProvider).getDataSource(jndiDatasource); - verify(eventStreamJdbcRepositoryHelper).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); + verify(preparedStatementWrapperFactory).preparedStatementWrapperOf(dataSource, SQL_FIND_EVENT_STREAM); verify(queryPreparedStatementWrapper).setObject(1, streamId); - verify(eventStreamJdbcRepositoryHelper, never()).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); + verify(preparedStatementWrapperFactory, never()).preparedStatementWrapperOf(dataSource, SQL_INSERT_EVENT_STREAM); verify(insertPreparedStatementWrapper, never()).setObject(1, streamId); verify(insertPreparedStatementWrapper, never()).setTimestamp(eq(2), any()); verify(insertPreparedStatementWrapper, never()).setBoolean(3, true); verify(insertPreparedStatementWrapper, never()).executeUpdate(); } -} \ No newline at end of file +} diff --git a/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventStreamPageIT.java b/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventStreamPageIT.java index 307ec753e..cb57c5f6d 100644 --- a/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventStreamPageIT.java +++ b/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventStreamPageIT.java @@ -39,7 +39,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.PostgresSQLEventLogInsertionStrategy; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.source.api.resource.EventSourceApiApplication; @@ -61,9 +61,9 @@ import uk.gov.justice.services.eventsourcing.source.core.JdbcEventSourceFactory; import uk.gov.justice.services.eventsourcing.source.core.PublishingEventAppenderFactory; import uk.gov.justice.services.eventsourcing.source.core.SystemEventService; -import uk.gov.justice.services.jdbc.persistence.DefaultJdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.messaging.DefaultJsonObjectEnvelopeConverter; import uk.gov.justice.services.messaging.JsonObjectEnvelopeConverter; import uk.gov.justice.services.messaging.jms.DefaultEnvelopeConverter; @@ -71,6 +71,7 @@ import uk.gov.justice.services.messaging.jms.JmsEnvelopeSender; import uk.gov.justice.services.messaging.logging.DefaultTraceLogger; import uk.gov.justice.services.messaging.logging.TraceLogger; +import uk.gov.justice.services.test.utils.persistence.OpenEjbEventStoreDataSourceProvider; import uk.gov.justice.subscription.ParserProducer; import uk.gov.justice.subscription.SubscriptionHelper; import uk.gov.justice.subscription.YamlFileFinder; @@ -83,11 +84,9 @@ import java.util.Properties; import java.util.UUID; -import javax.annotation.Resource; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; -import javax.naming.InitialContext; import javax.sql.DataSource; import com.jayway.jsonpath.JsonPath; @@ -124,8 +123,9 @@ public class EventStreamPageIT { private static int port = -1; private CloseableHttpClient httpClient; - @Resource(name = "openejb/Resource/frameworkeventstore") - private DataSource dataSource; + + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; @Inject private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory; @@ -140,10 +140,9 @@ public static void beforeClass() { @Before public void setup() throws Exception { httpClient = HttpClients.createDefault(); - final InitialContext initialContext = new InitialContext(); - initialContext.bind("java:/app/EventStreamPageIT/DS.frameworkeventstore", dataSource); initEventDatabase(); - eventsRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository("java:/app/EventStreamPageIT/DS.frameworkeventstore"); + final DataSource dataSource = jdbcDataSourceProvider.getDataSource("don't care"); + eventsRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); } @Configuration @@ -181,10 +180,9 @@ public EventInsertionStrategy eventLogInsertionStrategy() { PositionFactory.class, UrlLinkFactory.class, PositionValueFactory.class, - JdbcRepositoryHelper.class, + JdbcResultSetStreamer.class, + PreparedStatementWrapperFactory.class, UtcClock.class, - JdbcDataSourceProvider.class, - DefaultJdbcDataSourceProvider.class, JsonValidationLoggerHelper.class, BadRequestExceptionMapper.class, DefaultJsonValidationLoggerHelper.class, @@ -216,6 +214,7 @@ public EventInsertionStrategy eventLogInsertionStrategy() { YamlSchemaLoader.class, JmsEnvelopeSender.class, DefaultEnvelopeConverter.class, + OpenEjbEventStoreDataSourceProvider.class, InitialContextProducer.class, @@ -227,7 +226,7 @@ public EventInsertionStrategy eventLogInsertionStrategy() { DefaultEventSourceDefinitionFactory.class, SubscriptionHelper.class, - PublishedEventFinder.class + PublishedEventFinderFactory.class }) public WebApp war() { @@ -701,7 +700,7 @@ private HttpResponse feedOf(final String url, final UUID userId) throws IOExcept private void initEventDatabase() throws Exception { Liquibase eventStoreLiquibase = new Liquibase(LIQUIBASE_EVENT_STORE_CHANGELOG_XML, - new ClassLoaderResourceAccessor(), new JdbcConnection(dataSource.getConnection())); + new ClassLoaderResourceAccessor(), new JdbcConnection(jdbcDataSourceProvider.getDataSource("don't care").getConnection())); eventStoreLiquibase.dropAll(); eventStoreLiquibase.update(""); } diff --git a/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventsPageIT.java b/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventsPageIT.java index f81c57909..9b9ff3ebc 100644 --- a/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventsPageIT.java +++ b/event-sourcing/event-source-api-integration-test/src/test/java/uk/gov/justice/services/eventsourcing/source/api/EventsPageIT.java @@ -42,7 +42,7 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.exception.InvalidPositionException; import uk.gov.justice.services.eventsourcing.source.api.resource.EventPageResource; @@ -64,9 +64,9 @@ import uk.gov.justice.services.eventsourcing.source.core.JdbcEventSourceFactory; import uk.gov.justice.services.eventsourcing.source.core.PublishingEventAppenderFactory; import uk.gov.justice.services.eventsourcing.source.core.SystemEventService; -import uk.gov.justice.services.jdbc.persistence.DefaultJdbcDataSourceProvider; import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.messaging.DefaultJsonObjectEnvelopeConverter; import uk.gov.justice.services.messaging.JsonEnvelope; import uk.gov.justice.services.messaging.JsonObjectEnvelopeConverter; @@ -76,6 +76,7 @@ import uk.gov.justice.services.messaging.jms.EnvelopeConverter; import uk.gov.justice.services.messaging.logging.DefaultTraceLogger; import uk.gov.justice.services.messaging.logging.TraceLogger; +import uk.gov.justice.services.test.utils.persistence.OpenEjbEventStoreDataSourceProvider; import uk.gov.justice.subscription.ParserProducer; import uk.gov.justice.subscription.SubscriptionHelper; import uk.gov.justice.subscription.YamlFileFinder; @@ -88,11 +89,9 @@ import java.util.Properties; import java.util.UUID; -import javax.annotation.Resource; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; -import javax.naming.InitialContext; import javax.sql.DataSource; import com.jayway.jsonpath.JsonPath; @@ -131,8 +130,8 @@ public class EventsPageIT { private CloseableHttpClient httpClient; - @Resource(name = "openejb/Resource/frameworkeventstore") - private DataSource dataSource; + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; @Inject private EventJdbcRepositoryFactory eventJdbcRepositoryFactory; @@ -147,10 +146,9 @@ public static void beforeClass() { @Before public void setup() throws Exception { httpClient = HttpClients.createDefault(); - InitialContext initialContext = new InitialContext(); - initialContext.bind("java:/app/EventsPageIT/DS.frameworkeventstore", dataSource); initEventDatabase(); - eventsRepository = eventJdbcRepositoryFactory.eventJdbcRepository("java:/app/EventsPageIT/DS.frameworkeventstore"); + final DataSource dataSource = jdbcDataSourceProvider.getDataSource("don't care"); + eventsRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); } @Configuration @@ -188,10 +186,9 @@ public EventInsertionStrategy eventLogInsertionStrategy() { UrlLinkFactory.class, PositionValueFactory.class, BadRequestExceptionMapper.class, - JdbcRepositoryHelper.class, + JdbcResultSetStreamer.class, + PreparedStatementWrapperFactory.class, UtcClock.class, - JdbcDataSourceProvider.class, - DefaultJdbcDataSourceProvider.class, DefaultJsonValidationLoggerHelper.class, EventSource.class, JdbcBasedEventSource.class, @@ -233,7 +230,8 @@ public EventInsertionStrategy eventLogInsertionStrategy() { DefaultEventSourceDefinitionFactory.class, SubscriptionHelper.class, - PublishedEventFinder.class + PublishedEventFinderFactory.class, + OpenEjbEventStoreDataSourceProvider.class }) public WebApp war() { return new WebApp() @@ -612,7 +610,7 @@ private HttpResponse feedOf(final String url, final UUID userId) throws IOExcept private void initEventDatabase() throws Exception { Liquibase eventStoreLiquibase = new Liquibase(LIQUIBASE_EVENT_STORE_CHANGELOG_XML, - new ClassLoaderResourceAccessor(), new JdbcConnection(dataSource.getConnection())); + new ClassLoaderResourceAccessor(), new JdbcConnection(jdbcDataSourceProvider.getDataSource("don't care").getConnection())); eventStoreLiquibase.dropAll(); eventStoreLiquibase.update(""); } @@ -643,6 +641,4 @@ private void assertHeadAndLastLinks(String value) { final String firstUrl = JsonPath.read(value, "$.pagingLinks.first"); assertThat(firstUrl, containsString(EVENT_STREAM_URL_PATH_PREFIX + "/1/FORWARD/" + PAGE_SIZE)); } - - } diff --git a/event-sourcing/event-source/pom.xml b/event-sourcing/event-source/pom.xml index d4f3bcaaa..27f1bf1af 100644 --- a/event-sourcing/event-source/pom.xml +++ b/event-sourcing/event-source/pom.xml @@ -50,7 +50,7 @@ uk.gov.justice.event-store - linked-event-processor + published-event-processor ${project.version} diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformation.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformation.java index a87ee116e..2d12fba8a 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformation.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformation.java @@ -1,6 +1,6 @@ package uk.gov.justice.services.eventsourcing.source.core; -import uk.gov.justice.services.eventsourcing.publishedevent.ActiveStreamsProcessor; +import uk.gov.justice.services.eventsourcing.publishedevent.ActiveStreamsRepublisher; import uk.gov.justice.services.eventsourcing.publishedevent.PublishedEventsProcessor; import uk.gov.justice.services.eventsourcing.source.core.exception.PublishedEventException; @@ -12,19 +12,18 @@ public class DefaultPublishedEventSourceTransformation implements PublishedEventSourceTransformation { @Inject - private ActiveStreamsProcessor activeStreamsProcessor; + private ActiveStreamsRepublisher activeStreamsRepublisher; @Inject private PublishedEventsProcessor publishedEventsProcessor; - @Override - public void truncate() throws PublishedEventException { + public void deleteAllPublishedEvents() throws PublishedEventException { publishedEventsProcessor.truncatePublishedEvents(); } @Override - public void populate() throws PublishedEventException { - activeStreamsProcessor.populatePublishedEvents(); + public void populatePublishedEvents() throws PublishedEventException { + activeStreamsRepublisher.populatePublishedEvents(); } } diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducer.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducer.java index ce988b921..fda6b3813 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducer.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducer.java @@ -4,6 +4,7 @@ import uk.gov.justice.services.cdi.QualifierAnnotationExtractor; import uk.gov.justice.services.eventsourcing.source.core.annotation.EventSourceName; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.domain.eventsource.Location; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; @@ -36,6 +37,9 @@ public class EventSourceProducer { @Inject private QualifierAnnotationExtractor qualifierAnnotationExtractor; + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; + /** * Backwards compatible support for Unnamed EventSource injection points. Uses the injected * container JNDI name to lookup the EventSource @@ -71,7 +75,9 @@ private EventSource createEventSourceFrom(final EventSourceDefinition eventSourc final Optional dataSourceOptional = location.getDataSource(); return dataSourceOptional - .map(dataSource -> jdbcEventSourceFactory.create(dataSource, eventSourceDefinition.getName())) + .map(dataSource -> jdbcEventSourceFactory.create( + jdbcDataSourceProvider.getDataSource(dataSource), + eventSourceDefinition.getName())) .orElseThrow(() -> new CreationException( format("No DataSource specified for EventSource '%s' specified in event-sources.yaml", eventSourceDefinition.getName()) )); diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducer.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducer.java index 774501906..0742ecc36 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducer.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducer.java @@ -5,14 +5,17 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; +import javax.sql.DataSource; @ApplicationScoped public class EventSourceTransformationProducer { @@ -33,16 +36,23 @@ public class EventSourceTransformationProducer { private EventSourceDefinitionRegistry eventSourceDefinitionRegistry; @Inject - private PublishedEventFinder publishedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; + + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; @Produces public EventSourceTransformation eventSourceTransformation() { + final EventSourceDefinition defaultEventSourceDefinition = eventSourceDefinitionRegistry.getDefaultEventSourceDefinition(); final String jndiDatasource = defaultEventSourceDefinition.getLocation().getDataSource().get(); - final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource); - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); + final DataSource dataSource = jdbcDataSourceProvider.getDataSource(jndiDatasource); + + final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); + final PublishedEventFinder publishedEventFinder = publishedEventFinderFactory.create(dataSource); final EventRepository eventRepository = eventRepositoryFactory.eventRepository( eventJdbcRepository, diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSource.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSource.java index 50c560dea..b2ef0fb03 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSource.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSource.java @@ -14,20 +14,20 @@ public class JdbcBasedEventSource implements EventSource { private final EventStreamManager eventStreamManager; private final EventRepository eventRepository; - private final String name; + private final String eventSourceName; public JdbcBasedEventSource( final EventStreamManager eventStreamManager, final EventRepository eventRepository, - final String name) { + final String eventSourceName) { this.eventStreamManager = eventStreamManager; this.eventRepository = eventRepository; - this.name = name; + this.eventSourceName = eventSourceName; } @Override public EventStream getStreamById(final UUID streamId) { - return new EnvelopeEventStream(streamId, name, eventStreamManager); + return new EnvelopeEventStream(streamId, eventSourceName, eventStreamManager); } @Override diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactory.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactory.java index b22c73d51..ab792c21d 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactory.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactory.java @@ -2,15 +2,16 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.sql.DataSource; @ApplicationScoped public class JdbcEventSourceFactory { @@ -28,15 +29,13 @@ public class JdbcEventSourceFactory { private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory; @Inject - private EventConverter eventConverter; + private PublishedEventFinderFactory publishedEventFinderFactory; - @Inject - private PublishedEventFinder publishedEventFinder; - - public JdbcBasedEventSource create(final String jndiDatasource, String eventSourceName) { + public JdbcBasedEventSource create(final DataSource dataSource, String eventSourceName) { - final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource); - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); + final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); + final PublishedEventFinder publishedEventFinder = publishedEventFinderFactory.create(dataSource); final EventRepository eventRepository = eventRepositoryFactory.eventRepository( eventJdbcRepository, diff --git a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactory.java b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactory.java index 6fbd63c81..17ceb092e 100644 --- a/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactory.java +++ b/event-sourcing/event-source/src/main/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactory.java @@ -6,11 +6,14 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.sql.DataSource; @ApplicationScoped public class JdbcPublishedEventSourceFactory { @@ -28,17 +31,23 @@ public class JdbcPublishedEventSourceFactory { private EventConverter eventConverter; @Inject - private PublishedEventFinder linkedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; + + @Inject + private JdbcDataSourceProvider jdbcDataSourceProvider; public JdbcBasedPublishedEventSource create(final String jndiDatasource) { - final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource); - final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource); + final DataSource dataSource = jdbcDataSourceProvider.getDataSource(jndiDatasource); + + final EventJdbcRepository eventJdbcRepository = eventJdbcRepositoryFactory.eventJdbcRepository(dataSource); + final EventStreamJdbcRepository eventStreamJdbcRepository = eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource); + final PublishedEventFinder publishedEventFinder = publishedEventFinderFactory.create(dataSource); final EventRepository eventRepository = eventRepositoryFactory.eventRepository( eventJdbcRepository, eventStreamJdbcRepository, - linkedEventFinder); + publishedEventFinder); return new JdbcBasedPublishedEventSource(eventRepository, eventConverter); } diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformationTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformationTest.java index 42260f767..02f329b7c 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformationTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/DefaultPublishedEventSourceTransformationTest.java @@ -2,7 +2,7 @@ import static org.mockito.Mockito.verify; -import uk.gov.justice.services.eventsourcing.publishedevent.ActiveStreamsProcessor; +import uk.gov.justice.services.eventsourcing.publishedevent.ActiveStreamsRepublisher; import uk.gov.justice.services.eventsourcing.publishedevent.PublishedEventsProcessor; import org.junit.Test; @@ -15,7 +15,7 @@ public class DefaultPublishedEventSourceTransformationTest { @Mock - private ActiveStreamsProcessor activeStreamsProcessor; + private ActiveStreamsRepublisher activeStreamsRepublisher; @Mock private PublishedEventsProcessor publishedEventsProcessor; @@ -26,7 +26,7 @@ public class DefaultPublishedEventSourceTransformationTest { @Test public void shouldTruncatePublishedEvents() throws Exception { - defaultPublishedEventSourceTransformation.truncate(); + defaultPublishedEventSourceTransformation.deleteAllPublishedEvents(); verify(publishedEventsProcessor).truncatePublishedEvents(); } @@ -34,8 +34,8 @@ public void shouldTruncatePublishedEvents() throws Exception { @Test public void shouldPopulatePublishedEvents() throws Exception { - defaultPublishedEventSourceTransformation.populate(); + defaultPublishedEventSourceTransformation.populatePublishedEvents(); - verify(activeStreamsProcessor).populatePublishedEvents(); + verify(activeStreamsRepublisher).populatePublishedEvents(); } } diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducerTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducerTest.java index 5d87da111..46d540cbe 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducerTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceProducerTest.java @@ -12,6 +12,7 @@ import uk.gov.justice.services.cdi.QualifierAnnotationExtractor; import uk.gov.justice.services.eventsourcing.source.core.annotation.EventSourceName; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.domain.eventsource.Location; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; @@ -20,6 +21,7 @@ import javax.enterprise.inject.CreationException; import javax.enterprise.inject.spi.InjectionPoint; +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,25 +41,32 @@ public class EventSourceProducerTest { @Mock private QualifierAnnotationExtractor qualifierAnnotationExtractor; + @Mock + private JdbcDataSourceProvider jdbcDataSourceProvider; + @InjectMocks private EventSourceProducer eventSourceProducer; @Test public void shouldCreateDefaultEventSourceDefinitionWhenEventSourceNameIsEmpty() throws Exception { + final String jndiDataSourceName = "jndiDataSourceName"; final EventSourceDefinition eventSourceDefinition = eventSourceDefinition() .withName("defaultEventSource") .withDefault(true) - .withLocation(new Location("", "", Optional.of("dataSource"))) + .withLocation(new Location("", "", Optional.of(jndiDataSourceName))) .build(); final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); + final DataSource dataSource = mock(DataSource.class); + when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(""); when(eventSourceDefinitionRegistry.getDefaultEventSourceDefinition()).thenReturn(eventSourceDefinition); - when(jdbcEventSourceFactory.create(eventSourceDefinition.getLocation().getDataSource().get(), eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); + when(jdbcEventSourceFactory.create(dataSource, eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); assertThat(eventSourceProducer.eventSource(), is(jdbcBasedEventSource)); } @@ -65,16 +74,19 @@ public void shouldCreateDefaultEventSourceDefinitionWhenEventSourceNameIsEmpty() @Test public void shouldCreateDefaultEventSourceWhenNoEventSourceNameQualifierSet() throws Exception { + final String jndiDataSourceName = "jndiDataSourceName"; final EventSourceDefinition eventSourceDefinition = eventSourceDefinition() .withName("defaultEventSource") .withDefault(true) - .withLocation(new Location("", "", Optional.of("dataSource"))) + .withLocation(new Location("", "", Optional.of(jndiDataSourceName))) .build(); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); + final DataSource dataSource = mock(DataSource.class); when(eventSourceDefinitionRegistry.getDefaultEventSourceDefinition()).thenReturn(eventSourceDefinition); - when(jdbcEventSourceFactory.create(eventSourceDefinition.getLocation().getDataSource().get(), eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); + when(jdbcEventSourceFactory.create(dataSource, eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); assertThat(eventSourceProducer.eventSource(), is(jdbcBasedEventSource)); } @@ -83,19 +95,21 @@ public void shouldCreateDefaultEventSourceWhenNoEventSourceNameQualifierSet() th public void shouldCreateAnEventSourceUsingTheEventSourceNameAnnotation() throws Exception { final String eventSourceName = "eventSourceName"; - final String dataSource = "my-data-source"; + final String jndiDataSourceName = "jndiDataSourceName"; final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); final EventSourceDefinition eventSourceDefinition = mock(EventSourceDefinition.class); final Location location = mock(Location.class); final JdbcBasedEventSource jdbcBasedEventSource = mock(JdbcBasedEventSource.class); + final DataSource dataSource = mock(DataSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(eventSourceName); when(eventSourceDefinitionRegistry.getEventSourceDefinitionFor(eventSourceName)).thenReturn(Optional.of(eventSourceDefinition)); when(eventSourceDefinition.getLocation()).thenReturn(location); - when(location.getDataSource()).thenReturn(of(dataSource)); + when(location.getDataSource()).thenReturn(of(jndiDataSourceName)); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); when(jdbcEventSourceFactory.create(dataSource, eventSourceDefinition.getName())).thenReturn(jdbcBasedEventSource); assertThat(eventSourceProducer.eventSource(injectionPoint), is(jdbcBasedEventSource)); @@ -105,13 +119,16 @@ public void shouldCreateAnEventSourceUsingTheEventSourceNameAnnotation() throws public void shouldFailIfNoEventSourceFoundInTheEventSourceRegistry() throws Exception { final String eventSourceName = "my-event-source"; + final String jndiDataSourceName = "jndiDataSourceName"; final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); + final DataSource dataSource = mock(DataSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(eventSourceName); when(eventSourceDefinitionRegistry.getEventSourceDefinitionFor(eventSourceName)).thenReturn(empty()); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); try { eventSourceProducer.eventSource(injectionPoint); @@ -127,25 +144,26 @@ public void shouldFailIfNoEventSourceFoundInTheEventSourceRegistry() throws Exce public void shouldFailIfNoDataSourceNameFoundInEventSourcesYaml() throws Exception { final String eventSourceName = "eventSourceName"; - final String dataSourceName = "my-data-source"; + final String jndiDataSourceName = "jndiDataSourceName"; final InjectionPoint injectionPoint = mock(InjectionPoint.class); final EventSourceName eventSourceNameAnnotation = mock(EventSourceName.class); final EventSourceDefinition eventSourceDefinition = mock(EventSourceDefinition.class); final Location location = mock(Location.class); + final DataSource dataSource = mock(DataSource.class); when(qualifierAnnotationExtractor.getFrom(injectionPoint, EventSourceName.class)).thenReturn(eventSourceNameAnnotation); when(eventSourceNameAnnotation.value()).thenReturn(eventSourceName); when(eventSourceDefinitionRegistry.getEventSourceDefinitionFor(eventSourceName)).thenReturn(Optional.of(eventSourceDefinition)); when(eventSourceDefinition.getLocation()).thenReturn(location); when(location.getDataSource()).thenReturn(empty()); - when(eventSourceDefinition.getName()).thenReturn(dataSourceName); + when(eventSourceDefinition.getName()).thenReturn(jndiDataSourceName); try { eventSourceProducer.eventSource(injectionPoint); fail(); } catch (final CreationException expected) { - assertThat(expected.getMessage(), is("No DataSource specified for EventSource 'my-data-source' specified in event-sources.yaml")); + assertThat(expected.getMessage(), is("No DataSource specified for EventSource 'jndiDataSourceName' specified in event-sources.yaml")); } verifyZeroInteractions(jdbcEventSourceFactory); diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducerTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducerTest.java index 6de7afeba..6c8b795d3 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducerTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/EventSourceTransformationProducerTest.java @@ -3,8 +3,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.getValueOfField; @@ -16,11 +14,15 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; import uk.gov.justice.subscription.domain.eventsource.EventSourceDefinition; import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry; +import javax.sql.DataSource; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -46,27 +48,44 @@ public class EventSourceTransformationProducerTest { private EventSourceDefinitionRegistry eventSourceDefinitionRegistry; @Mock - private PublishedEventFinder publishedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; + + @Mock + private JdbcDataSourceProvider jdbcDataSourceProvider; @InjectMocks private EventSourceTransformationProducer eventSourceTransformationProducer; @Test public void shouldCreateEventSourceTransformation() throws Exception { + final EventRepository eventRepository = mock(EventRepository.class); final EventStreamManager eventStreamManager = mock(EventStreamManager.class); + final DataSource dataSource = mock(DataSource.class); + final String dataSourceJndiName = "jndi:datasource"; final EventSourceDefinition eventSourceDefinition = eventSourceDefinition() .withName("eventsource") .withLocation(location() .withJmsUri("") .withRestUri("http://localhost:8080/example/event-source-api/rest") - .withDataSource("jndi:datasource") + .withDataSource(dataSourceJndiName) .build()) .build(); - when(eventRepositoryFactory.eventRepository(any(EventJdbcRepository.class), any(EventStreamJdbcRepository.class), eq(publishedEventFinder))).thenReturn(eventRepository); + + final EventStreamJdbcRepository eventStreamJdbcRepository = mock(EventStreamJdbcRepository.class); + final EventJdbcRepository eventJdbcRepository = mock(EventJdbcRepository.class); + final PublishedEventFinder publishedEventFinder = mock(PublishedEventFinder.class); + + when(jdbcDataSourceProvider.getDataSource(dataSourceJndiName)).thenReturn(dataSource); + when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource)).thenReturn(eventStreamJdbcRepository); + when(eventJdbcRepositoryFactory.eventJdbcRepository(dataSource)).thenReturn(eventJdbcRepository); + when(publishedEventFinderFactory.create(dataSource)).thenReturn(publishedEventFinder); + + when(eventRepositoryFactory.eventRepository(eventJdbcRepository, eventStreamJdbcRepository, publishedEventFinder)).thenReturn(eventRepository); when(eventStreamManagerFactory.eventStreamManager(eventRepository, eventSourceDefinition.getName())).thenReturn(eventStreamManager); when(eventSourceDefinitionRegistry.getDefaultEventSourceDefinition()).thenReturn(eventSourceDefinition); + final EventSourceTransformation eventSourceTransformation = eventSourceTransformationProducer.eventSourceTransformation(); assertThat(eventSourceTransformation, is(instanceOf(DefaultEventSourceTransformation.class))); diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSourceTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSourceTest.java index d6ed4afbe..a7ac9f717 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSourceTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcBasedEventSourceTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.when; +import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.setField; import uk.gov.justice.services.eventsourcing.repository.jdbc.DefaultEventStreamMetadata; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; @@ -29,9 +30,6 @@ public class JdbcBasedEventSourceTest { private static final UUID STREAM_ID = randomUUID(); - @Mock - private EventStreamManager eventStreamManager; - @Mock private EventRepository eventRepository; @@ -97,7 +95,7 @@ public void shouldGetStreamsWithoutUsingPosition() throws Exception { @Test public void shouldReturnEventStreamName() throws Exception { final String eventSourceName = "eventSourceName"; - ReflectionUtil.setField(jdbcBasedEventSource, "name", eventSourceName); + setField(jdbcBasedEventSource, "eventSourceName", eventSourceName); final EnvelopeEventStream eventStream = (EnvelopeEventStream) jdbcBasedEventSource.getStreamById(STREAM_ID); diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactoryTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactoryTest.java index a78c48477..bc1bab553 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactoryTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcEventSourceFactoryTest.java @@ -8,12 +8,15 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.EventRepositoryFactory; -import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventConverter; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; + +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,10 +40,10 @@ public class JdbcEventSourceFactoryTest { private EventStreamJdbcRepositoryFactory eventStreamJdbcRepositoryFactory; @Mock - private EventConverter eventConverter; + private PublishedEventFinderFactory publishedEventFinderFactory; @Mock - private PublishedEventFinder publishedEventFinder; + private JdbcDataSourceProvider jdbcDataSourceProvider; @InjectMocks private JdbcEventSourceFactory jdbcEventSourceFactory; @@ -48,16 +51,19 @@ public class JdbcEventSourceFactoryTest { @Test public void shouldCreateJdbcBasedEventSource() throws Exception { - final String jndiDatasource = "jndiDatasource"; + final String jndiDataSourceName = "jndiDatasource"; final String eventSourceName = "eventSourceName"; final EventJdbcRepository eventJdbcRepository = mock(EventJdbcRepository.class); final EventStreamJdbcRepository eventStreamJdbcRepository = mock(EventStreamJdbcRepository.class); final EventRepository eventRepository = mock(EventRepository.class); final EventStreamManager eventStreamManager = mock(EventStreamManager.class); + final DataSource dataSource = mock(DataSource.class); + final PublishedEventFinder publishedEventFinder = mock(PublishedEventFinder.class); - when(eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource)).thenReturn(eventJdbcRepository); - when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource)).thenReturn(eventStreamJdbcRepository); + when(eventJdbcRepositoryFactory.eventJdbcRepository(dataSource)).thenReturn(eventJdbcRepository); + when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource)).thenReturn(eventStreamJdbcRepository); + when(publishedEventFinderFactory.create(dataSource)).thenReturn(publishedEventFinder); when(eventRepositoryFactory.eventRepository( eventJdbcRepository, @@ -65,11 +71,12 @@ public void shouldCreateJdbcBasedEventSource() throws Exception { publishedEventFinder)).thenReturn(eventRepository); when(eventStreamManagerFactory.eventStreamManager(eventRepository, eventSourceName)).thenReturn(eventStreamManager); + when(jdbcDataSourceProvider.getDataSource(jndiDataSourceName)).thenReturn(dataSource); - final JdbcBasedEventSource jdbcBasedEventSource = jdbcEventSourceFactory.create(jndiDatasource, eventSourceName); + final JdbcBasedEventSource jdbcBasedEventSource = jdbcEventSourceFactory.create(dataSource, eventSourceName); assertThat(getValueOfField(jdbcBasedEventSource, "eventStreamManager", EventStreamManager.class), is(eventStreamManager)); assertThat(getValueOfField(jdbcBasedEventSource, "eventRepository", EventRepository.class), is(eventRepository)); - assertThat(getValueOfField(jdbcBasedEventSource, "name", String.class), is(eventSourceName)); + assertThat(getValueOfField(jdbcBasedEventSource, "eventSourceName", String.class), is(eventSourceName)); } } diff --git a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactoryTest.java b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactoryTest.java index 6d9b0f4ae..be11ebb01 100644 --- a/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactoryTest.java +++ b/event-sourcing/event-source/src/test/java/uk/gov/justice/services/eventsourcing/source/core/JdbcPublishedEventSourceFactoryTest.java @@ -12,8 +12,12 @@ import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.EventJdbcRepositoryFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinder; +import uk.gov.justice.services.eventsourcing.repository.jdbc.event.PublishedEventFinderFactory; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepository; import uk.gov.justice.services.eventsourcing.repository.jdbc.eventstream.EventStreamJdbcRepositoryFactory; +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; + +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,7 +41,10 @@ public class JdbcPublishedEventSourceFactoryTest { private EventConverter eventConverter; @Mock - private PublishedEventFinder linkedEventFinder; + private PublishedEventFinderFactory publishedEventFinderFactory; + + @Mock + private JdbcDataSourceProvider jdbcDataSourceProvider; @InjectMocks private JdbcPublishedEventSourceFactory jdbcPublishedEventSourceFactory; @@ -50,18 +57,22 @@ public void shouldCreateJdbcBasedPublishedEventSource() throws Exception { final EventJdbcRepository eventJdbcRepository = mock(EventJdbcRepository.class); final EventStreamJdbcRepository eventStreamJdbcRepository = mock(EventStreamJdbcRepository.class); final EventRepository eventRepository = mock(EventRepository.class); + final DataSource dataSource = mock(DataSource.class); + final PublishedEventFinder publishedEventFinder = mock(PublishedEventFinder.class); - when(eventJdbcRepositoryFactory.eventJdbcRepository(jndiDatasource)).thenReturn(eventJdbcRepository); - when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(jndiDatasource)).thenReturn(eventStreamJdbcRepository); + when(jdbcDataSourceProvider.getDataSource(jndiDatasource)).thenReturn(dataSource); + when(eventJdbcRepositoryFactory.eventJdbcRepository(dataSource)).thenReturn(eventJdbcRepository); + when(eventStreamJdbcRepositoryFactory.eventStreamJdbcRepository(dataSource)).thenReturn(eventStreamJdbcRepository); + when(publishedEventFinderFactory.create(dataSource)).thenReturn(publishedEventFinder); when(eventRepositoryFactory.eventRepository( eventJdbcRepository, eventStreamJdbcRepository, - linkedEventFinder)).thenReturn(eventRepository); + publishedEventFinder)).thenReturn(eventRepository); final JdbcBasedPublishedEventSource jdbcBasedPublishedEventSource = jdbcPublishedEventSourceFactory.create(jndiDatasource); assertThat(getValueOfField(jdbcBasedPublishedEventSource, "eventRepository", EventRepository.class), is(eventRepository)); assertThat(getValueOfField(jdbcBasedPublishedEventSource, "eventConverter", EventConverter.class), is(eventConverter)); } -} \ No newline at end of file +} diff --git a/interceptors/subscription-event-interceptors/src/test/java/uk/gov/justice/services/event/source/subscriptions/interceptors/it/SubscriptionEventInterceptorIT.java b/interceptors/subscription-event-interceptors/src/test/java/uk/gov/justice/services/event/source/subscriptions/interceptors/it/SubscriptionEventInterceptorIT.java index 3a7b1cc09..fc95f271c 100644 --- a/interceptors/subscription-event-interceptors/src/test/java/uk/gov/justice/services/event/source/subscriptions/interceptors/it/SubscriptionEventInterceptorIT.java +++ b/interceptors/subscription-event-interceptors/src/test/java/uk/gov/justice/services/event/source/subscriptions/interceptors/it/SubscriptionEventInterceptorIT.java @@ -60,7 +60,8 @@ import uk.gov.justice.services.core.requester.RequesterProducer; import uk.gov.justice.services.core.sender.SenderProducer; import uk.gov.justice.services.event.source.subscriptions.interceptors.SubscriptionEventInterceptor; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider; import uk.gov.justice.services.messaging.DefaultJsonObjectEnvelopeConverter; import uk.gov.justice.services.messaging.JsonEnvelope; @@ -172,7 +173,8 @@ public Properties postgresqlConfiguration() { FileBasedJsonSchemaValidator.class, JsonSchemaLoader.class, DefaultTraceLogger.class, - JdbcRepositoryHelper.class, + JdbcResultSetStreamer.class, + PreparedStatementWrapperFactory.class, ViewStoreJdbcDataSourceProvider.class, SchemaCatalogAwareJsonSchemaValidator.class, diff --git a/pom.xml b/pom.xml index 600629748..cf1ef0856 100644 --- a/pom.xml +++ b/pom.xml @@ -41,9 +41,9 @@ 1.16.4 1.22.0 - 6.0.0-M12 + 6.0.0-M14 1.29.0 - 4.0.0-M7 + 4.0.0-M8 diff --git a/subscription-event-tracking/src/main/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepository.java b/subscription-event-tracking/src/main/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepository.java index 7899b0a72..bb6e31a34 100644 --- a/subscription-event-tracking/src/main/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepository.java +++ b/subscription-event-tracking/src/main/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepository.java @@ -3,8 +3,9 @@ import static java.util.Optional.empty; import static java.util.Optional.of; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapper; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider; import java.sql.Connection; @@ -35,10 +36,13 @@ public class ProcessedEventTrackingRepository { "ORDER BY event_number ASC"; @Inject - JdbcRepositoryHelper jdbcRepositoryHelper; + private JdbcResultSetStreamer jdbcResultSetStreamer; @Inject - ViewStoreJdbcDataSourceProvider viewStoreJdbcDataSourceProvider; + private PreparedStatementWrapperFactory preparedStatementWrapperFactory; + + @Inject + private ViewStoreJdbcDataSourceProvider viewStoreJdbcDataSourceProvider; public void save(final ProcessedEventTrackItem processedEventTrackItem) { @@ -60,12 +64,12 @@ public void save(final ProcessedEventTrackItem processedEventTrackItem) { public Stream getAllProcessedEvents(final String source) { try { - final PreparedStatementWrapper preparedStatement = jdbcRepositoryHelper.preparedStatementWrapperOf( + final PreparedStatementWrapper preparedStatement = preparedStatementWrapperFactory.preparedStatementWrapperOf( viewStoreJdbcDataSourceProvider.getDataSource(), SELECT_SQL); preparedStatement.setString(1, source); - return jdbcRepositoryHelper.streamOf(preparedStatement, resultSet -> { + return jdbcResultSetStreamer.streamOf(preparedStatement, resultSet -> { try { final long eventNumber = resultSet.getLong("event_number"); diff --git a/subscription-event-tracking/src/test/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepositoryIT.java b/subscription-event-tracking/src/test/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepositoryIT.java index 575974a4f..26114ebf1 100644 --- a/subscription-event-tracking/src/test/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepositoryIT.java +++ b/subscription-event-tracking/src/test/java/uk/gov/justice/services/subscription/ProcessedEventTrackingRepositoryIT.java @@ -6,7 +6,8 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.when; -import uk.gov.justice.services.jdbc.persistence.JdbcRepositoryHelper; +import uk.gov.justice.services.jdbc.persistence.JdbcResultSetStreamer; +import uk.gov.justice.services.jdbc.persistence.PreparedStatementWrapperFactory; import uk.gov.justice.services.jdbc.persistence.ViewStoreJdbcDataSourceProvider; import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner; import uk.gov.justice.services.test.utils.persistence.FrameworkTestDataSourceFactory; @@ -36,7 +37,11 @@ public class ProcessedEventTrackingRepositoryIT { @SuppressWarnings("unused") @Spy - private JdbcRepositoryHelper jdbcRepositoryHelper = new JdbcRepositoryHelper(); + private JdbcResultSetStreamer jdbcResultSetStreamer = new JdbcResultSetStreamer(); + + @SuppressWarnings("unused") + @Spy + private PreparedStatementWrapperFactory preparedStatementWrapperFactory = new PreparedStatementWrapperFactory(); @InjectMocks private ProcessedEventTrackingRepository processedEventTrackingRepository; diff --git a/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/OpenEjbEventStoreDataSourceProvider.java b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/OpenEjbEventStoreDataSourceProvider.java new file mode 100644 index 000000000..0792343d5 --- /dev/null +++ b/test-utils-event-store/test-utils-persistence/src/main/java/uk/gov/justice/services/test/utils/persistence/OpenEjbEventStoreDataSourceProvider.java @@ -0,0 +1,19 @@ +package uk.gov.justice.services.test.utils.persistence; + +import uk.gov.justice.services.jdbc.persistence.JdbcDataSourceProvider; + +import javax.annotation.Resource; +import javax.enterprise.context.ApplicationScoped; +import javax.sql.DataSource; + +@ApplicationScoped +public class OpenEjbEventStoreDataSourceProvider implements JdbcDataSourceProvider { + + @Resource(name = "openejb/Resource/frameworkeventstore") + private DataSource dataSource; + + @Override + public DataSource getDataSource(final String jndiName) { + return dataSource; + } +}