/********************************************************************************
* CruiseControl, a Continuous Integration Toolkit
* Copyright (c) 2006, ThoughtWorks, Inc.
* 200 E. Randolph, 25th Floor
* Chicago, IL 60601 USA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* + Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* + Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
********************************************************************************/
package net.sourceforge.cruisecontrol.listeners;
import net.sourceforge.cruisecontrol.CruiseControlException;
import net.sourceforge.cruisecontrol.Listener;
import net.sourceforge.cruisecontrol.ProjectEvent;
import net.sourceforge.cruisecontrol.ProjectState;
import net.sourceforge.cruisecontrol.util.CurrentBuildFileWriter;
import net.sourceforge.cruisecontrol.util.ValidationHelper;
import net.sourceforge.cruisecontrol.util.IO;
import net.sourceforge.cruisecontrol.util.DateUtil;
import org.apache.log4j.Logger;
import java.util.Date;
import java.util.List;
import java.io.File;
/**
* Writes a text snippet in a file (typically in a location where the reporting module can read it), indicating
* the current build status.
* @author jfredrick
*/
public class CurrentBuildStatusListener implements Listener {
private static final Logger LOG = Logger.getLogger(CurrentBuildStatusListener.class);
private String fileName;
public static final String MSG_PREFIX_PROGRESS = "progress: ";
public void handleEvent(ProjectEvent event) throws CruiseControlException {
if (event instanceof ProjectStateChangedEvent) {
final ProjectStateChangedEvent stateChanged = (ProjectStateChangedEvent) event;
final ProjectState newState = stateChanged.getNewState();
LOG.debug("updating status to " + newState.getName() + " for project " + stateChanged.getProjectName());
final String text = newState.getDescription() + " since\n";
CurrentBuildFileWriter.writefile(text, new Date(), fileName);
} else if (event instanceof ProgressChangedEvent) {
final ProgressChangedEvent progressChanged = (ProgressChangedEvent) event;
final String msgProgress = DateUtil.formatIso8601(progressChanged.getProgress().getLastUpdated())
+ " " + progressChanged.getProgress().getText();
LOG.debug("updating progress to " + msgProgress + " for project " + progressChanged.getProjectName());
final String text = getStatusTextPrefix()
+ MSG_PREFIX_PROGRESS + msgProgress;
IO.write(fileName, text);
} else {
// ignore other ProjectEvents
LOG.debug("ignoring event " + event.getClass().getName() + " for project " + event.getProjectName());
}
}
private String getStatusTextPrefix() throws CruiseControlException {
String statusPrefix = "";
final File statusFile = new File(fileName);
if (!statusFile.exists()) {
return statusPrefix;
}
final List lines = IO.readLines(statusFile);
// look for Progress Text Prefix (might not exist)
String line;
for (int i = 0; i < lines.size(); i++) {
line = (String) lines.get(i);
if (line.startsWith(MSG_PREFIX_PROGRESS)) {
break;
} else {
statusPrefix += line + "\n";
}
}
return statusPrefix;
}
public void validate() throws CruiseControlException {
ValidationHelper.assertIsSet(fileName, "file", this.getClass());
CurrentBuildFileWriter.validate(fileName);
}
public void setFile(String fileName) {
this.fileName = fileName.trim();
LOG.debug("set fileName = " + fileName);
}
}