Browse Source

Merge branch '1.9.x'

master
Stefan Bodewig 7 years ago
parent
commit
6a9d701205
5 changed files with 113 additions and 2 deletions
  1. +5
    -0
      WHATSNEW
  2. +23
    -0
      manual/Tasks/property.html
  3. +4
    -0
      src/etc/testcases/taskdefs/property.xml
  4. +68
    -2
      src/main/org/apache/tools/ant/taskdefs/Property.java
  5. +13
    -0
      src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java

+ 5
- 0
WHATSNEW View File

@@ -39,6 +39,11 @@ Other changes:
finishing threads might fail.
Bugzilla Report 62148

* <property> has a new attribute runtime which can be used to set
properties with values taken as snapshots from the
availableProcessors, freeMemory, maxMemory and totalMemory methods
of the Java Runtime class.

Changes from Ant 1.10.2 TO Ant 1.10.3
=====================================



+ 23
- 0
manual/Tasks/property.html View File

@@ -49,6 +49,13 @@ they are most definitely not variables.</p>
<li>By setting the <var>environment</var> attribute with a prefix to use. Properties will be
defined for every environment variable by prefixing the supplied name and a period to the name
of the variable.</li>
<li>By setting the <i>runtime</i> attribute with a prefix to use.
Properties <code>prefix.availableProcessors</code>,
<code>prefix.freeMemory</code>, <code>prefix.totalMemory</code>
and <code>prefix.maxMemory</code> will be defined with values that
correspond to the corresponding methods of
the <a href="https://docs.oracle.com/javase/10/docs/api/java/lang/Runtime.html">Runtime</a>
class.</li>
</ul>
<p>Although combinations of these ways are possible, only one should be used at a time. Problems
might occur with the order in which properties are set, for instance.</p>
@@ -119,6 +126,22 @@ to <a href="http://java.sun.com/dtd/properties.dtd" target="_top">Sun DTD</a>, w
are not; e.g. Windows 2000 or later system path variable is set to an Ant property
named <code>env.Path</code> rather than <code>env.PATH</code>.</td>
</tr>
<tr>
<td>runtime</td>
<td>the prefix to use when retrieving Runtime properties. Thus if
you specify <var>runtime</var>=<q>myrt</q> you will be able to
access runtime values corresponding to methods in
the <a href="https://docs.oracle.com/javase/10/docs/api/java/lang/Runtime.html">Runtime</a>
class via property names <code>myrt.availableProcessors</code>,
<code>myrt.maxMemory</code>, <code>myrt.totalMemory</code> or
<code>myrt.freeMemory</code>. Note that if you supply a property name with a final
<code>.</code> it will not be doubled; i.e. runtime=<code>myrt.</code> will still
allow access of prpperties through <code>myrt.maxMemory</code>.<br>
Note also that the property values are snapshots taken at the point in time
when the <code>property</code> has been executed.
<em>Since Ant 1.10.4</em>
</td>
</tr>
<tr>
<td>classpath</td>
<td>the classpath to use when looking up a resource.</td>


+ 4
- 0
src/etc/testcases/taskdefs/property.xml View File

@@ -89,4 +89,8 @@
</target>
<target name="testXmlProperty" depends="testXmlProperty.internal"/>

<target name="testRuntime">
<property runtime="testruntime"/>
</target>

</project>

+ 68
- 2
src/main/org/apache/tools/ant/taskdefs/Property.java View File

