http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/EndpointValidationResult.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/EndpointValidationResult.java b/camel-core/src/main/java/org/apache/camel/catalog/EndpointValidationResult.java deleted file mode 100644 index 9bb98f0..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/EndpointValidationResult.java +++ /dev/null @@ -1,451 +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.camel.catalog; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.apache.camel.catalog.URISupport.isEmpty; - -/** - * Details result of validating endpoint uri. - */ -public class EndpointValidationResult implements Serializable { - - private final String uri; - private int errors; - - // general - private String syntaxError; - private String unknownComponent; - private String incapable; - - // options - private Set<String> unknown; - private Map<String, String[]> unknownSuggestions; - private Set<String> lenient; - private Set<String> notConsumerOnly; - private Set<String> notProducerOnly; - private Set<String> required; - private Map<String, String> invalidEnum; - private Map<String, String[]> invalidEnumChoices; - private Map<String, String[]> invalidEnumSuggestions; - private Map<String, String> invalidReference; - private Map<String, String> invalidBoolean; - private Map<String, String> invalidInteger; - private Map<String, String> invalidNumber; - private Map<String, String> defaultValues; - - public EndpointValidationResult() { - this(null); - } - - public EndpointValidationResult(String uri) { - this.uri = uri; - } - - public String getUri() { - return uri; - } - - public boolean hasErrors() { - return errors > 0; - } - - public int getNumberOfErrors() { - return errors; - } - - public boolean isSuccess() { - boolean ok = syntaxError == null && unknownComponent == null && incapable == null - && unknown == null && required == null; - if (ok) { - ok = notConsumerOnly == null && notProducerOnly == null; - } - if (ok) { - ok = invalidEnum == null && invalidEnumChoices == null && invalidReference == null - && invalidBoolean == null && invalidInteger == null && invalidNumber == null; - } - return ok; - } - - public void addSyntaxError(String syntaxError) { - this.syntaxError = syntaxError; - errors++; - } - - public void addIncapable(String uri) { - this.incapable = uri; - errors++; - } - - public void addUnknownComponent(String name) { - this.unknownComponent = name; - errors++; - } - - public void addUnknown(String name) { - if (unknown == null) { - unknown = new LinkedHashSet<String>(); - } - if (!unknown.contains(name)) { - unknown.add(name); - errors++; - } - } - - public void addUnknownSuggestions(String name, String[] suggestions) { - if (unknownSuggestions == null) { - unknownSuggestions = new LinkedHashMap<String, String[]>(); - } - unknownSuggestions.put(name, suggestions); - } - - public void addLenient(String name) { - if (lenient == null) { - lenient = new LinkedHashSet<String>(); - } - if (!lenient.contains(name)) { - lenient.add(name); - } - } - - public void addRequired(String name) { - if (required == null) { - required = new LinkedHashSet<String>(); - } - if (!required.contains(name)) { - required.add(name); - errors++; - } - } - - public void addInvalidEnum(String name, String value) { - if (invalidEnum == null) { - invalidEnum = new LinkedHashMap<String, String>(); - } - if (!invalidEnum.containsKey(name)) { - invalidEnum.put(name, value); - errors++; - } - } - - public void addInvalidEnumChoices(String name, String[] choices) { - if (invalidEnumChoices == null) { - invalidEnumChoices = new LinkedHashMap<String, String[]>(); - } - invalidEnumChoices.put(name, choices); - } - - public void addInvalidEnumSuggestions(String name, String[] suggestions) { - if (invalidEnumSuggestions == null) { - invalidEnumSuggestions = new LinkedHashMap<String, String[]>(); - } - invalidEnumSuggestions.put(name, suggestions); - } - - public void addInvalidReference(String name, String value) { - if (invalidReference == null) { - invalidReference = new LinkedHashMap<String, String>(); - } - if (!invalidReference.containsKey(name)) { - invalidReference.put(name, value); - errors++; - } - } - - public void addInvalidBoolean(String name, String value) { - if (invalidBoolean == null) { - invalidBoolean = new LinkedHashMap<String, String>(); - } - if (!invalidBoolean.containsKey(name)) { - invalidBoolean.put(name, value); - errors++; - } - } - - public void addInvalidInteger(String name, String value) { - if (invalidInteger == null) { - invalidInteger = new LinkedHashMap<String, String>(); - } - if (!invalidInteger.containsKey(name)) { - invalidInteger.put(name, value); - errors++; - } - } - - public void addInvalidNumber(String name, String value) { - if (invalidNumber == null) { - invalidNumber = new LinkedHashMap<String, String>(); - } - if (!invalidNumber.containsKey(name)) { - invalidNumber.put(name, value); - errors++; - } - } - - public void addDefaultValue(String name, String value) { - if (defaultValues == null) { - defaultValues = new LinkedHashMap<String, String>(); - } - defaultValues.put(name, value); - } - - public void addNotConsumerOnly(String name) { - if (notConsumerOnly == null) { - notConsumerOnly = new LinkedHashSet<String>(); - } - if (!notConsumerOnly.contains(name)) { - notConsumerOnly.add(name); - errors++; - } - } - - public void addNotProducerOnly(String name) { - if (notProducerOnly == null) { - notProducerOnly = new LinkedHashSet<String>(); - } - if (!notProducerOnly.contains(name)) { - notProducerOnly.add(name); - errors++; - } - } - - public String getSyntaxError() { - return syntaxError; - } - - public String getIncapable() { - return incapable; - } - - public Set<String> getUnknown() { - return unknown; - } - - public Set<String> getLenient() { - return lenient; - } - - public Map<String, String[]> getUnknownSuggestions() { - return unknownSuggestions; - } - - public String getUnknownComponent() { - return unknownComponent; - } - - public Set<String> getRequired() { - return required; - } - - public Map<String, String> getInvalidEnum() { - return invalidEnum; - } - - public Map<String, String[]> getInvalidEnumChoices() { - return invalidEnumChoices; - } - - public List<String> getEnumChoices(String optionName) { - if (invalidEnumChoices != null) { - String[] enums = invalidEnumChoices.get(optionName); - if (enums != null) { - return Arrays.asList(enums); - } - } - - return Collections.emptyList(); - } - - public Map<String, String> getInvalidReference() { - return invalidReference; - } - - public Map<String, String> getInvalidBoolean() { - return invalidBoolean; - } - - public Map<String, String> getInvalidInteger() { - return invalidInteger; - } - - public Map<String, String> getInvalidNumber() { - return invalidNumber; - } - - public Map<String, String> getDefaultValues() { - return defaultValues; - } - - public Set<String> getNotConsumerOnly() { - return notConsumerOnly; - } - - public Set<String> getNotProducerOnly() { - return notProducerOnly; - } - - /** - * A human readable summary of the validation errors. - * - * @param includeHeader whether to include a header - * @return the summary, or <tt>null</tt> if no validation errors - */ - public String summaryErrorMessage(boolean includeHeader) { - if (isSuccess()) { - return null; - } - - if (incapable != null) { - return "\tIncapable of parsing uri: " + incapable; - } else if (syntaxError != null) { - return "\tSyntax error: " + syntaxError; - } else if (unknownComponent != null) { - return "\tUnknown component: " + unknownComponent; - } - - // for each invalid option build a reason message - Map<String, String> options = new LinkedHashMap<String, String>(); - if (unknown != null) { - for (String name : unknown) { - if (unknownSuggestions != null && unknownSuggestions.containsKey(name)) { - String[] suggestions = unknownSuggestions.get(name); - if (suggestions != null && suggestions.length > 0) { - String str = Arrays.asList(suggestions).toString(); - options.put(name, "Unknown option. Did you mean: " + str); - } else { - options.put(name, "Unknown option"); - } - } else { - options.put(name, "Unknown option"); - } - } - } - if (notConsumerOnly != null) { - for (String name : notConsumerOnly) { - options.put(name, "Option not applicable in consumer only mode"); - } - } - if (notProducerOnly != null) { - for (String name : notProducerOnly) { - options.put(name, "Option not applicable in producer only mode"); - } - } - if (required != null) { - for (String name : required) { - options.put(name, "Missing required option"); - } - } - if (invalidEnum != null) { - for (Map.Entry<String, String> entry : invalidEnum.entrySet()) { - String name = entry.getKey(); - String[] choices = invalidEnumChoices.get(name); - String defaultValue = defaultValues != null ? defaultValues.get(entry.getKey()) : null; - String str = Arrays.asList(choices).toString(); - String msg = "Invalid enum value: " + entry.getValue() + ". Possible values: " + str; - if (invalidEnumSuggestions != null) { - String[] suggestions = invalidEnumSuggestions.get(name); - if (suggestions != null && suggestions.length > 0) { - str = Arrays.asList(suggestions).toString(); - msg += ". Did you mean: " + str; - } - } - if (defaultValue != null) { - msg += ". Default value: " + defaultValue; - } - - options.put(entry.getKey(), msg); - } - } - if (invalidReference != null) { - for (Map.Entry<String, String> entry : invalidReference.entrySet()) { - boolean empty = isEmpty(entry.getValue()); - if (empty) { - options.put(entry.getKey(), "Empty reference value"); - } else if (!entry.getValue().startsWith("#")) { - options.put(entry.getKey(), "Invalid reference value: " + entry.getValue() + " must start with #"); - } else { - options.put(entry.getKey(), "Invalid reference value: " + entry.getValue()); - } - } - } - if (invalidBoolean != null) { - for (Map.Entry<String, String> entry : invalidBoolean.entrySet()) { - boolean empty = isEmpty(entry.getValue()); - if (empty) { - options.put(entry.getKey(), "Empty boolean value"); - } else { - options.put(entry.getKey(), "Invalid boolean value: " + entry.getValue()); - } - } - } - if (invalidInteger != null) { - for (Map.Entry<String, String> entry : invalidInteger.entrySet()) { - boolean empty = isEmpty(entry.getValue()); - if (empty) { - options.put(entry.getKey(), "Empty integer value"); - } else { - options.put(entry.getKey(), "Invalid integer value: " + entry.getValue()); - } - } - } - if (invalidNumber != null) { - for (Map.Entry<String, String> entry : invalidNumber.entrySet()) { - boolean empty = isEmpty(entry.getValue()); - if (empty) { - options.put(entry.getKey(), "Empty number value"); - } else { - options.put(entry.getKey(), "Invalid number value: " + entry.getValue()); - } - } - } - - // build a table with the error summary nicely formatted - // lets use 24 as min length - int maxLen = 24; - for (String key : options.keySet()) { - maxLen = Math.max(maxLen, key.length()); - } - String format = "%" + maxLen + "s %s"; - - // build the human error summary - StringBuilder sb = new StringBuilder(); - if (includeHeader) { - sb.append("Endpoint validator error\n"); - sb.append("---------------------------------------------------------------------------------------------------------------------------------------\n"); - sb.append("\n"); - } - if (uri != null) { - sb.append("\t").append(uri).append("\n"); - } else { - sb.append("\n"); - } - for (Map.Entry<String, String> option : options.entrySet()) { - String out = String.format(format, option.getKey(), option.getValue()); - sb.append("\n\t").append(out); - } - - return sb.toString(); - } -}
http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java b/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java deleted file mode 100644 index 774facd..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaHelper.java +++ /dev/null @@ -1,424 +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.camel.catalog; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class JSonSchemaHelper { - - // 0 = text, 1 = enum, 2 = boolean, 3 = integer or number - private static final Pattern PATTERN = Pattern.compile("\"(.+?)\"|\\[(.+)\\]|(true|false)|(-?\\d+\\.?\\d*)"); - private static final String QUOT = """; - - private JSonSchemaHelper() { - } - - /** - * Parses the json schema to split it into a list or rows, where each row contains key value pairs with the metadata - * - * @param group the group to parse from such as <tt>component</tt>, <tt>componentProperties</tt>, or <tt>properties</tt>. - * @param json the json - * @return a list of all the rows, where each row is a set of key value pairs with metadata - */ - public static List<Map<String, String>> parseJsonSchema(String group, String json, boolean parseProperties) { - List<Map<String, String>> answer = new ArrayList<Map<String, String>>(); - if (json == null) { - return answer; - } - - boolean found = false; - - // parse line by line - String[] lines = json.split("\n"); - for (String line : lines) { - // we need to find the group first - if (!found) { - String s = line.trim(); - found = s.startsWith("\"" + group + "\":") && s.endsWith("{"); - continue; - } - - // we should stop when we end the group - if (line.equals(" },") || line.equals(" }")) { - break; - } - - // need to safe encode \" so we can parse the line - line = line.replaceAll("\"\\\\\"\"", '"' + QUOT + '"'); - - Map<String, String> row = new LinkedHashMap<String, String>(); - Matcher matcher = PATTERN.matcher(line); - - String key; - if (parseProperties) { - // when parsing properties the first key is given as name, so the first parsed token is the value of the name - key = "name"; - } else { - key = null; - } - while (matcher.find()) { - if (key == null) { - key = matcher.group(1); - } else { - String value = matcher.group(1); - if (value != null) { - // its text based - value = value.trim(); - // decode - value = value.replaceAll(QUOT, "\""); - value = decodeJson(value); - } - if (value == null) { - // not text then its maybe an enum? - value = matcher.group(2); - if (value != null) { - // its an enum so strip out " and trim spaces after comma - value = value.replaceAll("\"", ""); - value = value.replaceAll(", ", ","); - value = value.trim(); - } - } - if (value == null) { - // not text then its maybe a boolean? - value = matcher.group(3); - } - if (value == null) { - // not text then its maybe a integer? - value = matcher.group(4); - } - if (value != null) { - row.put(key, value); - } - // reset - key = null; - } - } - if (!row.isEmpty()) { - answer.add(row); - } - } - - return answer; - } - - private static String decodeJson(String value) { - // json encodes a \ as \\ so we need to decode from \\ back to \ - if ("\\\\".equals(value)) { - value = "\\"; - } - return value; - } - - public static boolean isComponentLenientProperties(List<Map<String, String>> rows) { - for (Map<String, String> row : rows) { - if (row.containsKey("lenientProperties")) { - return "true".equals(row.get("lenientProperties")); - } - } - return false; - } - - public static boolean isComponentConsumerOnly(List<Map<String, String>> rows) { - for (Map<String, String> row : rows) { - if (row.containsKey("consumerOnly")) { - return "true".equals(row.get("consumerOnly")); - } - } - return false; - } - - public static boolean isComponentProducerOnly(List<Map<String, String>> rows) { - for (Map<String, String> row : rows) { - if (row.containsKey("producerOnly")) { - return "true".equals(row.get("producerOnly")); - } - } - return false; - } - - public static boolean isPropertyConsumerOnly(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String labels = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("label")) { - labels = row.get("label"); - } - if (found) { - return labels != null && labels.contains("consumer"); - } - } - return false; - } - - public static boolean isPropertyProducerOnly(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String labels = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("label")) { - labels = row.get("label"); - } - if (found) { - return labels != null && labels.contains("producer"); - } - } - return false; - } - - public static boolean isPropertyRequired(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - boolean required = false; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("required")) { - required = "true".equals(row.get("required")); - } - if (found) { - return required; - } - } - return false; - } - - public static String getPropertyKind(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String kind = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("kind")) { - kind = row.get("kind"); - } - if (found) { - return kind; - } - } - return null; - } - - public static boolean isPropertyBoolean(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String type = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("type")) { - type = row.get("type"); - } - if (found) { - return "boolean".equals(type); - } - } - return false; - } - - public static boolean isPropertyInteger(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String type = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("type")) { - type = row.get("type"); - } - if (found) { - return "integer".equals(type); - } - } - return false; - } - - public static boolean isPropertyNumber(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String type = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("type")) { - type = row.get("type"); - } - if (found) { - return "number".equals(type); - } - } - return false; - } - - public static boolean isPropertyObject(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String type = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("type")) { - type = row.get("type"); - } - if (found) { - return "object".equals(type); - } - } - return false; - } - - public static String getPropertyDefaultValue(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String defaultValue = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("defaultValue")) { - defaultValue = row.get("defaultValue"); - } - if (found) { - return defaultValue; - } - } - return null; - } - - public static String stripOptionalPrefixFromName(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String optionalPrefix = null; - boolean found = false; - if (row.containsKey("optionalPrefix")) { - optionalPrefix = row.get("optionalPrefix"); - } - if (row.containsKey("name")) { - if (optionalPrefix != null && name.startsWith(optionalPrefix)) { - name = name.substring(optionalPrefix.length()); - // try again - return stripOptionalPrefixFromName(rows, name); - } else { - found = name.equals(row.get("name")); - } - } - if (found) { - return name; - } - } - return name; - } - - public static String getPropertyEnum(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String enums = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("enum")) { - enums = row.get("enum"); - } - if (found) { - return enums; - } - } - return null; - } - - public static String getPropertyPrefix(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String prefix = null; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("prefix")) { - prefix = row.get("prefix"); - } - if (found) { - return prefix; - } - } - return null; - } - - public static boolean isPropertyMultiValue(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - boolean multiValue = false; - boolean found = false; - if (row.containsKey("name")) { - found = name.equals(row.get("name")); - } - if (row.containsKey("multiValue")) { - multiValue = "true".equals(row.get("multiValue")); - } - if (found) { - return multiValue; - } - } - return false; - } - - public static String getPropertyNameFromNameWithPrefix(List<Map<String, String>> rows, String name) { - for (Map<String, String> row : rows) { - String propertyName = null; - boolean found = false; - if (row.containsKey("name")) { - propertyName = row.get("name"); - } - if (row.containsKey("prefix")) { - String preifx = row.get("prefix"); - found = name.startsWith(preifx); - } - if (found) { - return propertyName; - } - } - return null; - } - - public static Map<String, String> getRow(List<Map<String, String>> rows, String key) { - for (Map<String, String> row : rows) { - if (key.equals(row.get("name"))) { - return row; - } - } - return null; - } - - public static Set<String> getNames(List<Map<String, String>> rows) { - Set<String> answer = new LinkedHashSet<String>(); - for (Map<String, String> row : rows) { - if (row.containsKey("name")) { - answer.add(row.get("name")); - } - } - return answer; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java b/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java deleted file mode 100644 index 9bf09cc..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java +++ /dev/null @@ -1,64 +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.camel.catalog; - -/** - * Pluggable resolver to load JSon schema files for components, data formats, languages etc. - */ -public interface JSonSchemaResolver { - - /** - * Returns the component information as JSon format. - * - * @param name the component name - * @return component details in JSon - */ - String getComponentJSonSchema(String name); - - /** - * Returns the data format information as JSon format. - * - * @param name the data format name - * @return data format details in JSon - */ - String getDataFormatJSonSchema(String name); - - /** - * Returns the language information as JSon format. - * - * @param name the language name - * @return language details in JSon - */ - String getLanguageJSonSchema(String name); - - /** - * Returns the other (miscellaneous) information as JSon format. - * - * @param name the other (miscellaneous) name - * @return other (miscellaneous) details in JSon - */ - String getOtherJSonSchema(String name); - - /** - * Returns the model information as JSon format. - * - * @param name the model name - * @return model details in JSon - */ - String getModelJSonSchema(String name); - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java b/camel-core/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java deleted file mode 100644 index 4a977eb..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/LanguageValidationResult.java +++ /dev/null @@ -1,65 +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.camel.catalog; - -import java.io.Serializable; - -/** - * Validation result of parsing a language expression or predicate - */ -public class LanguageValidationResult implements Serializable { - private final String text; - private String error; - private String shortError; - private int index; - - public LanguageValidationResult(String text) { - this.text = text; - } - - public String getText() { - return text; - } - - public boolean isSuccess() { - return error == null; - } - - public void setError(String error) { - this.error = error; - } - - public String getError() { - return error; - } - - public String getShortError() { - return shortError; - } - - public void setShortError(String shortError) { - this.shortError = shortError; - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/RuntimeCamelCatalog.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/RuntimeCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/RuntimeCamelCatalog.java deleted file mode 100644 index b46edab..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/RuntimeCamelCatalog.java +++ /dev/null @@ -1,234 +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.camel.catalog; - -import java.net.URISyntaxException; -import java.util.Map; - -import org.apache.camel.StaticService; - -/** - * Runtime based CamelCatalog which are included in camel-core that can provided limit CamelCatalog capabilities - */ -public interface RuntimeCamelCatalog extends StaticService { - - /** - * Returns the component information as JSon format. - * - * @param name the component name - * @return component details in JSon - */ - String componentJSonSchema(String name); - - /** - * Returns the data format information as JSon format. - * - * @param name the data format name - * @return data format details in JSon - */ - String dataFormatJSonSchema(String name); - - /** - * Returns the language information as JSon format. - * - * @param name the language name - * @return language details in JSon - */ - String languageJSonSchema(String name); - - /** - * Returns the model information as JSon format. - * - * @param name the model name - * @return model details in JSon - */ - String modelJSonSchema(String name); - - /** - * Parses the endpoint uri and constructs a key/value properties of each option - * - * @param uri the endpoint uri - * @return properties as key value pairs of each endpoint option - */ - Map<String, String> endpointProperties(String uri) throws URISyntaxException; - - /** - * Parses the endpoint uri and constructs a key/value properties of only the lenient properties (eg custom options) - * <p/> - * For example using the HTTP components to provide query parameters in the endpoint uri. - * - * @param uri the endpoint uri - * @return properties as key value pairs of each lenient properties - */ - Map<String, String> endpointLenientProperties(String uri) throws URISyntaxException; - - /** - * Validates the pattern whether its a valid time pattern. - * - * @param pattern the pattern such as 5000, 5s, 5sec, 4min, 4m30s, 1h, etc. - * @return <tt>true</tt> if valid, <tt>false</tt> if invalid - */ - boolean validateTimePattern(String pattern); - - /** - * Validates the properties for the given scheme against component and endpoint - * - * @param scheme the endpoint scheme - * @param properties the endpoint properties - * @return validation result - */ - EndpointValidationResult validateProperties(String scheme, Map<String, String> properties); - - /** - * Parses and validates the endpoint uri and constructs a key/value properties of each option. - * - * @param uri the endpoint uri - * @return validation result - */ - EndpointValidationResult validateEndpointProperties(String uri); - - /** - * Parses and validates the endpoint uri and constructs a key/value properties of each option. - * <p/> - * The option ignoreLenientProperties can be used to ignore components that uses lenient properties. - * When this is true, then the uri validation is stricter but would fail on properties that are not part of the component - * but in the uri because of using lenient properties. - * For example using the HTTP components to provide query parameters in the endpoint uri. - * - * @param uri the endpoint uri - * @param ignoreLenientProperties whether to ignore components that uses lenient properties. - * @return validation result - */ - EndpointValidationResult validateEndpointProperties(String uri, boolean ignoreLenientProperties); - - /** - * Parses and validates the endpoint uri and constructs a key/value properties of each option. - * <p/> - * The option ignoreLenientProperties can be used to ignore components that uses lenient properties. - * When this is true, then the uri validation is stricter but would fail on properties that are not part of the component - * but in the uri because of using lenient properties. - * For example using the HTTP components to provide query parameters in the endpoint uri. - * - * @param uri the endpoint uri - * @param ignoreLenientProperties whether to ignore components that uses lenient properties. - * @param consumerOnly whether the endpoint is only used as a consumer - * @param producerOnly whether the endpoint is only used as a producer - * @return validation result - */ - EndpointValidationResult validateEndpointProperties(String uri, boolean ignoreLenientProperties, boolean consumerOnly, boolean producerOnly); - - /** - * Parses and validates the simple expression. - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath - * - * @param simple the simple expression - * @return validation result - * @deprecated use {@link #validateSimpleExpression(ClassLoader, String)} - */ - @Deprecated - SimpleValidationResult validateSimpleExpression(String simple); - - /** - * Parses and validates the simple expression. - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath - * - * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader - * @param simple the simple expression - * @return validation result - */ - SimpleValidationResult validateSimpleExpression(ClassLoader classLoader, String simple); - - /** - * Parses and validates the simple predicate - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath - * - * @param simple the simple predicate - * @return validation result - * @deprecated use {@link #validateSimplePredicate(ClassLoader, String)} - */ - @Deprecated - SimpleValidationResult validateSimplePredicate(String simple); - - /** - * Parses and validates the simple predicate - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> on the classpath - * - * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader - * @param simple the simple predicate - * @return validation result - */ - SimpleValidationResult validateSimplePredicate(ClassLoader classLoader, String simple); - - /** - * Parses and validates the language as a predicate - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> and the language dependencies on the classpath - * - * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader - * @param language the name of the language - * @param text the predicate text - * @return validation result - */ - LanguageValidationResult validateLanguagePredicate(ClassLoader classLoader, String language, String text); - - /** - * Parses and validates the language as an expression - * <p/> - * <b>Important:</b> This requires having <tt>camel-core</tt> and the language dependencies on the classpath - * - * @param classLoader a custom classloader to use for loading the language from the classpath, or <tt>null</tt> for using default classloader - * @param language the name of the language - * @param text the expression text - * @return validation result - */ - LanguageValidationResult validateLanguageExpression(ClassLoader classLoader, String language, String text); - - /** - * Returns the component name from the given endpoint uri - * - * @param uri the endpoint uri - * @return the component name (aka scheme), or <tt>null</tt> if not possible to determine - */ - String endpointComponentName(String uri); - - /** - * Creates an endpoint uri in Java style from the information from the properties - * - * @param scheme the endpoint schema - * @param properties the properties as key value pairs - * @param encode whether to URL encode the returned uri or not - * @return the constructed endpoint uri - * @throws java.net.URISyntaxException is thrown if there is encoding error - */ - String asEndpointUri(String scheme, Map<String, String> properties, boolean encode) throws URISyntaxException; - - /** - * Creates an endpoint uri in XML style (eg escape & as &l;) from the information from the properties - * - * @param scheme the endpoint schema - * @param properties the properties as key value pairs - * @param encode whether to URL encode the returned uri or not - * @return the constructed endpoint uri - * @throws java.net.URISyntaxException is thrown if there is encoding error - */ - String asEndpointUriXml(String scheme, Map<String, String> properties, boolean encode) throws URISyntaxException; - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java b/camel-core/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java deleted file mode 100644 index 5c86f23..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/SimpleValidationResult.java +++ /dev/null @@ -1,32 +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.camel.catalog; - -/** - * To be backwards compatible, but favor using {@link LanguageValidationResult} instead. - */ -public class SimpleValidationResult extends LanguageValidationResult { - - public SimpleValidationResult(String text) { - super(text); - } - - public String getSimple() { - return getText(); - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/SuggestionStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/SuggestionStrategy.java b/camel-core/src/main/java/org/apache/camel/catalog/SuggestionStrategy.java deleted file mode 100644 index 057d372..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/SuggestionStrategy.java +++ /dev/null @@ -1,34 +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.camel.catalog; - -import java.util.Set; - -/** - * Strategy to provide suggestions for unknown endpoint options - */ -public interface SuggestionStrategy { - - /** - * Provides a list of valid option names for a did you mean function. - * - * @param names valid names - * @param unknownOption unknown option name - * @return a list of suggested names (did you mean) - */ - String[] suggestEndpointOptions(Set<String> names, String unknownOption); -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/TimePatternConverter.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/TimePatternConverter.java b/camel-core/src/main/java/org/apache/camel/catalog/TimePatternConverter.java deleted file mode 100644 index 4ed843a..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/TimePatternConverter.java +++ /dev/null @@ -1,120 +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.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 Pattern NUMBERS_ONLY_STRING_PATTERN = Pattern.compile("^[-]?(\\d)+$", Pattern.CASE_INSENSITIVE); - private static final Pattern HOUR_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))h(our(s)?)?", Pattern.CASE_INSENSITIVE); - private static final Pattern MINUTES_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))m(in(ute(s)?)?)?", Pattern.CASE_INSENSITIVE); - private static final Pattern SECONDS_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))s(ec(ond)?(s)?)?", Pattern.CASE_INSENSITIVE); - - /** - * Utility classes should not have a public constructor. - */ - private TimePatternConverter() { - } - - public static long toMilliSeconds(String source) throws IllegalArgumentException { - long milliseconds = 0; - boolean foundFlag = false; - - checkCorrectnessOfPattern(source); - 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(HOUR_REGEX_PATTERN, source); - if (matcher.find()) { - milliseconds = milliseconds + (3600000 * Long.valueOf(matcher.group(1))); - foundFlag = true; - } - - matcher = createMatcher(MINUTES_REGEX_PATTERN, source); - 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, source); - 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 void checkCorrectnessOfPattern(String source) { - //replace only numbers once - Matcher matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source); - String replaceSource = matcher.replaceFirst(""); - - //replace hour string once - matcher = createMatcher(HOUR_REGEX_PATTERN, replaceSource); - if (matcher.find() && matcher.find()) { - throw new IllegalArgumentException("Hours should not be specified more then once: " + source); - } - replaceSource = matcher.replaceFirst(""); - - //replace minutes once - matcher = createMatcher(MINUTES_REGEX_PATTERN, replaceSource); - if (matcher.find() && matcher.find()) { - throw new IllegalArgumentException("Minutes should not be specified more then once: " + source); - } - replaceSource = matcher.replaceFirst(""); - - //replace seconds once - matcher = createMatcher(SECONDS_REGEX_PATTERN, replaceSource); - if (matcher.find() && matcher.find()) { - throw new IllegalArgumentException("Seconds should not be specified more then once: " + source); - } - replaceSource = matcher.replaceFirst(""); - - if (replaceSource.length() > 0) { - throw new IllegalArgumentException("Illegal characters: " + source); - } - } - - private static Matcher createMatcher(Pattern pattern, String source) { - return pattern.matcher(source); - } -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/URISupport.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/URISupport.java b/camel-core/src/main/java/org/apache/camel/catalog/URISupport.java deleted file mode 100644 index ea1ecd5..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/URISupport.java +++ /dev/null @@ -1,392 +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.camel.catalog; - -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * Copied from org.apache.camel.util.URISupport - */ -public final class URISupport { - - public static final String RAW_TOKEN_START = "RAW("; - public static final String RAW_TOKEN_END = ")"; - - private static final String CHARSET = "UTF-8"; - - private URISupport() { - // Helper class - } - - /** - * Normalizes the URI so unsafe characters is encoded - * - * @param uri the input uri - * @return as URI instance - * @throws URISyntaxException is thrown if syntax error in the input uri - */ - public static URI normalizeUri(String uri) throws URISyntaxException { - return new URI(UnsafeUriCharactersEncoder.encode(uri, true)); - } - - public static Map<String, Object> extractProperties(Map<String, Object> properties, String optionPrefix) { - Map<String, Object> rc = new LinkedHashMap<String, Object>(properties.size()); - - for (Iterator<Map.Entry<String, Object>> it = properties.entrySet().iterator(); it.hasNext();) { - Map.Entry<String, Object> entry = it.next(); - String name = entry.getKey(); - if (name.startsWith(optionPrefix)) { - Object value = properties.get(name); - name = name.substring(optionPrefix.length()); - rc.put(name, value); - it.remove(); - } - } - - return rc; - } - - /** - * Strips the query parameters from the uri - * - * @param uri the uri - * @return the uri without the query parameter - */ - public static String stripQuery(String uri) { - int idx = uri.indexOf('?'); - if (idx > -1) { - uri = uri.substring(0, idx); - } - return uri; - } - - /** - * Parses the query parameters of the uri (eg the query part). - * - * @param uri the uri - * @return the parameters, or an empty map if no parameters (eg never null) - * @throws URISyntaxException is thrown if uri has invalid syntax. - */ - public static Map<String, Object> parseParameters(URI uri) throws URISyntaxException { - String query = uri.getQuery(); - if (query == null) { - String schemeSpecificPart = uri.getSchemeSpecificPart(); - int idx = schemeSpecificPart.indexOf('?'); - if (idx < 0) { - // return an empty map - return new LinkedHashMap<String, Object>(0); - } else { - query = schemeSpecificPart.substring(idx + 1); - } - } else { - query = stripPrefix(query, "?"); - } - return parseQuery(query); - } - - /** - * Strips the prefix from the value. - * <p/> - * Returns the value as-is if not starting with the prefix. - * - * @param value the value - * @param prefix the prefix to remove from value - * @return the value without the prefix - */ - public static String stripPrefix(String value, String prefix) { - if (value != null && value.startsWith(prefix)) { - return value.substring(prefix.length()); - } - return value; - } - - /** - * Parses the query part of the uri (eg the parameters). - * <p/> - * The URI parameters will by default be URI encoded. However you can define a parameter - * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value, - * and use the value as is (eg key=value) and the value has <b>not</b> been encoded. - * - * @param uri the uri - * @return the parameters, or an empty map if no parameters (eg never null) - * @throws URISyntaxException is thrown if uri has invalid syntax. - * @see #RAW_TOKEN_START - * @see #RAW_TOKEN_END - */ - public static Map<String, Object> parseQuery(String uri) throws URISyntaxException { - return parseQuery(uri, false); - } - - /** - * Parses the query part of the uri (eg the parameters). - * <p/> - * The URI parameters will by default be URI encoded. However you can define a parameter - * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value, - * and use the value as is (eg key=value) and the value has <b>not</b> been encoded. - * - * @param uri the uri - * @param useRaw whether to force using raw values - * @return the parameters, or an empty map if no parameters (eg never null) - * @throws URISyntaxException is thrown if uri has invalid syntax. - * @see #RAW_TOKEN_START - * @see #RAW_TOKEN_END - */ - public static Map<String, Object> parseQuery(String uri, boolean useRaw) throws URISyntaxException { - // must check for trailing & as the uri.split("&") will ignore those - if (uri != null && uri.endsWith("&")) { - throw new URISyntaxException(uri, "Invalid uri syntax: Trailing & marker found. " - + "Check the uri and remove the trailing & marker."); - } - - if (isEmpty(uri)) { - // return an empty map - return new LinkedHashMap<String, Object>(0); - } - - // need to parse the uri query parameters manually as we cannot rely on splitting by &, - // as & can be used in a parameter value as well. - - try { - // use a linked map so the parameters is in the same order - Map<String, Object> rc = new LinkedHashMap<String, Object>(); - - boolean isKey = true; - boolean isValue = false; - boolean isRaw = false; - StringBuilder key = new StringBuilder(); - StringBuilder value = new StringBuilder(); - - // parse the uri parameters char by char - for (int i = 0; i < uri.length(); i++) { - // current char - char ch = uri.charAt(i); - // look ahead of the next char - char next; - if (i <= uri.length() - 2) { - next = uri.charAt(i + 1); - } else { - next = '\u0000'; - } - - // are we a raw value - isRaw = value.toString().startsWith(RAW_TOKEN_START); - - // if we are in raw mode, then we keep adding until we hit the end marker - if (isRaw) { - if (isKey) { - key.append(ch); - } else if (isValue) { - value.append(ch); - } - - // we only end the raw marker if its )& or at the end of the value - - boolean end = ch == RAW_TOKEN_END.charAt(0) && (next == '&' || next == '\u0000'); - if (end) { - // raw value end, so add that as a parameter, and reset flags - addParameter(key.toString(), value.toString(), rc, useRaw || isRaw); - key.setLength(0); - value.setLength(0); - isKey = true; - isValue = false; - isRaw = false; - // skip to next as we are in raw mode and have already added the value - i++; - } - continue; - } - - // if its a key and there is a = sign then the key ends and we are in value mode - if (isKey && ch == '=') { - isKey = false; - isValue = true; - isRaw = false; - continue; - } - - // the & denote parameter is ended - if (ch == '&') { - // parameter is ended, as we hit & separator - String aKey = key.toString(); - // the key may be a placeholder of options which we then do not know what is - boolean validKey = !aKey.startsWith("{{") && !aKey.endsWith("}}"); - if (validKey) { - addParameter(aKey, value.toString(), rc, useRaw || isRaw); - } - key.setLength(0); - value.setLength(0); - isKey = true; - isValue = false; - isRaw = false; - continue; - } - - // regular char so add it to the key or value - if (isKey) { - key.append(ch); - } else if (isValue) { - value.append(ch); - } - } - - // any left over parameters, then add that - if (key.length() > 0) { - String aKey = key.toString(); - // the key may be a placeholder of options which we then do not know what is - boolean validKey = !aKey.startsWith("{{") && !aKey.endsWith("}}"); - if (validKey) { - addParameter(aKey, value.toString(), rc, useRaw || isRaw); - } - } - - return rc; - - } catch (UnsupportedEncodingException e) { - URISyntaxException se = new URISyntaxException(e.toString(), "Invalid encoding"); - se.initCause(e); - throw se; - } - } - - @SuppressWarnings("unchecked") - private static void addParameter(String name, String value, Map<String, Object> map, boolean isRaw) throws UnsupportedEncodingException { - name = URLDecoder.decode(name, CHARSET); - if (!isRaw) { - // need to replace % with %25 - value = URLDecoder.decode(value.replaceAll("%", "%25"), CHARSET); - } - - // does the key already exist? - if (map.containsKey(name)) { - // yes it does, so make sure we can support multiple values, but using a list - // to hold the multiple values - Object existing = map.get(name); - List<String> list; - if (existing instanceof List) { - list = (List<String>) existing; - } else { - // create a new list to hold the multiple values - list = new ArrayList<String>(); - String s = existing != null ? existing.toString() : null; - if (s != null) { - list.add(s); - } - } - list.add(value); - map.put(name, list); - } else { - map.put(name, value); - } - } - - /** - * Assembles a query from the given map. - * - * @param options the map with the options (eg key/value pairs) - * @param ampersand to use & for Java code, and & for XML - * @return a query string with <tt>key1=value&key2=value2&...</tt>, or an empty string if there is no options. - * @throws URISyntaxException is thrown if uri has invalid syntax. - */ - public static String createQueryString(Map<String, String> options, String ampersand, boolean encode) throws URISyntaxException { - try { - if (options.size() > 0) { - StringBuilder rc = new StringBuilder(); - boolean first = true; - for (Object o : options.keySet()) { - if (first) { - first = false; - } else { - rc.append(ampersand); - } - - String key = (String) o; - Object value = options.get(key); - - // use the value as a String - String s = value != null ? value.toString() : null; - appendQueryStringParameter(key, s, rc, encode); - } - return rc.toString(); - } else { - return ""; - } - } catch (UnsupportedEncodingException e) { - URISyntaxException se = new URISyntaxException(e.toString(), "Invalid encoding"); - se.initCause(e); - throw se; - } - } - - private static void appendQueryStringParameter(String key, String value, StringBuilder rc, boolean encode) throws UnsupportedEncodingException { - if (encode) { - rc.append(URLEncoder.encode(key, CHARSET)); - } else { - rc.append(key); - } - // only append if value is not null - if (value != null) { - rc.append("="); - if (value.startsWith(RAW_TOKEN_START) && value.endsWith(RAW_TOKEN_END)) { - // do not encode RAW parameters - rc.append(value); - } else { - if (encode) { - rc.append(URLEncoder.encode(value, CHARSET)); - } else { - rc.append(value); - } - } - } - } - - /** - * Tests whether the value is <tt>null</tt> or an empty string. - * - * @param value the value, if its a String it will be tested for text length as well - * @return true if empty - */ - public static boolean isEmpty(Object value) { - return !isNotEmpty(value); - } - - /** - * Tests whether the value is <b>not</b> <tt>null</tt> or an empty string. - * - * @param value the value, if its a String it will be tested for text length as well - * @return true if <b>not</b> empty - */ - public static boolean isNotEmpty(Object value) { - if (value == null) { - return false; - } else if (value instanceof String) { - String text = (String) value; - return text.trim().length() > 0; - } else { - return true; - } - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/UnsafeUriCharactersEncoder.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/UnsafeUriCharactersEncoder.java b/camel-core/src/main/java/org/apache/camel/catalog/UnsafeUriCharactersEncoder.java deleted file mode 100644 index 563bac2..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/UnsafeUriCharactersEncoder.java +++ /dev/null @@ -1,206 +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.camel.catalog; - -import java.util.ArrayList; -import java.util.BitSet; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Encoder for unsafe URI characters. - * <p/> - * A good source for details is <a href="http://en.wikipedia.org/wiki/Url_encode">wikipedia url encode</a> article. - */ -public final class UnsafeUriCharactersEncoder { - private static BitSet unsafeCharactersRfc1738; - private static BitSet unsafeCharactersHttp; - private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', - 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f'}; - private static final Pattern RAW_PATTERN = Pattern.compile("RAW\\([^\\)]+\\)"); - - static { - unsafeCharactersRfc1738 = new BitSet(256); - unsafeCharactersRfc1738.set(' '); - unsafeCharactersRfc1738.set('"'); - unsafeCharactersRfc1738.set('<'); - unsafeCharactersRfc1738.set('>'); - unsafeCharactersRfc1738.set('#'); - unsafeCharactersRfc1738.set('%'); - unsafeCharactersRfc1738.set('{'); - unsafeCharactersRfc1738.set('}'); - unsafeCharactersRfc1738.set('|'); - unsafeCharactersRfc1738.set('\\'); - unsafeCharactersRfc1738.set('^'); - unsafeCharactersRfc1738.set('~'); - unsafeCharactersRfc1738.set('['); - unsafeCharactersRfc1738.set(']'); - unsafeCharactersRfc1738.set('`'); - } - - static { - unsafeCharactersHttp = new BitSet(256); - unsafeCharactersHttp.set(' '); - unsafeCharactersHttp.set('"'); - unsafeCharactersHttp.set('<'); - unsafeCharactersHttp.set('>'); - unsafeCharactersHttp.set('#'); - unsafeCharactersHttp.set('%'); - unsafeCharactersHttp.set('{'); - unsafeCharactersHttp.set('}'); - unsafeCharactersHttp.set('|'); - unsafeCharactersHttp.set('\\'); - unsafeCharactersHttp.set('^'); - unsafeCharactersHttp.set('~'); - unsafeCharactersHttp.set('`'); - } - - private UnsafeUriCharactersEncoder() { - // util class - } - - public static String encode(String s) { - return encode(s, unsafeCharactersRfc1738); - } - - public static String encodeHttpURI(String s) { - return encode(s, unsafeCharactersHttp); - } - - public static String encode(String s, BitSet unsafeCharacters) { - return encode(s, unsafeCharacters, false); - } - - public static String encode(String s, boolean checkRaw) { - return encode(s, unsafeCharactersRfc1738, checkRaw); - } - - public static String encodeHttpURI(String s, boolean checkRaw) { - return encode(s, unsafeCharactersHttp, checkRaw); - } - - private static List<Pair> checkRAW(String s) { - Matcher matcher = RAW_PATTERN.matcher(s); - List<Pair> answer = new ArrayList<Pair>(); - // Check all occurrences - while (matcher.find()) { - answer.add(new Pair(matcher.start(), matcher.end())); - } - return answer; - } - - private static boolean isRaw(int index, List<Pair> pairs) { - for (Pair pair : pairs) { - if (index < pair.left) { - return false; - } else { - if (index >= pair.left) { - if (index <= pair.right) { - return true; - } else { - continue; - } - } - } - } - return false; - } - - private static class Pair { - int left; - int right; - - Pair(int left, int right) { - this.left = left; - this.right = right; - } - } - - // Just skip the encode for isRAW part - public static String encode(String s, BitSet unsafeCharacters, boolean checkRaw) { - List<Pair> rawPairs; - if (checkRaw) { - rawPairs = checkRAW(s); - } else { - rawPairs = new ArrayList<Pair>(); - } - - int n = s == null ? 0 : s.length(); - if (n == 0) { - return s; - } - - // First check whether we actually need to encode - char chars[] = s.toCharArray(); - for (int i = 0;;) { - // just deal with the ascii character - if (chars[i] > 0 && chars[i] < 128) { - if (unsafeCharacters.get(chars[i])) { - break; - } - } - if (++i >= chars.length) { - return s; - } - } - - // okay there are some unsafe characters so we do need to encode - // see details at: http://en.wikipedia.org/wiki/Url_encode - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < chars.length; i++) { - char ch = chars[i]; - if (ch > 0 && ch < 128 && unsafeCharacters.get(ch)) { - // special for % sign as it may be a decimal encoded value - if (ch == '%') { - char next = i + 1 < chars.length ? chars[i + 1] : ' '; - char next2 = i + 2 < chars.length ? chars[i + 2] : ' '; - - if (isHexDigit(next) && isHexDigit(next2) && !isRaw(i, rawPairs)) { - // its already encoded (decimal encoded) so just append as is - sb.append(ch); - } else { - // must escape then, as its an unsafe character - appendEscape(sb, (byte) ch); - } - } else { - // must escape then, as its an unsafe character - appendEscape(sb, (byte) ch); - } - } else { - sb.append(ch); - } - } - return sb.toString(); - } - - private static void appendEscape(StringBuilder sb, byte b) { - sb.append('%'); - sb.append(HEX_DIGITS[(b >> 4) & 0x0f]); - sb.append(HEX_DIGITS[(b >> 0) & 0x0f]); - } - - private static boolean isHexDigit(char ch) { - for (char hex : HEX_DIGITS) { - if (hex == ch) { - return true; - } - } - return false; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/package.html ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/catalog/package.html b/camel-core/src/main/java/org/apache/camel/catalog/package.html deleted file mode 100644 index 98786d1..0000000 --- a/camel-core/src/main/java/org/apache/camel/catalog/package.html +++ /dev/null @@ -1,25 +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. ---> -<html> -<head> -</head> -<body> - -Camel Catalog - -</body> -</html> http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifier.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifier.java b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifier.java index 5d19e0d..4013e5f 100644 --- a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifier.java +++ b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifier.java @@ -22,12 +22,12 @@ import java.util.Map; import org.apache.camel.Component; import org.apache.camel.ComponentVerifier; import org.apache.camel.VerifiableComponent; -import org.apache.camel.catalog.JSonSchemaHelper; -import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.impl.verifier.CatalogVerifierCustomizer; import org.apache.camel.impl.verifier.DefaultComponentVerifier; import org.apache.camel.impl.verifier.ResultBuilder; import org.apache.camel.impl.verifier.ResultErrorBuilder; +import org.apache.camel.runtimecatalog.JSonSchemaHelper; +import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.spi.RestConsumerFactory; import org.apache.camel.spi.RestProducerFactory; import org.apache.camel.util.ObjectHelper; http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index c85ce8c..b53efc8 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -26,7 +26,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -87,8 +86,6 @@ import org.apache.camel.api.management.mbean.ManagedRouteMBean; import org.apache.camel.builder.DefaultFluentProducerTemplate; import org.apache.camel.builder.ErrorHandlerBuilder; import org.apache.camel.builder.ErrorHandlerBuilderSupport; -import org.apache.camel.catalog.DefaultRuntimeCamelCatalog; -import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.component.properties.PropertiesComponent; import org.apache.camel.impl.converter.BaseTypeConverterRegistry; import org.apache.camel.impl.converter.DefaultTypeConverter; @@ -121,6 +118,8 @@ import org.apache.camel.processor.interceptor.Delayer; import org.apache.camel.processor.interceptor.HandleFault; import org.apache.camel.processor.interceptor.StreamCaching; import org.apache.camel.processor.interceptor.Tracer; +import org.apache.camel.runtimecatalog.DefaultRuntimeCamelCatalog; +import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.spi.AsyncProcessorAwaitManager; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.ClassResolver; http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/impl/verifier/DefaultComponentVerifier.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/verifier/DefaultComponentVerifier.java b/camel-core/src/main/java/org/apache/camel/impl/verifier/DefaultComponentVerifier.java index b9d9998..f05cdb1 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/verifier/DefaultComponentVerifier.java +++ b/camel-core/src/main/java/org/apache/camel/impl/verifier/DefaultComponentVerifier.java @@ -25,8 +25,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.ComponentVerifier; import org.apache.camel.NoSuchOptionException; import org.apache.camel.TypeConverter; -import org.apache.camel.catalog.EndpointValidationResult; -import org.apache.camel.catalog.RuntimeCamelCatalog; +import org.apache.camel.runtimecatalog.EndpointValidationResult; +import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.util.CamelContextHelper; import org.apache.camel.util.EndpointHelper; import org.apache.camel.util.IntrospectionSupport; http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java index a09ff7d..9a70390 100644 --- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java +++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java @@ -46,12 +46,9 @@ import org.apache.camel.StartupListener; import org.apache.camel.TimerListener; import org.apache.camel.VetoCamelContextStartException; import org.apache.camel.api.management.PerformanceCounter; -import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.impl.ConsumerCache; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.DefaultEndpointRegistry; -import org.apache.camel.impl.DefaultTransformerRegistry; -import org.apache.camel.impl.DefaultValidatorRegistry; import org.apache.camel.impl.EventDrivenConsumerRoute; import org.apache.camel.impl.ProducerCache; import org.apache.camel.impl.ThrottlingExceptionRoutePolicy; @@ -89,6 +86,7 @@ import org.apache.camel.processor.CamelInternalProcessor; import org.apache.camel.processor.interceptor.BacklogDebugger; import org.apache.camel.processor.interceptor.BacklogTracer; import org.apache.camel.processor.interceptor.Tracer; +import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.spi.AsyncProcessorAwaitManager; import org.apache.camel.spi.DataFormat; import org.apache.camel.spi.EventNotifier; http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRuntimeCamelCatalog.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRuntimeCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRuntimeCamelCatalog.java index 20d3f28..6a99656 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRuntimeCamelCatalog.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRuntimeCamelCatalog.java @@ -19,7 +19,7 @@ package org.apache.camel.management.mbean; import org.apache.camel.CamelContext; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.api.management.mbean.ManagedRuntimeCamelCatalogMBean; -import org.apache.camel.catalog.RuntimeCamelCatalog; +import org.apache.camel.runtimecatalog.RuntimeCamelCatalog; import org.apache.camel.spi.ManagementStrategy; /**