package hudson.plugins.fitnesse; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; public class NativePageCounts extends DefaultHandler { public static final String PAGE = "page"; public static final String PSEUDO_PAGE = "name"; public static final String APPROX_RESULT_DATE = "approxResultDate"; public static final String RIGHT = "right"; public static final String WRONG = "wrong"; public static final String IGNORED = "ignored"; public static final String EXCEPTIONS = "exceptions"; public static final String SUMMARY = "summary"; public static final String DETAIL = "detail"; private static final List<String> COUNTABLE = Arrays.asList(new String[] { SUMMARY, DETAIL }); private Counts summary; private Map<String, Counts> allCounts = new HashMap<String, Counts>(); @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { if (COUNTABLE.contains(qName)) { String page = attributes.getValue(PAGE); String pseudoPage = attributes.getValue(PSEUDO_PAGE); Counts counts = new Counts( page == null || page.equals("") ? pseudoPage : page, qName.equals(SUMMARY) ? "" : resultsDateOf(attributes.getValue(APPROX_RESULT_DATE)), Integer.parseInt(attributes.getValue(RIGHT)), Integer.parseInt(attributes.getValue(WRONG)), Integer.parseInt(attributes.getValue(IGNORED)), Integer.parseInt(attributes.getValue(EXCEPTIONS))); if (qName.equals(SUMMARY)) summary = counts; allCounts.put(counts.page, counts); } } public String resultsDateOf(String approxResultDate) { int pos = approxResultDate.indexOf('&'); if (pos == -1) return approxResultDate; return approxResultDate.substring(0, pos); } public int size() { return allCounts.size(); } public Counts getSummary() { if (summary != null && summary.right == 0 && summary.wrong == 0 && summary.ignored == 0 && summary.exceptions == 0) { List<Counts> details = getDetails(); if (details.size() == 1) { return details.get(0); } } return summary; } public List<Counts> getDetails() { ArrayList<Counts> details = new ArrayList<Counts>(); for (String key : allCounts.keySet()) { Counts counts = allCounts.get(key); if (counts != summary) details.add(counts); } return details; } static final class Counts { private static final long serialVersionUID = 1L; static final SimpleDateFormat RESULTS_DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss"); public final String page; public final String resultsDate; public final int right; public final int wrong; public final int ignored; public final int exceptions; public Counts(String page, String resultsDate, int right, int wrong, int ignored, int exceptions) { this.page = page; this.resultsDate = resultsDate; this.right = right; this.wrong = wrong; this.ignored = ignored; this.exceptions = exceptions; } public Date resultsDateAsDate() throws ParseException { return RESULTS_DATE_FORMAT.parse(resultsDate); } @Override public String toString() { return String.format("%s (%s): %s right, %s wrong, %s ignored, %s exceptions", page, resultsDate, right, wrong, ignored, exceptions ); } } }