|
- <?php
-
- namespace Cron;
-
- /**
- * Abstract CRON expression field
- */
- abstract class AbstractField implements FieldInterface
- {
- /**
- * Check to see if a field is satisfied by a value
- *
- * @param string $dateValue Date value to check
- * @param string $value Value to test
- *
- * @return bool
- */
- public function isSatisfied($dateValue, $value)
- {
- if ($this->isIncrementsOfRanges($value)) {
- return $this->isInIncrementsOfRanges($dateValue, $value);
- } elseif ($this->isRange($value)) {
- return $this->isInRange($dateValue, $value);
- }
-
- return $value == '*' || $dateValue == $value;
- }
-
- /**
- * Check if a value is a range
- *
- * @param string $value Value to test
- *
- * @return bool
- */
- public function isRange($value)
- {
- return strpos($value, '-') !== false;
- }
-
- /**
- * Check if a value is an increments of ranges
- *
- * @param string $value Value to test
- *
- * @return bool
- */
- public function isIncrementsOfRanges($value)
- {
- return strpos($value, '/') !== false;
- }
-
- /**
- * Test if a value is within a range
- *
- * @param string $dateValue Set date value
- * @param string $value Value to test
- *
- * @return bool
- */
- public function isInRange($dateValue, $value)
- {
- $parts = array_map('trim', explode('-', $value, 2));
-
- return $dateValue >= $parts[0] && $dateValue <= $parts[1];
- }
-
- /**
- * Test if a value is within an increments of ranges (offset[-to]/step size)
- *
- * @param string $dateValue Set date value
- * @param string $value Value to test
- *
- * @return bool
- */
- public function isInIncrementsOfRanges($dateValue, $value)
- {
- $parts = array_map('trim', explode('/', $value, 2));
- $stepSize = isset($parts[1]) ? (int) $parts[1] : 0;
-
- if ($stepSize === 0) {
- return false;
- }
-
- if (($parts[0] == '*' || $parts[0] === '0')) {
- return (int) $dateValue % $stepSize == 0;
- }
-
- $range = explode('-', $parts[0], 2);
- $offset = $range[0];
- $to = isset($range[1]) ? $range[1] : $dateValue;
- // Ensure that the date value is within the range
- if ($dateValue < $offset || $dateValue > $to) {
- return false;
- }
-
- if ($dateValue > $offset && 0 === $stepSize) {
- return false;
- }
-
- for ($i = $offset; $i <= $to; $i+= $stepSize) {
- if ($i == $dateValue) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns a range of values for the given cron expression
- *
- * @param string $expression The expression to evaluate
- * @param int $max Maximum offset for range
- *
- * @return array
- */
- public function getRangeForExpression($expression, $max)
- {
- $values = array();
-
- if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) {
- if (!$this->isIncrementsOfRanges($expression)) {
- list ($offset, $to) = explode('-', $expression);
- $stepSize = 1;
- }
- else {
- $range = array_map('trim', explode('/', $expression, 2));
- $stepSize = isset($range[1]) ? $range[1] : 0;
- $range = $range[0];
- $range = explode('-', $range, 2);
- $offset = $range[0];
- $to = isset($range[1]) ? $range[1] : $max;
- }
- $offset = $offset == '*' ? 0 : $offset;
- for ($i = $offset; $i <= $to; $i += $stepSize) {
- $values[] = $i;
- }
- sort($values);
- }
- else {
- $values = array($expression);
- }
-
- return $values;
- }
-
- }
|