Skip to content

Commit 3a671cc

Browse files
authored
Fix ERQueryService URI build bug (#316)
- Before this change, it was needed to know if the erBaseUrl was ending with a "/" or not. With this change, it doesnt matter as the library from eiffel commons handles this.
1 parent a57cb79 commit 3a671cc

File tree

11 files changed

+227
-219
lines changed

11 files changed

+227
-219
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
<dependency>
7575
<groupId>com.github.eiffel-community</groupId>
7676
<artifactId>eiffel-commons</artifactId>
77-
<version>0.0.13</version>
77+
<version>0.0.15</version>
7878
</dependency>
7979

8080
<dependency>

src/main/java/com/ericsson/ei/erqueryservice/ERQueryService.java

Lines changed: 72 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,54 +14,49 @@
1414
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1515
See the License for the specific language governing permissions and
1616
limitations under the License.
17-
*/
17+
*/
1818
package com.ericsson.ei.erqueryservice;
1919

20-
import com.fasterxml.jackson.databind.JsonNode;
21-
import lombok.Getter;
20+
import java.net.MalformedURLException;
21+
import java.util.ArrayList;
22+
import java.util.Collections;
23+
import java.util.List;
24+
25+
import javax.annotation.PostConstruct;
26+
2227
import org.apache.commons.lang3.StringUtils;
28+
import org.apache.commons.lang3.exception.ExceptionUtils;
29+
import org.apache.http.entity.ContentType;
2330
import org.slf4j.Logger;
2431
import org.slf4j.LoggerFactory;
2532
import org.springframework.beans.factory.annotation.Value;
26-
import org.springframework.boot.web.client.RestTemplateBuilder;
27-
import org.springframework.http.HttpEntity;
28-
import org.springframework.http.HttpHeaders;
29-
import org.springframework.http.HttpMethod;
30-
import org.springframework.http.MediaType;
31-
import org.springframework.http.ResponseEntity;
3233
import org.springframework.stereotype.Component;
33-
import org.springframework.web.client.RestClientException;
34-
import org.springframework.web.client.RestOperations;
35-
import org.springframework.web.util.UriComponents;
36-
import org.springframework.web.util.UriComponentsBuilder;
3734

38-
import javax.annotation.PostConstruct;
39-
import java.net.URI;
40-
import java.util.ArrayList;
41-
import java.util.Collections;
42-
import java.util.List;
43-
import java.util.Map;
35+
import com.ericsson.eiffelcommons.utils.HttpRequest;
36+
import com.ericsson.eiffelcommons.utils.HttpRequest.HttpMethod;
37+
import com.ericsson.eiffelcommons.utils.ResponseEntity;
4438

39+
import lombok.Getter;
4540
/**
4641
* @author evasiba
4742
*/
43+
4844
@Component
4945
public class ERQueryService {
50-
5146
private static final Logger LOGGER = LoggerFactory.getLogger(ERQueryService.class);
5247

53-
private RestOperations rest;
48+
private HttpRequest request;
5449

5550
@Getter
5651
@Value("${er.url}")
57-
private String url;
52+
private String erBaseUrl;
5853

59-
public ERQueryService(RestTemplateBuilder builder) {
60-
rest = builder.build();
54+
public ERQueryService() {
55+
this.request = new HttpRequest();
6156
}
6257

63-
public void setRest(RestOperations rest) {
64-
this.rest = rest;
58+
public void setHttpRequest(HttpRequest request) {
59+
this.request = request;
6560
}
6661

6762
/**
@@ -72,21 +67,28 @@ public void setRest(RestOperations rest) {
7267
* the id of the event.
7368
* @return ResponseEntity
7469
*/
75-
public ResponseEntity<String> getEventDataById(String eventId) {
76-
if(StringUtils.isNotBlank(url)) {
77-
final String erUrl = URI.create(url.trim() + "/" + "{id}").normalize().toString();
78-
LOGGER.debug("The URL to ER is: {}", erUrl);
79-
80-
final Map<String, String> params = Collections.singletonMap("id", eventId);
81-
LOGGER.trace("The ID parameter is set");
82-
try {
83-
final ResponseEntity<String> response = rest.getForEntity(erUrl, String.class, params);
70+
public ResponseEntity getEventDataById(String eventId) {
71+
String erUrl = null;
72+
73+
try {
74+
if(StringUtils.isNotBlank(erBaseUrl)) {
75+
request
76+
.setHttpMethod(HttpMethod.GET)
77+
.setBaseUrl(erBaseUrl)
78+
.setEndpoint("{id}")
79+
.addParam("id", eventId);
80+
81+
erUrl= request.getURI().toString();
82+
LOGGER.debug("The URL to ER is: {}", erUrl);
83+
ResponseEntity response = request.performRequest();
8484
LOGGER.trace("The response is : {}", response.toString());
85-
} catch (RestClientException e) {
86-
LOGGER.error("Error occurred while executing REST GET to: {} for {}", erUrl, eventId, e);
85+
} else {
86+
LOGGER.info("The URL to ER is not provided");
8787
}
88-
} else {
89-
LOGGER.info("The URL to ER is not provided");
88+
} catch (MalformedURLException e) {
89+
LOGGER.error("Error while building the ER url. Stacktrace: {}", ExceptionUtils.getStackTrace(e));
90+
} catch (Exception e) {
91+
LOGGER.error("Error occurred while executing REST GET to: {} for {}", erUrl, eventId, e);
9092
}
9193

9294
return null;
@@ -112,33 +114,33 @@ public ResponseEntity<String> getEventDataById(String eventId) {
112114
* whether or not to retain the tree structure in the result.
113115
* @return ResponseEntity
114116
*/
115-
public ResponseEntity<JsonNode> getEventStreamDataById(String eventId, SearchOption searchOption, int limit,
117+
public ResponseEntity getEventStreamDataById(String eventId, SearchOption searchOption, int limit,
116118
int levels, boolean tree) {
117119

118-
if(StringUtils.isNotBlank(url)) {
119-
final String erUrl = URI.create(url.trim() + "/" + eventId).normalize().toString();
120-
LOGGER.debug("The URL to ER is: {}", erUrl);
121-
122-
// Request Body parameters
123-
final SearchParameters searchParameters = getSearchParameters(searchOption);
124-
125-
// Build query parameters
126-
final UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(erUrl).queryParam("limit", limit)
127-
.queryParam("levels", levels).queryParam("tree", tree);
128-
final HttpHeaders headers = new HttpHeaders();
129-
headers.setContentType(MediaType.APPLICATION_JSON);
130-
131-
final HttpEntity<SearchParameters> requestEntity = new HttpEntity<>(searchParameters, headers);
132-
final UriComponents uriComponents = builder.buildAndExpand(searchParameters);
133-
LOGGER.debug("The request is : {}", uriComponents.toUri().toString());
134-
135-
try {
136-
return rest.exchange(uriComponents.toUri(), HttpMethod.POST, requestEntity, JsonNode.class);
137-
} catch (RestClientException e) {
138-
LOGGER.error("Error occurred while executing REST POST to: {} for\n{}", erUrl, requestEntity, e);
120+
String uri = null;
121+
try {
122+
if(StringUtils.isNotBlank(erBaseUrl)) {
123+
// Request Body parameters
124+
final SearchParameters searchParameters = getSearchParameters(searchOption);
125+
request
126+
.setHttpMethod(HttpMethod.POST)
127+
.setBaseUrl(erBaseUrl)
128+
.setEndpoint(eventId)
129+
.addParam("limit", Integer.toString(limit))
130+
.addParam("levels", Integer.toString(levels))
131+
.addParam("tree", Boolean.toString(tree))
132+
.setBody(searchParameters.getAsJsonString(), ContentType.APPLICATION_JSON);
133+
134+
uri = request.getURI().toString();
135+
LOGGER.debug("The URL to ER is: {}", uri);
136+
137+
return request.performRequest();
138+
} else {
139+
LOGGER.info("The URL to ER is not provided");
139140
}
140-
} else {
141-
LOGGER.info("The URL to ER is not provided");
141+
}
142+
catch (Exception e) {
143+
LOGGER.error("Error occurred while executing REST POST to {}, stacktrace: {}", uri, e);
142144
}
143145

144146
return null;
@@ -156,16 +158,16 @@ private SearchParameters getSearchParameters(SearchOption searchOption) {
156158
final List<LinkType> allLinkTypes = Collections.singletonList(LinkType.ALL);
157159
switch (searchOption) {
158160
case DOWN_STREAM:
159-
searchParameters.setUlt(new ArrayList<>());
160-
searchParameters.setDlt(allLinkTypes);
161+
searchParameters.setUpstreamLinkType(new ArrayList<>());
162+
searchParameters.setDownstreamLinkType(allLinkTypes);
161163
break;
162164
case UP_STREAM:
163-
searchParameters.setUlt(allLinkTypes);
164-
searchParameters.setDlt(new ArrayList<>());
165+
searchParameters.setUpstreamLinkType(allLinkTypes);
166+
searchParameters.setDownstreamLinkType(new ArrayList<>());
165167
break;
166168
case UP_AND_DOWN_STREAM:
167-
searchParameters.setUlt(allLinkTypes);
168-
searchParameters.setDlt(allLinkTypes);
169+
searchParameters.setUpstreamLinkType(allLinkTypes);
170+
searchParameters.setDownstreamLinkType(allLinkTypes);
169171
break;
170172
}
171173

@@ -175,6 +177,6 @@ private SearchParameters getSearchParameters(SearchOption searchOption) {
175177
@PostConstruct
176178
public void init() {
177179
// TODO: is this needed?
178-
LOGGER.debug("The url parameter is : {}", url);
180+
LOGGER.debug("The url parameter is : {}", erBaseUrl);
179181
}
180182
}

src/main/java/com/ericsson/ei/erqueryservice/SearchParameters.java

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,28 @@
1717
*/
1818
package com.ericsson.ei.erqueryservice;
1919

20+
import java.io.IOException;
21+
import java.util.ArrayList;
2022
import java.util.Arrays;
2123
import java.util.List;
2224

25+
import com.fasterxml.jackson.databind.JsonNode;
26+
import com.fasterxml.jackson.databind.ObjectMapper;
27+
2328
/**
2429
* A class representation of the POST body to the search API's upstream/downstream method.
2530
*/
2631
public class SearchParameters {
2732

28-
private List<LinkType> dlt;
29-
private List<LinkType> ult;
33+
private List<LinkType> downstreamLinkType;
34+
private List<LinkType> upstreamLinkType;
3035

3136
public SearchParameters() {
3237
}
3338

34-
public SearchParameters(final List<LinkType> dlt, final List<LinkType> ult) {
35-
this.dlt = dlt;
36-
this.ult = ult;
39+
public SearchParameters(final List<LinkType> downstreamLinkType, final List<LinkType> upstreamLinkType) {
40+
this.downstreamLinkType = downstreamLinkType;
41+
this.upstreamLinkType = upstreamLinkType;
3742
}
3843

3944
private List<LinkType> checkForAll(final List<LinkType> list) {
@@ -44,24 +49,57 @@ private List<LinkType> checkForAll(final List<LinkType> list) {
4449
}
4550
}
4651

47-
public List<LinkType> getDlt() {
48-
return checkForAll(dlt);
52+
public List<LinkType> getDownstreamLinkType() {
53+
return checkForAll(downstreamLinkType);
54+
}
55+
56+
public void setDownstreamLinkType(final List<LinkType> downstreamLinkType) {
57+
this.downstreamLinkType = downstreamLinkType;
4958
}
5059

51-
public void setDlt(final List<LinkType> dlt) {
52-
this.dlt = dlt;
60+
public List<LinkType> getUpstreamLinkType() {
61+
return checkForAll(upstreamLinkType);
5362
}
5463

55-
public List<LinkType> getUlt() {
56-
return checkForAll(ult);
64+
public void setUpstreamLinkType(final List<LinkType> upstreamLinkType) {
65+
this.upstreamLinkType = upstreamLinkType;
5766
}
5867

59-
public void setUlt(final List<LinkType> ult) {
60-
this.ult = ult;
68+
/**
69+
* Returns the search parameters as a json string
70+
* @return String
71+
* @throws IOException
72+
*/
73+
public String getAsJsonString() throws IOException {
74+
ArrayList<String> downstreamLinkTypeStringArray = convertSearchParametersToArrayList(downstreamLinkType);
75+
ArrayList<String> upstreamLinkTypeStringArray = convertSearchParametersToArrayList(upstreamLinkType);
76+
77+
ObjectMapper mapper = new ObjectMapper();
78+
JsonNode downloadLinkTypeJson = mapper.readTree(downstreamLinkTypeStringArray.toString());
79+
JsonNode upstreamLinkTypeJson = mapper.readTree(upstreamLinkTypeStringArray.toString());
80+
81+
return "{\"dlt\":" + downloadLinkTypeJson.toString() + ",\"ult\":" + upstreamLinkTypeJson.toString() + "}";
6182
}
6283

6384
@Override
6485
public String toString() {
65-
return "SearchParameters{" + "dlt=" + dlt + ", ult=" + ult + '}';
86+
return "SearchParameters{" + "dlt=" + downstreamLinkType + ", ult=" + upstreamLinkType + '}';
87+
}
88+
89+
/**
90+
* Converts the searchParameters to a ArrayList with json
91+
* @param searchParameters
92+
* @return
93+
*/
94+
private ArrayList<String> convertSearchParametersToArrayList(List<LinkType> searchParameters) {
95+
Object[] searchParametersArray = searchParameters.toArray();
96+
ArrayList<String> searchParametersJsonStringArray = new ArrayList<String>();
97+
98+
for(int i = 0; i < searchParametersArray.length; i++) {
99+
String linkTypeValue = "\"" + searchParametersArray[i].toString() + "\"";
100+
searchParametersJsonStringArray.add(linkTypeValue);
101+
}
102+
103+
return searchParametersJsonStringArray;
66104
}
67105
}

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

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,21 @@
1313
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1414
See the License for the specific language governing permissions and
1515
limitations under the License.
16-
*/
16+
*/
1717
package com.ericsson.ei.handlers;
1818

19+
import org.apache.commons.lang3.exception.ExceptionUtils;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
22+
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.stereotype.Component;
24+
1925
import com.ericsson.ei.jmespath.JmesPathInterface;
2026
import com.ericsson.ei.jsonmerge.MergeHandler;
2127
import com.ericsson.ei.rules.RulesObject;
2228
import com.fasterxml.jackson.databind.JsonNode;
2329
import com.fasterxml.jackson.databind.ObjectMapper;
2430
import com.fasterxml.jackson.databind.node.ObjectNode;
25-
import org.slf4j.Logger;
26-
import org.slf4j.LoggerFactory;
27-
import org.springframework.beans.factory.annotation.Autowired;
28-
import org.springframework.stereotype.Component;
2931

3032
@Component
3133
public class ExtractionHandler {
@@ -69,21 +71,25 @@ public void runExtraction(RulesObject rulesObject, String id, String event, Stri
6971
}
7072

7173
public void runExtraction(RulesObject rulesObject, String mergeId, String event, JsonNode aggregatedDbObject) {
72-
JsonNode extractedContent = extractContent(rulesObject, event);
73-
74-
if(aggregatedDbObject != null) {
75-
LOGGER.debug("ExtractionHandler: Merging Aggregated Object:\n{}"
76-
+ "\nwith extracted content:\n{}"
77-
+ "\nfrom event:\n{}",
78-
aggregatedDbObject.toString(), extractedContent.toString(), event);
79-
String objectId = objectHandler.extractObjectId(aggregatedDbObject);
80-
String mergedContent = mergeHandler.mergeObject(objectId, mergeId, rulesObject, event, extractedContent);
81-
processRulesHandler.runProcessRules(event, rulesObject, mergedContent, objectId, mergeId);
82-
} else {
83-
ObjectNode objectNode = (ObjectNode) extractedContent;
84-
objectNode.put("TemplateName", rulesObject.getTemplateName());
85-
mergeHandler.addNewObject(event, extractedContent, rulesObject);
86-
upStreamEventsHandler.runHistoryExtractionRulesOnAllUpstreamEvents(mergeId);
74+
try {
75+
JsonNode extractedContent = extractContent(rulesObject, event);
76+
77+
if(aggregatedDbObject != null) {
78+
LOGGER.debug("ExtractionHandler: Merging Aggregated Object:\n{}"
79+
+ "\nwith extracted content:\n{}"
80+
+ "\nfrom event:\n{}",
81+
aggregatedDbObject.toString(), extractedContent.toString(), event);
82+
String objectId = objectHandler.extractObjectId(aggregatedDbObject);
83+
String mergedContent = mergeHandler.mergeObject(objectId, mergeId, rulesObject, event, extractedContent);
84+
processRulesHandler.runProcessRules(event, rulesObject, mergedContent, objectId, mergeId);
85+
} else {
86+
ObjectNode objectNode = (ObjectNode) extractedContent;
87+
objectNode.put("TemplateName", rulesObject.getTemplateName());
88+
mergeHandler.addNewObject(event, extractedContent, rulesObject);
89+
upStreamEventsHandler.runHistoryExtractionRulesOnAllUpstreamEvents(mergeId);
90+
}
91+
} catch (Exception e) {
92+
LOGGER.error("Failed to run extraction for event {} , stacktrace {}", event, ExceptionUtils.getStackTrace(e));
8793
}
8894
}
8995

0 commit comments

Comments
 (0)