2 * Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may
5 * not use this file except in compliance with the License. You may obtain
6 * a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 * implied. See the License for the specific language governing
14 * permissions and limitations under the License.
16 package org.akraino.validation.ui.client.nexus;
18 import java.io.IOException;
19 import java.net.HttpURLConnection;
20 import java.net.InetSocketAddress;
21 import java.net.Proxy;
23 import java.security.KeyManagementException;
24 import java.security.NoSuchAlgorithmException;
25 import java.text.DateFormat;
26 import java.text.ParseException;
27 import java.text.SimpleDateFormat;
28 import java.util.ArrayList;
29 import java.util.Collections;
30 import java.util.Comparator;
31 import java.util.Date;
32 import java.util.HashSet;
33 import java.util.List;
34 import java.util.Locale;
35 import java.util.NoSuchElementException;
37 import javax.annotation.Nonnull;
39 import org.akraino.validation.ui.client.nexus.resources.RobotTestResult;
40 import org.akraino.validation.ui.client.nexus.resources.Status;
41 import org.akraino.validation.ui.client.nexus.resources.TestInfoYaml;
42 import org.akraino.validation.ui.client.nexus.resources.WRobotNexusTestResult;
43 import org.akraino.validation.ui.entity.Blueprint;
44 import org.akraino.validation.ui.entity.BlueprintInstance;
45 import org.akraino.validation.ui.entity.LabInfo;
46 import org.akraino.validation.ui.entity.ValidationDbTestResult;
47 import org.akraino.validation.ui.entity.WRobotDbTestResult;
48 import org.akraino.validation.ui.service.DbAdapter;
49 import org.apache.commons.httpclient.HttpException;
50 import org.json.JSONObject;
52 import org.jsoup.Jsoup;
53 import org.jsoup.nodes.Document;
54 import org.jsoup.nodes.Element;
55 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
56 import org.onap.portalsdk.core.onboarding.util.PortalApiProperties;
57 import org.onap.portalsdk.core.web.support.UserUtils;
58 import org.springframework.beans.factory.annotation.Autowired;
59 import org.springframework.stereotype.Service;
61 import com.fasterxml.jackson.annotation.JsonInclude.Include;
62 import com.fasterxml.jackson.core.JsonParseException;
63 import com.fasterxml.jackson.databind.DeserializationFeature;
64 import com.fasterxml.jackson.databind.JsonMappingException;
65 import com.fasterxml.jackson.databind.ObjectMapper;
66 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
67 import com.sun.jersey.api.client.Client;
68 import com.sun.jersey.api.client.ClientHandlerException;
69 import com.sun.jersey.api.client.ClientResponse;
70 import com.sun.jersey.api.client.UniformInterfaceException;
71 import com.sun.jersey.api.client.WebResource;
72 import com.sun.jersey.api.client.config.ClientConfig;
73 import com.sun.jersey.api.client.config.DefaultClientConfig;
74 import com.sun.jersey.api.json.JSONConfiguration;
75 import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory;
76 import com.sun.jersey.client.urlconnection.URLConnectionClientHandler;
79 public final class NexusExecutorClient {
84 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(NexusExecutorClient.class);
86 private final Client client;
87 private final String baseurl;
89 public NexusExecutorClient() {
90 this.baseurl = PortalApiProperties.getProperty("nexus_url");
91 ClientConfig clientConfig = new DefaultClientConfig();
92 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
93 this.client = new Client(new URLConnectionClientHandler(new HttpURLConnectionFactory() {
97 public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
99 String proxyIp = System.getenv("NEXUS_PROXY").substring(0,
100 System.getenv("NEXUS_PROXY").lastIndexOf(":"));
101 String proxyPort = System.getenv("NEXUS_PROXY")
102 .substring(System.getenv("NEXUS_PROXY").lastIndexOf(":") + 1);
103 proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, Integer.parseInt(proxyPort)));
104 return (HttpURLConnection) url.openConnection(proxy);
105 } catch (Exception ex) {
106 return (HttpURLConnection) url.openConnection();
112 public String getBaseUrl() {
116 public List<String> getResource(String endpoint)
117 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
118 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException {
119 List<String> resources = new ArrayList<String>();
120 String nexusUrl = this.baseurl;
121 if (endpoint != null) {
122 nexusUrl = this.baseurl + "/" + endpoint;
124 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get nexus resource: " + nexusUrl);
125 WebResource webResource = this.client.resource(nexusUrl + "/");
126 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
127 ClientResponse response = webResource.get(ClientResponse.class);
128 if (response.getStatus() != 200) {
129 throw new HttpException("Could not retrieve nexus resource " + nexusUrl + ". HTTP error code : "
130 + response.getStatus() + " and message: " + response.getEntity(String.class));
132 Document document = Jsoup.parse(response.getEntity(String.class));
133 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
134 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
135 for (int i = 2; i < elements.size(); i++) {
136 String resource = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
137 resource = resource.substring(0, resource.length() - 1);
138 resources.add(resource);
143 public List<String> getResource(@Nonnull String endpoint1, @Nonnull String endpoint2)
144 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
145 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException {
146 String endpoint = endpoint1 + "/" + endpoint2;
147 return this.getResource(endpoint);
150 public List<String> getResource(@Nonnull String endpoint1, @Nonnull String endpoint2, @Nonnull String endpoint3)
151 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
152 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException {
153 String endpoint = endpoint1 + "/" + endpoint2 + "/" + endpoint3;
154 return this.getResource(endpoint);
157 public ValidationDbTestResult getResult(@Nonnull String name, @Nonnull String version, @Nonnull String siloText,
158 @Nonnull String timestamp)
159 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
160 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException, NullPointerException {
161 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
162 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get validation nexus test result");
163 WebResource webResource = this.client.resource(nexusUrl + "/");
164 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
165 ClientResponse response = webResource.get(ClientResponse.class);
166 if (response.getStatus() != 200) {
167 throw new HttpException("Could not retrieve validation nexus test result. HTTP error code : "
168 + response.getStatus() + " and message: " + response.getEntity(String.class));
170 Document document = Jsoup.parse(response.getEntity(String.class));
171 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
172 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
173 Element element = findElementByTimestamp(elements.subList(2, elements.size()), timestamp);
174 if (element == null) {
177 ValidationDbTestResult vDbResult = new ValidationDbTestResult();
178 Blueprint blueprint = new Blueprint();
179 blueprint.setBlueprintName(name);
180 BlueprintInstance blueInst = new BlueprintInstance();
181 blueInst.setBlueprint(blueprint);
182 blueInst.setVersion(version);
183 vDbResult.setBlueprintInstance(blueInst);
184 LabInfo lab = new LabInfo();
185 lab.setSilo(siloText);
186 vDbResult.setLab(lab);
187 vDbResult.setTimestamp(timestamp);
188 String lastModified = element.getElementsByTag("td").get(1).text();
189 vDbResult.setDateStorage(lastModified);
190 TestInfoYaml testInfo = getTestInfo(webResource.getURI().toString() + timestamp);
191 if (testInfo != null) {
192 if (testInfo.gettest_info().getLayer().equals("all")) {
193 vDbResult.setAllLayers(true);
195 vDbResult.setAllLayers(false);
197 vDbResult.setOptional(testInfo.gettest_info().getOptional());
199 List<WRobotNexusTestResult> wTestResults = getWRobotTestResults(name, version, siloText, timestamp);
200 if (wTestResults.size() < 1) {
201 throw new RuntimeException("No robot test results could be obtained.");
203 vDbResult.setResult(determineResult(wTestResults));
204 List<WRobotDbTestResult> wDbResults = new ArrayList<WRobotDbTestResult>();
205 for (WRobotNexusTestResult wTestResult : wTestResults) {
206 WRobotDbTestResult wDbResult = new WRobotDbTestResult();
207 wDbResult.setLayer(wTestResult.getLayer());
208 ObjectMapper mapper = new ObjectMapper();
209 wDbResult.setRobotTestResults(mapper.writeValueAsString(wTestResult.getRobotNexusTestResults()));
210 wDbResults.add(wDbResult);
212 vDbResult.setWRobotDbTestResults(new HashSet<WRobotDbTestResult>(wDbResults));
216 public List<ValidationDbTestResult> getResults(@Nonnull String name, @Nonnull String version,
217 @Nonnull String siloText, int noOfLastElements)
218 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
219 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException {
220 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
221 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get validation Nexus test results");
222 WebResource webResource = this.client.resource(nexusUrl + "/");
223 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
224 ClientResponse response = webResource.get(ClientResponse.class);
225 if (response.getStatus() != 200) {
226 throw new HttpException("Could not retrieve validation Nexus test results. HTTP error code : "
227 + response.getStatus() + " and message: " + response.getEntity(String.class));
229 List<ValidationDbTestResult> vDbResults = new ArrayList<ValidationDbTestResult>();
230 Document document = Jsoup.parse(response.getEntity(String.class));
231 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
232 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
233 elements = findLastElementsByDate(elements.subList(2, elements.size()), noOfLastElements);
234 for (int i = 0; i < elements.size(); i++) {
235 String timestamp = null;
237 timestamp = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
238 timestamp = timestamp.substring(0, timestamp.length() - 1);
239 ValidationDbTestResult vDbResult = dbAdapter.getValidationTestResult(siloText, timestamp);
240 if (vDbResult == null || vDbResult.getDateStorage() == null) {
241 vDbResults.add(this.getResult(name, version, siloText, timestamp));
243 // Just to avoid deletion of already received validation timestamp results
244 vDbResult = new ValidationDbTestResult();
245 Blueprint blueprint = new Blueprint();
246 blueprint.setBlueprintName(name);
247 BlueprintInstance blueInst = new BlueprintInstance();
248 blueInst.setBlueprint(blueprint);
249 blueInst.setVersion(version);
250 vDbResult.setBlueprintInstance(blueInst);
251 LabInfo lab = new LabInfo();
252 lab.setSilo(siloText);
253 vDbResult.setLab(lab);
254 vDbResult.setTimestamp(timestamp);
255 vDbResults.add(vDbResult);
257 } catch (IllegalArgumentException | HttpException | NullPointerException | NoSuchElementException ex) {
258 LOGGER.warn(EELFLoggerDelegate.auditLogger, "Exception occured while retrieving timestamp : "
259 + timestamp + " result." + UserUtils.getStackTrace(ex));
266 public List<ValidationDbTestResult> getResults(@Nonnull String name, @Nonnull String version,
267 @Nonnull String siloText, @Nonnull Date date)
268 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
269 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException, NullPointerException {
270 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
271 LOGGER.debug(EELFLoggerDelegate.applicationLogger, "Trying to get validation Nexus results based on date");
272 WebResource webResource = this.client.resource(nexusUrl + "/");
273 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
274 ClientResponse response = webResource.get(ClientResponse.class);
275 if (response.getStatus() != 200) {
276 throw new HttpException("Could not retrieve validation Nexus results based on date. HTTP error code : "
277 + response.getStatus() + " and message: " + response.getEntity(String.class));
279 List<ValidationDbTestResult> vDbResults = new ArrayList<ValidationDbTestResult>();
280 Document document = Jsoup.parse(response.getEntity(String.class));
281 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
282 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
283 elements = findElementsBasedOnDate(elements.subList(2, elements.size()), date);
284 for (int i = 0; i < elements.size(); i++) {
286 String timestamp = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
287 timestamp = timestamp.substring(0, timestamp.length() - 1);
288 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, timestamp);
289 vDbResults.add(vDbResult);
290 } catch (IllegalArgumentException | HttpException | NullPointerException ex) {
291 LOGGER.warn(EELFLoggerDelegate.auditLogger,
292 "Exception occured while retrieving timestamp results. " + UserUtils.getStackTrace(ex));
299 public ValidationDbTestResult getLastResultBasedOnOutcome(@Nonnull String name, @Nonnull String version,
300 @Nonnull String siloText, List<String> layers, Boolean optional, boolean outcome)
301 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
302 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException, NullPointerException {
303 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
304 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get last result based on outcome");
305 WebResource webResource = this.client.resource(nexusUrl + "/");
306 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
307 ClientResponse response = webResource.get(ClientResponse.class);
308 if (response.getStatus() != 200) {
309 throw new HttpException("Could not retrieve last result based on outcome from Nexus. HTTP error code : "
310 + response.getStatus() + " and message: " + response.getEntity(String.class));
312 Document document = Jsoup.parse(response.getEntity(String.class));
313 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
314 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
315 elements = elements.subList(2, elements.size());
316 if (elements.size() < 1) {
319 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
320 Collections.sort(elements, new Comparator<Element>() {
322 public int compare(Element element1, Element element2) {
324 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
325 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
326 } catch (ParseException e) {
327 LOGGER.error(EELFLoggerDelegate.errorLogger,
328 "Error when parsing date. " + UserUtils.getStackTrace(e));
333 for (Element element : elements) {
335 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
336 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
337 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, elementTimestamp);
338 if (vDbResult.getResult() != outcome) {
341 if (optional != null && vDbResult.getOptional() != optional) {
344 if (layers != null) {
345 List<String> storedLayers = new ArrayList<String>();
346 for (WRobotDbTestResult wRobot : vDbResult.getWRobotDbTestResults()) {
347 storedLayers.add(wRobot.getLayer());
349 if (!new HashSet<>(storedLayers).equals(new HashSet<>(layers))) {
354 } catch (IllegalArgumentException | HttpException | NullPointerException ex) {
355 LOGGER.warn(EELFLoggerDelegate.auditLogger,
356 "Error when trying to retrieve results. " + UserUtils.getStackTrace(ex));
363 public ValidationDbTestResult getLastResultBasedOnOutcome(@Nonnull String name, @Nonnull String version,
364 @Nonnull String siloText, Boolean allLayers, Boolean optional, boolean outcome)
365 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
366 IOException, KeyManagementException, NoSuchAlgorithmException, ParseException, NullPointerException {
367 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
368 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get last result based on outcome");
369 WebResource webResource = this.client.resource(nexusUrl + "/");
370 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
371 ClientResponse response = webResource.get(ClientResponse.class);
372 if (response.getStatus() != 200) {
373 throw new HttpException("Could not retrieve last result based on outcome from Nexus. HTTP error code : "
374 + response.getStatus() + " and message: " + response.getEntity(String.class));
376 Document document = Jsoup.parse(response.getEntity(String.class));
377 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
378 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
379 elements = elements.subList(2, elements.size());
380 if (elements.size() < 1) {
383 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
384 Collections.sort(elements, new Comparator<Element>() {
386 public int compare(Element element1, Element element2) {
388 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
389 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
390 } catch (ParseException e) {
391 LOGGER.error(EELFLoggerDelegate.errorLogger,
392 "Error when parsing date. " + UserUtils.getStackTrace(e));
397 for (Element element : elements) {
399 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
400 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
401 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, elementTimestamp);
402 if (vDbResult.getResult() != outcome) {
405 if (optional != null && vDbResult.getOptional() != optional) {
408 if (allLayers != null && vDbResult.getAllLayers() != allLayers) {
412 } catch (IllegalArgumentException | HttpException | NullPointerException ex) {
413 LOGGER.warn(EELFLoggerDelegate.auditLogger,
414 "Error when trying to retrieve results. " + UserUtils.getStackTrace(ex));
421 public List<WRobotNexusTestResult> getWRobotTestResults(@Nonnull String name, @Nonnull String version,
422 @Nonnull String siloText, @Nonnull String timestamp)
423 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
424 IOException, KeyManagementException, NoSuchAlgorithmException {
425 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version + "/"
426 + timestamp + "/results";
427 List<WRobotNexusTestResult> listOfwrappers = new ArrayList<WRobotNexusTestResult>();
428 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get the blueprint layers");
429 WebResource webResource = this.client.resource(nexusUrl + "/");
430 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
431 ClientResponse response = webResource.get(ClientResponse.class);
432 if (response.getStatus() != 200) {
433 throw new HttpException("Could not retrieve blueprint layers from Nexus. HTTP error code : "
434 + response.getStatus() + " and message: " + response.getEntity(String.class));
436 Document document = Jsoup.parse(response.getEntity(String.class));
437 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
438 .getElementsByTag("tr");
439 for (int i = 2; i < elements.size(); i++) {
441 String layer = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
442 layer = layer.substring(0, layer.length() - 1);
443 if (layer.contains("test")) {
446 List<RobotTestResult> robotTestResults = getRobotTestResults(nexusUrl + "/" + layer);
447 WRobotNexusTestResult wrapper = new WRobotNexusTestResult();
448 wrapper.setLayer(layer);
449 wrapper.setRobotNexusTestResults(robotTestResults);
450 listOfwrappers.add(wrapper);
451 } catch (IllegalArgumentException | HttpException | NullPointerException ex) {
452 LOGGER.warn(EELFLoggerDelegate.auditLogger,
453 "Exception occured while retrieving robot results. " + UserUtils.getStackTrace(ex));
457 return listOfwrappers;
460 private List<RobotTestResult> getRobotTestResults(String resultsUrl)
461 throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
462 IOException, KeyManagementException, NoSuchAlgorithmException {
463 List<RobotTestResult> rTestResults = new ArrayList<RobotTestResult>();
464 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get test suites results");
465 WebResource webResource = this.client.resource(resultsUrl + "/");
466 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
467 ClientResponse response = webResource.get(ClientResponse.class);
468 if (response.getStatus() != 200) {
469 throw new HttpException("Could not retrieve test suites results from Nexus. HTTP error code : "
470 + response.getStatus() + " and message: " + response.getEntity(String.class));
472 Document document = Jsoup.parse(response.getEntity(String.class));
473 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
474 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
475 for (int i = 2; i < elements.size(); i++) {
476 String testSuiteName = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
477 testSuiteName = testSuiteName.substring(0, testSuiteName.length() - 1);
478 webResource = this.client.resource(resultsUrl + "/" + testSuiteName + "/output.xml");
479 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
480 response = webResource.get(ClientResponse.class);
481 if (response.getStatus() != 200) {
482 throw new HttpException("Could not retrieve test suite result from Nexus. HTTP error code : "
483 + response.getStatus() + " and message: " + response.getEntity(String.class));
485 String result = response.getEntity(String.class);
486 JSONObject xmlJSONObj = XML.toJSONObject(result);
487 ObjectMapper mapper = new ObjectMapper();
488 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
489 mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
490 mapper.setSerializationInclusion(Include.NON_NULL);
491 RobotTestResult robotTestResult = mapper.readValue(xmlJSONObj.toString(), RobotTestResult.class);
492 robotTestResult.setName(testSuiteName);
493 rTestResults.add(robotTestResult);
498 private boolean determineResult(List<WRobotNexusTestResult> wTestResults) {
499 boolean result = true;
500 for (WRobotNexusTestResult wTestResult : wTestResults) {
501 for (RobotTestResult robotTestResult : wTestResult.getRobotNexusTestResults()) {
502 for (Status status : robotTestResult.getRobot().getStatistics().getTotal().getStat()) {
503 if (status.getContent().trim().equals("All Tests") && status.getFail() > 0) {
512 private List<Element> findLastElementsByDate(List<Element> elements, int noOfLastElements) {
513 if (elements.size() <= noOfLastElements) {
516 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
517 Collections.sort(elements, new Comparator<Element>() {
519 public int compare(Element element1, Element element2) {
521 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
522 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
523 } catch (ParseException e) {
524 LOGGER.error(EELFLoggerDelegate.errorLogger,
525 "Error when parsing date. " + UserUtils.getStackTrace(e));
530 return elements.subList(0, noOfLastElements);
533 private Element findElementByTimestamp(List<Element> elements, String timestamp) {
534 for (Element element : elements) {
535 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
536 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
537 if (elementTimestamp.equals(timestamp)) {
544 private List<Element> findElementsBasedOnDate(List<Element> elements, Date date) throws ParseException {
545 DateFormat formatTime = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
546 DateFormat formatNoTime = new SimpleDateFormat("EEE MMM dd zzz yyyy", Locale.US);
547 List<Element> desiredElements = new ArrayList<Element>();
548 for (Element element : elements) {
549 String lastModified = element.getElementsByTag("td").get(1).text();
550 if (formatNoTime.format(formatTime.parse(lastModified)).compareTo(formatNoTime.format(date)) == 0) {
551 desiredElements.add(element);
554 return desiredElements;
557 private TestInfoYaml getTestInfo(String timestampUrl) throws JsonParseException, JsonMappingException, IOException {
558 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get test info");
559 WebResource webResource = this.client.resource(timestampUrl + "/results/test_info.yaml");
560 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
561 ClientResponse response = webResource.get(ClientResponse.class);
562 if (response.getStatus() != 200) {
565 String testInfo = response.getEntity(String.class);
566 ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());
567 Object obj = yamlReader.readValue(testInfo, Object.class);
568 ObjectMapper mapper = new ObjectMapper();
569 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
570 mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
571 mapper.setSerializationInclusion(Include.NON_NULL);
572 ObjectMapper jsonWriter = new ObjectMapper();
573 return mapper.readValue(jsonWriter.writeValueAsString(obj), TestInfoYaml.class);