@@ -58,6 +58,12 @@ import org.apache.tools.ant.util.FileUtils;
* <li>By setting the <i>environment</i> attribute with a prefix to use.
* Properties will be defined for every environment variable by
* prefixing the supplied name and a period to the name of the variable.</li>
* <li>By setting the <i>runtime</i> attribute with a prefix to use.
* Properties <code>prefix.availableProcessors</code>,
* <code>prefix.freeMemory</code>, <code>prefix.totalMemory</code>
* and <code>prefix.maxMemory</code> will be defined with values
* that correspond to the corresponding methods of the {@link
* Runtime} class.</li>
* </ul>
* <p>Although combinations of these ways are possible, only one should be used
* at a time. Problems might occur with the order in which properties are set, for
@@ -85,6 +91,7 @@ public class Property extends Task {
protected String env;
protected Reference ref;
protected String prefix;
private String runtime;
private Project fallback;
private Object untypedValue;
private boolean valueAttributeUsed = false;
@@ -385,6 +392,42 @@ public class Property extends Task {
return env;
}

/**
* Prefix to use when retrieving Runtime properties.
*
* <p>Properties <code>prefix.availableProcessors</code>,
* <code>prefix.freeMemory</code>, <code>prefix.totalMemory</code>
* and <code>prefix.maxMemory</code> will be defined with values
* that correspond to the corresponding methods of the {@link
* Runtime} class.</p>
*
* <p>Note that if you supply a prefix name with a final
* &quot;.&quot; it will not be doubled. ie
* runtime=&quot;myrt.&quot; will still allow access of property
* through &quot;myrt.availableProcessors&quot; and
* &quot;myrt.freeMemory&quot;.</p>
*
* <p>The property values are snapshots taken at the point in time
* when the <code>property</code> has been executed.</p>
*
* @param prefix prefix
*
* @ant.attribute group="noname"
* @since Ant 1.10.4
*/
public void setRuntime(String prefix) {
this.runtime = prefix;
}

/**
* Get the runtime attribute.
* @return the runtime attribute
* @since Ant 1.10.4
*/
public String getRuntime() {
return runtime;
}

/**
* The classpath to use when looking up a resource.
* @param classpath to add to any existing classpath
@@ -450,7 +493,7 @@ public class Property extends Task {

/**
* set the property in the project to the value.
* if the task was give a file, resource or env attribute
* if the task was give a file, resource, env or runtime attribute
* here is where it is loaded
* @throws BuildException on error
*/
@@ -470,7 +513,7 @@ public class Property extends Task {
if (url == null && file == null && resource == null
&& env == null) {
throw new BuildException(
"You must specify url, file, resource or environment when not using the name attribute",
"You must specify url, file, resource, environment or runtime when not using the name attribute",
getLocation());
}
}
@@ -515,6 +558,10 @@ public class Property extends Task {
loadEnvironment(env);
}

if (runtime != null) {
loadRuntime(runtime);
}

if (name != null && ref != null) {
try {
addProperty(name,
@@ -650,6 +697,25 @@ public class Property extends Task {
addProperties(props);
}

/**
* load the runtime values
* @param prefix prefix to place before them
* @since 1.10.4
*/
protected void loadRuntime(String prefix) {
Properties props = new Properties();
if (!prefix.endsWith(".")) {
prefix += ".";
}
log("Loading Runtime properties " + prefix, Project.MSG_VERBOSE);
Runtime r = Runtime.getRuntime();
props.put(prefix + "availableProcessors", String.valueOf(r.availableProcessors()));
props.put(prefix + "freeMemory", String.valueOf(r.freeMemory()));
props.put(prefix + "maxMemory", String.valueOf(r.maxMemory()));
props.put(prefix + "totalMemory", String.valueOf(r.totalMemory()));
addProperties(props);
}

/**
* iterate through a set of properties,
* resolve them then assign them


+ 13
- 0
src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java View File

@@ -20,6 +20,7 @@ package org.apache.tools.ant.taskdefs;

import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeNoException;

@@ -134,4 +135,16 @@ public class PropertyTest {
assertEquals("TWO", buildRule.getProject().getProperty("xml.two"));
}

@Test
public void testRuntime() {
// should get no output at all
buildRule.executeTarget("testRuntime");
assertEquals(Runtime.getRuntime().availableProcessors(),
Integer.parseInt(buildRule.getProject().getProperty("testruntime.availableProcessors")));
assertEquals(Runtime.getRuntime().maxMemory(),
Long.parseLong(buildRule.getProject().getProperty("testruntime.maxMemory")));
assertNotNull(buildRule.getProject().getProperty("testruntime.freeMemory"));
assertNotNull(buildRule.getProject().getProperty("testruntime.totalMemory"));
}

}

Loading…
Cancel
Save