Camel catalog - Validate uris with time pattern is now supported
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b98c8ae6 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b98c8ae6 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b98c8ae6 Branch: refs/heads/camel-2.16.x Commit: b98c8ae650ad2425cd9fa37e67d1bd870799325a Parents: 0ddf543 Author: Claus Ibsen <[email protected]> Authored: Sun Jan 3 12:13:53 2016 +0100 Committer: Claus Ibsen <[email protected]> Committed: Sun Jan 3 12:15:23 2016 +0100 ---------------------------------------------------------------------- .../camel/catalog/DefaultCamelCatalog.java | 26 ++++-- .../camel/catalog/TimePatternConverter.java | 93 ++++++++++++++++++++ .../apache/camel/catalog/CamelCatalogTest.java | 4 + 3 files changed, 117 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b98c8ae6/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java index fc63bd0..c4322f0 100644 --- a/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java +++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java @@ -817,12 +817,7 @@ public class DefaultCamelCatalog implements CamelCatalog { // is integer if (!placeholder && isPropertyInteger(rows, name)) { // value must be an integer - boolean valid = false; - try { - valid = Integer.valueOf(value) != null; - } catch (Exception e) { - // ignore - } + boolean valid = validateInteger(value); if (!valid) { result.addInvalidInteger(name, value); } @@ -862,6 +857,25 @@ public class DefaultCamelCatalog implements CamelCatalog { return result; } + private static boolean validateInteger(String value) { + boolean valid = false; + try { + valid = Integer.valueOf(value) != null; + } catch (Exception e) { + // ignore + } + if (!valid) { + // it may be a time pattern, such as 5s for 5 seconds = 5000 + try { + TimePatternConverter.toMilliSeconds(value); + valid = true; + } catch (Exception e) { + // ignore + } + } + return valid; + } + @Override public Map<String, String> endpointProperties(String uri) throws URISyntaxException { // NOTICE: This logic is similar to org.apache.camel.util.EndpointHelper#endpointProperties http://git-wip-us.apache.org/repos/asf/camel/blob/b98c8ae6/platforms/catalog/src/main/java/org/apache/camel/catalog/TimePatternConverter.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/main/java/org/apache/camel/catalog/TimePatternConverter.java b/platforms/catalog/src/main/java/org/apache/camel/catalog/TimePatternConverter.java new file mode 100644 index 0000000..e49ee89 --- /dev/null +++ b/platforms/catalog/src/main/java/org/apache/camel/catalog/TimePatternConverter.java @@ -0,0 +1,93 @@ +/** + * 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.camel.catalog; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * This class is a copy from camel-core so we can use it independent to validate uris with time patterns + */ +public final class TimePatternConverter { + + private static final String NUMBERS_ONLY_STRING_PATTERN = "^[-]?(\\d)+$"; + private static final String REPLACEMENT_PATTERN = "[our|inute|econd](s)?"; + private static final String HOUR_REGEX_PATTERN = "((\\d)*(\\d))[h|H]"; + private static final String MINUTES_REGEX_PATTERN = "((\\d)*(\\d))[m|M]"; + private static final String SECONDS_REGEX_PATTERN = "((\\d)*(\\d))[s|S]"; + + /** + * Utility classes should not have a public constructor. + */ + private TimePatternConverter() { + } + + public static long toMilliSeconds(String source) throws IllegalArgumentException { + long milliseconds = 0; + boolean foundFlag = false; + Matcher matcher; + + matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source); + if (matcher.find()) { + // Note: This will also be used for regular numeric strings. + // This String -> long converter will be used for all strings. + milliseconds = Long.valueOf(source); + } else { + matcher = createMatcher(REPLACEMENT_PATTERN, source); + String replacedSource = matcher.replaceAll(""); + + matcher = createMatcher(HOUR_REGEX_PATTERN, replacedSource); + if (matcher.find()) { + milliseconds = milliseconds + (3600000 * Long.valueOf(matcher.group(1))); + foundFlag = true; + } + + matcher = createMatcher(MINUTES_REGEX_PATTERN, replacedSource); + if (matcher.find()) { + long minutes = Long.valueOf(matcher.group(1)); + if ((minutes > 59) && foundFlag) { + throw new IllegalArgumentException("Minutes should contain a valid value between 0 and 59: " + source); + } + foundFlag = true; + milliseconds = milliseconds + (60000 * minutes); + } + + matcher = createMatcher(SECONDS_REGEX_PATTERN, replacedSource); + if (matcher.find()) { + long seconds = Long.valueOf(matcher.group(1)); + if ((seconds > 59) && foundFlag) { + throw new IllegalArgumentException("Seconds should contain a valid value between 0 and 59: " + source); + } + foundFlag = true; + milliseconds = milliseconds + (1000 * seconds); + } + + // No pattern matched... initiating fallback check and conversion (if required). + // The source at this point may contain illegal values or special characters + if (!foundFlag) { + milliseconds = Long.valueOf(source); + } + } + + return milliseconds; + } + + private static Matcher createMatcher(String regexPattern, String source) { + Pattern pattern = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE); + return pattern.matcher(source); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/b98c8ae6/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java ---------------------------------------------------------------------- diff --git a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index b58ec15..4387374 100644 --- a/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/platforms/catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -460,6 +460,10 @@ public class CamelCatalogTest { // dataset result = catalog.validateEndpointProperties("dataset:foo?minRate=50"); assertTrue(result.isSuccess()); + + // time pattern + result = catalog.validateEndpointProperties("timer://foo?fixedRate=true&delay=0&period=2s"); + assertTrue(result.isSuccess()); } @Test
