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.text.DateFormat;
24 import java.text.ParseException;
25 import java.text.SimpleDateFormat;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.Comparator;
29 import java.util.Date;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.Locale;
34 import javax.annotation.Nonnull;
36 import org.akraino.validation.ui.client.nexus.resources.RobotTestResult;
37 import org.akraino.validation.ui.client.nexus.resources.Status;
38 import org.akraino.validation.ui.client.nexus.resources.TestInfoYaml;
39 import org.akraino.validation.ui.client.nexus.resources.WRobotNexusTestResult;
40 import org.akraino.validation.ui.entity.Blueprint;
41 import org.akraino.validation.ui.entity.BlueprintInstance;
42 import org.akraino.validation.ui.entity.LabInfo;
43 import org.akraino.validation.ui.entity.ValidationDbTestResult;
44 import org.akraino.validation.ui.entity.WRobotDbTestResult;
45 import org.akraino.validation.ui.service.DbAdapter;
46 import org.apache.commons.httpclient.HttpException;
47 import org.json.JSONException;
48 import org.json.JSONObject;
50 import org.jsoup.Jsoup;
51 import org.jsoup.nodes.Document;
52 import org.jsoup.nodes.Element;
53 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
54 import org.onap.portalsdk.core.onboarding.util.PortalApiProperties;
55 import org.onap.portalsdk.core.web.support.UserUtils;
56 import org.springframework.beans.factory.annotation.Autowired;
57 import org.springframework.stereotype.Service;
59 import com.fasterxml.jackson.annotation.JsonInclude.Include;
60 import com.fasterxml.jackson.core.JsonProcessingException;
61 import com.fasterxml.jackson.databind.DeserializationFeature;
62 import com.fasterxml.jackson.databind.ObjectMapper;
63 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
64 import com.sun.jersey.api.client.Client;
65 import com.sun.jersey.api.client.ClientResponse;
66 import com.sun.jersey.api.client.WebResource;
67 import com.sun.jersey.api.client.config.ClientConfig;
68 import com.sun.jersey.api.client.config.DefaultClientConfig;
69 import com.sun.jersey.api.json.JSONConfiguration;
70 import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory;
71 import com.sun.jersey.client.urlconnection.URLConnectionClientHandler;
74 public final class NexusExecutorClient {
79 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(NexusExecutorClient.class);
81 private final Client client;
82 private final String baseurl;
84 public NexusExecutorClient() {
85 this.baseurl = PortalApiProperties.getProperty("nexus_url");
86 ClientConfig clientConfig = new DefaultClientConfig();
87 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
88 this.client = new Client(new URLConnectionClientHandler(new HttpURLConnectionFactory() {
92 public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
94 String proxyIp = System.getenv("NEXUS_PROXY").substring(0,
95 System.getenv("NEXUS_PROXY").lastIndexOf(":"));
96 String proxyPort = System.getenv("NEXUS_PROXY")
97 .substring(System.getenv("NEXUS_PROXY").lastIndexOf(":") + 1);
98 proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, Integer.parseInt(proxyPort)));
99 return (HttpURLConnection) url.openConnection(proxy);
100 } catch (Exception ex) {
101 return (HttpURLConnection) url.openConnection();
107 public String getBaseUrl() {
111 public List<String> getResource(String endpoint)
112 throws IndexOutOfBoundsException, HttpException, NullPointerException {
113 List<String> resources = new ArrayList<String>();
114 String nexusUrl = this.baseurl;
115 if (endpoint != null) {
116 nexusUrl = this.baseurl + "/" + endpoint;
118 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get nexus resource: " + nexusUrl);
119 WebResource webResource = this.client.resource(nexusUrl + "/");
120 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
121 ClientResponse response = webResource.get(ClientResponse.class);
122 if (response.getStatus() != 200) {
123 throw new HttpException("Could not retrieve nexus resource " + nexusUrl + ". HTTP error code : "
124 + response.getStatus() + " and message: " + response.getEntity(String.class));
126 Document document = Jsoup.parse(response.getEntity(String.class));
127 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
128 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
129 for (int i = 2; i < elements.size(); i++) {
130 String resource = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
131 resource = resource.substring(0, resource.length() - 1);
132 resources.add(resource);
137 public List<String> getResource(@Nonnull String endpoint1, @Nonnull String endpoint2)
138 throws IndexOutOfBoundsException, HttpException, NullPointerException {
139 String endpoint = endpoint1 + "/" + endpoint2;
140 return this.getResource(endpoint);
143 public List<String> getResource(@Nonnull String endpoint1, @Nonnull String endpoint2, @Nonnull String endpoint3)
144 throws IndexOutOfBoundsException, HttpException, NullPointerException {
145 String endpoint = endpoint1 + "/" + endpoint2 + "/" + endpoint3;
146 return this.getResource(endpoint);
149 public ValidationDbTestResult getResult(@Nonnull String name, @Nonnull String version, @Nonnull String siloText,
150 @Nonnull String timestamp) throws IndexOutOfBoundsException, HttpException, NullPointerException {
151 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
152 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get validation nexus test result");
153 WebResource webResource = this.client.resource(nexusUrl + "/");
154 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
155 ClientResponse response = webResource.get(ClientResponse.class);
156 if (response.getStatus() != 200) {
157 throw new HttpException("Could not retrieve validation nexus test result. HTTP error code : "
158 + response.getStatus() + " and message: " + response.getEntity(String.class));
160 Document document = Jsoup.parse(response.getEntity(String.class));
161 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
162 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
163 Element element = findElementByTimestamp(elements.subList(2, elements.size()), timestamp);
164 if (element == null) {
167 ValidationDbTestResult vDbResult = new ValidationDbTestResult();
168 Blueprint blueprint = new Blueprint();
169 blueprint.setBlueprintName(name);
170 BlueprintInstance blueInst = new BlueprintInstance();
171 blueInst.setBlueprint(blueprint);
172 blueInst.setVersion(version);
173 vDbResult.setBlueprintInstance(blueInst);
174 LabInfo lab = new LabInfo();
175 lab.setSilo(siloText);
176 vDbResult.setLab(lab);
177 vDbResult.setTimestamp(timestamp);
178 String lastModified = element.getElementsByTag("td").get(1).text();
179 vDbResult.setDateStorage(lastModified);
180 TestInfoYaml testInfo = getTestInfo(webResource.getURI().toString() + timestamp);
181 if (testInfo != null) {
182 if (testInfo.gettest_info().getLayer().equals("all")) {
183 vDbResult.setAllLayers(true);
185 vDbResult.setAllLayers(false);
187 vDbResult.setOptional(testInfo.gettest_info().getOptional());
189 List<WRobotNexusTestResult> wTestResults = getWRobotTestResults(name, version, siloText, timestamp);
190 if (wTestResults.size() < 1) {
193 vDbResult.setResult(determineResult(wTestResults));
194 List<WRobotDbTestResult> wDbResults = new ArrayList<WRobotDbTestResult>();
195 for (WRobotNexusTestResult wTestResult : wTestResults) {
197 WRobotDbTestResult wDbResult = new WRobotDbTestResult();
198 wDbResult.setLayer(wTestResult.getLayer());
199 ObjectMapper mapper = new ObjectMapper();
200 wDbResult.setRobotTestResults(mapper.writeValueAsString(wTestResult.getRobotNexusTestResults()));
201 wDbResults.add(wDbResult);
202 } catch (JsonProcessingException e) {
203 LOGGER.warn(EELFLoggerDelegate.auditLogger,
204 "Exception occured while processing JSON. " + UserUtils.getStackTrace(e));
207 vDbResult.setWRobotDbTestResults(new HashSet<WRobotDbTestResult>(wDbResults));
211 public List<ValidationDbTestResult> getResults(@Nonnull String name, @Nonnull String version,
212 @Nonnull String siloText, int noOfLastElements)
213 throws IndexOutOfBoundsException, HttpException, NullPointerException {
214 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
215 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get validation Nexus test results");
216 WebResource webResource = this.client.resource(nexusUrl + "/");
217 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
218 ClientResponse response = webResource.get(ClientResponse.class);
219 if (response.getStatus() != 200) {
220 throw new HttpException("Could not retrieve validation Nexus test results. HTTP error code : "
221 + response.getStatus() + " and message: " + response.getEntity(String.class));
223 List<ValidationDbTestResult> vDbResults = new ArrayList<ValidationDbTestResult>();
224 Document document = Jsoup.parse(response.getEntity(String.class));
225 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
226 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
227 elements = findLastElementsByDate(elements.subList(2, elements.size()), noOfLastElements);
228 for (int i = 0; i < elements.size(); i++) {
229 String timestamp = null;
231 timestamp = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
232 timestamp = timestamp.substring(0, timestamp.length() - 1);
233 ValidationDbTestResult vDbResult = dbAdapter.getValidationTestResult(siloText, timestamp);
234 if (vDbResult == null || vDbResult.getDateStorage() == null) {
235 ValidationDbTestResult vDbResult2 = this.getResult(name, version, siloText, timestamp);
236 if (vDbResult2 == null) {
239 vDbResults.add(vDbResult2);
241 // Just to avoid deletion of already received validation timestamp results
242 vDbResult = new ValidationDbTestResult();
243 Blueprint blueprint = new Blueprint();
244 blueprint.setBlueprintName(name);
245 BlueprintInstance blueInst = new BlueprintInstance();
246 blueInst.setBlueprint(blueprint);
247 blueInst.setVersion(version);
248 vDbResult.setBlueprintInstance(blueInst);
249 LabInfo lab = new LabInfo();
250 lab.setSilo(siloText);
251 vDbResult.setLab(lab);
252 vDbResult.setTimestamp(timestamp);
253 vDbResults.add(vDbResult);
255 } catch (HttpException | IndexOutOfBoundsException | NullPointerException ex) {
256 LOGGER.warn(EELFLoggerDelegate.auditLogger, "Exception occured while retrieving timestamp : "
257 + timestamp + " result." + UserUtils.getStackTrace(ex));
263 public List<ValidationDbTestResult> getResults(@Nonnull String name, @Nonnull String version,
264 @Nonnull String siloText, @Nonnull Date date)
265 throws IndexOutOfBoundsException, HttpException, NullPointerException, ParseException {
266 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
267 LOGGER.debug(EELFLoggerDelegate.applicationLogger, "Trying to get validation Nexus results based on date");
268 WebResource webResource = this.client.resource(nexusUrl + "/");
269 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
270 ClientResponse response = webResource.get(ClientResponse.class);
271 if (response.getStatus() != 200) {
272 throw new HttpException("Could not retrieve validation Nexus results based on date. HTTP error code : "
273 + response.getStatus() + " and message: " + response.getEntity(String.class));
275 List<ValidationDbTestResult> vDbResults = new ArrayList<ValidationDbTestResult>();
276 Document document = Jsoup.parse(response.getEntity(String.class));
277 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
278 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
279 elements = findElementsBasedOnDate(elements.subList(2, elements.size()), date);
280 for (int i = 0; i < elements.size(); i++) {
282 String timestamp = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
283 timestamp = timestamp.substring(0, timestamp.length() - 1);
284 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, timestamp);
285 if (vDbResult == null) {
288 vDbResults.add(vDbResult);
289 } catch (HttpException | IndexOutOfBoundsException | NullPointerException ex) {
290 LOGGER.warn(EELFLoggerDelegate.auditLogger,
291 "Exception occured while retrieving timestamp results. " + UserUtils.getStackTrace(ex));
297 public ValidationDbTestResult getLastResultBasedOnOutcome(@Nonnull String name, @Nonnull String version,
298 @Nonnull String siloText, List<String> layers, Boolean optional, boolean outcome)
299 throws IndexOutOfBoundsException, HttpException, NullPointerException {
300 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
301 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get last result based on outcome");
302 WebResource webResource = this.client.resource(nexusUrl + "/");
303 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
304 ClientResponse response = webResource.get(ClientResponse.class);
305 if (response.getStatus() != 200) {
306 throw new HttpException("Could not retrieve last result based on outcome from Nexus. HTTP error code : "
307 + response.getStatus() + " and message: " + response.getEntity(String.class));
309 Document document = Jsoup.parse(response.getEntity(String.class));
310 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
311 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
312 elements = elements.subList(2, elements.size());
313 if (elements.size() < 1) {
316 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
317 Collections.sort(elements, new Comparator<Element>() {
319 public int compare(Element element1, Element element2) {
321 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
322 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
323 } catch (ParseException e) {
324 LOGGER.error(EELFLoggerDelegate.errorLogger,
325 "Error when parsing date. " + UserUtils.getStackTrace(e));
330 for (Element element : elements) {
332 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
333 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
334 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, elementTimestamp);
335 if (vDbResult == null) {
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 (HttpException | IndexOutOfBoundsException | NullPointerException ex) {
355 LOGGER.warn(EELFLoggerDelegate.auditLogger,
356 "Error when trying to retrieve results. " + UserUtils.getStackTrace(ex));
362 public ValidationDbTestResult getLastResultBasedOnOutcome(@Nonnull String name, @Nonnull String version,
363 @Nonnull String siloText, Boolean allLayers, Boolean optional, boolean outcome)
364 throws IndexOutOfBoundsException, HttpException, NullPointerException {
365 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version;
366 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get last result based on outcome");
367 WebResource webResource = this.client.resource(nexusUrl + "/");
368 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
369 ClientResponse response = webResource.get(ClientResponse.class);
370 if (response.getStatus() != 200) {
371 throw new HttpException("Could not retrieve last result based on outcome from Nexus. HTTP error code : "
372 + response.getStatus() + " and message: " + response.getEntity(String.class));
374 Document document = Jsoup.parse(response.getEntity(String.class));
375 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
376 .getElementsByTag("tbody").get(0).getElementsByTag("tr");
377 elements = elements.subList(2, elements.size());
378 if (elements.size() < 1) {
381 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
382 Collections.sort(elements, new Comparator<Element>() {
384 public int compare(Element element1, Element element2) {
386 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
387 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
388 } catch (ParseException e) {
389 LOGGER.error(EELFLoggerDelegate.errorLogger,
390 "Error when parsing date. " + UserUtils.getStackTrace(e));
395 for (Element element : elements) {
397 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
398 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
399 ValidationDbTestResult vDbResult = this.getResult(name, version, siloText, elementTimestamp);
400 if (vDbResult == null) {
403 if (vDbResult.getResult() != outcome) {
406 if (optional != null && vDbResult.getOptional() != optional) {
409 if (allLayers != null && vDbResult.getAllLayers() != allLayers) {
413 } catch (HttpException | IndexOutOfBoundsException | NullPointerException ex) {
414 LOGGER.warn(EELFLoggerDelegate.auditLogger,
415 "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 IndexOutOfBoundsException, HttpException, NullPointerException {
424 String nexusUrl = this.baseurl + "/" + siloText + "/" + "bluval_results/" + name + "/" + version + "/"
425 + timestamp + "/results";
426 List<WRobotNexusTestResult> listOfWrappers = new ArrayList<WRobotNexusTestResult>();
427 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get the blueprint layers");
428 WebResource webResource = this.client.resource(nexusUrl + "/");
429 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
430 ClientResponse response = webResource.get(ClientResponse.class);
431 if (response.getStatus() != 200) {
432 throw new HttpException("Could not retrieve blueprint layers from Nexus. HTTP error code : "
433 + response.getStatus() + " and message: " + response.getEntity(String.class));
435 Document document = Jsoup.parse(response.getEntity(String.class));
436 List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
437 .getElementsByTag("tr");
438 for (int i = 2; i < elements.size(); i++) {
440 String layer = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
441 layer = layer.substring(0, layer.length() - 1);
442 if (layer.contains("test") || layer.contains("service") || layer.contains("home")) {
445 List<RobotTestResult> robotTestResults = getRobotTestResults(nexusUrl + "/" + layer);
446 if (robotTestResults.size() < 1) {
449 WRobotNexusTestResult wrapper = new WRobotNexusTestResult();
450 wrapper.setLayer(layer);
451 wrapper.setRobotNexusTestResults(robotTestResults);
452 listOfWrappers.add(wrapper);
453 } catch (IndexOutOfBoundsException | HttpException | NullPointerException ex) {
454 LOGGER.warn(EELFLoggerDelegate.auditLogger,
455 "Exception occured while retrieving wrapped robot results. " + UserUtils.getStackTrace(ex));
458 return listOfWrappers;
461 private List<RobotTestResult> getRobotTestResults(String resultsUrl)
462 throws IndexOutOfBoundsException, HttpException, NullPointerException {
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++) {
477 String testSuiteName = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0)
479 testSuiteName = testSuiteName.substring(0, testSuiteName.length() - 1);
480 webResource = this.client.resource(resultsUrl + "/" + testSuiteName + "/output.xml");
481 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
482 response = webResource.get(ClientResponse.class);
483 if (response.getStatus() != 200) {
484 throw new HttpException("Could not retrieve test suite result from Nexus. HTTP error code : "
485 + response.getStatus() + " and message: " + response.getEntity(String.class));
487 String result = response.getEntity(String.class);
488 JSONObject xmlJSONObj = XML.toJSONObject(result);
490 ObjectMapper mapper = new ObjectMapper();
491 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
492 mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
493 mapper.setSerializationInclusion(Include.NON_NULL);
494 RobotTestResult robotTestResult = mapper.readValue(xmlJSONObj.toString(), RobotTestResult.class);
495 robotTestResult.setName(testSuiteName);
496 rTestResults.add(robotTestResult);
497 } catch (Exception ex) {
498 LOGGER.error(EELFLoggerDelegate.errorLogger, "Exception occured while deserializing for resource "
499 + resultsUrl + " " + UserUtils.getStackTrace(ex));
501 } catch (IOException | JSONException ex) {
502 LOGGER.warn(EELFLoggerDelegate.auditLogger, "Exception occured while retrieving robot results from "
503 + resultsUrl + " . " + UserUtils.getStackTrace(ex));
509 private boolean determineResult(List<WRobotNexusTestResult> wTestResults) {
510 boolean result = true;
511 for (WRobotNexusTestResult wTestResult : wTestResults) {
512 for (RobotTestResult robotTestResult : wTestResult.getRobotNexusTestResults()) {
513 for (Status status : robotTestResult.getRobot().getStatistics().getTotal().getStat()) {
514 if (status.getContent().trim().equals("All Tests") && status.getFail() > 0) {
523 private List<Element> findLastElementsByDate(List<Element> elements, int noOfLastElements) {
524 if (elements.size() <= noOfLastElements) {
527 DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
528 Collections.sort(elements, new Comparator<Element>() {
530 public int compare(Element element1, Element element2) {
532 return dateFormat.parse(element2.getElementsByTag("td").get(1).text())
533 .compareTo(dateFormat.parse(element1.getElementsByTag("td").get(1).text()));
534 } catch (ParseException e) {
535 LOGGER.error(EELFLoggerDelegate.errorLogger,
536 "Error when parsing date. " + UserUtils.getStackTrace(e));
541 return elements.subList(0, noOfLastElements);
544 private Element findElementByTimestamp(List<Element> elements, String timestamp) {
545 for (Element element : elements) {
546 String elementTimestamp = element.getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
547 elementTimestamp = elementTimestamp.substring(0, elementTimestamp.length() - 1);
548 if (elementTimestamp.equals(timestamp)) {
555 private List<Element> findElementsBasedOnDate(List<Element> elements, Date date) throws ParseException {
556 DateFormat formatTime = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
557 DateFormat formatNoTime = new SimpleDateFormat("EEE MMM dd zzz yyyy", Locale.US);
558 List<Element> desiredElements = new ArrayList<Element>();
559 for (Element element : elements) {
560 String lastModified = element.getElementsByTag("td").get(1).text();
561 if (formatNoTime.format(formatTime.parse(lastModified)).compareTo(formatNoTime.format(date)) == 0) {
562 desiredElements.add(element);
565 return desiredElements;
568 private TestInfoYaml getTestInfo(String timestampUrl) {
569 LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get test info");
570 WebResource webResource = this.client.resource(timestampUrl + "/results/test_info.yaml");
571 LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
572 ClientResponse response = webResource.get(ClientResponse.class);
573 if (response.getStatus() != 200) {
574 LOGGER.warn(EELFLoggerDelegate.auditLogger, "No test_info.yaml file was found");
578 String testInfo = response.getEntity(String.class);
579 ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());
581 obj = yamlReader.readValue(testInfo, Object.class);
582 ObjectMapper mapper = new ObjectMapper();
583 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
584 mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
585 mapper.setSerializationInclusion(Include.NON_NULL);
586 ObjectMapper jsonWriter = new ObjectMapper();
587 return mapper.readValue(jsonWriter.writeValueAsString(obj), TestInfoYaml.class);
588 } catch (IOException e) {
589 LOGGER.error(EELFLoggerDelegate.errorLogger,
590 "Error when parsing test_info.yaml file. " + UserUtils.getStackTrace(e));