summaryrefslogtreecommitdiff
path: root/buildscripts/phing/classes/phing/tasks/system/WaitForTask.php
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/phing/classes/phing/tasks/system/WaitForTask.php')
-rwxr-xr-xbuildscripts/phing/classes/phing/tasks/system/WaitForTask.php188
1 files changed, 188 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/tasks/system/WaitForTask.php b/buildscripts/phing/classes/phing/tasks/system/WaitForTask.php
new file mode 100755
index 00000000..00bcff1e
--- /dev/null
+++ b/buildscripts/phing/classes/phing/tasks/system/WaitForTask.php
@@ -0,0 +1,188 @@
+<?php
+/*
+ * $Id: dae67bf2b9c154d4614f30e9ba85c16782550bb3 $
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information please see
+ * <http://phing.info>.
+ */
+
+require_once 'phing/Task.php';
+
+/**
+ * Based on Apache Ant Wait For:
+ *
+ * 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.
+ *
+ * @author Michiel Rook <mrook@php.net>
+ * @version $Id$
+ * @package phing.tasks.system
+ */
+class WaitForTask extends ConditionBase
+{
+ const ONE_MILLISECOND = 1;
+ const ONE_SECOND = 1000;
+ const ONE_MINUTE = 60000;
+ const ONE_HOUR = 3600000;
+ const ONE_DAY = 86400000;
+ const ONE_WEEK = 604800000;
+
+ const DEFAULT_MAX_WAIT_MILLIS = 180000;
+ const DEFAULT_CHECK_MILLIS = 500;
+
+ protected $maxWait = self::DEFAULT_MAX_WAIT_MILLIS;
+ protected $maxWaitMultiplier = self::ONE_MILLISECOND;
+
+ protected $checkEvery = self::DEFAULT_CHECK_MILLIS;
+ protected $checkEveryMultiplier = self::ONE_MILLISECOND;
+
+ protected $timeoutProperty = null;
+
+ /**
+ * Set the maximum length of time to wait.
+ * @param int $maxWait
+ */
+ public function setMaxWait($maxWait)
+ {
+ $this->maxWait = (int) $maxWait;
+ }
+
+ /**
+ * Set the max wait time unit
+ * @param string $maxWaitUnit
+ */
+ public function setMaxWaitUnit($maxWaitUnit)
+ {
+ $this->maxWaitMultiplier = $this->_convertUnit($maxWaitUnit);
+ }
+
+ /**
+ * Set the time between each check
+ * @param int $checkEvery
+ */
+ public function setCheckEvery($checkEvery)
+ {
+ $this->checkEvery = (int) $checkEvery;
+ }
+
+ /**
+ * Set the check every time unit
+ * @param string $checkEveryUnit
+ */
+ public function setCheckEveryUnit($checkEveryUnit)
+ {
+ $this->checkEveryMultiplier = $this->_convertUnit($checkEveryUnit);
+ }
+
+ /**
+ * Name of the property to set after a timeout.
+ * @param string $timeoutProperty
+ */
+ public function setTimeoutProperty($timeoutProperty)
+ {
+ $this->timeoutProperty = $timeoutProperty;
+ }
+
+ /**
+ * Convert the unit to a multipler.
+ * @param string $unit
+ */
+ protected function _convertUnit($unit)
+ {
+ switch ($unit) {
+ case "week": {
+ return self::ONE_WEEK;
+ }
+
+ case "day": {
+ return self::ONE_DAY;
+ }
+
+ case "hour": {
+ return self::ONE_HOUR;
+ }
+
+ case "minute": {
+ return self::ONE_MINUTE;
+ }
+
+ case "second": {
+ return self::ONE_SECOND;
+ }
+
+ case "millisecond": {
+ return self::ONE_MILLISECOND;
+ }
+
+ default: {
+ throw new BuildException("Illegal unit '$unit'");
+ }
+ }
+ }
+
+ /**
+ * Check repeatedly for the specified conditions until they become
+ * true or the timeout expires.
+ * @throws BuildException
+ */
+ public function main()
+ {
+ if ($this->countConditions() > 1) {
+ throw new BuildException("You must not nest more than one condition into <waitfor>");
+ }
+
+ if ($this->countConditions() < 1) {
+ throw new BuildException("You must nest a condition into <waitfor>");
+ }
+
+ $cs = $this->getIterator();
+ $condition = $cs->current();
+
+ $maxWaitMillis = $this->maxWait * $this->maxWaitMultiplier;
+ $checkEveryMillis = $this->checkEvery * $this->checkEveryMultiplier;
+
+ $start = microtime(true) * 1000;
+ $end = $start + $maxWaitMillis;
+
+ while (microtime(true) * 1000 < $end) {
+ if ($condition->evaluate()) {
+ $this->log("waitfor: condition was met", Project::MSG_VERBOSE);
+
+ return;
+ }
+
+ usleep($checkEveryMillis * 1000);
+ }
+
+ $this->log("waitfor: timeout", Project::MSG_VERBOSE);
+
+ if ($this->timeoutProperty != null) {
+ $this->project->setNewProperty($this->timeoutProperty, "true");
+ }
+ }
+} \ No newline at end of file