/* * Copyright PMEase (c) 2005 - 2010, * Date: Jun 13, 2010 8:42:06 AM * All rights reserved. * * Revision: $Id$ */ package com.pmease.quickbuild.monitor; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.pmease.quickbuild.monitor.gui.TrayMonitor; import com.pmease.quickbuild.monitor.notifier.BuildFragment; import com.pmease.quickbuild.monitor.notifier.BuildFragment.Status; import com.pmease.quickbuild.monitor.utils.XMLHelper; public class BuildHistory { private static final Logger logger = LoggerFactory.getLogger(BuildHistory.class); private List<BuildFragment> builds = Collections.synchronizedList(new ArrayList<BuildFragment>()); static String OUTPUT_NAME = "buildhistory.xml"; static String VERSION = "1.0"; final TrayMonitor monitor; public BuildHistory(final TrayMonitor monitor) { this.monitor = monitor; } public Status getStatus() { synchronized(builds) { if (builds.isEmpty()) { return Status.SUCCESSFUL; } // Status status = Status.SUCCESSFUL; int slide = monitor.settings.getStatusWindow(); List<BuildFragment> window; if (slide == 0 || builds.size() <= slide) { window = builds; } else { window = builds.subList(builds.size() - slide, builds.size()); } for (BuildFragment build : window) { if (build.getStatus() == Status.FAILED || build.getStatus() == Status.CANCELLED) { return Status.FAILED; } } return Status.SUCCESSFUL; } } public int size() { synchronized(builds) { return builds.size(); } } public void clear() { synchronized(builds) { builds.clear(); monitor.updateStatus(); } } public void add(List<BuildFragment> received) { if (received.isEmpty()) { return; } synchronized(builds) { int length = monitor.settings.getLengthOfNotifications(); builds.addAll(received); if (length > 0 && builds.size() > length) { builds = new ArrayList<BuildFragment>(builds.subList(builds.size() - length, builds.size())); } monitor.updateStatus(); } } public void save(File dir) { Element root = DocumentHelper.createElement("builds"); root.addAttribute("version", VERSION); Document doc = DocumentHelper.createDocument(root); synchronized(builds) { for (BuildFragment build : builds) { root.add(build.toXML()); } } File file = new File(dir, OUTPUT_NAME); try { XMLHelper.writeXML(doc, file); } catch (MonitorException e) { logger.error("Write document " + file + " failed!", e); } } @SuppressWarnings("unchecked") public void load(File dir) { File file = new File(dir, OUTPUT_NAME); if (!file.exists()) { return; } try { Document doc = XMLHelper.readXML(file); List<Element> elements = doc.getRootElement().elements(); synchronized(builds) { for (Element node : elements) { BuildFragment build = new BuildFragment(); build.fromXML(node); builds.add(build); } } } catch (MonitorException e) { logger.error("Read document " + file + " failed!", e); } } public List<BuildFragment> getBuilds() { return builds; } public void setBuilds(List<BuildFragment> builds) { this.builds = builds; } }