Skip to content

Commit a93b186

Browse files
Introduce mongo query interface (#377)
* Fix bug JsonNode.toString() will return a string including quotes which will break the code * Add first version of conditions class * Refactor to satic methods * Add javadoc and improve code * Update MongoDBHandler to use MongoQuery instead of string * Update code to use MongoQuery * Add subscriptionName condition * Remove unused code/test and add TODO * Move mongo classes to own package * Create a MongoQueryBuilder * Add lock condition * Add or query and append possiblity - Add a buildOr on MongoQueryBuilder to build or querys - Possibility to append MongoConditions to a MongoQueryBuilder * Change to allways use MongoQuery for queries * Use MongoQuery and builder in ObjectHandler * Use MongoQuery * Remove todo * Fix bug and improve tests * Change id to _id * Add test and rename test methods * Add posibility to stop worklist worker * Update MongoDB to give more error messages * Fix tests * Remove previously added upcheck * Change to correct condition * Fix codacy issues * Fix Codacy issue * Simplify error logging * Add final and fix javadoc * Add wait for events to appear in database * Fix review comments
1 parent f0722ff commit a93b186

File tree

45 files changed

+1312
-490
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1312
-490
lines changed

src/functionaltests/java/com/ericsson/ei/notifications/trigger/SubscriptionNotificationSteps.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232

3333
import com.dumbster.smtp.SimpleSmtpServer;
3434
import com.dumbster.smtp.SmtpMessage;
35-
import com.ericsson.ei.handlers.MongoDBHandler;
35+
import com.ericsson.ei.mongo.MongoCondition;
36+
import com.ericsson.ei.mongo.MongoDBHandler;
3637
import com.ericsson.ei.utils.FunctionalTestBase;
3738
import com.ericsson.ei.utils.HttpRequest;
3839
import com.fasterxml.jackson.databind.JsonNode;
@@ -208,7 +209,7 @@ public void missed_notification_db_should_contain_x_objects(int maxObjectsInDB)
208209
int minWaitTime = 5;
209210
int maxWaittime = 20;
210211

211-
String condition = "{}";
212+
final MongoCondition condition = MongoCondition.emptyCondition();
212213
int missedNotifications = getDbSizeForCondition(minWaitTime, maxWaittime, maxObjectsInDB, condition);
213214

214215
assertEquals(missedNotifications, maxObjectsInDB);
@@ -435,14 +436,15 @@ private String replaceTagsInNotificationMeta(String text) {
435436
* @return
436437
* @throws InterruptedException
437438
*/
438-
private int getDbSizeForCondition(int minWaitTime, int maxWaitTime, int expectedSize, String condition)
439+
private int getDbSizeForCondition(int minWaitTime, int maxWaitTime, int expectedSize, MongoCondition condition)
439440
throws InterruptedException {
440441
TimeUnit.SECONDS.sleep(minWaitTime);
441442
long maxTime = System.currentTimeMillis() + maxWaitTime;
442443
List<String> queryResult = null;
443444

444445
while (System.currentTimeMillis() < maxTime) {
445-
queryResult = mongoDBHandler.find(failedNotificationDatabase, failedNotificationCollection, condition);
446+
queryResult = mongoDBHandler.find(failedNotificationDatabase,
447+
failedNotificationCollection, condition);
446448

447449
if (queryResult.size() == expectedSize) {
448450
return queryResult.size();

src/functionaltests/java/com/ericsson/ei/notifications/ttl/TestTTLSteps.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
import org.springframework.util.SocketUtils;
2727

2828
import com.ericsson.ei.exception.AuthenticationException;
29-
import com.ericsson.ei.handlers.MongoDBHandler;
29+
import com.ericsson.ei.mongo.MongoCondition;
30+
import com.ericsson.ei.mongo.MongoDBHandler;
3031
import com.ericsson.ei.notifications.InformSubscriber;
3132
import com.ericsson.ei.utils.FunctionalTestBase;
3233
import com.ericsson.ei.utils.HttpRequest;
@@ -137,8 +138,9 @@ public void verify_request_has_been_made() throws JSONException {
137138

138139
@Then("^Check failed notification is in database$")
139140
public void check_failed_notification_is_in_database() {
140-
String condition = "{\"subscriptionName\" : \"" + SUBSCRIPTION_NAME + "\"}";
141-
List<String> result = mongoDBHandler.find(failedNotificationDatabase, failedNotificationCollection, condition);
141+
final MongoCondition condition = MongoCondition.subscriptionNameCondition(SUBSCRIPTION_NAME);
142+
List<String> result = mongoDBHandler.find(failedNotificationDatabase,
143+
failedNotificationCollection, condition);
142144

143145
assertEquals(1, result.size());
144146
assertEquals("Could not find a missed notification matching the condition: " + condition,
@@ -184,7 +186,7 @@ public void aggregated_object_is_created() throws Throwable {
184186
public void a_failed_notification_is_created() throws Throwable {
185187
// verifying that missed notification is created and present in db
186188
int expectedSize = 1;
187-
String condition = "{\"subscriptionName\" : \"" + SUBSCRIPTION_NAME_3 + "\"}";
189+
final MongoCondition condition = MongoCondition.subscriptionNameCondition(SUBSCRIPTION_NAME_3);
188190

189191
LOGGER.debug("Checking presence of failed notification in db");
190192
int notificationExistSize = getNotificationForExpectedSize(expectedSize, condition);
@@ -194,7 +196,7 @@ public void a_failed_notification_is_created() throws Throwable {
194196
@Then("^Notification document should be deleted from the database$")
195197
public void the_Notification_document_should_be_deleted_from_the_database() throws Throwable {
196198
int expectedSize = 0;
197-
String condition = "{\"subscriptionName\" : \"" + SUBSCRIPTION_NAME_3 + "\"}";
199+
final MongoCondition condition = MongoCondition.subscriptionNameCondition(SUBSCRIPTION_NAME_3);
198200
LOGGER.debug("Checking deletion of notification document in db");
199201

200202
int notificationExistSize = getNotificationForExpectedSize(expectedSize, condition);
@@ -235,12 +237,13 @@ protected List<String> getEventNamesToSend() {
235237
return eventNames;
236238
}
237239

238-
private int getNotificationForExpectedSize(int expectedSize, String condition) {
240+
private int getNotificationForExpectedSize(int expectedSize, MongoCondition condition) {
239241
long maxTime = System.currentTimeMillis() + MAX_WAIT_TIME;
240242
List<String> notificationExist = null;
241243

242244
while (System.currentTimeMillis() < maxTime) {
243-
notificationExist = mongoDBHandler.find(failedNotificationDatabase, failedNotificationCollection,
245+
notificationExist = mongoDBHandler.find(failedNotificationDatabase,
246+
failedNotificationCollection,
244247
condition);
245248

246249
if (notificationExist.size() == expectedSize) {

src/functionaltests/java/com/ericsson/ei/query/QueryAggregatedObjectsTestSteps.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
import org.springframework.http.ResponseEntity;
2020
import org.springframework.test.context.TestPropertySource;
2121

22-
import com.ericsson.ei.handlers.MongoDBHandler;
22+
import com.ericsson.ei.mongo.MongoCondition;
23+
import com.ericsson.ei.mongo.MongoDBHandler;
2324
import com.ericsson.ei.utils.FunctionalTestBase;
2425
import com.ericsson.ei.utils.HttpRequest;
2526
import com.ericsson.ei.utils.HttpRequest.HttpMethod;
@@ -98,8 +99,9 @@ public QueryAggregatedObjectsTestSteps() {
9899

99100
@Given("^Aggregated object is created$")
100101
public void aggregated_object_is_created() throws Throwable {
102+
final MongoCondition condition = MongoCondition.idCondition("6acc3c87-75e0-4b6d-88f5-b1a5d4e62b43");
101103
List<String> aggregatedObject = mongoDBHandler.find(eiDatabaseName, aggrCollectionName,
102-
"{\"_id\": \"6acc3c87-75e0-4b6d-88f5-b1a5d4e62b43\"}");
104+
condition);
103105

104106
boolean aggregatedObjectExists = aggregatedObject.size() > 0;
105107
if (!aggregatedObjectExists) {
@@ -252,9 +254,10 @@ public void perform_a_query_for_missed_notification() throws Throwable {
252254
final String expectedTestCaseStartedEventId = "cb9d64b0-a6e9-4419-8b5d-a650c27c59ca";
253255

254256
LOGGER.debug("Check if FailedNotification and " + subscriptionName + " exist in Database");
255-
final String queryRequest = "{\"subscriptionName\":\"" + subscriptionName + "\"}";
257+
final MongoCondition queryRequest = MongoCondition.subscriptionNameCondition(subscriptionName);
256258
String subscriptionNameCheck = objMapper.readValue(
257-
mongoDBHandler.find(failedNotificationDatabaseName, failedNotificationCollectionName, queryRequest)
259+
mongoDBHandler.find(failedNotificationDatabaseName,
260+
failedNotificationCollectionName, queryRequest)
258261
.get(0),
259262
JsonNode.class).get("subscriptionName").asText();
260263
assertEquals("Expected subscriptionName in missed notification in Database is not as expected.",

src/functionaltests/java/com/ericsson/ei/subscriptions/repeatHandler/SubscriptionRepeatHandlerSteps.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
import org.springframework.test.context.TestPropertySource;
2222

2323
import com.ericsson.ei.controller.model.Subscription;
24-
import com.ericsson.ei.handlers.MongoDBHandler;
24+
import com.ericsson.ei.mongo.MongoCondition;
25+
import com.ericsson.ei.mongo.MongoDBHandler;
2526
import com.ericsson.ei.services.ISubscriptionService;
2627
import com.ericsson.ei.subscription.RunSubscription;
2728
import com.ericsson.ei.utils.FunctionalTestBase;
@@ -57,7 +58,7 @@ public class SubscriptionRepeatHandlerSteps extends FunctionalTestBase {
5758
private String subscriptionStrWithOneMatch;
5859
private String subscriptionStrWithTwoMatch;
5960
private String aggregatedObject;
60-
private String subscriptionIdMatchedAggrIdObjQuery;
61+
private MongoCondition subscriptionIdMatchedAggrIdObjQuery;
6162
private ObjectMapper mapper = new ObjectMapper();
6263

6364
@Value("${aggregated.collection.name}")
@@ -134,15 +135,16 @@ public void check_in_MongoDB_RepeatFlagHandler_collections_that_the_subscription
134135
List<String> resultRepeatFlagHandler = mongoDBHandler.find(dataBaseName, repeatFlagHandlerCollection,
135136
subscriptionIdMatchedAggrIdObjQuery);
136137
assertEquals("[]", resultRepeatFlagHandler.toString());
137-
String condition = "{\"_id\": \"" + AGGREGATED_OBJECT_ID + "\"}";
138+
final MongoCondition condition = MongoCondition.idCondition(AGGREGATED_OBJECT_ID);
138139
assertTrue(mongoDBHandler.dropDocument(dataBaseName, collectionName, condition));
139140
}
140141

141142
@When("^In MongoDb RepeatFlagHandler collection the subscription has matched the AggrObjectId at least two times$")
142143
public void in_MongoDb_RepeatFlagHandler_collection_the_subscription_has_matched_the_AggrObjectId_at_least_two_times()
143144
throws IOException {
144145
processSubscription(subscriptionStrWithTwoMatch, subscriptionWithTwoMatch);
145-
List<String> resultRepeatFlagHandler = mongoDBHandler.find(dataBaseName, repeatFlagHandlerCollection,
146+
List<String> resultRepeatFlagHandler = mongoDBHandler.find(dataBaseName,
147+
repeatFlagHandlerCollection,
146148
subscriptionIdMatchedAggrIdObjQuery);
147149
assertEquals(1, resultRepeatFlagHandler.size());
148150
assertEquals("\"" + AGGREGATED_OBJECT_ID + "\"", getAggregatedObjectId(resultRepeatFlagHandler, 0));
@@ -186,6 +188,7 @@ private void processSubscription(String subscriptionStrValue, JSONObject subscri
186188
Iterator<JsonNode> requirementIterator = requirementNode.elements();
187189
assertTrue(runSubscription.runSubscriptionOnObject(aggregatedObject, requirementIterator, subscriptionJson,
188190
AGGREGATED_OBJECT_ID));
189-
subscriptionIdMatchedAggrIdObjQuery = "{ \"subscriptionId\" : \"" + expectedSubscriptionName + "\"}";
191+
subscriptionIdMatchedAggrIdObjQuery = MongoCondition.subscriptionCondition(
192+
expectedSubscriptionName);
190193
}
191194
}

src/integrationtests/java/com/ericsson/ei/integrationtests/notification/FailedNotificationRunnerIT.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
"com.ericsson.ei.integrationtests.notification" }, plugin = { "pretty",
1212
"html:target/cucumber-reports/FailedNotificationRunnerIT" })
1313
public class FailedNotificationRunnerIT {
14+
public static final String FAILED_NOTIFICATION_COLLECTION = "failed_notification";
15+
1416
@BeforeClass
1517
public static void before() {
1618
System.setProperty("aggregated.collection.name", "aggregated_failed_notification");
@@ -19,7 +21,7 @@ public static void before() {
1921
System.setProperty("event_object_map.collection.name", "event_object_map_failed_notification");
2022
System.setProperty("subscription.collection.repeatFlagHandlerName",
2123
"subscription_repeat_handler_failed_notification");
22-
System.setProperty("failed.notification.collection-name", "missed_notification_failed_notification");
24+
System.setProperty("failed.notification.collection-name", FAILED_NOTIFICATION_COLLECTION);
2325
System.setProperty("sessions.collection.name", "sessions_failed_notification");
2426

2527
System.setProperty("rules.path", "/rules/ArtifactRules-Eiffel-Agen-Version.json");

src/integrationtests/java/com/ericsson/ei/integrationtests/notification/FailedNotificationStepsIT.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package com.ericsson.ei.integrationtests.notification;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotEquals;
45

56
import java.io.IOException;
67
import java.net.URISyntaxException;
78
import java.util.ArrayList;
89
import java.util.HashMap;
910
import java.util.List;
1011
import java.util.Map;
12+
import java.util.concurrent.TimeUnit;
1113

1214
import org.apache.http.client.ClientProtocolException;
1315
import org.json.JSONObject;
1416
import org.junit.Ignore;
1517
import org.junit.runner.RunWith;
18+
import org.springframework.beans.factory.annotation.Autowired;
1619
import org.springframework.boot.test.context.SpringBootContextLoader;
1720
import org.springframework.boot.test.context.SpringBootTest;
1821
import org.springframework.test.context.ContextConfiguration;
@@ -22,6 +25,8 @@
2225
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
2326

2427
import com.ericsson.ei.App;
28+
import com.ericsson.ei.mongo.MongoCondition;
29+
import com.ericsson.ei.mongo.MongoDBHandler;
2530
import com.ericsson.eiffelcommons.subscriptionobject.MailSubscriptionObject;
2631
import com.ericsson.eiffelcommons.subscriptionobject.RestPostSubscriptionObject;
2732
import com.ericsson.eiffelcommons.subscriptionobject.SubscriptionObject;
@@ -43,13 +48,19 @@
4348
@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class })
4449
@TestPropertySource(properties = { "spring.mail.port: 9999" })
4550
public class FailedNotificationStepsIT extends IntegrationTestBase {
51+
private static final int SECONDS_1 = 1000;
52+
private static final String FAILED_NOTIFICATION_DATABASE = "FailedNotification";
53+
private static final int SECONDS_30 = 30000;
4654
private String rulesFilePath;
4755
private String eventsFilePath;
4856
private ObjectMapper objectMapper = new ObjectMapper();
4957
private int extraEventsCount = 0;
5058

5159
private SubscriptionObject subscriptionObject;
5260

61+
@Autowired
62+
private MongoDBHandler mongoDBHandler;
63+
5364
@Given("^the rules \"([^\"]*)\"$")
5465
public void rules(String rulesFilePath) throws Throwable {
5566
this.rulesFilePath = rulesFilePath;
@@ -117,14 +128,29 @@ public void subscriptionIsUploaded()
117128

118129
@Then("^failed notification of type \"([^\"]*)\" should exist for subscription \"([^\"]*)\"$")
119130
public void failedNotificationShouldExist(String searchValue, String subscriptionName) throws Throwable {
131+
waitForDatabaseEntry(subscriptionName);
132+
120133
HttpRequest request = new HttpRequest(HttpMethod.GET);
121134
request.setBaseUrl("http://" + eiHost + ":" + port)
122135
.setEndpoint("/failed-notifications")
123136
.addParam("subscriptionName", subscriptionName);
124-
125137
ResponseEntity response = request.performRequest();
126-
String message = objectMapper.readTree(response.getBody()).get("queryResponseEntity").get("message").toString();
127-
assertEquals(true, message.contains(searchValue));
138+
139+
String body = response.getBody();
140+
assertNotEquals("Performed request but body was empty", "", body);
141+
String message = "";
142+
143+
// There was a lot errors in this area so I added more logging
144+
try {
145+
JsonNode messageNode = objectMapper.readTree(body).get("queryResponseEntity").get("message");
146+
assertNotEquals("No failed notifications found for " + subscriptionName, null,
147+
messageNode);
148+
message = messageNode.toString();
149+
} catch (NullPointerException e) {
150+
throw new IllegalArgumentException("Tried to parse json of "+ body);
151+
}
152+
153+
assertEquals("Did not contain a failed notification", true, message.contains(searchValue));
128154
}
129155

130156
@Override
@@ -155,4 +181,18 @@ protected List<String> getEventNamesToSend() throws IOException {
155181
eventNames.add("event_EiffelTestCaseTriggeredEvent_3");
156182
return eventNames;
157183
}
184+
185+
private void waitForDatabaseEntry(String subscriptionName) throws InterruptedException {
186+
final MongoCondition condition = MongoCondition.subscriptionNameCondition(subscriptionName);
187+
188+
long stopTime = System.currentTimeMillis() + SECONDS_30;
189+
ArrayList<String> find = new ArrayList<>(0);
190+
do {
191+
TimeUnit.MILLISECONDS.sleep(SECONDS_1);
192+
find = mongoDBHandler.find(FAILED_NOTIFICATION_DATABASE,
193+
FailedNotificationRunnerIT.FAILED_NOTIFICATION_COLLECTION, condition);
194+
} while (find.isEmpty() && stopTime > System.currentTimeMillis());
195+
}
196+
197+
158198
}

src/integrationtests/java/util/IntegrationTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import org.springframework.http.ResponseEntity;
3636
import org.springframework.test.context.support.AbstractTestExecutionListener;
3737

38-
import com.ericsson.ei.handlers.MongoDBHandler;
38+
import com.ericsson.ei.mongo.MongoDBHandler;
3939
import com.ericsson.ei.utils.HttpRequest;
4040
import com.ericsson.ei.utils.HttpRequest.HttpMethod;
4141
import com.fasterxml.jackson.databind.JsonNode;

src/main/java/com/ericsson/ei/handlers/EventToObjectMapHandler.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import org.springframework.stereotype.Component;
2727

2828
import com.ericsson.ei.jmespath.JmesPathInterface;
29+
import com.ericsson.ei.mongo.MongoCondition;
30+
import com.ericsson.ei.mongo.MongoDBHandler;
31+
import com.ericsson.ei.mongo.MongoStringQuery;
2932
import com.ericsson.ei.rules.RulesObject;
3033
import com.fasterxml.jackson.core.type.TypeReference;
3134
import com.fasterxml.jackson.databind.JsonNode;
@@ -83,15 +86,15 @@ public ArrayList<String> getObjectsForEventId(String eventId) {
8386

8487
public void updateEventToObjectMapInMemoryDB(RulesObject rulesObject, String event, String objectId) {
8588
String eventId = getEventId(rulesObject, event);
86-
String condition = "{\"_id\" : \"" + eventId + "\"}";
89+
final MongoCondition condition = MongoCondition.idCondition(eventId);
8790
ArrayList<String> list = getEventToObjectList(eventId);
8891
boolean firstTime = list.isEmpty();
8992
list = updateList(list, eventId, objectId);
9093
ObjectMapper mapper = new ObjectMapper();
9194
JsonNode entry = null;
9295

9396
try {
94-
entry = new ObjectMapper().readValue(condition, JsonNode.class);
97+
entry = new ObjectMapper().readValue(condition.toString(), JsonNode.class);
9598
ArrayNode jsonNode = mapper.convertValue(list, ArrayNode.class);
9699
((ObjectNode) entry).set(listPropertyName, mapper.readTree(jsonNode.toString()));
97100
String mapStr = entry.toString();
@@ -119,7 +122,7 @@ public ArrayList<String> updateList(ArrayList<String> list, String eventId, Stri
119122

120123
public ArrayList<String> getEventToObjectList(String eventId) {
121124
ArrayList<String> list = new ArrayList<String>();
122-
String condition = "{\"_id\" : \"" + eventId + "\"}";
125+
final MongoCondition condition = MongoCondition.idCondition(eventId);
123126
ArrayList<String> documents = mongodbhandler.find(databaseName, collectionName, condition);
124127
if (!documents.isEmpty()) {
125128
String mapStr = documents.get(0);
@@ -142,13 +145,14 @@ public ArrayList<String> getEventToObjectList(String eventId) {
142145
* @return boolean
143146
*/
144147
public boolean deleteEventObjectMap(String templateName) {
145-
String condition = "{\"objects\": { \"$in\" : [/.*" + templateName + "/]} }";
146-
LOGGER.info("The JSON condition for deleting aggregated object is : {}", condition);
147-
return mongodbhandler.dropDocument(databaseName, collectionName, condition);
148+
String queryString = "{\"objects\": { \"$in\" : [/.*" + templateName + "/]} }";
149+
MongoStringQuery query = new MongoStringQuery(queryString);
150+
LOGGER.info("The JSON query for deleting aggregated object is : {}", query);
151+
return mongodbhandler.dropDocument(databaseName, collectionName, query);
148152
}
149153

150154
public boolean isEventInEventObjectMap(String eventId) {
151-
String condition = "{\"_id\" : \"" + eventId + "\"}";
155+
final MongoCondition condition = MongoCondition.idCondition(eventId);
152156
List<String> documents = mongodbhandler.find(databaseName, collectionName, condition);
153157
return !documents.isEmpty();
154158
}

src/main/java/com/ericsson/ei/handlers/MatchIdRulesHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.springframework.beans.factory.annotation.Autowired;
2222
import org.springframework.stereotype.Component;
2323

24+
import com.ericsson.ei.mongo.MongoQuery;
25+
import com.ericsson.ei.mongo.MongoStringQuery;
2426
import com.ericsson.ei.rules.RulesObject;
2527

2628
@Component
@@ -31,7 +33,8 @@ public class MatchIdRulesHandler {
3133

3234
public List<String> fetchObjectsById(RulesObject ruleObject, String id) {
3335
String matchIdString = ruleObject.getMatchIdRules();
34-
String fetchQuery = replaceIdInRules(matchIdString, id);
36+
String fetchQueryString = replaceIdInRules(matchIdString, id);
37+
MongoQuery fetchQuery = new MongoStringQuery(fetchQueryString);
3538
List<String> objects = objHandler.findObjectsByCondition(fetchQuery);
3639
return objects;
3740
}

0 commit comments

Comments
 (0)