Skip to content

Commit

Permalink
Merge pull request #48 from CJSCommonPlatform/subscriptio-prioritisation
Browse files Browse the repository at this point in the history
Event Catch-Up Subscription prioritisation
  • Loading branch information
MartinYSpasov committed Feb 6, 2019
2 parents 205b366 + 5654c83 commit 816c759
Show file tree
Hide file tree
Showing 17 changed files with 191 additions and 11 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to

## [Unreleased]

### Added
- Subscription prioritisation

## [1.1.3] - 2019-02-04
### Changed
-Update utilities to 1.16.4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import uk.gov.justice.services.messaging.jms.JmsEnvelopeSender;
import uk.gov.justice.services.test.utils.persistence.DatabaseCleaner;
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.EventSourceDefinition;
import uk.gov.justice.subscription.registry.DefaultEventSourceDefinitionFactory;
Expand Down Expand Up @@ -204,7 +205,10 @@ public class SnapshotAwareAggregateServiceIT {
QualifierAnnotationExtractor.class,
SnapshotAwareEventSourceFactory.class,

DefaultEventSourceDefinitionFactory.class
DefaultEventSourceDefinitionFactory.class,

SubscriptionHelper.class

})

public WebApp war() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import uk.gov.justice.services.test.utils.persistence.TestJdbcDataSourceProvider;
import uk.gov.justice.subscription.EventSourcesParser;
import uk.gov.justice.subscription.ParserProducer;
import uk.gov.justice.subscription.SubscriptionHelper;
import uk.gov.justice.subscription.YamlFileFinder;
import uk.gov.justice.subscription.registry.DefaultEventSourceDefinitionFactory;
import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistry;
Expand Down Expand Up @@ -142,7 +143,8 @@ public void initializeDatabase() throws Exception {
EventPrePublisher.class,
MetadataSequenceNumberUpdater.class,
PrePublishRepository.class,
UtcClock.class
UtcClock.class,
SubscriptionHelper.class
})
public WebApp war() {
return new WebApp()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import uk.gov.justice.services.messaging.logging.DefaultTraceLogger;
import uk.gov.justice.services.messaging.logging.TraceLogger;
import uk.gov.justice.subscription.ParserProducer;
import uk.gov.justice.subscription.SubscriptionHelper;
import uk.gov.justice.subscription.YamlFileFinder;
import uk.gov.justice.subscription.registry.DefaultEventSourceDefinitionFactory;
import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistryProducer;
Expand Down Expand Up @@ -223,7 +224,8 @@ public EventInsertionStrategy eventLogInsertionStrategy() {
QualifierAnnotationExtractor.class,
JdbcEventSourceFactory.class,

DefaultEventSourceDefinitionFactory.class
DefaultEventSourceDefinitionFactory.class,
SubscriptionHelper.class
})

