Skip to content

Commit 23e6976

Browse files
authored
Implemented routing key for eiffel messages in REMReM semantics (#49)
* Implemented routing key for eiffel messages in REMReM semantics * Added logs and changed getting the domainId logic for routing key * Added method to get event type * Uplifted eiffel-remrem-protocol-interface to 0.0.5 * Added comment * changed log message * Changed static methods to normal methods in Event class * Added tag validation
1 parent 8b0c408 commit 23e6976

File tree

6 files changed

+94
-30
lines changed

6 files changed

+94
-30
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 0.3.0
2+
- Implemented routing key for eiffel messages in REMReM semantics.
3+
14
## 0.2.9
25
- Implemented functionality to accept case insensitive eventType while generating events
36

build.gradle

+2-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ jar {
6464

6565
shadowJar {
6666
baseName = 'eiffel-remrem-semantics'
67-
version = '0.2.8'
67+
version = '0.3.0'
6868
classifier = ''
6969
}
7070

@@ -93,8 +93,7 @@ repositories {
9393
install.dependsOn shadowJar
9494

9595
dependencies {
96-
compile 'com.github.Ericsson:eiffel-remrem-shared:0.2.0'
97-
compile 'com.github.Ericsson:eiffel-remrem-protocol-interface:0.0.1'
96+
compile 'com.github.Ericsson:eiffel-remrem-protocol-interface:0.0.5'
9897
compile('com.github.fge:json-schema-validator:2.2.6')
9998
{
10099
// we need to exclude jackson-databind here and add a

src/main/java/com/ericsson/eiffel/remrem/semantics/RoutingKeyTypes.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import com.ericsson.eiffel.remrem.semantics.schemas.EiffelConstants;
1818

1919
public enum RoutingKeyTypes {
20-
21-
EiffelActivityCanceledEvent(EiffelConstants.ACTIVITY, "canceled"),
20+
21+
EiffelActivityCanceledEvent(EiffelConstants.ACTIVITY, "canceled"),
2222
EiffelActivityFinishedEvent(EiffelConstants.ACTIVITY,"finished"),
2323
EiffelActivityStartedEvent(EiffelConstants.ACTIVITY,"started"),
2424
EiffelActivityTriggeredEvent(EiffelConstants.ACTIVITY,"triggered"),
@@ -33,24 +33,26 @@ public enum RoutingKeyTypes {
3333
EiffelIssueVerifiedEvent(EiffelConstants.TEST,"issueverified"),
3434
EiffelSourceChangeCreatedEvent(EiffelConstants.CM,"scmchange"),
3535
EiffelSourceChangeSubmittedEvent(EiffelConstants.CM,"scmproposedchange"),
36+
EiffelTestCaseCanceledEvent(EiffelConstants.TEST,"casecanceled"),
37+
EiffelTestCaseTriggeredEvent(EiffelConstants.TEST,"casetriggered"),
3638
EiffelTestCaseFinishedEvent(EiffelConstants.TEST,"casefinished"),
3739
EiffelTestCaseStartedEvent(EiffelConstants.TEST,"casestarted"),
3840
EiffelTestSuiteFinishedEvent(EiffelConstants.TEST,"suitefinished"),
3941
EiffelTestSuiteStartedEvent(EiffelConstants.TEST,"suitestarted"),
4042
EiffelTestExecutionRecipeCollectionCreatedEvent(EiffelConstants.TEST,"execution");
41-
43+
4244
private final String family; // family
43-
private final String type; // type
44-
45+
private final String type; // type
46+
4547
RoutingKeyTypes(String family, String type) {
4648
this.family = family;
4749
this.type = type;
4850
}
49-
51+
5052
public String getFamily() {
5153
return family;
5254
}
53-
55+
5456
public String getType() {
5557
return type;
5658
}

src/main/java/com/ericsson/eiffel/remrem/semantics/SemanticsService.java

+67-7
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
import javax.inject.Named;
4545

46+
import org.apache.commons.lang3.StringUtils;
4647
import org.slf4j.Logger;
4748
import org.slf4j.LoggerFactory;
4849

@@ -92,8 +93,13 @@ public class SemanticsService implements MsgService {
9293
private static final String ID = "id";
9394
private static final String META = "meta";
9495
private static final String TYPE = "type";
96+
private static final String SOURCE = "source";
97+
private static final String DOMAIN_ID = "domainId";
98+
private static final String PROTOCOL = "eiffel";
99+
private static final String DOT = ".";
95100
private final ArrayList<String> supportedEventTypes = new ArrayList<String>();
96101
public static final Logger log = LoggerFactory.getLogger(SemanticsService.class);
102+
private Event event = new Event();
97103

98104
private static Gson gson = new Gson();
99105
private static Map<EiffelEventType, Class<? extends Event>> eventTypes = SemanticsService.eventType();
@@ -224,21 +230,37 @@ public String getInputEventType(JsonObject json) {
224230
}
225231

226232
@Override
227-
public String getFamily(JsonObject eiffelMessage) {
233+
public String getEventType(JsonObject json) {
234+
if (json.isJsonObject() && json.getAsJsonObject().has(META) && json.getAsJsonObject()
235+
.getAsJsonObject(META).has(TYPE)) {
236+
return json.getAsJsonObject().getAsJsonObject(META)
237+
.get(TYPE).getAsString();
238+
}
239+
return null;
240+
}
241+
242+
/**
243+
* Returns Family Routing Key Word from the messaging library based on the eiffel message eventType.
244+
* @param JsonObject eiffelMessage
245+
* @return family routing key word in String format.
246+
*/
247+
private String getFamily(JsonObject eiffelMessage) {
228248
if (eiffelMessage.isJsonObject() && eiffelMessage.getAsJsonObject().has(META)
229249
&& eiffelMessage.getAsJsonObject().getAsJsonObject(META).has(TYPE)) {
230-
return Event
231-
.getFamilyRoutingKey(eiffelMessage.getAsJsonObject().getAsJsonObject(META).get(TYPE).getAsString());
250+
return event.getFamilyRoutingKey(eiffelMessage.getAsJsonObject().getAsJsonObject(META).get(TYPE).getAsString());
232251
}
233252
return null;
234253
}
235254

236-
@Override
237-
public String getType(JsonObject eiffelMessage) {
255+
/**
256+
* Returns Type Routing Key Word from the messaging library based on the eiffel message eventType.
257+
* @param JsonObject eiffelMessage
258+
* @return type routing key word in String format.
259+
*/
260+
private String getType(JsonObject eiffelMessage) {
238261
if (eiffelMessage.isJsonObject() && eiffelMessage.getAsJsonObject().has(META)
239262
&& eiffelMessage.getAsJsonObject().getAsJsonObject(META).has(TYPE)) {
240-
return Event
241-
.getTypeRoutingKey(eiffelMessage.getAsJsonObject().getAsJsonObject(META).get(TYPE).getAsString());
263+
return event.getTypeRoutingKey(eiffelMessage.getAsJsonObject().getAsJsonObject(META).get(TYPE).getAsString());
242264
}
243265
return null;
244266
}
@@ -261,4 +283,42 @@ public ValidationResult validateMsg(String msgType, JsonObject jsonvalidateMessa
261283
}
262284
return validationResult;
263285
}
286+
287+
/**
288+
* Returns the domain Id from json formatted eiffel message.
289+
* @param eiffelMessage eiffel message in json format
290+
* @return the domainId from eiffelMessage if domainId not available then returns the null value
291+
*/
292+
private String getDomainId(JsonObject eiffelMessage) {
293+
if (eiffelMessage.isJsonObject() && eiffelMessage.getAsJsonObject().has(META) && eiffelMessage.getAsJsonObject()
294+
.getAsJsonObject(META).has(SOURCE) && eiffelMessage.getAsJsonObject()
295+
.getAsJsonObject(META).getAsJsonObject(SOURCE).has(DOMAIN_ID)) {
296+
return eiffelMessage.getAsJsonObject().getAsJsonObject(META).getAsJsonObject(SOURCE)
297+
.get(DOMAIN_ID).getAsString();
298+
}
299+
return null;
300+
}
301+
302+
@Override
303+
public String generateRoutingKey(JsonObject eiffelMessage, String tag, String domain, String userDomainSuffix) {
304+
String family = getFamily(eiffelMessage);
305+
String type = getType(eiffelMessage);
306+
if (StringUtils.isNotEmpty(family) && StringUtils.isNotEmpty(type)) {
307+
if (StringUtils.isNotBlank(tag) && (tag.contains(".") || StringUtils.deleteWhitespace(tag).length() > 16)) {
308+
log.error("tag must not contain any dots and must not exceed 16 characters");
309+
return null;
310+
}
311+
String domainId = getDomainId(eiffelMessage);
312+
//If domainId from input message is null then configured domain will be considered
313+
domainId = StringUtils.defaultIfBlank(domainId, domain);
314+
if(StringUtils.isNotBlank(domainId)) {
315+
if (StringUtils.isNotBlank(userDomainSuffix)) {
316+
domainId = domainId + DOT + userDomainSuffix;
317+
}
318+
return StringUtils.deleteWhitespace(PROTOCOL + DOT + family + DOT + type + DOT + StringUtils.defaultIfBlank(tag, "notag") + DOT + domainId);
319+
}
320+
log.error("domain needed for Routing key generation in the format <protocol>.<family>.<type>.<tag>.<domain> is not provided in either input message or configuration");
321+
}
322+
return null;
323+
}
264324
}

src/main/java/com/ericsson/eiffel/semantics/events/Event.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public Meta generateMeta(Meta meta) {
2828
return meta;
2929
}
3030

31-
public static String getFamilyRoutingKey(String eventType) {
31+
public String getFamilyRoutingKey(String eventType) {
3232
try {
3333
return RoutingKeyTypes.valueOf(eventType).getFamily();
3434
} catch (Exception e) {
@@ -37,7 +37,7 @@ public static String getFamilyRoutingKey(String eventType) {
3737
return null;
3838
}
3939

40-
public static String getTypeRoutingKey(String eventType) {
40+
public String getTypeRoutingKey(String eventType) {
4141
try {
4242
return RoutingKeyTypes.valueOf(eventType).getType();
4343
} catch (Exception e) {

src/test/java/com/ericsson/eiffel/remrem/semantics/ServiceTest.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -306,44 +306,44 @@ public void validateMessage() {
306306
Assert.assertNotNull(msg);
307307
Assert.assertTrue(msg.isValid());
308308
}
309-
309+
310310
@Test
311-
public void testGetFamily() {
312-
URL url = getClass().getClassLoader().getResource("output/ActivityFinished.json");
311+
public void testGetEventType() {
312+
URL url = getClass().getClassLoader().getResource("output/ActivityFinished.json");
313313
String path = url.getPath().replace("%20"," ");
314314
File file = new File(path);
315315
JsonObject input;
316-
String family = null;
316+
String eventType = null;
317317
try {
318318
input = parser.parse(new FileReader(file)).getAsJsonObject();
319-
family = service.getFamily(input);
319+
eventType = service.getEventType(input);
320320
} catch (JsonIOException e) {
321321
e.printStackTrace();
322322
} catch (JsonSyntaxException e) {
323323
e.printStackTrace();
324324
} catch (FileNotFoundException e) {
325325
e.printStackTrace();
326326
}
327-
assertEquals("activity", family);
327+
assertEquals("EiffelActivityFinishedEvent", eventType);
328328
}
329329

330330
@Test
331-
public void testGetType() {
332-
URL url = getClass().getClassLoader().getResource("output/ActivityFinished.json");
331+
public void testGenerateRoutingKey() {
332+
URL url = getClass().getClassLoader().getResource("output/ActivityFinished.json");
333333
String path = url.getPath().replace("%20"," ");
334334
File file = new File(path);
335335
JsonObject input;
336-
String type = null;
336+
String routingKey = null;
337337
try {
338338
input = parser.parse(new FileReader(file)).getAsJsonObject();
339-
type = service.getType(input);
339+
routingKey = service.generateRoutingKey(input, null, null, null);
340340
} catch (JsonIOException e) {
341341
e.printStackTrace();
342342
} catch (JsonSyntaxException e) {
343343
e.printStackTrace();
344344
} catch (FileNotFoundException e) {
345345
e.printStackTrace();
346346
}
347-
assertEquals("finished", type);
347+
assertEquals("eiffel.activity.finished.notag.domainID", routingKey);
348348
}
349349
}

0 commit comments

Comments
 (0)