ReportParser implements TextParser<Metrics> { @NotNull @Override public Metrics parse(@NotNull final String reportContent) { if(StringUtil.isEmptyOrSpaces(reportContent)) { return new Metrics(Collections.<Metric>emptyList()); } final List<Metric> metrics = new ArrayList<Metric>(); final Document doc = myXmlDocumentManager.convertStringToDocument(reportContent); final XPath xpath = XPathFactory.newInstance().newXPath(); try { final NodeList functionElements = (NodeList)xpath.evaluate(FUNCTION_XPATH, doc, XPathConstants.NODESET); for (int functionIndex = 0; functionIndex < functionElements.getLength(); functionIndex++) { final Node functionElement = functionElements.item(functionIndex); @Nullable final Node methodNameAttr = functionElement.getAttributes().getNamedItem(METHOD_NAME_ATTR); @Nullable final Node totalTimeAttr = functionElement.getAttributes().getNamedItem(TOTAL_TIME_ATTR); @Nullable final Node ownTimeAttr = functionElement.getAttributes().getNamedItem(OWN_TIME_ATTR); if(methodNameAttr == null || totalTimeAttr == null || ownTimeAttr == null) { continue; } final String methodName = methodNameAttr.getNodeValue(); final String totalTime = totalTimeAttr.getNodeValue(); final String ownTime = ownTimeAttr.getNodeValue(); if(StringUtil.isEmptyOrSpaces(methodName) || StringUtil.isEmptyOrSpaces(totalTime) || StringUtil.isEmptyOrSpaces(ownTime)) { continue; } metrics.add(new Metric(methodName, totalTime, ownTime)); } } catch (XPathExpressionException e) { throw new BuildException(ERROR_DURING_PARSING_ERROR_MESSAGE); } return new Metrics(metrics); } ReportParser(
    @NotNull final XmlDocumentManager xmlDocumentManager); @NotNull @Override Metrics parse(@NotNull final String reportContent);  }
@Test(dataProvider = "parseDotTraceReportFromXmlCases") public void shouldParseDotTraceReportFromXml(@NotNull final String text, @NotNull final Metrics expectedMetrics) { final TextParser<Metrics> instance = createInstance(); final Metrics actualMetrics = instance.parse(text); then(actualMetrics).isEqualTo(expectedMetrics); }