public WebApp war() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
import uk.gov.justice.services.messaging.logging.DefaultTraceLogger;
import uk.gov.justice.services.messaging.logging.TraceLogger;
import uk.gov.justice.subscription.ParserProducer;
import uk.gov.justice.subscription.SubscriptionHelper;
import uk.gov.justice.subscription.YamlFileFinder;
import uk.gov.justice.subscription.registry.DefaultEventSourceDefinitionFactory;
import uk.gov.justice.subscription.registry.EventSourceDefinitionRegistryProducer;
Expand Down Expand Up @@ -229,7 +230,8 @@ public EventInsertionStrategy eventLogInsertionStrategy() {
QualifierAnnotationExtractor.class,
JdbcEventSourceFactory.class,

DefaultEventSourceDefinitionFactory.class
DefaultEventSourceDefinitionFactory.class,
SubscriptionHelper.class
})
public WebApp war() {
return new WebApp()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ subscriptions_descriptor:
service_component: EVENT_LISTENER
subscriptions:
- name: subscription1
prioritisation: 1
events:
- name: example.recipe-added
schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json
Expand All @@ -12,6 +13,7 @@ subscriptions_descriptor:
event_source_name: example

- name: subscription2
prioritisation: 2
events:
- name: people.person-added
schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public final class SubscriptionBuilder {
private String name;
private final List<Event> events = new ArrayList<>();
private String eventSourceName;
private String prioritisation;

private SubscriptionBuilder() {
}
Expand Down Expand Up @@ -39,7 +40,12 @@ public SubscriptionBuilder withEventSourceName(final String eventSourceName) {
return this;
}

public SubscriptionBuilder withPrioritisation(final String prioritisation) {
this.prioritisation = prioritisation;
return this;
}

public Subscription build() {
return new Subscription(name, events, eventSourceName);
return new Subscription(name, events, eventSourceName, prioritisation);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,18 @@ public void shouldBuildASubscription() throws Exception {
final Event event_1 = mock(Event.class);
final Event event_2 = mock(Event.class);
final String eventSourceName = "eventSoureName";
final String prioritisation = "1";

final Subscription subscription = subscription()
.withName(name)
.withEvents(asList(event_1, event_2))
.withEventSourceName(eventSourceName)
.withPrioritisation(prioritisation)
.build();

assertThat(subscription.getName(), is(name));
assertThat(subscription.getEventSourceName(), is(eventSourceName));
assertThat(subscription.getPrioritisation(), is(prioritisation));
assertThat(subscription.getEvents(), hasItem(event_1));
assertThat(subscription.getEvents(), hasItem(event_2));
}
Expand All @@ -42,16 +45,19 @@ public void shouldBeAbleToAddEventsOneAtATime() throws Exception {
final Event event_1 = mock(Event.class);
final Event event_2 = mock(Event.class);
final String eventSourceName = "eventSourceName";
final String prioritisation = "1";

final Subscription subscription = subscription()
.withName(name)
.withEvent(event_1)
.withEvent(event_2)
.withEventSourceName(eventSourceName)
.withPrioritisation(prioritisation)
.build();

assertThat(subscription.getName(), is(name));
assertThat(subscription.getEventSourceName(), is(eventSourceName));
assertThat(subscription.getPrioritisation(), is(prioritisation));
assertThat(subscription.getEvents(), hasItem(event_1));
assertThat(subscription.getEvents(), hasItem(event_2));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,17 @@ public class ParserProducer {
@Inject
YamlSchemaLoader yamlSchemaLoader;

@Inject
SubscriptionHelper subscriptionHelper;

@Produces
public uk.gov.justice.subscription.EventSourcesParser eventSourcesParser() {
return new uk.gov.justice.subscription.EventSourcesParser(yamlParser, getYamlFileValidator());
}

@Produces
public SubscriptionsDescriptorParser subscriptionDescriptorsParser() {
return new SubscriptionsDescriptorParser(yamlParser, getYamlFileValidator());
return new SubscriptionsDescriptorParser(yamlParser, getYamlFileValidator(), subscriptionHelper);
}

private YamlFileValidator getYamlFileValidator() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package uk.gov.justice.subscription;

import static java.lang.Integer.parseInt;
import static java.lang.String.format;
import static java.util.Comparator.comparing;
import static java.util.Comparator.naturalOrder;

import uk.gov.justice.subscription.domain.subscriptiondescriptor.SubscriptionsDescriptor;
import uk.gov.justice.subscription.yaml.parser.YamlParserException;

public class SubscriptionHelper {

private final static int HIGHEST_PRIORITY = 0;

public void sortSubscriptionsByPrioritisation(final SubscriptionsDescriptor subscriptionsDescriptor) {
if (!subscriptionsDescriptor.getSubscriptions().isEmpty()) {
subscriptionsDescriptor.getSubscriptions().sort(comparing(subscription -> getPrioritisationNumber(subscription.getPrioritisation()), naturalOrder()));
}
}

private Integer getPrioritisationNumber(final String prioritisation) {
try {
if (null != prioritisation) {
return parseInt(prioritisation);
}
return HIGHEST_PRIORITY;
} catch (final NumberFormatException nfe) {
throw new YamlParserException(format("Incorrect prioritisation number: %s in subscription-descriptor.yaml", prioritisation));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ public class SubscriptionsDescriptorParser {

private YamlParser yamlParser;
private YamlFileValidator yamlFileValidator;
private SubscriptionHelper subscriptionHelper;


public SubscriptionsDescriptorParser(final YamlParser yamlParser, final YamlFileValidator yamlFileValidator) {
public SubscriptionsDescriptorParser(final YamlParser yamlParser, final YamlFileValidator yamlFileValidator, final SubscriptionHelper subscriptionHelper) {
this.yamlParser = yamlParser;
this.yamlFileValidator = yamlFileValidator;
this.subscriptionHelper = subscriptionHelper;
}

/**
Expand All @@ -42,7 +44,11 @@ public Stream<SubscriptionsDescriptor> getSubscriptionDescriptorsFrom(final Coll

private SubscriptionsDescriptor parseSubscriptionDescriptorFromYaml(final URL url) {
yamlFileValidator.validateSubscription(url);

final Map<String, SubscriptionsDescriptor> stringSubscriptionDescriptorMap = yamlParser.parseYamlFrom(url, SUBSCRIPTIONS_DESCRIPTOR_TYPE_REF);
return stringSubscriptionDescriptorMap.get(SUBSCRIPTIONS_DESCRIPTOR);
final SubscriptionsDescriptor subscriptionsDescriptor = stringSubscriptionDescriptorMap.get(SUBSCRIPTIONS_DESCRIPTOR);

subscriptionHelper.sortSubscriptionsByPrioritisation(subscriptionsDescriptor);
return subscriptionsDescriptor;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ public class Subscription {
private final String name;
private final List<Event> events;
private final String eventSourceName;
private final String prioritisation;

public Subscription(final String name,
final List<Event> events,
final String eventSourceName) {
final String eventSourceName,
final String prioritisation) {
this.name = name;
this.events = events;
this.eventSourceName = eventSourceName;
this.prioritisation = prioritisation;
}

public String getName() {
Expand All @@ -29,18 +32,23 @@ public String getEventSourceName() {
return eventSourceName;
}

public String getPrioritisation() {
return prioritisation;
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final Subscription that = (Subscription) o;
return Objects.equals(name, that.name) &&
Objects.equals(events, that.events) &&
Objects.equals(prioritisation, that.prioritisation) &&
Objects.equals(eventSourceName, that.eventSourceName);
}

@Override
public int hashCode() {
return Objects.hash(name, events, eventSourceName);
return Objects.hash(name, events,prioritisation, eventSourceName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@ public class YamlParserException extends RuntimeException{
public YamlParserException(final String message, final Throwable cause) {
super(message, cause);
}

public YamlParserException(final String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@
"subscription1"
]
},
"prioritisation": {
"$id": "/properties/subscriptions_descriptor/properties/subscriptions/items/properties/prioritisation",
"type": "integer",
"title": "Subscription prioritisation",
"examples": [
"1"
]
},
"events": {
"$id": "/properties/subscriptions_descriptor/properties/subscriptions/items/properties/events",
"type": "array",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package uk.gov.justice.subscription;


import static org.hamcrest.Matchers.is;
import static java.util.Arrays.asList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;

import uk.gov.justice.subscription.domain.subscriptiondescriptor.Event;
import uk.gov.justice.subscription.domain.subscriptiondescriptor.Subscription;
import uk.gov.justice.subscription.domain.subscriptiondescriptor.SubscriptionsDescriptor;
import uk.gov.justice.subscription.yaml.parser.YamlParserException;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class SubscriptionHelperTest {

@Test
public void shouldSortBySubscriptionPrioritisation() {

final List<Event> eventList = asList(mock(Event.class),mock(Event.class));

final Subscription subscription1 = new Subscription("name1",eventList,"eventSourceName1", "1");
final Subscription subscription2 = new Subscription("name2",eventList,"eventSourceName3", "2");
final Subscription subscription3 = new Subscription("name3",eventList,"eventSourceName1", "3");

final List<Subscription> subscriptions = asList(subscription2,subscription3,subscription1);
final SubscriptionsDescriptor subscriptionsDescriptor = new SubscriptionsDescriptor("specVersion", "service", "serviceComponent", subscriptions);

final SubscriptionHelper subscriptionHelper = new SubscriptionHelper();

subscriptionHelper.sortSubscriptionsByPrioritisation(subscriptionsDescriptor);

assertThat(subscriptionsDescriptor.getSubscriptions().get(0), is(subscription1));
assertThat(subscriptionsDescriptor.getSubscriptions().get(1), is(subscription2));
assertThat(subscriptionsDescriptor.getSubscriptions().get(2), is(subscription3));

}

@Test
public void shouldSortBySubscriptionPrioritisationNullsFirst() {

final List<Event> eventList = asList(mock(Event.class),mock(Event.class));

final Subscription subscription1 = new Subscription("name1",eventList,"eventSourceName1", "1");
final Subscription subscription2 = new Subscription("name2",eventList,"eventSourceName3", null);
final Subscription subscription3 = new Subscription("name3",eventList,"eventSourceName1", "3");

final List<Subscription> subscriptions = asList(subscription2,subscription3,subscription1);

final SubscriptionsDescriptor subscriptionsDescriptor = new SubscriptionsDescriptor("specVersion", "service", "serviceComponent", subscriptions);

final SubscriptionHelper subscriptionHelper = new SubscriptionHelper();

subscriptionHelper.sortSubscriptionsByPrioritisation(subscriptionsDescriptor);

assertThat(subscriptionsDescriptor.getSubscriptions().get(0), is(subscription2));
assertThat(subscriptionsDescriptor.getSubscriptions().get(1), is(subscription1));
assertThat(subscriptionsDescriptor.getSubscriptions().get(2), is(subscription3));

}

@Test
public void shouldThrowExceptionIfPrioritisationNotNumber() {

final List<Event> eventList = asList(mock(Event.class),mock(Event.class));

final Subscription subscription1 = new Subscription("name1",eventList,"eventSourceName1", "1");
final Subscription subscription2 = new Subscription("name2",eventList,"eventSourceName3", "wrongPrioritisation");
final Subscription subscription3 = new Subscription("name3",eventList,"eventSourceName1", "3");

final List<Subscription> subscriptions = asList(subscription2,subscription3,subscription1);

final SubscriptionsDescriptor subscriptionsDescriptor = new SubscriptionsDescriptor("specVersion", "service", "serviceComponent", subscriptions);

final SubscriptionHelper subscriptionHelper = new SubscriptionHelper();

try {
subscriptionHelper.sortSubscriptionsByPrioritisation(subscriptionsDescriptor);
fail();
}catch (final YamlParserException expected){
assertThat(expected.getMessage(), is("Incorrect prioritisation number: wrongPrioritisation in subscription-descriptor.yaml"));
}
}
}
Loading

0 comments on commit 816c759

Please sign in to comment.