Skip to content

Commit

Permalink
Add support for archiving streams
Browse files Browse the repository at this point in the history
  • Loading branch information
=Dinesh Kadam authored and purple52 committed Jun 1, 2018
1 parent 2d18d1f commit d541e85
Show file tree
Hide file tree
Showing 9 changed files with 399 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package uk.gov.sample.event.transformation;

import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.ARCHIVE;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.NO_ACTION;

import uk.gov.justice.services.core.enveloper.Enveloper;
import uk.gov.justice.services.messaging.JsonEnvelope;
import uk.gov.justice.tools.eventsourcing.transformation.api.EventTransformation;
import uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction;
import uk.gov.justice.tools.eventsourcing.transformation.api.annotation.Transformation;


@Transformation
public class SampleArchiveTransformation implements EventTransformation {

@Override
public TransformAction actionFor(final JsonEnvelope event) {
if (event.metadata().name().equalsIgnoreCase("sample.archive.events.name")) {
return ARCHIVE;
}
return NO_ACTION;
}

@Override
public void setEnveloper(Enveloper enveloper) {
// Unused by test
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package uk.gov.sample.event.transformation;

import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.NO_ACTION;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.TRANSFORM;

import uk.gov.justice.services.core.enveloper.Enveloper;
import uk.gov.justice.services.messaging.JsonEnvelope;
import uk.gov.justice.tools.eventsourcing.transformation.api.EventTransformation;
import uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction;
import uk.gov.justice.tools.eventsourcing.transformation.api.annotation.Transformation;

import java.util.stream.Stream;

@Transformation
public class SampleTransformationV2 implements EventTransformation {

private Enveloper enveloper;

@Override
public TransformAction actionFor(JsonEnvelope event) {
if (event.metadata().name().equalsIgnoreCase("sample.v2.events.name")){
return TRANSFORM;
}
return NO_ACTION;
}

@Override
public Stream<JsonEnvelope> apply(JsonEnvelope event) {
final JsonEnvelope transformedEnvelope = enveloper.withMetadataFrom(event, "sample.events.transformedName").apply(event.payload());
return Stream.of(transformedEnvelope);
}

@Override
public void setEnveloper(Enveloper enveloper) {
this.enveloper = enveloper;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package uk.gov.sample.event.transformation;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.ARCHIVE;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.NO_ACTION;

import uk.gov.justice.services.messaging.JsonEnvelope;
import uk.gov.justice.services.messaging.Metadata;
import uk.gov.justice.tools.eventsourcing.transformation.api.EventTransformation;

import java.util.stream.Stream;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class SampleArchiveTransformationTest {

private SampleArchiveTransformation sampleTransformation = new SampleArchiveTransformation();

@Test
public void shouldCreateInstanceOfEventTransformation() {
assertTrue(sampleTransformation instanceof EventTransformation);
}

@Test
public void shouldSetArchiveAction() {
JsonEnvelope event = mock(JsonEnvelope.class);
Metadata metadata = mock(Metadata.class);

when(event.metadata()).thenReturn(metadata);
when(event.metadata().name()).thenReturn("sample.archive.events.name");

assertTrue(sampleTransformation.actionFor(event) == ARCHIVE);
}

@Test
public void shouldSetNoAction() {
JsonEnvelope event = mock(JsonEnvelope.class);
Metadata metadata = mock(Metadata.class);

when(event.metadata()).thenReturn(metadata);
when(event.metadata().name()).thenReturn("dummy.archive.events.name");
assertTrue(sampleTransformation.actionFor(event) == NO_ACTION);
}


@Test
public void shouldCreateArchive() {
SampleArchiveTransformation sampleTransformation = mock(SampleArchiveTransformation.class);
JsonEnvelope event = mock(JsonEnvelope.class);

when(sampleTransformation.apply(event)).thenReturn(Stream.of(event));

assertTrue(EqualsBuilder.reflectionEquals(event, sampleTransformation.apply(event).findFirst().get()));
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package uk.gov.sample.event.transformation;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.NO_ACTION;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.TRANSFORM;

import uk.gov.justice.services.messaging.JsonEnvelope;
import uk.gov.justice.services.messaging.Metadata;
import uk.gov.justice.tools.eventsourcing.transformation.api.EventTransformation;

import java.util.stream.Stream;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class SampleTransformationV2Test {

private SampleTransformationV2 sampleTransformation = new SampleTransformationV2();

@Test
public void shouldCreateInstanceOfEventTransformation() {
assertTrue(sampleTransformation instanceof EventTransformation);
}

@Test
public void shouldSetTransformAction() {
JsonEnvelope event = mock(JsonEnvelope.class);
Metadata metadata = mock(Metadata.class);

when(event.metadata()).thenReturn(metadata);
when(event.metadata().name()).thenReturn("sample.v2.events.name");

assertTrue(sampleTransformation.actionFor(event)== TRANSFORM);
}

@Test
public void shouldSetNoAction() {
JsonEnvelope event = mock(JsonEnvelope.class);
Metadata metadata = mock(Metadata.class);

when(event.metadata()).thenReturn(metadata);
when(event.metadata().name()).thenReturn("dummy.sample.v2.events.name");

assertTrue(sampleTransformation.actionFor(event) == NO_ACTION);
}


@Test
public void shouldCreateTransformation() {
SampleTransformation sampleTransformation = mock(SampleTransformation.class);
JsonEnvelope event = mock(JsonEnvelope.class);

when(sampleTransformation.apply(event)).thenReturn(Stream.of(event));

assertTrue(EqualsBuilder.reflectionEquals(event, sampleTransformation.apply(event).findFirst().get()));
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

public class StreamTransformationIT {

private static final UUID STREAM_ID = randomUUID();
private UUID STREAM_ID;

private static TestEventLogJdbcRepository EVENT_LOG_JDBC_REPOSITORY;

Expand All @@ -38,6 +38,7 @@ public class StreamTransformationIT {

@Before
public void setUpDB() throws Exception {
STREAM_ID = randomUUID();
dataSource = liquibaseUtil.initEventStoreDb();
EVENT_LOG_JDBC_REPOSITORY = new TestEventLogJdbcRepository(dataSource);
EVENT_STREAM_JDBC_REPOSITORY = new TestEventStreamJdbcRepository(dataSource);
Expand All @@ -56,7 +57,8 @@ public void tearDown() throws SQLException {

@Test
public void shouldTransformEventInEventStore() throws Exception {
insertEventLogData();
insertEventLogData("sample.events.name", 1L);
insertEventLogData("sample.v2.events.name", 2L);

swarmStarterUtil.runCommand();

Expand All @@ -65,6 +67,14 @@ public void shouldTransformEventInEventStore() throws Exception {
assertFalse(clonedStreamIsActive());
}

@Test
public void shouldArchiveStreamInEventStore() throws Exception {
insertEventLogData("sample.archive.events.name", 1L);

swarmStarterUtil.runCommand();
assertFalse(originalEventStreamIsActive());
}

private boolean clonedStreamIsActive() {
final UUID clonedStreamId = EVENT_LOG_JDBC_REPOSITORY.findAll()
.filter(event -> event.getName().equals("system.events.cloned"))
Expand Down Expand Up @@ -96,8 +106,8 @@ private boolean eventStoreTransformedEventPresent() throws SQLException {
return event.isPresent() && event.get().getName().equals("sample.events.transformedName");
}

private void insertEventLogData() throws SQLException, InvalidSequenceIdException {
EVENT_LOG_JDBC_REPOSITORY.insert(eventLogFrom("sample.events.name", 1L, STREAM_ID));
private void insertEventLogData(String eventName, long sequenceId) throws SQLException, InvalidSequenceIdException {
EVENT_LOG_JDBC_REPOSITORY.insert(eventLogFrom(eventName, sequenceId, STREAM_ID));
EVENT_STREAM_JDBC_REPOSITORY.insert(STREAM_ID);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package uk.gov.justice.tools.eventsourcing.transformation.api;

import static java.util.stream.Stream.of;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.NO_ACTION;
import static uk.gov.justice.tools.eventsourcing.transformation.api.TransformAction.TRANSFORM;

import uk.gov.justice.services.core.enveloper.Enveloper;
import uk.gov.justice.services.messaging.JsonEnvelope;

Expand All @@ -12,20 +16,41 @@
public interface EventTransformation {

/**
* Checks if a transformation is applicable to a given event.
* Checks if a transformation is applicable to a given event. The actionFor method call this
* internally in the default implementation for backwards compatibility.
*
* @param event - the event to check
* @return TRUE if the event is eligible to have the transformation applied to it.
* @deprecated use actionFor method instead
* The default implementation is false
*/
@Deprecated
default boolean isApplicable(final JsonEnvelope event){
return false;
}


/**
* Checks which actionFor to perform for a given event.
*
* @param event - the event to check
* @return TransformAction if the event is eligible to have the transformation applied to it.
*/
boolean isApplicable(final JsonEnvelope event);
default TransformAction actionFor(final JsonEnvelope event) {
return isApplicable(event) ? TRANSFORM : NO_ACTION;
}

/**
* Transforms an events into zero to many events.
*
* @param event - the event to be transformed
* @return a stream of transformed events.
* The default implementation is provided for other than transform actio, as other actions dose not need to implement this method.
*/
Stream<JsonEnvelope> apply(final JsonEnvelope event);
default Stream<JsonEnvelope> apply(final JsonEnvelope event){
return of(event);

}

void setEnveloper(Enveloper enveloper);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package uk.gov.justice.tools.eventsourcing.transformation.api;

public enum TransformAction {
TRANSFORM,
ARCHIVE,
NO_ACTION
}
Loading

0 comments on commit d541e85

Please sign in to comment.