diff --git a/pom.xml b/pom.xml
index e67096a..70b906a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,11 +25,13 @@
generator-maven-test-utils
schema-parser
parser-common
+ subscription-descriptor-parser
1.21.0
generator-maven-plugin
+ 2.8.6
diff --git a/subscription-descriptor-parser/pom.xml b/subscription-descriptor-parser/pom.xml
new file mode 100644
index 0000000..680cbc8
--- /dev/null
+++ b/subscription-descriptor-parser/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ generator-maven-plugin
+ uk.gov.justice.maven.generator
+ 2.5.0-SNAPSHOT
+
+ 4.0.0
+
+ uk.gov.justice.maven.generator
+ subscription-descriptor-parser
+ 2.5.0-SNAPSHOT
+
+
+ javax
+ javaee-api
+ 7.0
+
+
+ uk.gov.justice.maven.generator
+ parser-common
+ ${project.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ ${jackson-dataformat-yaml-version}
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jdk8
+
+
+ com.fasterxml.jackson.module
+ jackson-module-parameter-names
+
+
+ junit
+ junit
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ test
+
+
+
\ No newline at end of file
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Event.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Event.java
new file mode 100644
index 0000000..7f091cf
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Event.java
@@ -0,0 +1,20 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+public class Event {
+
+ private final String name;
+ private final String schemaUri;
+
+ public Event(final String name, final String schemaUri) {
+ this.name = name;
+ this.schemaUri = schemaUri;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getSchemaUri() {
+ return schemaUri;
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Eventsource.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Eventsource.java
new file mode 100644
index 0000000..1a7f6f4
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Eventsource.java
@@ -0,0 +1,20 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+public class Eventsource {
+
+ private final String name;
+ private final Location location;
+
+ public Eventsource(final String name, final Location location) {
+ this.name = name;
+ this.location = location;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Location getLocation() {
+ return location;
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Location.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Location.java
new file mode 100644
index 0000000..c255b11
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Location.java
@@ -0,0 +1,19 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+public class Location {
+ private final String jmsUri;
+ private final String restUri;
+
+ public Location(final String jmsUri, final String restUri) {
+ this.jmsUri = jmsUri;
+ this.restUri = restUri;
+ }
+
+ public String getJmsUri() {
+ return jmsUri;
+ }
+
+ public String getRestUri() {
+ return restUri;
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Subscription.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Subscription.java
new file mode 100644
index 0000000..b7dbfdd
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/Subscription.java
@@ -0,0 +1,28 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+import java.util.List;
+
+public class Subscription {
+
+ private final String name;
+ private final List events;
+ private final Eventsource eventsource;
+
+ public Subscription(final String name, final List events, final Eventsource eventsource) {
+ this.name = name;
+ this.events = events;
+ this.eventsource = eventsource;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getEvents() {
+ return events;
+ }
+
+ public Eventsource getEventsource() {
+ return eventsource;
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptor.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptor.java
new file mode 100644
index 0000000..b60c438
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptor.java
@@ -0,0 +1,35 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+import java.util.List;
+
+public class SubscriptionDescriptor {
+
+ private final String specVersion;
+ private final String service;
+ private final String serviceComponent;
+ private final List subscriptions;
+
+ public SubscriptionDescriptor(final String specVersion, final String service, final String serviceComponent, final List subscriptions) {
+ this.specVersion = specVersion;
+ this.service = service;
+ this.serviceComponent = serviceComponent;
+ this.subscriptions = subscriptions;
+ }
+
+ public String getSpecVersion() {
+ return specVersion;
+ }
+
+ public String getService() {
+ return service;
+ }
+
+ public String getServiceComponent() {
+ return serviceComponent;
+ }
+
+ public List getSubscriptions() {
+ return subscriptions;
+ }
+
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptorDef.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptorDef.java
new file mode 100644
index 0000000..341023d
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/domain/subscriptiondescriptor/SubscriptionDescriptorDef.java
@@ -0,0 +1,15 @@
+package uk.gov.justice.domain.subscriptiondescriptor;
+
+public class SubscriptionDescriptorDef {
+
+ private final SubscriptionDescriptor subscriptionDescriptor;
+
+ public SubscriptionDescriptorDef(final SubscriptionDescriptor subscriptionDescriptor) {
+ this.subscriptionDescriptor = subscriptionDescriptor;
+ }
+
+ public SubscriptionDescriptor getSubscriptionDescriptor() {
+ return subscriptionDescriptor;
+ }
+}
+
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParser.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParser.java
new file mode 100644
index 0000000..f2e8c32
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParser.java
@@ -0,0 +1,42 @@
+package uk.gov.justice.maven.generator.io.files.parser;
+
+import static com.fasterxml.jackson.annotation.JsonCreator.Mode.PROPERTIES;
+
+import uk.gov.justice.domain.subscriptiondescriptor.SubscriptionDescriptor;
+import uk.gov.justice.domain.subscriptiondescriptor.SubscriptionDescriptorDef;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
+
+public class SubscriptionDescriptorFileParser implements FileParser {
+
+ @Override
+ public Collection parse(final Path baseDir, final Collection paths) {
+ return paths.stream()
+ .map(path -> read(baseDir.resolve(path).toAbsolutePath().toString()))
+ .collect(Collectors.toList());
+ }
+
+ private SubscriptionDescriptor read(final String filePath) {
+ final ObjectMapper mapper = new ObjectMapper(new YAMLFactory())
+ .registerModule(new Jdk8Module())
+ .registerModule(new ParameterNamesModule(PROPERTIES));
+
+ mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
+
+ try {
+ return mapper.readValue(new File(filePath), SubscriptionDescriptorDef.class).getSubscriptionDescriptor();
+ } catch (IOException e) {
+ throw new SubscriptionDescriptorIOException("Failed to read subscriptions yaml file", e);
+ }
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactory.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactory.java
new file mode 100644
index 0000000..cc846aa
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactory.java
@@ -0,0 +1,12 @@
+package uk.gov.justice.maven.generator.io.files.parser;
+
+
+import uk.gov.justice.domain.subscriptiondescriptor.SubscriptionDescriptor;
+
+public class SubscriptionDescriptorFileParserFactory implements FileParserFactory {
+
+ @Override
+ public SubscriptionDescriptorFileParser create() {
+ return new SubscriptionDescriptorFileParser();
+ }
+}
diff --git a/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorIOException.java b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorIOException.java
new file mode 100644
index 0000000..4e51bae
--- /dev/null
+++ b/subscription-descriptor-parser/src/main/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorIOException.java
@@ -0,0 +1,7 @@
+package uk.gov.justice.maven.generator.io.files.parser;
+
+public class SubscriptionDescriptorIOException extends RuntimeException {
+ public SubscriptionDescriptorIOException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactoryTest.java b/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactoryTest.java
new file mode 100644
index 0000000..e6fa3f7
--- /dev/null
+++ b/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserFactoryTest.java
@@ -0,0 +1,21 @@
+package uk.gov.justice.maven.generator.io.files.parser;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import uk.gov.justice.domain.subscriptiondescriptor.SubscriptionDescriptor;
+
+import org.junit.Test;
+
+public class SubscriptionDescriptorFileParserFactoryTest {
+
+ @Test
+ public void shouldCreateJsonSchemaFileParser() throws Exception {
+
+ final FileParser subscriptionDescriptorFileParser = new SubscriptionDescriptorFileParserFactory().create();
+
+ assertThat(subscriptionDescriptorFileParser, is(instanceOf(SubscriptionDescriptorFileParser.class)));
+ }
+
+}
\ No newline at end of file
diff --git a/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserTest.java b/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserTest.java
new file mode 100644
index 0000000..3f130ed
--- /dev/null
+++ b/subscription-descriptor-parser/src/test/java/uk/gov/justice/maven/generator/io/files/parser/SubscriptionDescriptorFileParserTest.java
@@ -0,0 +1,118 @@
+package uk.gov.justice.maven.generator.io.files.parser;
+
+import static java.nio.file.Paths.get;
+import static java.util.Arrays.asList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.fail;
+
+import uk.gov.justice.domain.subscriptiondescriptor.Event;
+import uk.gov.justice.domain.subscriptiondescriptor.Eventsource;
+import uk.gov.justice.domain.subscriptiondescriptor.Location;
+import uk.gov.justice.domain.subscriptiondescriptor.Subscription;
+import uk.gov.justice.domain.subscriptiondescriptor.SubscriptionDescriptor;
+
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JsonMappingException;
+import org.junit.Test;
+
+public class SubscriptionDescriptorFileParserTest {
+
+ final Path baseDir = get("src/test/resources/");
+ final SubscriptionDescriptorFileParser parser = new SubscriptionDescriptorFileParser();
+
+
+ @Test
+ public void shouldFailOnIncorrectSubscriptionYaml() throws URISyntaxException {
+
+ final List paths = asList(get("incorrect-subscription.yaml"));
+ try {
+ final Collection subscriptionDescriptors = parser.parse(baseDir, paths);
+ fail();
+ } catch (RuntimeException re) {
+ assertThat(re.getCause(), is(instanceOf(JsonMappingException.class)));
+ }
+ }
+
+ @Test
+ public void shouldParsePathsToYaml() throws URISyntaxException {
+
+ final List paths = asList(get("subscription.yaml"));
+ final Collection subscriptionDescriptors = parser.parse(baseDir, paths);
+
+ assertThat(subscriptionDescriptors, hasSize(1));
+ for (final SubscriptionDescriptor subscriptionDescriptor : subscriptionDescriptors) {
+ assertSubscriptionDescriptor(subscriptionDescriptor);
+ final List subscriptions = subscriptionDescriptor.getSubscriptions();
+ for (final Subscription subscription : subscriptions) {
+ if (subscription.getName().equalsIgnoreCase("subscription1")) {
+ assertExampleEvents(subscription);
+ assertExampleEventSource(subscription.getEventsource());
+ }
+ if (subscription.getName().equalsIgnoreCase("subscription2")) {
+ assertPeopleEvents(subscription);
+ assertPeopleEventSource(subscription.getEventsource());
+ }
+ }
+ }
+ }
+
+ private void assertExampleEventSource(Eventsource eventsource) {
+ final String name = eventsource.getName();
+ assertThat(name, is("examplecontext"));
+ final Location location = eventsource.getLocation();
+ assertThat(location.getJmsUri(), is("jms:topic:example.event?timeToLive=1000"));
+ assertThat(location.getRestUri(), is("http://localhost:8080/example/event-source-api/rest"));
+ }
+
+ private void assertPeopleEventSource(Eventsource eventsource) {
+ final String name = eventsource.getName();
+ assertThat(name, is("people"));
+ final Location location = eventsource.getLocation();
+ assertThat(location.getJmsUri(), is("jms:topic:people.event?timeToLive=1000"));
+ assertThat(location.getRestUri(), is("http://localhost:8080/people/event-source-api/rest"));
+ }
+
+ private SubscriptionDescriptor assertSubscriptionDescriptor(SubscriptionDescriptor subscriptionDescriptor) {
+ assertThat(subscriptionDescriptor.getService(), is("examplecontext"));
+ assertThat(subscriptionDescriptor.getServiceComponent(), is("EVENT_LISTENER"));
+ assertThat(subscriptionDescriptor.getSpecVersion(), is("1.0.0"));
+ return subscriptionDescriptor;
+ }
+
+ private void assertExampleEvents(Subscription subscription) {
+ final List events = subscription.getEvents();
+ assertThat(events.size(), is(2));
+ assertThat(events.get(0).getName(), is("example.recipe-added"));
+ assertThat(events.get(0).getSchemaUri(), is("http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json"));
+ assertThat(events.get(1).getName(), is("example.recipe-deleted"));
+ assertThat(events.get(1).getSchemaUri(), is("http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json"));
+ }
+
+ private void assertPeopleEvents(Subscription subscription) {
+ final List events = subscription.getEvents();
+ assertThat(events.size(), is(2));
+ assertThat(events.get(0).getName(), is("people.person-added"));
+ assertThat(events.get(0).getSchemaUri(), is("http://justice.gov.uk/json/schemas/domains/people/people.person-added.json"));
+ assertThat(events.get(1).getName(), is("people.person-removed"));
+ assertThat(events.get(1).getSchemaUri(), is("http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json"));
+ }
+
+ @Test
+ public void shouldThrowFileNotFoundException() {
+ final List paths = asList(get("no-subscription.yaml"));
+ try {
+ final Collection result = parser.parse(baseDir, paths);
+ fail();
+ } catch (RuntimeException re) {
+ assertThat(re.getCause(), is(instanceOf(FileNotFoundException.class)));
+ }
+ }
+}
\ No newline at end of file
diff --git a/subscription-descriptor-parser/src/test/resources/incorrect-subscription.yaml b/subscription-descriptor-parser/src/test/resources/incorrect-subscription.yaml
new file mode 100644
index 0000000..4534c54
--- /dev/null
+++ b/subscription-descriptor-parser/src/test/resources/incorrect-subscription.yaml
@@ -0,0 +1,30 @@
+---
+subscription_descriptor:
+ spec_version: 1.0.0
+ service: examplecontext
+ service_component: EVENT_LISTENER
+ subscriptions1:
+ - name: subscription1
+ events:
+ - name: example.recipe-added
+ schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json
+ - name: example.recipe-deleted
+ schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json
+ eventsource:
+ name: examplecontext
+ location:
+ jms_uri: jms:topic:example.event?timeToLive=1000
+ rest_uri: http://localhost:8080/example/event-source-api/rest
+ - name: subscription2
+ events:
+ - name: people.person-added
+ schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json
+ - name: people.person-removed
+ schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json
+
+ eventsource:
+ name: people
+ location:
+ jms_uri: jms:topic:people.event?timeToLive=1000
+ rest_uri: http://localhost:8080/people/event-source-api/rest
+...
\ No newline at end of file
diff --git a/subscription-descriptor-parser/src/test/resources/subscription.yaml b/subscription-descriptor-parser/src/test/resources/subscription.yaml
new file mode 100644
index 0000000..f987c84
--- /dev/null
+++ b/subscription-descriptor-parser/src/test/resources/subscription.yaml
@@ -0,0 +1,30 @@
+---
+subscription_descriptor:
+ spec_version: 1.0.0
+ service: examplecontext
+ service_component: EVENT_LISTENER
+ subscriptions:
+ - name: subscription1
+ events:
+ - name: example.recipe-added
+ schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json
+ - name: example.recipe-deleted
+ schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json
+ eventsource:
+ name: examplecontext
+ location:
+ jms_uri: jms:topic:example.event?timeToLive=1000
+ rest_uri: http://localhost:8080/example/event-source-api/rest
+ - name: subscription2
+ events:
+ - name: people.person-added
+ schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json
+ - name: people.person-removed
+ schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json
+
+ eventsource:
+ name: people
+ location:
+ jms_uri: jms:topic:people.event?timeToLive=1000
+ rest_uri: http://localhost:8080/people/event-source-api/rest
+...
\ No newline at end of file