Skip to content
This repository was archived by the owner on Aug 13, 2020. It is now read-only.

Commit f76e01b

Browse files
authored
Merge pull request #419 from CJSCommonPlatform/messaging-client-classname
Allow any base URI for messaging client class names
2 parents 70e51a4 + 5c2d3e5 commit f76e01b

File tree

15 files changed

+175
-108
lines changed

15 files changed

+175
-108
lines changed
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,20 @@
1010
import java.util.regex.Pattern;
1111

1212
/**
13-
* Parses Raml base uri and exposes it's parts through accessor methods
13+
* Parses RAML base URI for adapters, and exposes it's parts through accessor methods.
14+
*
15+
* This class enforces the framework conventions for service component names and should be
16+
* deprecated at some point in favour of discovering the service component through configuration.
1417
*/
15-
public class MessagingBaseUri {
18+
public class MessagingAdapterBaseUri {
1619

1720
private static final Pattern MESSAGING_BASE_URI_PATTERN
1821
= Pattern.compile("message://(event|command|query)/(api|controller|handler|listener|processor)/\\S+/(\\S+)");
1922
private final String tier;
2023
private final String pillar;
2124
private final String service;
2225

23-
public MessagingBaseUri(final String uriString) {
26+
public MessagingAdapterBaseUri(final String uriString) {
2427
final Matcher m = matcherOf(uriString);
2528
m.find();
2629
this.pillar = m.group(1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package uk.gov.justice.services.generators.commons.helper;
2+
3+
import static java.lang.String.format;
4+
import static uk.gov.justice.services.generators.commons.helper.Names.buildJavaFriendlyName;
5+
6+
import java.util.regex.Matcher;
7+
import java.util.regex.Pattern;
8+
9+
/**
10+
* Parses RAML base URI for messaging client generation and exposes it's parts through accessor methods
11+
*/
12+
public class MessagingClientBaseUri {
13+
14+
private static final Pattern MESSAGING_BASE_URI_PATTERN = Pattern.compile("message://(.+)");
15+
private final String uriExcludingProtocol;
16+
17+
public MessagingClientBaseUri(final String uriString) {
18+
final Matcher m = matcherOf(uriString);
19+
if(m.find()) {
20+
this.uriExcludingProtocol = m.group(1);
21+
} else {
22+
throw new IllegalArgumentException(format("Base URI %s does not match message://(.+) pattern", uriString));
23+
}
24+
}
25+
26+
/**
27+
* Checks if the uri adheres to framework's standard
28+
*
29+
* @param uriString - uri to validate
30+
* @return true is uri adheres to framework's standard, false otherwise
31+
*/
32+
public static boolean valid(final String uriString) {
33+
return matcherOf(uriString).matches();
34+
}
35+
36+
private static Matcher matcherOf(final String uriString) {
37+
return MESSAGING_BASE_URI_PATTERN.matcher(uriString);
38+
}
39+
40+
/**
41+
* Returns a camel case class name with all invalid characters removed
42+
*
43+
* @return camel case string with all invalid characters removed.
44+
*/
45+
public String toClassName() {
46+
return buildJavaFriendlyName(uriExcludingProtocol);
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package uk.gov.justice.services.generators.commons.helper;
2+
3+
import static org.hamcrest.core.Is.is;
4+
import static org.junit.Assert.assertFalse;
5+
import static org.junit.Assert.assertThat;
6+
import static org.junit.Assert.assertTrue;
7+
import static uk.gov.justice.services.core.annotation.Component.EVENT_LISTENER;
8+
import static uk.gov.justice.services.core.annotation.Component.EVENT_PROCESSOR;
9+
10+
import org.junit.Test;
11+
12+
public class MessagingAdapterBaseUriTest {
13+
@Test
14+
public void shouldReturnTier() throws Exception {
15+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/service1").tier(), is("listener"));
16+
assertThat(new MessagingAdapterBaseUri("message://event/processor/message/service2").tier(), is("processor"));
17+
}
18+
19+
@Test
20+
public void shouldReturnPillar() throws Exception {
21+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/service1").pillar(), is("event"));
22+
assertThat(new MessagingAdapterBaseUri("message://command/handler/message/service2").pillar(), is("command"));
23+
}
24+
25+
@Test
26+
public void shouldReturnService() throws Exception {
27+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/service1").service(), is("service1"));
28+
assertThat(new MessagingAdapterBaseUri("message://command/handler/message/service2").service(), is("service2"));
29+
}
30+
31+
@Test
32+
public void shouldReturnAdapterClientId() {
33+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/service1").adapterClientId(), is("service1.event.listener"));
34+
assertThat(new MessagingAdapterBaseUri("message://event/processor/message/service2").adapterClientId(), is("service2.event.processor"));
35+
}
36+
37+
@Test
38+
public void shouldReturnTrueIfValidBaseUri() {
39+
assertTrue(MessagingAdapterBaseUri.valid("message://event/listener/message/service1"));
40+
assertTrue(MessagingAdapterBaseUri.valid("message://event/processor/message/service2"));
41+
assertTrue(MessagingAdapterBaseUri.valid("message://command/controller/message/service2"));
42+
}
43+
44+
@Test
45+
public void shouldReturnTrueIfNotValidBaseUri() {
46+
assertFalse(MessagingAdapterBaseUri.valid("message://INVALID/listener/message/service1"));
47+
assertFalse(MessagingAdapterBaseUri.valid("message://event/INVALID/message/service2"));
48+
assertFalse(MessagingAdapterBaseUri.valid("message://command/controller/message"));
49+
}
50+
51+
52+
@Test
53+
public void shouldReturnComponent() {
54+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/service1").component(), is(EVENT_LISTENER));
55+
assertThat(new MessagingAdapterBaseUri("message://event/processor/message/service2").component(), is(EVENT_PROCESSOR));
56+
}
57+
58+
@Test
59+
public void shouldReturnClassName() {
60+
assertThat(new MessagingAdapterBaseUri("message://event/listener/message/system").toClassName(), is("SystemEventListener"));
61+
}
62+
}

generators/generators-commons/src/test/java/uk/gov/justice/services/generators/commons/helper/MessagingBaseUriTest.java

Lines changed: 0 additions & 64 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package uk.gov.justice.services.generators.commons.helper;
2+
3+
import static org.hamcrest.core.Is.is;
4+
import static org.junit.Assert.assertThat;
5+
6+
import org.junit.Test;
7+
8+
/**
9+
* Unit test for the {@link MessagingClientBaseUri} class.
10+
*/
11+
public class MessagingClientBaseUriTest {
12+
13+
@Test
14+
public void shouldReturnClassName() {
15+
assertThat(new MessagingClientBaseUri("message://event/listener/message/system").toClassName(), is("EventListenerMessageSystem"));
16+
}
17+
18+
@Test(expected = IllegalArgumentException.class)
19+
public void shouldThrowExceptionForInvalidUri() {
20+
new MessagingClientBaseUri("blah").toClassName();
21+
}
22+
}

generators/messaging-adapter-generator/src/main/java/uk/gov/justice/raml/jms/core/EventFilterCodeGenerator.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package uk.gov.justice.raml.jms.core;
22

3-
43
import static com.squareup.javapoet.AnnotationSpec.builder;
54
import static com.squareup.javapoet.MethodSpec.constructorBuilder;
65
import static com.squareup.javapoet.TypeSpec.classBuilder;
76
import static java.lang.String.format;
87
import static javax.lang.model.element.Modifier.PUBLIC;
98
import static uk.gov.justice.raml.jms.core.MediaTypesUtil.mediaTypesFrom;
109
import static uk.gov.justice.services.generators.commons.helper.Names.DEFAULT_ANNOTATION_PARAMETER;
11-
import static uk.gov.justice.services.generators.commons.helper.Names.buildJavaFriendlyName;
1210
import static uk.gov.justice.services.generators.commons.helper.Names.namesListStringFrom;
1311

14-
import uk.gov.justice.services.generators.commons.helper.MessagingBaseUri;
1512
import uk.gov.justice.services.event.buffer.api.AbstractEventFilter;
13+
import uk.gov.justice.services.generators.commons.helper.MessagingAdapterBaseUri;
1614

1715
import javax.annotation.Priority;
1816
import javax.enterprise.context.ApplicationScoped;
@@ -23,7 +21,7 @@
2321

2422
class EventFilterCodeGenerator {
2523

26-
TypeSpec generatedCodeFor(final Resource resource, final MessagingBaseUri baseUri) {
24+
TypeSpec generatedCodeFor(final Resource resource, final MessagingAdapterBaseUri baseUri) {
2725
return classBuilder(classNameOf(baseUri))
2826
.addModifiers(PUBLIC)
2927
.superclass(AbstractEventFilter.class)
@@ -42,9 +40,7 @@ TypeSpec generatedCodeFor(final Resource resource, final MessagingBaseUri baseUr
4240
* @param baseUri URI String to convert
4341
* @return camel case class name
4442
*/
45-
private String classNameOf(final MessagingBaseUri baseUri) {
46-
return format("%sEventFilter", buildJavaFriendlyName(baseUri.service()));
43+
private String classNameOf(final MessagingAdapterBaseUri baseUri) {
44+
return format("%sEventFilter", baseUri.toClassName());
4745
}
48-
49-
5046
}

generators/messaging-adapter-generator/src/main/java/uk/gov/justice/raml/jms/core/JmsEndpointGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import uk.gov.justice.raml.core.Generator;
99
import uk.gov.justice.raml.core.GeneratorConfig;
10-
import uk.gov.justice.services.generators.commons.helper.MessagingBaseUri;
10+
import uk.gov.justice.services.generators.commons.helper.MessagingAdapterBaseUri;
1111
import uk.gov.justice.raml.jms.validator.BaseUriRamlValidator;
1212
import uk.gov.justice.services.generators.commons.validator.CompositeRamlValidator;
1313
import uk.gov.justice.services.generators.commons.validator.ContainsActionsRamlValidator;
@@ -59,7 +59,7 @@ public void run(final Raml raml, final GeneratorConfig configuration) {
5959

6060

6161
private Stream<? extends TypeSpec> generatedClassesFrom(final Raml raml, final Resource resource, final GeneratorConfig configuration) {
62-
final MessagingBaseUri baseUri = new MessagingBaseUri(raml.getBaseUri());
62+
final MessagingAdapterBaseUri baseUri = new MessagingAdapterBaseUri(raml.getBaseUri());
6363
final boolean listenToAllMessages = shouldListenToAllMessages(resource, baseUri);
6464

6565
final TypeSpec messageListenerCode = messageListenerCodeGenerator.generatedCodeFor(resource, baseUri, listenToAllMessages, configuration);
@@ -79,11 +79,11 @@ private Stream<? extends TypeSpec> generatedClassesFrom(final Raml raml, final R
7979
therefore we need all messages with consecutive numbers there. Messages need to be in correct order in order to update the view correctly.
8080
*/
8181

82-
private boolean shouldGenerateEventFilter(final Resource resource, final MessagingBaseUri baseUri) {
82+
private boolean shouldGenerateEventFilter(final Resource resource, final MessagingAdapterBaseUri baseUri) {
8383
return EVENT_LISTENER.equals(baseUri.component()) && !containsGeneralJsonMimeType(resource.getActions());
8484
}
8585

86-
private boolean shouldListenToAllMessages(final Resource resource, final MessagingBaseUri baseUri) {
86+
private boolean shouldListenToAllMessages(final Resource resource, final MessagingAdapterBaseUri baseUri) {
8787
return EVENT_LISTENER.equals(baseUri.component()) || containsGeneralJsonMimeType(resource.getActions());
8888
}
8989

generators/messaging-adapter-generator/src/main/java/uk/gov/justice/raml/jms/core/MessageListenerCodeGenerator.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import static uk.gov.justice.services.generators.commons.helper.Names.namesListStringFrom;
1212

1313
import uk.gov.justice.raml.core.GeneratorConfig;
14-
import uk.gov.justice.services.generators.commons.helper.MessagingBaseUri;
14+
import uk.gov.justice.services.generators.commons.helper.MessagingAdapterBaseUri;
1515
import uk.gov.justice.services.adapter.messaging.JmsLoggerMetadataInterceptor;
1616
import uk.gov.justice.services.adapter.messaging.JmsProcessor;
1717
import uk.gov.justice.services.adapter.messaging.JsonSchemaValidationInterceptor;
@@ -78,7 +78,7 @@ class MessageListenerCodeGenerator {
7878
* @param baseUri the base URI
7979
* @return the message listener class specification
8080
*/
81-
TypeSpec generatedCodeFor(final Resource resource, final MessagingBaseUri baseUri, final boolean listenToAllMessages, final GeneratorConfig configuration) {
81+
TypeSpec generatedCodeFor(final Resource resource, final MessagingAdapterBaseUri baseUri, final boolean listenToAllMessages, final GeneratorConfig configuration) {
8282
return classSpecFrom(resource, baseUri, listenToAllMessages, configuration)
8383
.addMethod(generateOnMessageMethod())
8484
.build();
@@ -93,7 +93,7 @@ TypeSpec generatedCodeFor(final Resource resource, final MessagingBaseUri baseUr
9393
* @return the {@link TypeSpec.Builder} that defines the class
9494
*/
9595
private TypeSpec.Builder classSpecFrom(final Resource resource,
96-
final MessagingBaseUri baseUri,
96+
final MessagingAdapterBaseUri baseUri,
9797
final boolean listenToAllMessages,
9898
final GeneratorConfig generatorConfiguration) {
9999
final MessagingResourceUri resourceUri = new MessagingResourceUri(resource.getUri());
@@ -180,7 +180,7 @@ private MethodSpec generateOnMessageMethod() {
180180
private AnnotationSpec messageDrivenAnnotation(final String component,
181181
final Map<ActionType, Action> actions,
182182
final MessagingResourceUri resourceUri,
183-
final MessagingBaseUri baseUri, final boolean listenToAllMessages) {
183+
final MessagingAdapterBaseUri baseUri, final boolean listenToAllMessages) {
184184

185185
final Class<? extends Destination> inputType = componentDestinationType.inputTypeFor(component);
186186

@@ -233,7 +233,7 @@ private AnnotationSpec generateActivationConfigPropertyAnnotation(final String n
233233
* @param baseUri URI String to convert
234234
* @return camel case class name
235235
*/
236-
private String classNameOf(final MessagingBaseUri baseUri, final MessagingResourceUri resourceUri) {
236+
private String classNameOf(final MessagingAdapterBaseUri baseUri, final MessagingResourceUri resourceUri) {
237237
return format("%s%sJmsListener", baseUri.toClassName(), resourceUri.toClassName());
238238
}
239239

@@ -243,7 +243,7 @@ private String classNameOf(final MessagingBaseUri baseUri, final MessagingResour
243243
* @param baseUri base uri of the resource
244244
* @return component the value of the pillar and tier parts of the uri
245245
*/
246-
private String componentOf(final MessagingBaseUri baseUri) {
246+
private String componentOf(final MessagingAdapterBaseUri baseUri) {
247247
return Component.valueOf(baseUri.pillar(), baseUri.tier());
248248
}
249249

generators/messaging-adapter-generator/src/main/java/uk/gov/justice/raml/jms/validator/BaseUriRamlValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static java.lang.String.format;
44
import static org.apache.commons.lang3.StringUtils.isEmpty;
55

6-
import uk.gov.justice.services.generators.commons.helper.MessagingBaseUri;
6+
import uk.gov.justice.services.generators.commons.helper.MessagingAdapterBaseUri;
77
import uk.gov.justice.services.generators.commons.validator.RamlValidationException;
88
import uk.gov.justice.services.generators.commons.validator.RamlValidator;
99

@@ -21,7 +21,7 @@ public void validate(final Raml raml) {
2121
if (isEmpty(raml.getBaseUri())) {
2222
throw new RamlValidationException(BASE_URI_NOT_SET_MSG);
2323
}
24-
if (!MessagingBaseUri.valid(raml.getBaseUri())) {
24+
if (!MessagingAdapterBaseUri.valid(raml.getBaseUri())) {
2525
throw new RamlValidationException(format(ERROR_MSG, raml.getBaseUri()));
2626
}
2727
}

generators/messaging-adapter-generator/src/test/java/uk/gov/justice/raml/jms/core/JmsEndpointGenerator_EventFilterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void shouldGenerateEventFilterForEventListener() throws Exception {
5757
.build(),
5858
configurationWithBasePackage(BASE_PACKAGE, outputFolder, emptyMap()));
5959

60-
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "StructureEventFilter");
60+
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "StructureEventListenerEventFilter");
6161

6262
final AbstractEventFilter eventFilter = (AbstractEventFilter) clazz.newInstance();
6363

@@ -109,7 +109,7 @@ public void shouldAddDIAnnotations() throws Exception {
109109
.build(),
110110
configurationWithBasePackage(BASE_PACKAGE, outputFolder, emptyMap()));
111111

112-
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "StructureEventFilter");
112+
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "StructureEventListenerEventFilter");
113113
assertThat(clazz.getAnnotation(ApplicationScoped.class), is(not(nullValue())));
114114
assertThat(clazz.getAnnotation(Alternative.class), is(not(nullValue())));
115115
final Priority priorityAnnotation = clazz.getAnnotation(Priority.class);
@@ -129,7 +129,7 @@ public void shouldGenerateEventFilterIfBaseUriContainsSpecialCharacters() throws
129129
.build(),
130130
configurationWithBasePackage(BASE_PACKAGE, outputFolder, emptyMap()));
131131

132-
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "MyHyphenatedServiceEventFilter");
132+
Class<?> clazz = compiler.compiledClassOf(BASE_PACKAGE, "MyHyphenatedServiceEventListenerEventFilter");
133133

134134
final AbstractEventFilter eventFilter = (AbstractEventFilter) clazz.newInstance();
135135

0 commit comments

Comments
 (0)