git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271706 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,292 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional; | |||
| import java.io.BufferedInputStream; | |||
| import java.io.BufferedOutputStream; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.OutputStream; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * PropertyFile task uses java.util.Properties to modify integer, String and | |||
| * Date settings in a property file.<p> | |||
| * | |||
| * The following is an example of its usage: | |||
| * <ul><target name="setState"><br> | |||
| * | |||
| * <ul><property<br> | |||
| * | |||
| * <ul>name="header"<br> | |||
| * value="##Generated file - do not modify!"/><br> | |||
| * <propertyfile file="apropfile.properties" comment="${header}"> | |||
| * <br> | |||
| * <entry key="product.version.major" type="int" value="5"/><br> | |||
| * <entry key="product.version.minor" type="int" value="0"/><br> | |||
| * <entry key="product.build.major" type="int" value="0" /><br> | |||
| * <entry key="product.build.minor" type="int" operation="+" /><br> | |||
| * <entry key="product.build.date" type="date" operation="now" /> | |||
| * <br> | |||
| * <entry key="intSet" type="int" operation="=" value="681"/><br> | |||
| * <entry key="intDec" type="int" operation="-"/><br> | |||
| * <entry key="NeverDate" type="date" operation="never"/><br> | |||
| * <entry key="StringEquals" type="string" value="testValue"/><br> | |||
| * <entry key="NowDate" type="date" operation="now"/><br> | |||
| * | |||
| * </ul> | |||
| * </propertyfile><br> | |||
| * | |||
| * </ul> | |||
| * </target> | |||
| * </ul> | |||
| * <p> | |||
| * | |||
| * The <propertyfile> task must have:<br> | |||
| * | |||
| * <ul> | |||
| * <li> file</li> | |||
| * </ul> | |||
| * Other parameters are:<br> | |||
| * | |||
| * <ul> | |||
| * <li> comment, key, operation, type and value (the final four being | |||
| * eliminated shortly)</li> | |||
| * </ul> | |||
| * The <entry> task must have:<br> | |||
| * | |||
| * <ul> | |||
| * <li> key</li> | |||
| * </ul> | |||
| * Other parameters are:<br> | |||
| * | |||
| * <ul> | |||
| * <li> operation</li> | |||
| * <li> type</li> | |||
| * <li> value</li> | |||
| * <li> offset</li> | |||
| * </ul> | |||
| * If type is unspecified, it defaults to string Parameter values:<br> | |||
| * | |||
| * <ul> | |||
| * <li> operation:</li> | |||
| * <ul> | |||
| * <li> "=" (set -- default)</li> | |||
| * <li> "-" (dec)</li> | |||
| * <li> "+" (inc)</li> | |||
| * <li> type:</li> | |||
| * <ul> | |||
| * <li> "int"</li> | |||
| * <li> "date"</li> | |||
| * <li> "string"</li> | |||
| * </ul> | |||
| * | |||
| * </ul> | |||
| * | |||
| * <li> value:</li> | |||
| * <ul> | |||
| * <li> holds the default value, if the property was not found in property | |||
| * file</li> | |||
| * <li> "now" In case of type "date", the value "now" will be replaced by | |||
| * the current date/time and used even if a valid date was found in the | |||
| * property file.</li> | |||
| * </ul> | |||
| * | |||
| * <li> offset:<br> | |||
| * valid for "-" or "+", the offset (default set to 1) will be added or | |||
| * subtracted from "int" or "date" type value.</li> | |||
| * </ul> | |||
| * String property types can only use the "=" operation. Date property types can | |||
| * only use the "never" or "now" operations. Int property types can only use the | |||
| * "=", "-" or "+" operations.<p> | |||
| * | |||
| * The message property is used for the property file header, with "\\" being a | |||
| * newline delimiter charater. | |||
| * | |||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||
| * @author Jeremy Mawson <a href="mailto:jem@loftinspace.com.au"> | |||
| * jem@loftinspace.com.au</a> | |||
| */ | |||
| public class PropertyFile | |||
| extends AbstractTask | |||
| { | |||
| private ArrayList m_entries = new ArrayList(); | |||
| // Use this to prepend a message to the properties file | |||
| private String m_comment; | |||
| private Properties m_properties; | |||
| private File m_file; | |||
| public void setComment( final String comment ) | |||
| { | |||
| m_comment = comment; | |||
| } | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public Entry createEntry() | |||
| { | |||
| final Entry entry = new Entry(); | |||
| m_entries.add( entry ); | |||
| return entry; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| checkParameters(); | |||
| readFile(); | |||
| executeOperation(); | |||
| writeFile(); | |||
| } | |||
| /* | |||
| * Returns whether the given parameter has been defined. | |||
| */ | |||
| private boolean checkParam( String param ) | |||
| { | |||
| return !( ( param == null ) || ( param.equals( "null" ) ) ); | |||
| } | |||
| private boolean checkParam( File param ) | |||
| { | |||
| return !( param == null ); | |||
| } | |||
| private void checkParameters() | |||
| throws TaskException | |||
| { | |||
| if( !checkParam( m_file ) ) | |||
| { | |||
| throw new TaskException( "file token must not be null." ); | |||
| } | |||
| } | |||
| private void executeOperation() | |||
| throws TaskException | |||
| { | |||
| for( Iterator e = m_entries.iterator(); e.hasNext(); ) | |||
| { | |||
| Entry entry = (Entry)e.next(); | |||
| entry.executeOn( m_properties ); | |||
| } | |||
| } | |||
| private void readFile() | |||
| throws TaskException | |||
| { | |||
| // Create the PropertyFile | |||
| m_properties = new Properties(); | |||
| try | |||
| { | |||
| if( m_file.exists() ) | |||
| { | |||
| getLogger().info( "Updating property file: " + m_file.getAbsolutePath() ); | |||
| FileInputStream fis = null; | |||
| try | |||
| { | |||
| fis = new FileInputStream( m_file ); | |||
| BufferedInputStream bis = new BufferedInputStream( fis ); | |||
| m_properties.load( bis ); | |||
| } | |||
| finally | |||
| { | |||
| if( fis != null ) | |||
| { | |||
| fis.close(); | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| getLogger().info( "Creating new property file: " + | |||
| m_file.getAbsolutePath() ); | |||
| FileOutputStream out = null; | |||
| try | |||
| { | |||
| out = new FileOutputStream( m_file.getAbsolutePath() ); | |||
| out.flush(); | |||
| } | |||
| finally | |||
| { | |||
| if( out != null ) | |||
| { | |||
| out.close(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| catch( IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.toString() ); | |||
| } | |||
| } | |||
| private void writeFile() | |||
| throws TaskException | |||
| { | |||
| BufferedOutputStream bos = null; | |||
| try | |||
| { | |||
| bos = new BufferedOutputStream( new FileOutputStream( m_file ) ); | |||
| // Properties.store is not available in JDK 1.1 | |||
| Method m = | |||
| Properties.class.getMethod( "store", | |||
| new Class[]{ | |||
| OutputStream.class, | |||
| String.class} | |||
| ); | |||
| m.invoke( m_properties, new Object[]{bos, m_comment} ); | |||
| } | |||
| catch( NoSuchMethodException nsme ) | |||
| { | |||
| m_properties.save( bos, m_comment ); | |||
| } | |||
| catch( InvocationTargetException ite ) | |||
| { | |||
| Throwable t = ite.getTargetException(); | |||
| throw new TaskException( "Error", t ); | |||
| } | |||
| catch( IllegalAccessException iae ) | |||
| { | |||
| // impossible | |||
| throw new TaskException( "Error", iae ); | |||
| } | |||
| catch( IOException ioe ) | |||
| { | |||
| throw new TaskException( "Error", ioe ); | |||
| } | |||
| finally | |||
| { | |||
| if( bos != null ) | |||
| { | |||
| try | |||
| { | |||
| bos.close(); | |||
| } | |||
| catch( IOException ioex ) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,292 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional; | |||
| import java.io.BufferedInputStream; | |||
| import java.io.BufferedOutputStream; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.OutputStream; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * PropertyFile task uses java.util.Properties to modify integer, String and | |||
| * Date settings in a property file.<p> | |||
| * | |||
| * The following is an example of its usage: | |||
| * <ul><target name="setState"><br> | |||
| * | |||
| * <ul><property<br> | |||
| * | |||
| * <ul>name="header"<br> | |||
| * value="##Generated file - do not modify!"/><br> | |||
| * <propertyfile file="apropfile.properties" comment="${header}"> | |||
| * <br> | |||
| * <entry key="product.version.major" type="int" value="5"/><br> | |||
| * <entry key="product.version.minor" type="int" value="0"/><br> | |||
| * <entry key="product.build.major" type="int" value="0" /><br> | |||
| * <entry key="product.build.minor" type="int" operation="+" /><br> | |||
| * <entry key="product.build.date" type="date" operation="now" /> | |||
| * <br> | |||
| * <entry key="intSet" type="int" operation="=" value="681"/><br> | |||
| * <entry key="intDec" type="int" operation="-"/><br> | |||
| * <entry key="NeverDate" type="date" operation="never"/><br> | |||
| * <entry key="StringEquals" type="string" value="testValue"/><br> | |||
| * <entry key="NowDate" type="date" operation="now"/><br> | |||
| * | |||
| * </ul> | |||
| * </propertyfile><br> | |||
| * | |||
| * </ul> | |||
| * </target> | |||
| * </ul> | |||
| * <p> | |||
| * | |||
| * The <propertyfile> task must have:<br> | |||
| * | |||
| * <ul> | |||
| * <li> file</li> | |||
| * </ul> | |||
| * Other parameters are:<br> | |||
| * | |||
| * <ul> | |||
| * <li> comment, key, operation, type and value (the final four being | |||
| * eliminated shortly)</li> | |||
| * </ul> | |||
| * The <entry> task must have:<br> | |||
| * | |||
| * <ul> | |||
| * <li> key</li> | |||
| * </ul> | |||
| * Other parameters are:<br> | |||
| * | |||
| * <ul> | |||
| * <li> operation</li> | |||
| * <li> type</li> | |||
| * <li> value</li> | |||
| * <li> offset</li> | |||
| * </ul> | |||
| * If type is unspecified, it defaults to string Parameter values:<br> | |||
| * | |||
| * <ul> | |||
| * <li> operation:</li> | |||
| * <ul> | |||
| * <li> "=" (set -- default)</li> | |||
| * <li> "-" (dec)</li> | |||
| * <li> "+" (inc)</li> | |||
| * <li> type:</li> | |||
| * <ul> | |||
| * <li> "int"</li> | |||
| * <li> "date"</li> | |||
| * <li> "string"</li> | |||
| * </ul> | |||
| * | |||
| * </ul> | |||
| * | |||
| * <li> value:</li> | |||
| * <ul> | |||
| * <li> holds the default value, if the property was not found in property | |||
| * file</li> | |||
| * <li> "now" In case of type "date", the value "now" will be replaced by | |||
| * the current date/time and used even if a valid date was found in the | |||
| * property file.</li> | |||
| * </ul> | |||
| * | |||
| * <li> offset:<br> | |||
| * valid for "-" or "+", the offset (default set to 1) will be added or | |||
| * subtracted from "int" or "date" type value.</li> | |||
| * </ul> | |||
| * String property types can only use the "=" operation. Date property types can | |||
| * only use the "never" or "now" operations. Int property types can only use the | |||
| * "=", "-" or "+" operations.<p> | |||
| * | |||
| * The message property is used for the property file header, with "\\" being a | |||
| * newline delimiter charater. | |||
| * | |||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||
| * @author Jeremy Mawson <a href="mailto:jem@loftinspace.com.au"> | |||
| * jem@loftinspace.com.au</a> | |||
| */ | |||
| public class PropertyFile | |||
| extends AbstractTask | |||
| { | |||
| private ArrayList m_entries = new ArrayList(); | |||
| // Use this to prepend a message to the properties file | |||
| private String m_comment; | |||
| private Properties m_properties; | |||
| private File m_file; | |||
| public void setComment( final String comment ) | |||
| { | |||
| m_comment = comment; | |||
| } | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public Entry createEntry() | |||
| { | |||
| final Entry entry = new Entry(); | |||
| m_entries.add( entry ); | |||
| return entry; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| checkParameters(); | |||
| readFile(); | |||
| executeOperation(); | |||
| writeFile(); | |||
| } | |||
| /* | |||
| * Returns whether the given parameter has been defined. | |||
| */ | |||
| private boolean checkParam( String param ) | |||
| { | |||
| return !( ( param == null ) || ( param.equals( "null" ) ) ); | |||
| } | |||
| private boolean checkParam( File param ) | |||
| { | |||
| return !( param == null ); | |||
| } | |||
| private void checkParameters() | |||
| throws TaskException | |||
| { | |||
| if( !checkParam( m_file ) ) | |||
| { | |||
| throw new TaskException( "file token must not be null." ); | |||
| } | |||
| } | |||
| private void executeOperation() | |||
| throws TaskException | |||
| { | |||
| for( Iterator e = m_entries.iterator(); e.hasNext(); ) | |||
| { | |||
| Entry entry = (Entry)e.next(); | |||
| entry.executeOn( m_properties ); | |||
| } | |||
| } | |||
| private void readFile() | |||
| throws TaskException | |||
| { | |||
| // Create the PropertyFile | |||
| m_properties = new Properties(); | |||
| try | |||
| { | |||
| if( m_file.exists() ) | |||
| { | |||
| getLogger().info( "Updating property file: " + m_file.getAbsolutePath() ); | |||
| FileInputStream fis = null; | |||
| try | |||
| { | |||
| fis = new FileInputStream( m_file ); | |||
| BufferedInputStream bis = new BufferedInputStream( fis ); | |||
| m_properties.load( bis ); | |||
| } | |||
| finally | |||
| { | |||
| if( fis != null ) | |||
| { | |||
| fis.close(); | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| getLogger().info( "Creating new property file: " + | |||
| m_file.getAbsolutePath() ); | |||
| FileOutputStream out = null; | |||
| try | |||
| { | |||
| out = new FileOutputStream( m_file.getAbsolutePath() ); | |||
| out.flush(); | |||
| } | |||
| finally | |||
| { | |||
| if( out != null ) | |||
| { | |||
| out.close(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| catch( IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.toString() ); | |||
| } | |||
| } | |||
| private void writeFile() | |||
| throws TaskException | |||
| { | |||
| BufferedOutputStream bos = null; | |||
| try | |||
| { | |||
| bos = new BufferedOutputStream( new FileOutputStream( m_file ) ); | |||
| // Properties.store is not available in JDK 1.1 | |||
| Method m = | |||
| Properties.class.getMethod( "store", | |||
| new Class[]{ | |||
| OutputStream.class, | |||
| String.class} | |||
| ); | |||
| m.invoke( m_properties, new Object[]{bos, m_comment} ); | |||
| } | |||
| catch( NoSuchMethodException nsme ) | |||
| { | |||
| m_properties.save( bos, m_comment ); | |||
| } | |||
| catch( InvocationTargetException ite ) | |||
| { | |||
| Throwable t = ite.getTargetException(); | |||
| throw new TaskException( "Error", t ); | |||
| } | |||
| catch( IllegalAccessException iae ) | |||
| { | |||
| // impossible | |||
| throw new TaskException( "Error", iae ); | |||
| } | |||
| catch( IOException ioe ) | |||
| { | |||
| throw new TaskException( "Error", ioe ); | |||
| } | |||
| finally | |||
| { | |||
| if( bos != null ) | |||
| { | |||
| try | |||
| { | |||
| bos.close(); | |||
| } | |||
| catch( IOException ioex ) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||