You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ke...@apache.org on 2022/08/10 02:20:22 UTC
[dolphinscheduler] branch dev updated: [fix-11295] remove duplicate classes (#11355)
This is an automated email from the ASF dual-hosted git repository.
kerwin pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 05932bcf55 [fix-11295] remove duplicate classes (#11355)
05932bcf55 is described below
commit 05932bcf55443e48aafda2201ba2d90806f19c00
Author: fuchanghai <33...@users.noreply.github.com>
AuthorDate: Wed Aug 10 10:20:16 2022 +0800
[fix-11295] remove duplicate classes (#11355)
---
.../common/utils/ParameterUtils.java | 9 +-
.../common/utils/placeholder/PlaceholderUtils.java | 103 ----
.../placeholder/PropertyPlaceholderHelper.java | 211 --------
.../utils/placeholder/TimePlaceholderUtils.java | 563 ---------------------
.../common/utils/ParameterUtilsTest.java | 5 +-
.../placeholder/TimePlaceholderUtilsTest.java | 1 +
6 files changed, 6 insertions(+), 886 deletions(-)
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ParameterUtils.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ParameterUtils.java
index c4edc5d1b7..dae6843112 100644
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ParameterUtils.java
+++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ParameterUtils.java
@@ -18,21 +18,17 @@
package org.apache.dolphinscheduler.common.utils;
import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.enums.CommandType;
-import org.apache.dolphinscheduler.common.utils.placeholder.BusinessTimeUtils;
-import org.apache.dolphinscheduler.common.utils.placeholder.PlaceholderUtils;
-import org.apache.dolphinscheduler.common.utils.placeholder.TimePlaceholderUtils;
import org.apache.dolphinscheduler.plugin.task.api.model.Property;
+import org.apache.dolphinscheduler.plugin.task.api.parser.PlaceholderUtils;
+import org.apache.dolphinscheduler.plugin.task.api.parser.TimePlaceholderUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -113,7 +109,6 @@ public class ParameterUtils {
return null;
}
-
StringBuffer newValue = new StringBuffer(templateStr.length());
Matcher matcher = DATE_PARSE_PATTERN.matcher(templateStr);
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PlaceholderUtils.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PlaceholderUtils.java
deleted file mode 100644
index 217aa75063..0000000000
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PlaceholderUtils.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.dolphinscheduler.common.utils.placeholder;
-
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * placeholder utils
- */
-public class PlaceholderUtils {
-
- private static final Logger logger = LoggerFactory.getLogger(PlaceholderUtils.class);
-
- /**
- * Prefix of the position to be replaced
- */
- public static final String PLACEHOLDER_PREFIX = "${";
-
- /**
- * The suffix of the position to be replaced
- */
-
- public static final String PLACEHOLDER_SUFFIX = "}";
-
- /**
- * Replaces all placeholders of format {@code ${name}} with the value returned
- * from the supplied {@link PropertyPlaceholderHelper.PlaceholderResolver}.
- *
- * @param value the value containing the placeholders to be replaced
- * @param paramsMap placeholder data dictionary
- * @param ignoreUnresolvablePlaceholders ignoreUnresolvablePlaceholders
- * @return the supplied value with placeholders replaced inline
- */
- public static String replacePlaceholders(String value,
- Map<String, String> paramsMap,
- boolean ignoreUnresolvablePlaceholders) {
- //replacement tool, parameter key will be replaced by value,if can't match , will throw an exception
- PropertyPlaceholderHelper strictHelper = getPropertyPlaceholderHelper(false);
-
- //Non-strict replacement tool implementation, when the position to be replaced does not get the corresponding value, the current position is ignored, and the next position is replaced.
- PropertyPlaceholderHelper nonStrictHelper = getPropertyPlaceholderHelper(true);
-
- PropertyPlaceholderHelper helper = (ignoreUnresolvablePlaceholders ? nonStrictHelper : strictHelper);
-
- //the PlaceholderResolver to use for replacement
- return helper.replacePlaceholders(value, new PropertyPlaceholderResolver(value, paramsMap));
- }
-
- /**
- * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix.
- * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should
- * be ignored ({@code true}) or cause an exception ({@code false})
- * @return PropertyPlaceholderHelper
- */
- public static PropertyPlaceholderHelper getPropertyPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) {
-
- return new PropertyPlaceholderHelper(PLACEHOLDER_PREFIX, PLACEHOLDER_SUFFIX, null, ignoreUnresolvablePlaceholders);
- }
-
- /**
- * Placeholder replacement resolver
- */
- private static class PropertyPlaceholderResolver implements PropertyPlaceholderHelper.PlaceholderResolver {
-
- private final String value;
-
- private final Map<String, String> paramsMap;
-
- public PropertyPlaceholderResolver(String value, Map<String, String> paramsMap) {
- this.value = value;
- this.paramsMap = paramsMap;
- }
-
- @Override
- public String resolvePlaceholder(String placeholderName) {
- try {
- return paramsMap.get(placeholderName);
- } catch (Exception ex) {
- logger.error("resolve placeholder '{}' in [ {} ]", placeholderName, value, ex);
- return null;
- }
- }
- }
-
-}
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PropertyPlaceholderHelper.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PropertyPlaceholderHelper.java
deleted file mode 100644
index 781b7e347b..0000000000
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/PropertyPlaceholderHelper.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * 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.dolphinscheduler.common.utils.placeholder;
-
-import static java.util.Objects.requireNonNull;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.util.*;
-
-/**
- * Utility class for working with Strings that have placeholder values in them. A placeholder takes the form
- * {@code ${name}}. Using {@code PropertyPlaceholderHelper} these placeholders can be substituted for
- * user-supplied values. <p> Values for substitution can be supplied using a {@link Properties} instance or
- * using a {@link PlaceholderResolver}.
- *
- * @author Juergen Hoeller
- * @author Rob Harrop
- * @since 3.0
- */
-public class PropertyPlaceholderHelper {
-
- private static final Log logger = LogFactory.getLog(PropertyPlaceholderHelper.class);
-
- private static final Map<String, String> wellKnownSimplePrefixes = new HashMap<>(4);
-
- static {
- wellKnownSimplePrefixes.put("}", "{");
- wellKnownSimplePrefixes.put("]", "[");
- wellKnownSimplePrefixes.put(")", "(");
- }
-
-
- private final String placeholderPrefix;
-
- private final String placeholderSuffix;
-
- private final String simplePrefix;
-
- private final String valueSeparator;
-
- private final boolean ignoreUnresolvablePlaceholders;
-
-
- /**
- * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix.
- *
- * @param placeholderPrefix the prefix that denotes the start of a placeholder
- * @param placeholderSuffix the suffix that denotes the end of a placeholder
- * @param valueSeparator the separating character between the placeholder variable
- * and the associated default value, if any
- * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should
- * be ignored ({@code true}) or cause an exception ({@code false})
- */
- public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix,
- String valueSeparator, boolean ignoreUnresolvablePlaceholders) {
-
- requireNonNull((Object) placeholderPrefix, "'placeholderPrefix' must not be null");
- requireNonNull((Object) placeholderSuffix, "'placeholderSuffix' must not be null");
- this.placeholderPrefix = placeholderPrefix;
- this.placeholderSuffix = placeholderSuffix;
- String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix);
- if (simplePrefixForSuffix != null && this.placeholderPrefix.endsWith(simplePrefixForSuffix)) {
- this.simplePrefix = simplePrefixForSuffix;
- } else {
- this.simplePrefix = this.placeholderPrefix;
- }
- this.valueSeparator = valueSeparator;
- this.ignoreUnresolvablePlaceholders = ignoreUnresolvablePlaceholders;
- }
-
-
- /**
- * Replaces all placeholders of format {@code ${name}} with the value returned
- * from the supplied {@link PlaceholderResolver}.
- *
- * @param value the value containing the placeholders to be replaced
- * @param placeholderResolver the {@code PlaceholderResolver} to use for replacement
- * @return the supplied value with placeholders replaced inline
- */
- public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) {
- requireNonNull((Object) value, "'value' must not be null");
- return parseStringValue(value, placeholderResolver, new HashSet<String>());
- }
-
- protected String parseStringValue(
- String value, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) {
-
- StringBuilder result = new StringBuilder(value);
-
- int startIndex = value.indexOf(this.placeholderPrefix);
- while (startIndex != -1) {
- int endIndex = findPlaceholderEndIndex(result, startIndex);
- if (endIndex != -1) {
- String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex);
- String originalPlaceholder = placeholder;
- if (!visitedPlaceholders.add(originalPlaceholder)) {
- throw new IllegalArgumentException(
- "Circular placeholder reference '" + originalPlaceholder + "' in property definitions");
- }
- // Recursive invocation, parsing placeholders contained in the placeholder key.
- placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders);
- // Now obtain the value for the fully resolved key...
- String propVal = placeholderResolver.resolvePlaceholder(placeholder);
- if (propVal == null && this.valueSeparator != null) {
- int separatorIndex = placeholder.indexOf(this.valueSeparator);
- if (separatorIndex != -1) {
- String actualPlaceholder = placeholder.substring(0, separatorIndex);
- String defaultValue = placeholder.substring(separatorIndex + this.valueSeparator.length());
- propVal = placeholderResolver.resolvePlaceholder(actualPlaceholder);
- if (propVal == null) {
- propVal = defaultValue;
- }
- }
- }
- if (propVal != null) {
- // Recursive invocation, parsing placeholders contained in the
- // previously resolved placeholder value.
- propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders);
- result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal);
- if (logger.isTraceEnabled()) {
- logger.trace("Resolved placeholder '" + placeholder + "'");
- }
- startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length());
- } else if (this.ignoreUnresolvablePlaceholders) {
- // Proceed with unprocessed value.
- startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length());
- } else {
- throw new IllegalArgumentException("Could not resolve placeholder '" +
- placeholder + "'" + " in value \"" + value + "\"");
- }
- visitedPlaceholders.remove(originalPlaceholder);
- } else {
- startIndex = -1;
- }
- }
-
- return result.toString();
- }
-
- private int findPlaceholderEndIndex(CharSequence buf, int startIndex) {
- int index = startIndex + this.placeholderPrefix.length();
- int withinNestedPlaceholder = 0;
- while (index < buf.length()) {
- if (substringMatch(buf, index, this.placeholderSuffix)) {
- if (withinNestedPlaceholder > 0) {
- withinNestedPlaceholder--;
- index = index + this.placeholderSuffix.length();
- } else {
- return index;
- }
- } else if (substringMatch(buf, index, this.simplePrefix)) {
- withinNestedPlaceholder++;
- index = index + this.simplePrefix.length();
- } else {
- index++;
- }
- }
- return -1;
- }
-
-
- /**
- * Strategy interface used to resolve replacement values for placeholders contained in Strings.
- */
- public interface PlaceholderResolver {
-
- /**
- * Resolve the supplied placeholder name to the replacement value.
- *
- * @param placeholderName the name of the placeholder to resolve
- * @return the replacement value, or {@code null} if no replacement is to be made
- */
- String resolvePlaceholder(String placeholderName);
- }
-
- /**
- * Test whether the given string matches the given substring
- * at the given index.
- *
- * @param str the original string (or StringBuilder)
- * @param index the index in the original string to start matching against
- * @param substring the substring to match at the given index
- * @return whether the given string matches the given substring
- */
- public static boolean substringMatch(CharSequence str, int index, CharSequence substring) {
- for (int j = 0; j < substring.length(); j++) {
- int i = index + j;
- if (i >= str.length() || str.charAt(i) != substring.charAt(j)) {
- return false;
- }
- }
- return true;
- }
-}
-
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtils.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtils.java
deleted file mode 100644
index 28d96a5969..0000000000
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtils.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * 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.dolphinscheduler.common.utils.placeholder;
-
-import static org.apache.dolphinscheduler.common.Constants.ADD_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.ADD_STRING;
-import static org.apache.dolphinscheduler.common.Constants.DIVISION_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.DIVISION_STRING;
-import static org.apache.dolphinscheduler.common.Constants.LEFT_BRACE_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.LEFT_BRACE_STRING;
-import static org.apache.dolphinscheduler.common.Constants.MULTIPLY_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.STAR;
-import static org.apache.dolphinscheduler.common.Constants.N;
-import static org.apache.dolphinscheduler.common.Constants.P;
-import static org.apache.dolphinscheduler.common.Constants.RIGHT_BRACE_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.SUBTRACT_CHAR;
-import static org.apache.dolphinscheduler.common.Constants.SUBTRACT_STRING;
-
-import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.utils.DateUtils;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * time place holder utils
- */
-public class TimePlaceholderUtils {
- private static final Logger logger = LoggerFactory.getLogger(TimePlaceholderUtils.class);
-
- /**
- * Prefix of the position to be replaced
- */
- public static final String PLACEHOLDER_PREFIX = "$[";
-
- /**
- * The suffix of the position to be replaced
- */
- public static final String PLACEHOLDER_SUFFIX = "]";
-
- /**
- * Replaces all placeholders of format {@code ${name}} with the value returned
- * from the supplied {@link PropertyPlaceholderHelper.PlaceholderResolver}.
- *
- * @param value the value containing the placeholders to be replaced
- * @param date custom date
- * @param ignoreUnresolvablePlaceholders ignore unresolvable placeholders
- * @return the supplied value with placeholders replaced inline
- */
- public static String replacePlaceholders(String value, Date date, boolean ignoreUnresolvablePlaceholders) {
- PropertyPlaceholderHelper strictHelper = getPropertyPlaceholderHelper(false);
- PropertyPlaceholderHelper nonStrictHelper = getPropertyPlaceholderHelper(true);
-
- PropertyPlaceholderHelper helper = (ignoreUnresolvablePlaceholders ? nonStrictHelper : strictHelper);
- return helper.replacePlaceholders(value, new TimePlaceholderResolver(value, date));
- }
-
- /**
- * Creates a new {@code PropertyPlaceholderHelper} that uses the supplied prefix and suffix.
- *
- * @param ignoreUnresolvablePlaceholders indicates whether unresolvable placeholders should
- * be ignored ({@code true}) or cause an exception ({@code false})
- */
- private static PropertyPlaceholderHelper getPropertyPlaceholderHelper(boolean ignoreUnresolvablePlaceholders) {
- return new PropertyPlaceholderHelper(PLACEHOLDER_PREFIX, PLACEHOLDER_SUFFIX, null, ignoreUnresolvablePlaceholders);
- }
-
- /**
- * calculate expression's value
- *
- * @param expression expression
- * @return expression's value
- */
- public static Integer calculate(String expression) {
- expression = StringUtils.trim(expression);
- expression = convert(expression);
-
- List<String> result = string2List(expression);
- result = convert2SuffixList(result);
-
- return calculate(result);
- }
-
- /**
- * Change the sign in the expression to P (positive) N (negative)
- *
- * @param expression
- * @return eg. "-3+-6*(+8)-(-5) -> S3+S6*(P8)-(S5)"
- */
- private static String convert(String expression) {
- char[] arr = expression.toCharArray();
-
- for (int i = 0; i < arr.length; i++) {
- if (arr[i] == SUBTRACT_CHAR) {
- if (i == 0) {
- arr[i] = N;
- } else {
- char c = arr[i - 1];
- if (c == ADD_CHAR || c == SUBTRACT_CHAR || c == MULTIPLY_CHAR || c == DIVISION_CHAR || c == LEFT_BRACE_CHAR) {
- arr[i] = N;
- }
- }
- } else if (arr[i] == ADD_CHAR) {
- if (i == 0) {
- arr[i] = P;
- } else {
- char c = arr[i - 1];
- if (c == ADD_CHAR || c == SUBTRACT_CHAR || c == MULTIPLY_CHAR || c == DIVISION_CHAR || c == LEFT_BRACE_CHAR) {
- arr[i] = P;
- }
- }
- }
- }
-
- return new String(arr);
- }
-
- /**
- * to suffix expression
- *
- * @param srcList
- * @return
- */
- private static List<String> convert2SuffixList(List<String> srcList) {
- List<String> result = new ArrayList<>();
- Stack<String> stack = new Stack<>();
-
- for (int i = 0; i < srcList.size(); i++) {
- if (Character.isDigit(srcList.get(i).charAt(0))) {
- result.add(srcList.get(i));
- } else {
- switch (srcList.get(i).charAt(0)) {
- case LEFT_BRACE_CHAR:
- stack.push(srcList.get(i));
- break;
- case RIGHT_BRACE_CHAR:
- while (!LEFT_BRACE_STRING.equals(stack.peek())) {
- result.add(stack.pop());
- }
- stack.pop();
- break;
- default:
- while (!stack.isEmpty() && compare(stack.peek(), srcList.get(i))) {
- result.add(stack.pop());
- }
- stack.push(srcList.get(i));
- break;
- }
- }
- }
-
- while (!stack.isEmpty()) {
- result.add(stack.pop());
- }
-
- return result;
- }
-
- /**
- * Calculate the suffix expression
- *
- * @param result
- * @return
- */
- private static Integer calculate(List<String> result) {
- Stack<Integer> stack = new Stack<>();
- for (int i = 0; i < result.size(); i++) {
- if (Character.isDigit(result.get(i).charAt(0))) {
- stack.push(Integer.parseInt(result.get(i)));
- } else {
- Integer backInt = stack.pop();
- Integer frontInt = 0;
- char op = result.get(i).charAt(0);
-
- if (!(op == P || op == N)) {
- frontInt = stack.pop();
- }
-
- Integer res = 0;
- switch (result.get(i).charAt(0)) {
- case P:
- res = frontInt + backInt;
- break;
- case N:
- res = frontInt - backInt;
- break;
- case ADD_CHAR:
- res = frontInt + backInt;
- break;
- case SUBTRACT_CHAR:
- res = frontInt - backInt;
- break;
- case MULTIPLY_CHAR:
- res = frontInt * backInt;
- break;
- case DIVISION_CHAR:
- res = frontInt / backInt;
- break;
- default:
- break;
- }
- stack.push(res);
- }
- }
-
- return stack.pop();
- }
-
- /**
- * string to list
- *
- * @param expression
- * @return list
- */
- private static List<String> string2List(String expression) {
- List<String> result = new ArrayList<>();
- String num = "";
- for (int i = 0; i < expression.length(); i++) {
- if (Character.isDigit(expression.charAt(i))) {
- num = num + expression.charAt(i);
- } else {
- if (!num.isEmpty()) {
- result.add(num);
- }
- result.add(expression.charAt(i) + "");
- num = "";
- }
- }
-
- if (!num.isEmpty()) {
- result.add(num);
- }
-
- return result;
- }
-
- /**
- * compare loginUser level
- *
- * @param peek
- * @param cur
- * @return true or false
- */
- private static boolean compare(String peek, String cur) {
- if (STAR.equals(peek) && (DIVISION_STRING.equals(cur) || STAR.equals(cur) || ADD_STRING.equals(cur) || SUBTRACT_STRING.equals(cur))) {
- return true;
- } else if (DIVISION_STRING.equals(peek) && (DIVISION_STRING.equals(cur) || STAR.equals(cur) || ADD_STRING.equals(cur) || SUBTRACT_STRING.equals(cur))) {
- return true;
- } else if (ADD_STRING.equals(peek) && (ADD_STRING.equals(cur) || SUBTRACT_STRING.equals(cur))) {
- return true;
- } else {
- return SUBTRACT_STRING.equals(peek) && (ADD_STRING.equals(cur) || SUBTRACT_STRING.equals(cur));
- }
-
- }
-
- /**
- * Placeholder replacement resolver
- */
- private static class TimePlaceholderResolver implements
- PropertyPlaceholderHelper.PlaceholderResolver {
-
- private final String value;
-
- private final Date date;
-
- public TimePlaceholderResolver(String value, Date date) {
- this.value = value;
- this.date = date;
- }
-
- @Override
- public String resolvePlaceholder(String placeholderName) {
- try {
- return calculateTime(placeholderName, date);
- } catch (Exception ex) {
- logger.error("resolve placeholder '{}' in [ {} ]", placeholderName, value, ex);
- return null;
- }
- }
- }
-
- /**
- * return the formatted date according to the corresponding date format
- *
- * @param expression date expression
- * @param date date
- * @return reformat date
- */
- public static String getPlaceHolderTime(String expression, Date date) {
- if (StringUtils.isBlank(expression)) {
- return null;
- }
- if (null == date) {
- return null;
- }
- return calculateTime(expression, date);
- }
-
- /**
- * calculate time
- *
- * @param date date
- * @return calculate time
- */
- private static String calculateTime(String expression, Date date) {
- // After N years: $[add_months(yyyyMMdd,12*N)], the first N months: $[add_months(yyyyMMdd,-N)], etc
- String value;
-
- try {
- if (expression.startsWith(Constants.TIMESTAMP)) {
- String timeExpression = expression.substring(Constants.TIMESTAMP.length() + 1, expression.length() - 1);
-
- Map.Entry<Date, String> entry = calcTimeExpression(timeExpression, date);
-
- String dateStr = DateUtils.format(entry.getKey(), entry.getValue(), null);
-
- Date timestamp = DateUtils.parse(dateStr, Constants.PARAMETER_FORMAT_TIME, null);
-
- value = String.valueOf(timestamp.getTime() / 1000);
- } else {
- Map.Entry<Date, String> entry = calcTimeExpression(expression, date);
- value = DateUtils.format(entry.getKey(), entry.getValue(), null);
- }
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- throw e;
- }
-
- return value;
- }
-
- /**
- * calculate time expresstion
- *
- * @param expression expresstion
- * @param date date
- * @return map with date, date format
- */
- public static Map.Entry<Date, String> calcTimeExpression(String expression, Date date) {
- Map.Entry<Date, String> resultEntry;
-
- if (expression.startsWith(Constants.ADD_MONTHS)) {
- resultEntry = calcMonths(expression, date);
- } else if (expression.startsWith(Constants.MONTH_BEGIN)) {
- resultEntry = calcMonthBegin(expression, date);
- } else if (expression.startsWith(Constants.MONTH_END)) {
- resultEntry = calcMonthEnd(expression, date);
- } else if (expression.startsWith(Constants.WEEK_BEGIN)) {
- resultEntry = calcWeekStart(expression, date);
- } else if (expression.startsWith(Constants.WEEK_END)) {
- resultEntry = calcWeekEnd(expression, date);
- } else {
- resultEntry = calcMinutes(expression, date);
- }
-
- return resultEntry;
- }
-
- /**
- * get first day of month
- *
- * @param expression expresstion
- * @param date date
- * @return first day of month
- */
- public static Map.Entry<Date, String> calcMonthBegin(String expression, Date date) {
- String addMonthExpr = expression.substring(Constants.MONTH_BEGIN.length() + 1, expression.length() - 1);
- String[] params = addMonthExpr.split(Constants.COMMA);
-
- if (params.length == 2) {
- String dateFormat = params[0];
- String dayExpr = params[1];
- Integer day = calculate(dayExpr);
- Date targetDate = DateUtils.getFirstDayOfMonth(date);
- targetDate = org.apache.commons.lang.time.DateUtils.addDays(targetDate, day);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- throw new RuntimeException("expression not valid");
- }
-
- /**
- * get last day of month
- *
- * @param expression expresstion
- * @param date date
- * @return last day of month
- */
- public static Map.Entry<Date, String> calcMonthEnd(String expression, Date date) {
- String addMonthExpr = expression.substring(Constants.MONTH_END.length() + 1, expression.length() - 1);
- String[] params = addMonthExpr.split(Constants.COMMA);
-
- if (params.length == 2) {
- String dateFormat = params[0];
- String dayExpr = params[1];
- Integer day = calculate(dayExpr);
- Date targetDate = DateUtils.getLastDayOfMonth(date);
- targetDate = org.apache.commons.lang.time.DateUtils.addDays(targetDate, day);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- throw new RuntimeException("expression not valid");
- }
-
- /**
- * get first day of week
- *
- * @param expression expresstion
- * @param date date
- * @return monday
- */
- public static Map.Entry<Date, String> calcWeekStart(String expression, Date date) {
- String addMonthExpr = expression.substring(Constants.WEEK_BEGIN.length() + 1, expression.length() - 1);
- String[] params = addMonthExpr.split(Constants.COMMA);
-
- if (params.length == 2) {
- String dateFormat = params[0];
- String dayExpr = params[1];
- Integer day = calculate(dayExpr);
- Date targetDate = DateUtils.getMonday(date);
- targetDate = org.apache.commons.lang.time.DateUtils.addDays(targetDate, day);
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- throw new RuntimeException("expression not valid");
- }
-
- /**
- * get last day of week
- *
- * @param expression expresstion
- * @param date date
- * @return last day of week
- */
- public static Map.Entry<Date, String> calcWeekEnd(String expression, Date date) {
- String addMonthExpr = expression.substring(Constants.WEEK_END.length() + 1, expression.length() - 1);
- String[] params = addMonthExpr.split(Constants.COMMA);
-
- if (params.length == 2) {
- String dateFormat = params[0];
- String dayExpr = params[1];
- Integer day = calculate(dayExpr);
- Date targetDate = DateUtils.getSunday(date);
- targetDate = org.apache.commons.lang.time.DateUtils.addDays(targetDate, day);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- throw new RuntimeException("Expression not valid");
- }
-
- /**
- * calc months expression
- *
- * @param expression expresstion
- * @param date date
- * @return calc months
- */
- public static Map.Entry<Date, String> calcMonths(String expression, Date date) {
- String addMonthExpr = expression.substring(Constants.ADD_MONTHS.length() + 1, expression.length() - 1);
- String[] params = addMonthExpr.split(Constants.COMMA);
-
- if (params.length == 2) {
- String dateFormat = params[0];
- String monthExpr = params[1];
- Integer addMonth = calculate(monthExpr);
- Date targetDate = org.apache.commons.lang.time.DateUtils.addMonths(date, addMonth);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- throw new RuntimeException("expression not valid");
- }
-
- /**
- * calculate time expression
- *
- * @param expression expresstion
- * @param date date
- * @return calculate time expression with date,format
- */
- public static Map.Entry<Date, String> calcMinutes(String expression, Date date) {
- if (expression.contains("+")) {
- int index = expression.lastIndexOf('+');
-
- if (Character.isDigit(expression.charAt(index + 1))) {
- String addMinuteExpr = expression.substring(index + 1);
- Date targetDate = org.apache.commons.lang3.time.DateUtils
- .addMinutes(date, calcMinutes(addMinuteExpr));
- String dateFormat = expression.substring(0, index);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
- } else if (expression.contains("-")) {
- int index = expression.lastIndexOf('-');
-
- if (Character.isDigit(expression.charAt(index + 1))) {
- String addMinuteExpr = expression.substring(index + 1);
- Date targetDate = org.apache.commons.lang.time.DateUtils
- .addMinutes(date, 0 - calcMinutes(addMinuteExpr));
- String dateFormat = expression.substring(0, index);
-
- return new AbstractMap.SimpleImmutableEntry<>(targetDate, dateFormat);
- }
-
- // yyyy-MM-dd/HH:mm:ss
- return new AbstractMap.SimpleImmutableEntry<>(date, expression);
- }
-
- // $[HHmmss]
- return new AbstractMap.SimpleImmutableEntry<>(date, expression);
- }
-
- /**
- * calculate need minutes
- *
- * @param minuteExpression minute expression
- * @return calculate need minutes
- */
- public static Integer calcMinutes(String minuteExpression) {
- int index = minuteExpression.indexOf('/');
-
- String calcExpression;
-
- if (index == -1) {
- calcExpression = String.format("60*24*(%s)", minuteExpression);
- } else {
-
- calcExpression = String.format("60*24*(%s)%s", minuteExpression.substring(0, index),
- minuteExpression.substring(index));
- }
-
- return calculate(calcExpression);
- }
-
-}
diff --git a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ParameterUtilsTest.java b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ParameterUtilsTest.java
index ba27032ad8..71acc348be 100644
--- a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ParameterUtilsTest.java
+++ b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/ParameterUtilsTest.java
@@ -17,10 +17,11 @@
package org.apache.dolphinscheduler.common.utils;
-import static org.apache.dolphinscheduler.common.utils.placeholder.TimePlaceholderUtils.replacePlaceholders;
+
+import static org.apache.dolphinscheduler.plugin.task.api.parser.TimePlaceholderUtils.replacePlaceholders;
import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.utils.placeholder.PlaceholderUtils;
+import org.apache.dolphinscheduler.plugin.task.api.parser.PlaceholderUtils;
import java.text.ParseException;
import java.util.Date;
diff --git a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtilsTest.java b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtilsTest.java
index 3bd10f7f83..66536baa65 100644
--- a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtilsTest.java
+++ b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/placeholder/TimePlaceholderUtilsTest.java
@@ -18,6 +18,7 @@
package org.apache.dolphinscheduler.common.utils.placeholder;
import org.apache.dolphinscheduler.common.utils.DateUtils;
+import org.apache.dolphinscheduler.plugin.task.api.parser.TimePlaceholderUtils;
import java.util.Date;
import java.util.TimeZone;