X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Ftest%2Ftree%2FTreeTestResult.java;h=3e365afe0822c6f28b51f3f835d89189a6fd7328;hb=c4e9c29266eb8656d0573a3aff8b6b2a713861d7;hp=36233e9942a2d321cb73b39d5d86842638adb275;hpb=02b464f4fceaee1d65c711c868259879b02001b5;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java index 36233e994..3e365afe0 100644 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/tree/TreeTestResult.java @@ -2,91 +2,75 @@ package org.argeo.slc.core.test.tree; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.argeo.slc.core.SlcException; -import org.argeo.slc.core.process.SlcExecution; -import org.argeo.slc.core.process.SlcExecutionAware; -import org.argeo.slc.core.process.SlcExecutionStep; import org.argeo.slc.core.structure.StructureAware; import org.argeo.slc.core.structure.StructureElement; import org.argeo.slc.core.structure.StructureRegistry; import org.argeo.slc.core.structure.tree.TreeSPath; -import org.argeo.slc.core.test.NumericTRId; import org.argeo.slc.core.test.TestResult; -import org.argeo.slc.core.test.TestResultId; import org.argeo.slc.core.test.TestResultListener; import org.argeo.slc.core.test.TestResultPart; +import org.argeo.slc.core.test.TestRun; +import org.argeo.slc.core.test.TestRunAware; /** * Complex implementation of a test result compatible with a tree based * structure. */ public class TreeTestResult implements TestResult, StructureAware, - SlcExecutionAware { + Comparable { private Log log = LogFactory.getLog(TreeTestResult.class); - /** For ORM */ - private Long tid; - private NumericTRId testResultId; - private List listeners = new Vector(); + private List> listeners = new Vector>(); private TreeSPath currentPath; - private String currentSlcExecutionUuid; - private String currentSlcExecutionStepUuid; + private TestRun currentTestRun; private Date closeDate; - private boolean isClosed = false; + private Boolean isClosed = false; - private SortedMap resultParts = new TreeMap(); - private SortedMap pathNames = new TreeMap(); + private Boolean warnIfAlreadyClosed = true; - private StructureRegistry registry; + private String uuid; - public TestResultId getTestResultId() { - return testResultId; - } - - /** - * Use of a NumericTRId is required by Hibernate. It may - * change in the future. - */ - public NumericTRId getNumericResultId() { - return testResultId; - } + private SortedMap resultParts = new TreeMap(); + private SortedMap elements = new TreeMap(); - /** Sets the test result id as a numeric test result id. */ - public void setNumericResultId(NumericTRId testResultId) { - this.testResultId = testResultId; - } + private Map attributes = new TreeMap(); /** Sets the list of listeners. */ - public void setListeners(List listeners) { + public void setListeners(List> listeners) { this.listeners = listeners; } public void addResultPart(TestResultPart part) { - if (currentPath == null) { + if (isClosed) + throw new SlcException("Cannot result parts to a closed result"); + + if (currentPath == null) throw new SlcException("No current path set."); - } + PartSubList subList = resultParts.get(currentPath); if (subList == null) { subList = new PartSubList(); - subList.setSlcExecutionUuid(currentSlcExecutionUuid); - subList.setSlcExecutionStepUuid(currentSlcExecutionStepUuid); resultParts.put(currentPath, subList); } + if (part instanceof TestRunAware && currentTestRun != null) { + ((TestRunAware) part).notifyTestRun(currentTestRun); + } subList.getParts().add(part); // notify listeners synchronized (listeners) { - for (TestResultListener listener : listeners) { + for (TestResultListener listener : listeners) { listener.resultPartAdded(this, part); } } @@ -96,17 +80,21 @@ public class TreeTestResult implements TestResult, StructureAware, TreeSPath path) { if (registry != null) { for (TreeSPath p : path.getHierarchyAsList()) { - if (!pathNames.containsKey(p)) { + if (!elements.containsKey(p)) { StructureElement elem = registry.getElement(p); if (elem != null) { - pathNames.put(p, elem.getLabel()); + elements.put(p, elem); } + } else { + if (log.isTraceEnabled()) + log.trace("An element is already registered for path " + + p + " and was not updated"); } + } } - currentPath = (TreeSPath) path; - this.registry = registry; + currentPath = path; } /** Gets the current path. */ @@ -125,63 +113,107 @@ public class TreeTestResult implements TestResult, StructureAware, } public void close() { + if (resultParts.size() == 0) { + if (log.isTraceEnabled()) + log.trace("Test Result #" + getUuid() + + " contains no results, no need to close it."); + return; + } + if (isClosed) { - throw new SlcException("Test Result #" + getTestResultId() - + " alredy closed."); + if (warnIfAlreadyClosed) + log.warn("Test Result #" + getUuid() + + " already closed. Doing nothing."); + return; } + closeDate = new Date(); synchronized (listeners) { - for (TestResultListener listener : listeners) { + for (TestResultListener listener : listeners) { listener.close(this); } listeners.clear(); } isClosed = true; - log.info("Test Result #" + getTestResultId() + " closed."); + if (log.isTraceEnabled()) + log.trace("Test Result " + getUuid() + " closed."); + } + + public Date getCloseDate() { + return closeDate; + } + + /** Sets the close date (for ORM) */ + public void setCloseDate(Date closeDate) { + this.closeDate = closeDate; } - Long getTid() { - return tid; + public void notifyTestRun(TestRun testRun) { + currentTestRun = testRun; } - void setTid(Long tid) { - this.tid = tid; + public SortedMap getElements() { + return elements; } - /** Gets the related registry (can be null). */ - public StructureRegistry getRegistry() { - return registry; + public void setElements(SortedMap pathNames) { + this.elements = pathNames; } - /** Sets the related registry. */ - // public void setRegistry(StructureRegistry registry) { - // this.registry = registry; - // } - public Date getCloseDate() { - return closeDate; + public String getUuid() { + return uuid; } - /** Sets the close date (for ORM) */ - public void setCloseDate(Date closeDate) { - this.closeDate = closeDate; + public void setUuid(String uuid) { + this.uuid = uuid; } - public void notifySlcExecution(SlcExecution slcExecution) { - currentSlcExecutionUuid = slcExecution.getUuid(); - SlcExecutionStep step = slcExecution.currentStep(); - if (step != null) { - currentSlcExecutionStepUuid = step.getUuid(); + public SortedMap getRelatedElements( + TreeSPath path) { + if (path == null) + throw new SlcException( + "Cannot retrieve element for a null path in result #" + + uuid); + + SortedMap relatedElements = new TreeMap(); + List hierarchy = path.getHierarchyAsList(); + for (TreeSPath currPath : elements.keySet()) { + if (hierarchy.contains(currPath)) { + relatedElements.put(currPath, elements.get(currPath)); + } } + return relatedElements; + } + + public TestRun getCurrentTestRun() { + return currentTestRun; + } + + public int compareTo(TreeTestResult ttr2) { + TreeTestResult ttr1 = this; + if (ttr1.getCloseDate() != null && ttr2.getCloseDate() != null) { + return -ttr1.getCloseDate().compareTo(ttr2.getCloseDate()); + } else if (ttr1.getCloseDate() != null && ttr2.getCloseDate() == null) { + return 1; + } else if (ttr1.getCloseDate() == null && ttr2.getCloseDate() != null) { + return -1; + } else { + return ttr1.getUuid().compareTo(ttr2.getUuid()); + } + } + + public Map getAttributes() { + return attributes; } - public SortedMap getPathNames() { - return pathNames; + public void setAttributes(Map attributes) { + this.attributes = attributes; } - public void setPathNames(SortedMap pathNames) { - this.pathNames = pathNames; + public void setWarnIfAlreadyClosed(Boolean warnIfAlreadyClosed) { + this.warnIfAlreadyClosed = warnIfAlreadyClosed; } }