git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@559386 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -127,6 +127,10 @@ Fixed bugs: | |||
| * Regression: Path subclasses that overrode list() stopped working in | |||
| resourceCollection contexts in Ant 1.7.0. Bugzilla 42967. | |||
| * <property> supports loading from xml based property definition. | |||
| Bugzilla 42946 | |||
| Other changes: | |||
| -------------- | |||
| * <script> now has basic support for JavaFX scripts | |||
| @@ -57,6 +57,10 @@ properties. These references are resolved at the time these properties are set. | |||
| This also holds for properties loaded from a property file.</p> | |||
| <p>A list of predefined properties can be found <a | |||
| href="../using.html#built-in-props">here</a>.</p> | |||
| <p>Since Ant 1.7.1 it is possible to load properties defined in xml | |||
| according to <a href="http://java.sun.com/dtd/properties.dtd">Suns DTD</a>, | |||
| if Java5+ is present. For this the name of the file, resource or url has | |||
| to end with <tt>.xml</tt>.</p> | |||
| <h4>OpenVMS Users</h4> | |||
| <p>With the <code>environment</code> attribute this task will load all defined | |||
| @@ -2,6 +2,13 @@ | |||
| <project name="property-test" basedir="." default="test1"> | |||
| <property name="tmp.dir" value="_tmpdir_"/> | |||
| <available property="java5+" classname="java.lang.Iterable"/> | |||
| <target name="tearDown"> | |||
| <delete dir="${tmp.dir}"/> | |||
| </target> | |||
| <target name="test1"> | |||
| <property environment="testenv"/> | |||
| </target> | |||
| @@ -46,4 +53,24 @@ | |||
| <echo>b is ${b}</echo> | |||
| </target> | |||
| <target name="genXmlPropFile"> | |||
| <mkdir dir="${tmp.dir}"/> | |||
| <echo file="${tmp.dir}/props.xml"><?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> | |||
| <properties version="1.0"> | |||
| <comment> | |||
| Example of property definition according to Suns DTD as | |||
| specified in the Java5 docs and http://java.sun.com/dtd/properties.dtd. | |||
| </comment> | |||
| <entry key="xml.one">ONE</entry> | |||
| <entry key="xml.two">TWO</entry> | |||
| </properties> | |||
| </echo> | |||
| </target> | |||
| <target name="testXmlProperty.internal" depends="genXmlPropFile" if="java5+"> | |||
| <property file="${tmp.dir}/props.xml"/> | |||
| </target> | |||
| <target name="testXmlProperty" depends="testXmlProperty.internal"/> | |||
| </project> | |||
| @@ -21,6 +21,8 @@ import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import java.net.URL; | |||
| import java.util.Enumeration; | |||
| import java.util.HashMap; | |||
| @@ -36,6 +38,7 @@ import org.apache.tools.ant.PropertyHelper; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.Reference; | |||
| import org.apache.tools.ant.util.ReflectUtil; | |||
| /** | |||
| * Sets a property by name, or set of properties (from file or | |||
| @@ -499,7 +502,7 @@ public class Property extends Task { | |||
| try { | |||
| InputStream is = url.openStream(); | |||
| try { | |||
| props.load(is); | |||
| loadProperties(props, is, url.getFile().endsWith(".xml")); | |||
| } finally { | |||
| if (is != null) { | |||
| is.close(); | |||
| @@ -511,6 +514,39 @@ public class Property extends Task { | |||
| } | |||
| } | |||
| /** | |||
| * Loads the properties defined in the InputStream into the given | |||
| * property. On Java5+ it supports reading from XML based property | |||
| * definition. | |||
| * @param props The property object to load into | |||
| * @param is The input stream from where to load | |||
| * @param isXml <tt>true</tt> if we should try to load from xml | |||
| * @throws IOException if something goes wrong | |||
| * @since 1.7.1 | |||
| * @see http://java.sun.com/dtd/properties.dtd | |||
| * @see java.util.Properties#loadFromXML(InputStream) | |||
| */ | |||
| private void loadProperties(Properties props, InputStream is, boolean isXml) throws IOException { | |||
| if (isXml) { | |||
| // load the xml based property definition | |||
| // use reflection because of bwc to Java 1.3 | |||
| try { | |||
| Method loadXmlMethod = props.getClass().getMethod("loadFromXML", new Class[]{InputStream.class}); | |||
| loadXmlMethod.invoke(props, new Object[]{is}); | |||
| } catch (NoSuchMethodException e) { | |||
| e.printStackTrace(); | |||
| log("Can not load xml based property definition on Java < 5"); | |||
| return; | |||
| } catch (Exception e) { | |||
| // no-op | |||
| e.printStackTrace(); | |||
| } | |||
| } else { | |||
| // load ".properties" format | |||
| props.load(is); | |||
| } | |||
| } | |||
| /** | |||
| * load properties from a file | |||
| @@ -525,7 +561,7 @@ public class Property extends Task { | |||
| FileInputStream fis = null; | |||
| try { | |||
| fis = new FileInputStream(file); | |||
| props.load(fis); | |||
| loadProperties(props, fis, file.getName().endsWith(".xml")); | |||
| } finally { | |||
| if (fis != null) { | |||
| fis.close(); | |||
| @@ -565,7 +601,7 @@ public class Property extends Task { | |||
| } | |||
| if (is != null) { | |||
| props.load(is); | |||
| loadProperties(props, is, name.endsWith(".xml")); | |||
| addProperties(props); | |||
| } else { | |||
| log("Unable to find resource " + name, Project.MSG_WARN); | |||
| @@ -581,7 +617,6 @@ public class Property extends Task { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| @@ -107,5 +107,16 @@ public class PropertyTest extends BuildFileTest { | |||
| public void testThisIsNotACircularReference() { | |||
| expectLog("thisIsNotACircularReference", "b is A/A/A"); | |||
| } | |||
| public void testXmlProperty() { | |||
| try { | |||
| Class.forName("java.lang.Iterable"); | |||
| executeTarget("testXmlProperty"); | |||
| assertEquals("ONE", project.getProperty("xml.one")); | |||
| assertEquals("TWO", project.getProperty("xml.two")); | |||
| } catch (ClassNotFoundException e) { | |||
| // Xml-Loading only on Java5+ | |||
| } | |||
| } | |||
| } | |||