diff --git a/nifi-api/src/main/java/org/apache/nifi/processor/util/StandardValidators.java b/nifi-api/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
index 136c67d57f8a..0980069538ff 100644
--- a/nifi-api/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
+++ b/nifi-api/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
@@ -23,7 +23,7 @@
import org.apache.nifi.expression.AttributeExpression.ResultType;
import org.apache.nifi.flowfile.FlowFile;
import org.apache.nifi.processor.DataUnit;
-import org.apache.nifi.time.TimeFormat;
+import org.apache.nifi.time.DurationFormat;
import java.io.File;
import java.net.URI;
@@ -391,10 +391,8 @@ public ValidationResult validate(final String subject, final String input, final
}
return new ValidationResult.Builder().input(input).subject(subject).valid(true).build();
};
- /**
- * URL Validator that does not allow the Expression Language to be used
- */
- public static final Validator URL_VALIDATOR = createURLValidator();
+
+ public static final Validator URL_VALIDATOR = new URLValidator();
public static final Validator URI_VALIDATOR = new Validator() {
@Override
@@ -463,7 +461,7 @@ private static boolean isEmpty(final String value) {
}
public static final Validator TIME_PERIOD_VALIDATOR = new Validator() {
- private final Pattern TIME_DURATION_PATTERN = Pattern.compile(TimeFormat.TIME_DURATION_REGEX);
+ private final Pattern TIME_DURATION_PATTERN = Pattern.compile(DurationFormat.TIME_DURATION_REGEX);
@Override
public ValidationResult validate(final String subject, final String input, final ValidationContext context) {
@@ -531,27 +529,6 @@ public static Validator createDirectoryExistsValidator(final boolean allowExpres
return new DirectoryExistsValidator(allowExpressionLanguage, createDirectoryIfMissing);
}
- private static Validator createURLValidator() {
- return new Validator() {
- @Override
- public ValidationResult validate(final String subject, final String input, final ValidationContext context) {
- if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(input)) {
- return new ValidationResult.Builder().subject(subject).input(input).explanation("Expression Language Present").valid(true).build();
- }
-
- try {
- // Check that we can parse the value as a URL
- final String evaluatedInput = context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
- URI.create(evaluatedInput).toURL();
- return new ValidationResult.Builder().subject(subject).input(input).explanation("Valid URL").valid(true).build();
- } catch (final Exception e) {
- return new ValidationResult.Builder().subject(subject).input(input).explanation("Not a valid URL").valid(false).build();
- }
- }
- };
- }
-
-
public static Validator createListValidator(boolean trimEntries, boolean excludeEmptyEntries,
Validator elementValidator) {
return createListValidator(trimEntries, excludeEmptyEntries, elementValidator, false);
@@ -815,7 +792,7 @@ public ValidationResult validate(final String subject, final String input, final
//
//
static class TimePeriodValidator implements Validator {
- private static final Pattern pattern = Pattern.compile(TimeFormat.TIME_DURATION_REGEX);
+ private static final Pattern pattern = Pattern.compile(DurationFormat.TIME_DURATION_REGEX);
private final long minNanos;
private final long maxNanos;
@@ -843,7 +820,7 @@ public ValidationResult validate(final String subject, final String input, final
final boolean validSyntax = pattern.matcher(lowerCase).matches();
final ValidationResult.Builder builder = new ValidationResult.Builder();
if (validSyntax) {
- final long nanos = new TimeFormat().getTimeDuration(lowerCase, TimeUnit.NANOSECONDS);
+ final long nanos = DurationFormat.getTimeDuration(lowerCase, TimeUnit.NANOSECONDS);
if (nanos < minNanos || nanos > maxNanos) {
builder.subject(subject).input(input).valid(false)
diff --git a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/UriUtils.java b/nifi-api/src/main/java/org/apache/nifi/processor/util/URLValidator.java
similarity index 58%
rename from nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/UriUtils.java
rename to nifi-api/src/main/java/org/apache/nifi/processor/util/URLValidator.java
index 13808d927386..95d532224876 100644
--- a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/UriUtils.java
+++ b/nifi-api/src/main/java/org/apache/nifi/processor/util/URLValidator.java
@@ -14,20 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.nifi.util;
+package org.apache.nifi.processor.util;
+
+import org.apache.nifi.components.ValidationContext;
+import org.apache.nifi.components.ValidationResult;
+import org.apache.nifi.components.Validator;
+
+import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+public class URLValidator implements Validator {
-/**
- * Utility class providing java.net.URI utilities.
- * The regular expressions in this class used to capture the various components of a URI were adapted from
- * UriComponentsBuilder
- */
-public class UriUtils {
private static final String SCHEME_PATTERN = "([^:/?#]+):";
private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";
private static final String HOST_IPV4_PATTERN = "[^\\[/?#:]*";
@@ -40,10 +42,25 @@ public class UriUtils {
// Regex patterns that matches URIs. See RFC 3986, appendix B
private static final Pattern URI_PATTERN = Pattern.compile(
- "^(" + SCHEME_PATTERN + ")?" + "(//(" + USERINFO_PATTERN + "@)?" + HOST_PATTERN + "(:" + PORT_PATTERN +
- ")?" + ")?" + PATH_PATTERN + "(\\?" + QUERY_PATTERN + ")?" + "(#" + LAST_PATTERN + ")?");
+ "^(" + SCHEME_PATTERN + ")?" + "(//(" + USERINFO_PATTERN + "@)?" + HOST_PATTERN + "(:" + PORT_PATTERN +
+ ")?" + ")?" + PATH_PATTERN + "(\\?" + QUERY_PATTERN + ")?" + "(#" + LAST_PATTERN + ")?");
- private UriUtils() {}
+
+ @Override
+ public ValidationResult validate(final String subject, final String input, final ValidationContext context) {
+ if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(input)) {
+ return new ValidationResult.Builder().subject(subject).input(input).explanation("Expression Language Present").valid(true).build();
+ }
+
+ try {
+ // Check that we can parse the value as a URL
+ final String evaluatedInput = context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
+ createURL(evaluatedInput);
+ return new ValidationResult.Builder().subject(subject).input(input).explanation("Valid URL").valid(true).build();
+ } catch (final Exception e) {
+ return new ValidationResult.Builder().subject(subject).input(input).explanation("Not a valid URL").valid(false).build();
+ }
+ }
/**
* This method provides an alternative to the use of java.net.URI's single argument constructor and 'create' method.
@@ -56,12 +73,12 @@ private UriUtils() {}
* On the other hand, java.net.URI's seven argument constructor provides these quoting capabilities. In order
* to take advantage of this constructor, this method parses the given string into the arguments needed
* thereby allowing for instantiating a java.net.URI with the quoting of all illegal characters.
- * @param uri String representing a URI.
- * @return Instance of java.net.URI
- * @throws URISyntaxException Thrown on parsing failures
+ * @param url String representing a URL.
+ * @return Instance of java.net.URL
+ * @throws MalformedURLException if unable to create a URL from the given String representation
*/
- public static URI create(String uri) throws URISyntaxException {
- final Matcher matcher = URI_PATTERN.matcher(uri);
+ public static URL createURL(final String url) throws MalformedURLException {
+ final Matcher matcher = URI_PATTERN.matcher(url);
if (matcher.matches()) {
final String scheme = matcher.group(2);
final String userInfo = matcher.group(5);
@@ -70,9 +87,14 @@ public static URI create(String uri) throws URISyntaxException {
final String path = matcher.group(9);
final String query = matcher.group(11);
final String fragment = matcher.group(13);
- return new URI(scheme, userInfo, host, port != null ? Integer.parseInt(port) : -1, path, query, fragment);
+
+ try {
+ return new URI(scheme, userInfo, host, port != null ? Integer.parseInt(port) : -1, path, query, fragment).toURL();
+ } catch (final URISyntaxException e) {
+ throw new MalformedURLException("Unable to create URL from " + url + ": " + e.getMessage());
+ }
} else {
- throw new IllegalArgumentException(uri + " is not a valid URI");
+ throw new MalformedURLException(url + " is not a valid URL");
}
}
}
diff --git a/nifi-api/src/main/java/org/apache/nifi/time/TimeFormat.java b/nifi-api/src/main/java/org/apache/nifi/time/DurationFormat.java
similarity index 85%
rename from nifi-api/src/main/java/org/apache/nifi/time/TimeFormat.java
rename to nifi-api/src/main/java/org/apache/nifi/time/DurationFormat.java
index 2682ed17c0e7..6de336a36c03 100644
--- a/nifi-api/src/main/java/org/apache/nifi/time/TimeFormat.java
+++ b/nifi-api/src/main/java/org/apache/nifi/time/DurationFormat.java
@@ -23,24 +23,26 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class TimeFormat {
+public class DurationFormat {
private static final String UNION = "|";
// for Time Durations
- private static final String NANOS = join(UNION, "ns", "nano", "nanos", "nanosecond", "nanoseconds");
- private static final String MILLIS = join(UNION, "ms", "milli", "millis", "millisecond", "milliseconds");
- private static final String SECS = join(UNION, "s", "sec", "secs", "second", "seconds");
- private static final String MINS = join(UNION, "m", "min", "mins", "minute", "minutes");
- private static final String HOURS = join(UNION, "h", "hr", "hrs", "hour", "hours");
- private static final String DAYS = join(UNION, "d", "day", "days");
- private static final String WEEKS = join(UNION, "w", "wk", "wks", "week", "weeks");
-
- private static final String VALID_TIME_UNITS = join(UNION, NANOS, MILLIS, SECS, MINS, HOURS, DAYS, WEEKS);
+ private static final String NANOS = String.join(UNION, "ns", "nano", "nanos", "nanosecond", "nanoseconds");
+ private static final String MILLIS = String.join(UNION, "ms", "milli", "millis", "millisecond", "milliseconds");
+ private static final String SECS = String.join(UNION, "s", "sec", "secs", "second", "seconds");
+ private static final String MINS = String.join(UNION, "m", "min", "mins", "minute", "minutes");
+ private static final String HOURS = String.join(UNION, "h", "hr", "hrs", "hour", "hours");
+ private static final String DAYS = String.join(UNION, "d", "day", "days");
+ private static final String WEEKS = String.join(UNION, "w", "wk", "wks", "week", "weeks");
+
+ private static final String VALID_TIME_UNITS = String.join(UNION, NANOS, MILLIS, SECS, MINS, HOURS, DAYS, WEEKS);
public static final String TIME_DURATION_REGEX = "([\\d.]+)\\s*(" + VALID_TIME_UNITS + ")";
public static final Pattern TIME_DURATION_PATTERN = Pattern.compile(TIME_DURATION_REGEX);
private static final List TIME_UNIT_MULTIPLIERS = Arrays.asList(1000L, 1000L, 1000L, 60L, 60L, 24L);
+ private DurationFormat() {
+ }
/**
* Returns a time duration in the requested {@link TimeUnit} after parsing the {@code String}
@@ -53,7 +55,7 @@ public class TimeFormat {
* @return the whole number value of this duration in the requested units
* @see #getPreciseTimeDuration(String, TimeUnit)
*/
- public long getTimeDuration(final String value, final TimeUnit desiredUnit) {
+ public static long getTimeDuration(final String value, final TimeUnit desiredUnit) {
return Math.round(getPreciseTimeDuration(value, desiredUnit));
}
@@ -81,7 +83,7 @@ public long getTimeDuration(final String value, final TimeUnit desiredUnit) {
* @param desiredUnit the desired output {@link TimeUnit}
* @return the parsed and converted amount (without a unit)
*/
- public double getPreciseTimeDuration(final String value, final TimeUnit desiredUnit) {
+ public static double getPreciseTimeDuration(final String value, final TimeUnit desiredUnit) {
final Matcher matcher = TIME_DURATION_PATTERN.matcher(value.toLowerCase());
if (!matcher.matches()) {
throw new IllegalArgumentException("Value '" + value + "' is not a valid time duration");
@@ -134,7 +136,7 @@ public double getPreciseTimeDuration(final String value, final TimeUnit desiredU
* @param timeUnit the current time unit
* @return the time duration as a whole number ({@code long}) and the smaller time unit used
*/
- List