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