package hudson.plugins.seleniumhq; import hudson.XmlFile; import hudson.model.AbstractBuild; import hudson.model.Action; import hudson.model.BuildListener; import hudson.model.Result; import hudson.util.XStream2; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.lang.ref.WeakReference; import java.util.logging.Level; import java.util.logging.Logger; import com.thoughtworks.xstream.XStream; /** * * @author Pascal Martin * */ public class SeleniumhqBuildAction implements Action, Serializable { private transient WeakReference<TestResult> result; private static final long serialVersionUID = 1L; public final AbstractBuild<?,?> owner; private static final Logger logger = Logger.getLogger(SeleniumhqBuildAction.class.getName()); public SeleniumhqBuildAction(AbstractBuild<?,?> owner, TestResult result, BuildListener listener) { this.owner = owner; // persist the data try { getDataFile().write(result); } catch (IOException e) { e.printStackTrace(listener.fatalError("Failed to save the Selenium test result")); } } private XmlFile getDataFile() { return new XmlFile(XSTREAM,new File(owner.getRootDir(), "seleniumhqResult.xml")); } public Object getTarget() { return getResult(); } public String getIconFileName() { return "/plugin/seleniumhq/icons/sla-24x24.png"; } public String getDisplayName() { return "Selenium Report"; } public String getUrlName() { return "seleniumhq"; } public AbstractBuild<?, ?> getOwner() { return owner; } public synchronized TestResult getResult() { TestResult r; if(result==null) { r = load(); result = new WeakReference<TestResult>(r); } else { r = result.get(); } if(r==null) { r = load(); result = new WeakReference<TestResult>(r); } return r; } public synchronized SeleniumhqBuildAction getPreviousResult() { AbstractBuild<?, ?> b = owner; while (true) { b = b.getPreviousBuild(); if (b == null) return null; if (b.getResult() == Result.FAILURE) continue; SeleniumhqBuildAction r = b.getAction(SeleniumhqBuildAction.class); if (r != null) return r; } } /** * Loads a {@link TestResult} from disk. */ private TestResult load() { TestResult r; try { r = (TestResult)getDataFile().read(); } catch (IOException e) { logger.log(Level.WARNING, "Failed to load "+getDataFile(),e); r = new TestResult(); // return a dummy } return r; } private static final XStream XSTREAM = new XStream2(); }