/* * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. 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. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR * ITS 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ package org.apache.tools.ant.taskdefs; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.util.FileUtils; /** * Read, increment, and write a build number in a file * It will first * attempt to read a build number from a file, then set the property * "build.number" to the value that was read in (or 0 if no such value). Then * it will increment the build number by one and write it back out into the * file. * * @author Peter Donald * @version $Revision$ $Date$ * @since Ant 1.5 * @ant.task name="buildnumber" */ public class BuildNumber extends Task { /** * The name of the property in which the build number is stored. */ private static final String DEFAULT_PROPERTY_NAME = "build.number"; /** The default filename to use if no file specified. */ private static final String DEFAULT_FILENAME = DEFAULT_PROPERTY_NAME; /** The File in which the build number is stored. */ private File m_file; /** * The file in which the build number is stored. Defaults to * "build.number" if not specified. * * @param file the file in which build number is stored. */ public void setFile(final File file) { m_file = file; } /** * Run task. * * @exception BuildException if an error occurs */ public void execute() throws BuildException { File savedFile = m_file;// may be altered in validate validate(); final Properties properties = loadProperties(); final int buildNumber = getBuildNumber(properties); properties.put(DEFAULT_PROPERTY_NAME, String.valueOf(buildNumber + 1)); // Write the properties file back out FileOutputStream output = null; try { output = new FileOutputStream(m_file); final String header = "Build Number for ANT. Do not edit!"; properties.save(output, header); } catch (final IOException ioe) { final String message = "Error while writing " + m_file; throw new BuildException(message, ioe); } finally { if (null != output) { try { output.close(); } catch (final IOException ioe) { } } m_file = savedFile; } //Finally set the property getProject().setNewProperty(DEFAULT_PROPERTY_NAME, String.valueOf(buildNumber)); } /** * Utility method to retrieve build number from properties object. * * @param properties the properties to retrieve build number from * @return the build number or if no number in properties object * @throws BuildException if build.number property is not an integer */ private int getBuildNumber(final Properties properties) throws BuildException { final String buildNumber = properties.getProperty(DEFAULT_PROPERTY_NAME, "0").trim(); // Try parsing the line into an integer. try { return Integer.parseInt(buildNumber); } catch (final NumberFormatException nfe) { final String message = m_file + " contains a non integer build number: " + buildNumber; throw new BuildException(message, nfe); } } /** * Utility method to load properties from file. * * @return the loaded properties * @throws BuildException */ private Properties loadProperties() throws BuildException { FileInputStream input = null; try { final Properties properties = new Properties(); input = new FileInputStream(m_file); properties.load(input); return properties; } catch (final IOException ioe) { throw new BuildException(ioe); } finally { if (null != input) { try { input.close(); } catch (final IOException ioe) { } } } } /** * Validate that the task parameters are valid. * * @throws BuildException if parameters are invalid */ private void validate() throws BuildException { if (null == m_file) { m_file = getProject().resolveFile(DEFAULT_FILENAME); } if (!m_file.exists()) { try { FileUtils.newFileUtils().createNewFile(m_file); } catch (final IOException ioe) { final String message = m_file + " doesn't exist and new file can't be created."; throw new BuildException(message, ioe); } } if (!m_file.canRead()) { final String message = "Unable to read from " + m_file + "."; throw new BuildException(message); } if (!m_file.canWrite()) { final String message = "Unable to write to " + m_file + "."; throw new BuildException(message); } } }