aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java277
1 files changed, 277 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java
new file mode 100644
index 00000000..d23beabc
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java
@@ -0,0 +1,277 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.taskdefs.condition.ConditionBase;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Wait for an external event to occur.
+ *
+ * Wait for an external process to start or to complete some
+ * task. This is useful with the <code>parallel</code> task to
+ * synchronize the execution of tests with server startup.
+ *
+ * The following attributes can be specified on a waitfor task:
+ * <ul>
+ * <li>maxwait - maximum length of time to wait before giving up</li>
+ * <li>maxwaitunit - The unit to be used to interpret maxwait attribute</li>
+ * <li>checkevery - amount of time to sleep between each check</li>
+ * <li>checkeveryunit - The unit to be used to interpret checkevery attribute</li>
+ * <li>timeoutproperty - name of a property to set if maxwait has been exceeded.</li>
+ * </ul>
+ *
+ * The maxwaitunit and checkeveryunit are allowed to have the following values:
+ * millisecond, second, minute, hour, day and week. The default is millisecond.
+ *
+ * For programmatic use/subclassing, there are two methods that may be overridden,
+ * <code>processSuccess</code> and <code>processTimeout</code>
+ * @since Ant 1.5
+ *
+ * @ant.task category="control"
+ */
+public class WaitFor extends ConditionBase {
+ /** a millisecond */
+ public static final long ONE_MILLISECOND = 1L;
+ /** a second in milliseconds */
+ public static final long ONE_SECOND = 1000L;
+ /** a minute in milliseconds */
+ public static final long ONE_MINUTE = ONE_SECOND * 60L;
+ /** an hour in milliseconds */
+ public static final long ONE_HOUR = ONE_MINUTE * 60L;
+ /** a day in milliseconds */
+ public static final long ONE_DAY = ONE_HOUR * 24L;
+ /** a week in milliseconds */
+ public static final long ONE_WEEK = ONE_DAY * 7L;
+
+ /** default wait time */
+ public static final long DEFAULT_MAX_WAIT_MILLIS = ONE_MINUTE * 3L;
+ /** default check time */
+ public static final long DEFAULT_CHECK_MILLIS = 500L;
+
+ /** default max wait time in the current unit*/
+ private long maxWait = DEFAULT_MAX_WAIT_MILLIS;
+ private long maxWaitMultiplier = ONE_MILLISECOND;
+ /**
+ * check time in the current unit
+ */
+ private long checkEvery = DEFAULT_CHECK_MILLIS;
+ private long checkEveryMultiplier = ONE_MILLISECOND;
+ private String timeoutProperty;
+
+ /**
+ * Constructor, names this task "waitfor".
+ */
+ public WaitFor() {
+ super("waitfor");
+ }
+
+
+ /**
+ * Constructor that takes the name of the task in the task name.
+ *
+ * @param taskName the name of the task.
+ * @since Ant 1.8
+ */
+ public WaitFor(String taskName) {
+ super(taskName);
+ }
+
+ /**
+ * Set the maximum length of time to wait.
+ * @param time a <code>long</code> value
+ */
+ public void setMaxWait(long time) {
+ maxWait = time;
+ }
+
+
+ /**
+ * Set the max wait time unit
+ * @param unit an enumerated <code>Unit</code> value
+ */
+ public void setMaxWaitUnit(Unit unit) {
+ maxWaitMultiplier = unit.getMultiplier();
+ }
+
+
+
+ /**
+ * Set the time between each check
+ * @param time a <code>long</code> value
+ */
+ public void setCheckEvery(long time) {
+ checkEvery = time;
+ }
+
+ /**
+ * Set the check every time unit
+ * @param unit an enumerated <code>Unit</code> value
+ */
+ public void setCheckEveryUnit(Unit unit) {
+ checkEveryMultiplier = unit.getMultiplier();
+ }
+
+ /**
+ * Name the property to set after a timeout.
+ * @param p the property name
+ */
+ public void setTimeoutProperty(String p) {
+ timeoutProperty = p;
+ }
+
+ /**
+ * Check repeatedly for the specified conditions until they become
+ * true or the timeout expires.
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException {
+ if (countConditions() > 1) {
+ throw new BuildException("You must not nest more than one "
+ + "condition into "
+ + getTaskName());
+ }
+ if (countConditions() < 1) {
+ throw new BuildException("You must nest a condition into "
+ + getTaskName());
+ }
+ Condition c = (Condition) getConditions().nextElement();
+ try {
+ long maxWaitMillis = calculateMaxWaitMillis();
+ long checkEveryMillis = calculateCheckEveryMillis();
+ long start = System.currentTimeMillis();
+ long end = start + maxWaitMillis;
+
+ while (System.currentTimeMillis() < end) {
+ if (c.eval()) {
+ processSuccess();
+ return;
+ }
+ Thread.sleep(checkEveryMillis);
+ }
+ } catch (InterruptedException e) {
+ log("Task " + getTaskName()
+ + " interrupted, treating as timed out.");
+ }
+ processTimeout();
+ }
+
+ /**
+ * Get the check wait time, in milliseconds.
+ * @since Ant 1.8
+ * @return how long to wait between checks
+ */
+ public long calculateCheckEveryMillis() {
+ return checkEvery * checkEveryMultiplier;
+ }
+
+ /**
+ * Get the maximum wait time, in milliseconds.
+ * @since Ant 1.8
+ * @return how long to wait before timing out
+ */
+ public long calculateMaxWaitMillis() {
+ return maxWait * maxWaitMultiplier;
+ }
+
+ /**
+ * Actions to be taken on a successful waitfor.
+ * This is an override point. The base implementation does nothing.
+ * @since Ant1.7
+ */
+ protected void processSuccess() {
+ log(getTaskName() + ": condition was met", Project.MSG_VERBOSE);
+ }
+
+ /**
+ * Actions to be taken on an unsuccessful wait.
+ * This is an override point. It is where the timeout processing takes place.
+ * The base implementation sets the timeoutproperty if there was a timeout
+ * and the property was defined.
+ * @since Ant1.7
+ */
+ protected void processTimeout() {
+ log(getTaskName() + ": timeout", Project.MSG_VERBOSE);
+ if (timeoutProperty != null) {
+ getProject().setNewProperty(timeoutProperty, "true");
+ }
+ }
+
+ /**
+ * The enumeration of units:
+ * millisecond, second, minute, hour, day, week
+ * @todo we use timestamps in many places, why not factor this out
+ */
+ public static class Unit extends EnumeratedAttribute {
+
+ /** millisecond string */
+ public static final String MILLISECOND = "millisecond";
+ /** second string */
+ public static final String SECOND = "second";
+ /** minute string */
+ public static final String MINUTE = "minute";
+ /** hour string */
+ public static final String HOUR = "hour";
+ /** day string */
+ public static final String DAY = "day";
+ /** week string */
+ public static final String WEEK = "week";
+
+ private static final String[] UNITS = {
+ MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK
+ };
+
+ private Map timeTable = new HashMap();
+
+ /** Constructor the Unit enumerated type. */
+ public Unit() {
+ timeTable.put(MILLISECOND, new Long(1L));
+ timeTable.put(SECOND, new Long(ONE_SECOND));
+ timeTable.put(MINUTE, new Long(ONE_MINUTE));
+ timeTable.put(HOUR, new Long(ONE_HOUR));
+ timeTable.put(DAY, new Long(ONE_DAY));
+ timeTable.put(WEEK, new Long(ONE_WEEK));
+ }
+
+ /**
+ * Convert the value to a multipler (millisecond to unit).
+ * @return a multipler (a long value)
+ */
+ public long getMultiplier() {
+ String key = getValue().toLowerCase(Locale.ENGLISH);
+ Long l = (Long) timeTable.get(key);
+ return l.longValue();
+ }
+
+ /**
+ * @see EnumeratedAttribute#getValues()
+ */
+ /** {@inheritDoc} */
+ public String[] getValues() {
+ return UNITS;
+ }
+ }
+}