Stefan Bodewig 7 years ago
parent
commit
5e99fc2c1a
5 changed files with 115 additions and 4 deletions
  1. +5
    -0
      WHATSNEW
  2. +23
    -0
      manual/Tasks/property.html
  3. +4
    -0
      src/etc/testcases/taskdefs/property.xml
  4. +70
    -4
      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

@@ -36,6 +36,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.9.10 TO Ant 1.9.11
=====================================



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

@@ -49,6 +49,13 @@ resource) in the project. Properties are case sensitive.</p>
<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 <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
@@ -126,6 +133,22 @@ to end with <tt>.xml</tt>.</p>
system path variable is set to an Ant property named "env.Path"
rather than "env.PATH".</td>
</tr>
<tr>
<td valign="top">runtime</td>
<td valign="top">the prefix to use when retrieving Runtime properties. Thus
if you specify runtime=&quot;myrt&quot; 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 &quot;myrt.availableProcessors&quot;,
&quot;myrt.maxMemory&quot;, &quot;myrt.totalMemory&quot; or
&quot;myrt.freeMemory&quot;. Note that if you supply a property name with a final
&quot;.&quot; it will not be doubled; i.e. runtime=&quot;myrt.&quot; will still
allow access of prpperties through &quot;myrt.maxMemory&quot;.<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.9.12</em>
</td>
</tr>
<tr>
<td valign="top">classpath</td>
<td valign="top">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>

+ 70
- 4
src/main/org/apache/tools/ant/taskdefs/Property.java View File

@@ -59,6 +59,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
@@ -86,6 +92,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;
@@ -387,6 +394,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.9.12
*/
public void setRuntime(String prefix) {
this.runtime = prefix;
}

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

/**
* The classpath to use when looking up a resource.
* @param classpath to add to any existing classpath
@@ -452,7 +495,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
*/
@@ -469,9 +512,9 @@ public class Property extends Task {
getLocation());
}
} else {
if (url == null && file == null && resource == null && env == null) {
throw new BuildException("You must specify url, file, resource or "
+ "environment when not using the "
if (url == null && file == null && resource == null && env == null && runtime == null) {
throw new BuildException("You must specify url, file, resource, "
+ "environment or runtime when not using the "
+ "name attribute", getLocation());
}
}
@@ -513,6 +556,10 @@ public class Property extends Task {
loadEnvironment(env);
}

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

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

/**
* load the runtime values
* @param prefix prefix to place before them
* @since 1.9.12
*/
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.apache.tools.ant.AntAssert.assertContains;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

@@ -136,4 +137,16 @@ public class PropertyTest {

}

@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