From 5e99fc2c1ad0930b8f46ead6fdb5fc63b430827f Mon Sep 17 00:00:00 2001
From: Stefan Bodewig
Date: Thu, 26 Apr 2018 13:56:09 +0200
Subject: [PATCH] add properties created from Runtime's methods
inspired by https://stackoverflow.com/questions/1170337/how-can-i-get-the-number-of-availableprocessors-in-ant
---
WHATSNEW | 5 ++
manual/Tasks/property.html | 23 ++++++
src/etc/testcases/taskdefs/property.xml | 4 +
.../apache/tools/ant/taskdefs/Property.java | 74 ++++++++++++++++++-
.../tools/ant/taskdefs/PropertyTest.java | 13 ++++
5 files changed, 115 insertions(+), 4 deletions(-)
diff --git a/WHATSNEW b/WHATSNEW
index 3041bc5da..a87bd817c 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -36,6 +36,11 @@ Other changes:
finishing threads might fail.
Bugzilla Report 62148
+ * 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
=====================================
diff --git a/manual/Tasks/property.html b/manual/Tasks/property.html
index 7dc90a754..e8e57bb21 100644
--- a/manual/Tasks/property.html
+++ b/manual/Tasks/property.html
@@ -49,6 +49,13 @@ resource) in the project. Properties are case sensitive.
By setting the environment 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.
+ By setting the runtime attribute with a prefix to use.
+ Properties prefix.availableProcessors
,
+ prefix.freeMemory
, prefix.totalMemory
+ and prefix.maxMemory
will be defined with values that
+ correspond to the corresponding methods of
+ the Runtime
+ class.
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 .xml.
system path variable is set to an Ant property named "env.Path"
rather than "env.PATH".
+
+ runtime |
+ the prefix to use when retrieving Runtime properties. Thus
+ if you specify runtime="myrt" you will be able to access
+ runtime values corresponding to methods in
+ the Runtime
+ class via property names "myrt.availableProcessors",
+ "myrt.maxMemory", "myrt.totalMemory" or
+ "myrt.freeMemory". Note that if you supply a property name with a final
+ "." it will not be doubled; i.e. runtime="myrt." will still
+ allow access of prpperties through "myrt.maxMemory".
+ Note also that the property values are snapshots taken at the point in time
+ when the property has been executed.
+ Since Ant 1.9.12
+ |
+
classpath |
the classpath to use when looking up a resource. |
diff --git a/src/etc/testcases/taskdefs/property.xml b/src/etc/testcases/taskdefs/property.xml
index 87cda8b01..2e0c8353e 100644
--- a/src/etc/testcases/taskdefs/property.xml
+++ b/src/etc/testcases/taskdefs/property.xml
@@ -89,4 +89,8 @@
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java
index 64a637620..a6b51a2e1 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Property.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Property.java
@@ -59,6 +59,12 @@ import org.apache.tools.ant.util.FileUtils;
* By setting the environment 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.
+ * By setting the runtime attribute with a prefix to use.
+ * Properties prefix.availableProcessors
,
+ * prefix.freeMemory
, prefix.totalMemory
+ * and prefix.maxMemory
will be defined with values
+ * that correspond to the corresponding methods of the {@link
+ * Runtime} class.
*
* 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.
+ *
+ *
Properties prefix.availableProcessors
,
+ * prefix.freeMemory
, prefix.totalMemory
+ * and prefix.maxMemory
will be defined with values
+ * that correspond to the corresponding methods of the {@link
+ * Runtime} class.
+ *
+ * Note that if you supply a prefix name with a final
+ * "." it will not be doubled. ie
+ * runtime="myrt." will still allow access of property
+ * through "myrt.availableProcessors" and
+ * "myrt.freeMemory".
+ *
+ * The property values are snapshots taken at the point in time
+ * when the property
has been executed.
+ *
+ * @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
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java
index 7cead6678..adb7843ea 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java
@@ -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"));
+ }
+
}