You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/04/14 10:53:00 UTC

[6/6] camel git commit: Rename catalog to runtimecatalog to avoid clash with same package name in camel-catalog.

Rename catalog to runtimecatalog to avoid clash with same package name in camel-catalog.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c66be7a8
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c66be7a8
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c66be7a8

Branch: refs/heads/master
Commit: c66be7a8c21de8944fd86888a2cf039eb97a2ff1
Parents: d726964
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Apr 14 12:08:59 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Apr 14 12:52:40 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/camel/CamelContext.java     |    2 +-
 .../camel/catalog/AbstractCamelCatalog.java     | 1294 ------------------
 .../catalog/CamelContextJSonSchemaResolver.java |   80 --
 .../org/apache/camel/catalog/CatalogHelper.java |  179 ---
 .../camel/catalog/CollectionStringBuffer.java   |   57 -
 .../catalog/DefaultRuntimeCamelCatalog.java     |  136 --
 .../camel/catalog/EndpointValidationResult.java |  451 ------
 .../apache/camel/catalog/JSonSchemaHelper.java  |  424 ------
 .../camel/catalog/JSonSchemaResolver.java       |   64 -
 .../camel/catalog/LanguageValidationResult.java |   65 -
 .../camel/catalog/RuntimeCamelCatalog.java      |  234 ----
 .../camel/catalog/SimpleValidationResult.java   |   32 -
 .../camel/catalog/SuggestionStrategy.java       |   34 -
 .../camel/catalog/TimePatternConverter.java     |  120 --
 .../org/apache/camel/catalog/URISupport.java    |  392 ------
 .../catalog/UnsafeUriCharactersEncoder.java     |  206 ---
 .../java/org/apache/camel/catalog/package.html  |   25 -
 .../component/rest/RestComponentVerifier.java   |    4 +-
 .../apache/camel/impl/DefaultCamelContext.java  |    5 +-
 .../impl/verifier/DefaultComponentVerifier.java |    4 +-
 .../DefaultManagementLifecycleStrategy.java     |    4 +-
 .../mbean/ManagedRuntimeCamelCatalog.java       |    2 +-
 .../runtimecatalog/AbstractCamelCatalog.java    | 1294 ++++++++++++++++++
 .../CamelContextJSonSchemaResolver.java         |   80 ++
 .../camel/runtimecatalog/CatalogHelper.java     |  179 +++
 .../runtimecatalog/CollectionStringBuffer.java  |   57 +
 .../DefaultRuntimeCamelCatalog.java             |  136 ++
 .../EndpointValidationResult.java               |  451 ++++++
 .../camel/runtimecatalog/JSonSchemaHelper.java  |  424 ++++++
 .../runtimecatalog/JSonSchemaResolver.java      |   64 +
 .../LanguageValidationResult.java               |   65 +
 .../runtimecatalog/RuntimeCamelCatalog.java     |  234 ++++
 .../runtimecatalog/SimpleValidationResult.java  |   32 +
 .../runtimecatalog/SuggestionStrategy.java      |   34 +
 .../runtimecatalog/TimePatternConverter.java    |  120 ++
 .../apache/camel/runtimecatalog/URISupport.java |  392 ++++++
 .../UnsafeUriCharactersEncoder.java             |  206 +++
 .../apache/camel/runtimecatalog/package.html    |   25 +
 .../org/apache/camel/util/EndpointHelper.java   |    6 +-
 .../camel/catalog/AbstractCamelCatalogTest.java |  104 --
 .../camel/catalog/RuntimeCamelCatalogTest.java  |  393 ------
 .../AbstractCamelCatalogTest.java               |  104 ++
 .../runtimecatalog/RuntimeCamelCatalogTest.java |  393 ++++++
 43 files changed, 4302 insertions(+), 4305 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/CamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/CamelContext.java b/camel-core/src/main/java/org/apache/camel/CamelContext.java
index d4fd6ae..00702d1 100644
--- a/camel-core/src/main/java/org/apache/camel/CamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/CamelContext.java
@@ -30,7 +30,6 @@ import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.ErrorHandlerBuilder;
-import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.HystrixConfigurationDefinition;
 import org.apache.camel.model.ProcessorDefinition;
@@ -41,6 +40,7 @@ import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.validator.ValidatorDefinition;
+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/catalog/AbstractCamelCatalog.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
deleted file mode 100644
index 6511eff..0000000
--- a/camel-core/src/main/java/org/apache/camel/catalog/AbstractCamelCatalog.java
+++ /dev/null
@@ -1,1294 +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.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static org.apache.camel.catalog.CatalogHelper.after;
-import static org.apache.camel.catalog.JSonSchemaHelper.getNames;
-import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyDefaultValue;
-import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyEnum;
-import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyKind;
-import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyNameFromNameWithPrefix;
-import static org.apache.camel.catalog.JSonSchemaHelper.getPropertyPrefix;
-import static org.apache.camel.catalog.JSonSchemaHelper.getRow;
-import static org.apache.camel.catalog.JSonSchemaHelper.isComponentConsumerOnly;
-import static org.apache.camel.catalog.JSonSchemaHelper.isComponentLenientProperties;
-import static org.apache.camel.catalog.JSonSchemaHelper.isComponentProducerOnly;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyBoolean;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyConsumerOnly;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyInteger;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyMultiValue;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyNumber;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyObject;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyProducerOnly;
-import static org.apache.camel.catalog.JSonSchemaHelper.isPropertyRequired;
-import static org.apache.camel.catalog.JSonSchemaHelper.stripOptionalPrefixFromName;
-import static org.apache.camel.catalog.URISupport.createQueryString;
-import static org.apache.camel.catalog.URISupport.isEmpty;
-import static org.apache.camel.catalog.URISupport.normalizeUri;
-import static org.apache.camel.catalog.URISupport.stripQuery;
-
-/**
- * Base class for both the runtime RuntimeCamelCatalog from camel-core and the complete CamelCatalog from camel-catalog.
- */
-public abstract class AbstractCamelCatalog {
-
-    // CHECKSTYLE:OFF
-
-    private static final Pattern SYNTAX_PATTERN = Pattern.compile("(\\w+)");
-
-    private SuggestionStrategy suggestionStrategy;
-    private JSonSchemaResolver jsonSchemaResolver;
-
-    public SuggestionStrategy getSuggestionStrategy() {
-        return suggestionStrategy;
-    }
-
-    public void setSuggestionStrategy(SuggestionStrategy suggestionStrategy) {
-        this.suggestionStrategy = suggestionStrategy;
-    }
-
-    public JSonSchemaResolver getJSonSchemaResolver() {
-        return jsonSchemaResolver;
-    }
-
-    public void setJSonSchemaResolver(JSonSchemaResolver resolver) {
-        this.jsonSchemaResolver = resolver;
-    }
-
-    public boolean validateTimePattern(String pattern) {
-        return validateInteger(pattern);
-    }
-
-    public EndpointValidationResult validateEndpointProperties(String uri) {
-        return validateEndpointProperties(uri, false, false, false);
-    }
-
-    public EndpointValidationResult validateEndpointProperties(String uri, boolean ignoreLenientProperties) {
-        return validateEndpointProperties(uri, ignoreLenientProperties, false, false);
-    }
-
-    public EndpointValidationResult validateProperties(String scheme, Map<String, String> properties) {
-        EndpointValidationResult result = new EndpointValidationResult(scheme);
-
-        String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-        List<Map<String, String>> componentProps = JSonSchemaHelper.parseJsonSchema("componentProperties", json, true);
-
-        // endpoint options have higher priority so remove those from component
-        // that may clash
-        componentProps.stream()
-            .filter(c -> rows.stream().noneMatch(e -> Objects.equals(e.get("name"), c.get("name"))))
-            .forEach(rows::add);
-
-        boolean lenient = Boolean.getBoolean(properties.getOrDefault("lenient", "false"));
-
-        // the dataformat component refers to a data format so lets add the properties for the selected
-        // data format to the list of rows
-        if ("dataformat".equals(scheme)) {
-            String dfName = properties.get("name");
-            if (dfName != null) {
-                String dfJson = jsonSchemaResolver.getDataFormatJSonSchema(dfName);
-                List<Map<String, String>> dfRows = JSonSchemaHelper.parseJsonSchema("properties", dfJson, true);
-                if (dfRows != null && !dfRows.isEmpty()) {
-                    rows.addAll(dfRows);
-                }
-            }
-        }
-
-        for (Map.Entry<String, String> property : properties.entrySet()) {
-            String value = property.getValue();
-            String originalName = property.getKey();
-            String name = property.getKey();
-            // the name may be using an optional prefix, so lets strip that because the options
-            // in the schema are listed without the prefix
-            name = stripOptionalPrefixFromName(rows, name);
-            // the name may be using a prefix, so lets see if we can find the real property name
-            String propertyName = getPropertyNameFromNameWithPrefix(rows, name);
-            if (propertyName != null) {
-                name = propertyName;
-            }
-
-            String prefix = getPropertyPrefix(rows, name);
-            String kind = getPropertyKind(rows, name);
-            boolean namePlaceholder = name.startsWith("{{") && name.endsWith("}}");
-            boolean valuePlaceholder = value.startsWith("{{") || value.startsWith("${") || value.startsWith("$simple{");
-            boolean lookup = value.startsWith("#") && value.length() > 1;
-            // we cannot evaluate multi values as strict as the others, as we don't know their expected types
-            boolean multiValue = prefix != null && originalName.startsWith(prefix) && isPropertyMultiValue(rows, name);
-
-            Map<String, String> row = getRow(rows, name);
-            if (row == null) {
-                // unknown option
-
-                // only add as error if the component is not lenient properties, or not stub component
-                // and the name is not a property placeholder for one or more values
-                if (!namePlaceholder && !"stub".equals(scheme)) {
-                    if (lenient) {
-                        // as if we are lenient then the option is a dynamic extra option which we cannot validate
-                        result.addLenient(name);
-                    } else {
-                        // its unknown
-                        result.addUnknown(name);
-                        if (suggestionStrategy != null) {
-                            String[] suggestions = suggestionStrategy.suggestEndpointOptions(getNames(rows), name);
-                            if (suggestions != null) {
-                                result.addUnknownSuggestions(name, suggestions);
-                            }
-                        }
-                    }
-                }
-            } else {
-                /* TODO: we may need to add something in the properties to know if they are related to a producer or consumer
-                if ("parameter".equals(kind)) {
-                    // consumer only or producer only mode for parameters
-                    if (consumerOnly) {
-                        boolean producer = isPropertyProducerOnly(rows, name);
-                        if (producer) {
-                            // the option is only for producer so you cannot use it in consumer mode
-                            result.addNotConsumerOnly(name);
-                        }
-                    } else if (producerOnly) {
-                        boolean consumer = isPropertyConsumerOnly(rows, name);
-                        if (consumer) {
-                            // the option is only for consumer so you cannot use it in producer mode
-                            result.addNotProducerOnly(name);
-                        }
-                    }
-                }
-                */
-
-                // default value
-                String defaultValue = getPropertyDefaultValue(rows, name);
-                if (defaultValue != null) {
-                    result.addDefaultValue(name, defaultValue);
-                }
-
-                // is required but the value is empty
-                boolean required = isPropertyRequired(rows, name);
-                if (required && isEmpty(value)) {
-                    result.addRequired(name);
-                }
-
-                // is enum but the value is not within the enum range
-                // but we can only check if the value is not a placeholder
-                String enums = getPropertyEnum(rows, name);
-                if (!multiValue && !valuePlaceholder && !lookup && enums != null) {
-                    String[] choices = enums.split(",");
-                    boolean found = false;
-                    for (String s : choices) {
-                        if (value.equalsIgnoreCase(s)) {
-                            found = true;
-                            break;
-                        }
-                    }
-                    if (!found) {
-                        result.addInvalidEnum(name, value);
-                        result.addInvalidEnumChoices(name, choices);
-                        if (suggestionStrategy != null) {
-                            Set<String> names = new LinkedHashSet<>();
-                            names.addAll(Arrays.asList(choices));
-                            String[] suggestions = suggestionStrategy.suggestEndpointOptions(names, value);
-                            if (suggestions != null) {
-                                result.addInvalidEnumSuggestions(name, suggestions);
-                            }
-                        }
-
-                    }
-                }
-
-                // is reference lookup of bean (not applicable for @UriPath, enums, or multi-valued)
-                if (!multiValue && enums == null && !"path".equals(kind) && isPropertyObject(rows, name)) {
-                    // must start with # and be at least 2 characters
-                    if (!value.startsWith("#") || value.length() <= 1) {
-                        result.addInvalidReference(name, value);
-                    }
-                }
-
-                // is boolean
-                if (!multiValue && !valuePlaceholder && !lookup && isPropertyBoolean(rows, name)) {
-                    // value must be a boolean
-                    boolean bool = "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value);
-                    if (!bool) {
-                        result.addInvalidBoolean(name, value);
-                    }
-                }
-
-                // is integer
-                if (!multiValue && !valuePlaceholder && !lookup && isPropertyInteger(rows, name)) {
-                    // value must be an integer
-                    boolean valid = validateInteger(value);
-                    if (!valid) {
-                        result.addInvalidInteger(name, value);
-                    }
-                }
-
-                // is number
-                if (!multiValue && !valuePlaceholder && !lookup && isPropertyNumber(rows, name)) {
-                    // value must be an number
-                    boolean valid = false;
-                    try {
-                        valid = !Double.valueOf(value).isNaN() || !Float.valueOf(value).isNaN();
-                    } catch (Exception e) {
-                        // ignore
-                    }
-                    if (!valid) {
-                        result.addInvalidNumber(name, value);
-                    }
-                }
-            }
-        }
-
-        // now check if all required values are there, and that a default value does not exists
-        for (Map<String, String> row : rows) {
-            String name = row.get("name");
-            boolean required = isPropertyRequired(rows, name);
-            if (required) {
-                String value = properties.get(name);
-                if (isEmpty(value)) {
-                    value = getPropertyDefaultValue(rows, name);
-                }
-                if (isEmpty(value)) {
-                    result.addRequired(name);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    public EndpointValidationResult validateEndpointProperties(String uri, boolean ignoreLenientProperties, boolean consumerOnly, boolean producerOnly) {
-        EndpointValidationResult result = new EndpointValidationResult(uri);
-
-        Map<String, String> properties;
-        List<Map<String, String>> rows;
-        boolean lenientProperties;
-        String scheme;
-
-        try {
-            String json = null;
-
-            // parse the uri
-            URI u = normalizeUri(uri);
-            scheme = u.getScheme();
-
-            if (scheme != null) {
-                json = jsonSchemaResolver.getComponentJSonSchema(scheme);
-            }
-            if (json == null) {
-                // if the uri starts with a placeholder then we are also incapable of parsing it as we wasn't able to resolve the component name
-                if (uri.startsWith("{{")) {
-                    result.addIncapable(uri);
-                } else if (scheme != null) {
-                    result.addUnknownComponent(scheme);
-                } else {
-                    result.addUnknownComponent(uri);
-                }
-                return result;
-            }
-
-            rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
-
-            // is the component capable of both consumer and producer?
-            boolean canConsumeAndProduce = false;
-            if (!isComponentConsumerOnly(rows) && !isComponentProducerOnly(rows)) {
-                canConsumeAndProduce = true;
-            }
-
-            if (canConsumeAndProduce && consumerOnly) {
-                // lenient properties is not support in consumer only mode if the component can do both of them
-                lenientProperties = false;
-            } else {
-                // only enable lenient properties if we should not ignore
-                lenientProperties = !ignoreLenientProperties && isComponentLenientProperties(rows);
-            }
-            rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-            properties = endpointProperties(uri);
-        } catch (URISyntaxException e) {
-            if (uri.startsWith("{{")) {
-                // if the uri starts with a placeholder then we are also incapable of parsing it as we wasn't able to resolve the component name
-                result.addIncapable(uri);
-            } else {
-                result.addSyntaxError(e.getMessage());
-            }
-
-            return result;
-        }
-
-        // the dataformat component refers to a data format so lets add the properties for the selected
-        // data format to the list of rows
-        if ("dataformat".equals(scheme)) {
-            String dfName = properties.get("name");
-            if (dfName != null) {
-                String dfJson = jsonSchemaResolver.getDataFormatJSonSchema(dfName);
-                List<Map<String, String>> dfRows = JSonSchemaHelper.parseJsonSchema("properties", dfJson, true);
-                if (dfRows != null && !dfRows.isEmpty()) {
-                    rows.addAll(dfRows);
-                }
-            }
-        }
-
-        for (Map.Entry<String, String> property : properties.entrySet()) {
-            String value = property.getValue();
-            String originalName = property.getKey();
-            String name = property.getKey();
-            // the name may be using an optional prefix, so lets strip that because the options
-            // in the schema are listed without the prefix
-            name = stripOptionalPrefixFromName(rows, name);
-            // the name may be using a prefix, so lets see if we can find the real property name
-            String propertyName = getPropertyNameFromNameWithPrefix(rows, name);
-            if (propertyName != null) {
-                name = propertyName;
-            }
-
-            String prefix = getPropertyPrefix(rows, name);
-            String kind = getPropertyKind(rows, name);
-            boolean namePlaceholder = name.startsWith("{{") && name.endsWith("}}");
-            boolean valuePlaceholder = value.startsWith("{{") || value.startsWith("${") || value.startsWith("$simple{");
-            boolean lookup = value.startsWith("#") && value.length() > 1;
-            // we cannot evaluate multi values as strict as the others, as we don't know their expected types
-            boolean mulitValue = prefix != null && originalName.startsWith(prefix) && isPropertyMultiValue(rows, name);
-
-            Map<String, String> row = getRow(rows, name);
-            if (row == null) {
-                // unknown option
-
-                // only add as error if the component is not lenient properties, or not stub component
-                // and the name is not a property placeholder for one or more values
-                if (!namePlaceholder && !"stub".equals(scheme)) {
-                    if (lenientProperties) {
-                        // as if we are lenient then the option is a dynamic extra option which we cannot validate
-                        result.addLenient(name);
-                    } else {
-                        // its unknown
-                        result.addUnknown(name);
-                        if (suggestionStrategy != null) {
-                            String[] suggestions = suggestionStrategy.suggestEndpointOptions(getNames(rows), name);
-                            if (suggestions != null) {
-                                result.addUnknownSuggestions(name, suggestions);
-                            }
-                        }
-                    }
-                }
-            } else {
-                if ("parameter".equals(kind)) {
-                    // consumer only or producer only mode for parameters
-                    if (consumerOnly) {
-                        boolean producer = isPropertyProducerOnly(rows, name);
-                        if (producer) {
-                            // the option is only for producer so you cannot use it in consumer mode
-                            result.addNotConsumerOnly(name);
-                        }
-                    } else if (producerOnly) {
-                        boolean consumer = isPropertyConsumerOnly(rows, name);
-                        if (consumer) {
-                            // the option is only for consumer so you cannot use it in producer mode
-                            result.addNotProducerOnly(name);
-                        }
-                    }
-                }
-
-                // default value
-                String defaultValue = getPropertyDefaultValue(rows, name);
-                if (defaultValue != null) {
-                    result.addDefaultValue(name, defaultValue);
-                }
-
-                // is required but the value is empty
-                boolean required = isPropertyRequired(rows, name);
-                if (required && isEmpty(value)) {
-                    result.addRequired(name);
-                }
-
-                // is enum but the value is not within the enum range
-                // but we can only check if the value is not a placeholder
-                String enums = getPropertyEnum(rows, name);
-                if (!mulitValue && !valuePlaceholder && !lookup && enums != null) {
-                    String[] choices = enums.split(",");
-                    boolean found = false;
-                    for (String s : choices) {
-                        if (value.equalsIgnoreCase(s)) {
-                            found = true;
-                            break;
-                        }
-                    }
-                    if (!found) {
-                        result.addInvalidEnum(name, value);
-                        result.addInvalidEnumChoices(name, choices);
-                        if (suggestionStrategy != null) {
-                            Set<String> names = new LinkedHashSet<>();
-                            names.addAll(Arrays.asList(choices));
-                            String[] suggestions = suggestionStrategy.suggestEndpointOptions(names, value);
-                            if (suggestions != null) {
-                                result.addInvalidEnumSuggestions(name, suggestions);
-                            }
-                        }
-
-                    }
-                }
-
-                // is reference lookup of bean (not applicable for @UriPath, enums, or multi-valued)
-                if (!mulitValue && enums == null && !"path".equals(kind) && isPropertyObject(rows, name)) {
-                    // must start with # and be at least 2 characters
-                    if (!value.startsWith("#") || value.length() <= 1) {
-                        result.addInvalidReference(name, value);
-                    }
-                }
-
-                // is boolean
-                if (!mulitValue && !valuePlaceholder && !lookup && isPropertyBoolean(rows, name)) {
-                    // value must be a boolean
-                    boolean bool = "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value);
-                    if (!bool) {
-                        result.addInvalidBoolean(name, value);
-                    }
-                }
-
-                // is integer
-                if (!mulitValue && !valuePlaceholder && !lookup && isPropertyInteger(rows, name)) {
-                    // value must be an integer
-                    boolean valid = validateInteger(value);
-                    if (!valid) {
-                        result.addInvalidInteger(name, value);
-                    }
-                }
-
-                // is number
-                if (!mulitValue && !valuePlaceholder && !lookup && isPropertyNumber(rows, name)) {
-                    // value must be an number
-                    boolean valid = false;
-                    try {
-                        valid = !Double.valueOf(value).isNaN() || !Float.valueOf(value).isNaN();
-                    } catch (Exception e) {
-                        // ignore
-                    }
-                    if (!valid) {
-                        result.addInvalidNumber(name, value);
-                    }
-                }
-            }
-        }
-
-        // now check if all required values are there, and that a default value does not exists
-        for (Map<String, String> row : rows) {
-            String name = row.get("name");
-            boolean required = isPropertyRequired(rows, name);
-            if (required) {
-                String value = properties.get(name);
-                if (isEmpty(value)) {
-                    value = getPropertyDefaultValue(rows, name);
-                }
-                if (isEmpty(value)) {
-                    result.addRequired(name);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    public Map<String, String> endpointProperties(String uri) throws URISyntaxException {
-        // need to normalize uri first
-        URI u = normalizeUri(uri);
-        String scheme = u.getScheme();
-
-        String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
-        if (json == null) {
-            throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);
-        }
-
-        // grab the syntax
-        String syntax = null;
-        String alternativeSyntax = null;
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
-        for (Map<String, String> row : rows) {
-            if (row.containsKey("syntax")) {
-                syntax = row.get("syntax");
-            }
-            if (row.containsKey("alternativeSyntax")) {
-                alternativeSyntax = row.get("alternativeSyntax");
-            }
-        }
-        if (syntax == null) {
-            throw new IllegalArgumentException("Endpoint with scheme " + scheme + " has no syntax defined in the json schema");
-        }
-
-        // only if we support alternative syntax, and the uri contains the username and password in the authority
-        // part of the uri, then we would need some special logic to capture that information and strip those
-        // details from the uri, so we can continue parsing the uri using the normal syntax
-        Map<String, String> userInfoOptions = new LinkedHashMap<String, String>();
-        if (alternativeSyntax != null && alternativeSyntax.contains("@")) {
-            // clip the scheme from the syntax
-            alternativeSyntax = after(alternativeSyntax, ":");
-            // trim so only userinfo
-            int idx = alternativeSyntax.indexOf("@");
-            String fields = alternativeSyntax.substring(0, idx);
-            String[] names = fields.split(":");
-
-            // grab authority part and grab username and/or password
-            String authority = u.getAuthority();
-            if (authority != null && authority.contains("@")) {
-                String username = null;
-                String password = null;
-
-                // grab unserinfo part before @
-                String userInfo = authority.substring(0, authority.indexOf("@"));
-                String[] parts = userInfo.split(":");
-                if (parts.length == 2) {
-                    username = parts[0];
-                    password = parts[1];
-                } else {
-                    // only username
-                    username = userInfo;
-                }
-
-                // remember the username and/or password which we add later to the options
-                if (names.length == 2) {
-                    userInfoOptions.put(names[0], username);
-                    if (password != null) {
-                        // password is optional
-                        userInfoOptions.put(names[1], password);
-                    }
-                }
-            }
-        }
-
-        // clip the scheme from the syntax
-        syntax = after(syntax, ":");
-        // clip the scheme from the uri
-        uri = after(uri, ":");
-        String uriPath = stripQuery(uri);
-
-        // strip user info from uri path
-        if (!userInfoOptions.isEmpty()) {
-            int idx = uriPath.indexOf('@');
-            if (idx > -1) {
-                uriPath = uriPath.substring(idx + 1);
-            }
-        }
-
-        // strip double slash in the start
-        if (uriPath != null && uriPath.startsWith("//")) {
-            uriPath = uriPath.substring(2);
-        }
-
-        // parse the syntax and find the names of each option
-        Matcher matcher = SYNTAX_PATTERN.matcher(syntax);
-        List<String> word = new ArrayList<String>();
-        while (matcher.find()) {
-            String s = matcher.group(1);
-            if (!scheme.equals(s)) {
-                word.add(s);
-            }
-        }
-        // parse the syntax and find each token between each option
-        String[] tokens = SYNTAX_PATTERN.split(syntax);
-
-        // find the position where each option start/end
-        List<String> word2 = new ArrayList<String>();
-        int prev = 0;
-        int prevPath = 0;
-
-        // special for activemq/jms where the enum for destinationType causes a token issue as it includes a colon
-        // for 'temp:queue' and 'temp:topic' values
-        if ("activemq".equals(scheme) || "jms".equals(scheme)) {
-            if (uriPath.startsWith("temp:")) {
-                prevPath = 5;
-            }
-        }
-
-        for (String token : tokens) {
-            if (token.isEmpty()) {
-                continue;
-            }
-
-            // special for some tokens where :// can be used also, eg http://foo
-            int idx = -1;
-            int len = 0;
-            if (":".equals(token)) {
-                idx = uriPath.indexOf("://", prevPath);
-                len = 3;
-            }
-            if (idx == -1) {
-                idx = uriPath.indexOf(token, prevPath);
-                len = token.length();
-            }
-
-            if (idx > 0) {
-                String option = uriPath.substring(prev, idx);
-                word2.add(option);
-                prev = idx + len;
-                prevPath = prev;
-            }
-        }
-        // special for last or if we did not add anyone
-        if (prev > 0 || word2.isEmpty()) {
-            String option = uriPath.substring(prev);
-            word2.add(option);
-        }
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-
-        boolean defaultValueAdded = false;
-
-        // now parse the uri to know which part isw what
-        Map<String, String> options = new LinkedHashMap<String, String>();
-
-        // include the username and password from the userinfo section
-        if (!userInfoOptions.isEmpty()) {
-            options.putAll(userInfoOptions);
-        }
-
-        // word contains the syntax path elements
-        Iterator<String> it = word2.iterator();
-        for (int i = 0; i < word.size(); i++) {
-            String key = word.get(i);
-
-            boolean allOptions = word.size() == word2.size();
-            boolean required = isPropertyRequired(rows, key);
-            String defaultValue = getPropertyDefaultValue(rows, key);
-
-            // we have all options so no problem
-            if (allOptions) {
-                String value = it.next();
-                options.put(key, value);
-            } else {
-                // we have a little problem as we do not not have all options
-                if (!required) {
-                    String value = null;
-
-                    boolean last = i == word.size() - 1;
-                    if (last) {
-                        // if its the last value then use it instead of the default value
-                        value = it.hasNext() ? it.next() : null;
-                        if (value != null) {
-                            options.put(key, value);
-                        } else {
-                            value = defaultValue;
-                        }
-                    }
-                    if (value != null) {
-                        options.put(key, value);
-                        defaultValueAdded = true;
-                    }
-                } else {
-                    String value = it.hasNext() ? it.next() : null;
-                    if (value != null) {
-                        options.put(key, value);
-                    }
-                }
-            }
-        }
-
-        Map<String, String> answer = new LinkedHashMap<String, String>();
-
-        // remove all options which are using default values and are not required
-        for (Map.Entry<String, String> entry : options.entrySet()) {
-            String key = entry.getKey();
-            String value = entry.getValue();
-
-            if (defaultValueAdded) {
-                boolean required = isPropertyRequired(rows, key);
-                String defaultValue = getPropertyDefaultValue(rows, key);
-
-                if (!required && defaultValue != null) {
-                    if (defaultValue.equals(value)) {
-                        continue;
-                    }
-                }
-            }
-
-            // we should keep this in the answer
-            answer.put(key, value);
-        }
-
-        // now parse the uri parameters
-        Map<String, Object> parameters = URISupport.parseParameters(u);
-
-        // and covert the values to String so its JMX friendly
-        while (!parameters.isEmpty()) {
-            Map.Entry<String, Object> entry = parameters.entrySet().iterator().next();
-            String key = entry.getKey();
-            String value = entry.getValue() != null ? entry.getValue().toString() : "";
-
-            boolean multiValued = isPropertyMultiValue(rows, key);
-            if (multiValued) {
-                String prefix = getPropertyPrefix(rows, key);
-                // extra all the multi valued options
-                Map<String, Object> values = URISupport.extractProperties(parameters, prefix);
-                // build a string with the extra multi valued options with the prefix and & as separator
-                CollectionStringBuffer csb = new CollectionStringBuffer("&");
-                for (Map.Entry<String, Object> multi : values.entrySet()) {
-                    String line = prefix + multi.getKey() + "=" + (multi.getValue() != null ? multi.getValue().toString() : "");
-                    csb.append(line);
-                }
-                // append the extra multi-values to the existing (which contains the first multi value)
-                if (!csb.isEmpty()) {
-                    value = value + "&" + csb.toString();
-                }
-            }
-
-            answer.put(key, value);
-            // remove the parameter as we run in a while loop until no more parameters
-            parameters.remove(key);
-        }
-
-        return answer;
-    }
-
-    public Map<String, String> endpointLenientProperties(String uri) throws URISyntaxException {
-        // need to normalize uri first
-
-        // parse the uri
-        URI u = normalizeUri(uri);
-        String scheme = u.getScheme();
-
-        String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
-        if (json == null) {
-            throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);
-        }
-
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-
-        // now parse the uri parameters
-        Map<String, Object> parameters = URISupport.parseParameters(u);
-
-        // all the known options
-        Set<String> names = getNames(rows);
-
-        Map<String, String> answer = new LinkedHashMap<>();
-
-        // and covert the values to String so its JMX friendly
-        parameters.forEach((k, v) -> {
-            String key = k;
-            String value = v != null ? v.toString() : "";
-
-            // is the key a prefix property
-            int dot = key.indexOf('.');
-            if (dot != -1) {
-                String prefix = key.substring(0, dot + 1); // include dot in prefix
-                String option = getPropertyNameFromNameWithPrefix(rows, prefix);
-                if (option == null || !isPropertyMultiValue(rows, option)) {
-                    answer.put(key, value);
-                }
-            } else if (!names.contains(key)) {
-                answer.put(key, value);
-            }
-        });
-
-        return answer;
-    }
-
-    public String endpointComponentName(String uri) {
-        if (uri != null) {
-            int idx = uri.indexOf(":");
-            if (idx > 0) {
-                return uri.substring(0, idx);
-            }
-        }
-        return null;
-    }
-
-    public String asEndpointUri(String scheme, String json, boolean encode) throws URISyntaxException {
-        return doAsEndpointUri(scheme, json, "&", encode);
-    }
-
-    public String asEndpointUriXml(String scheme, String json, boolean encode) throws URISyntaxException {
-        return doAsEndpointUri(scheme, json, "&amp;", encode);
-    }
-
-    private String doAsEndpointUri(String scheme, String json, String ampersand, boolean encode) throws URISyntaxException {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-
-        Map<String, String> copy = new HashMap<String, String>();
-        for (Map<String, String> row : rows) {
-            String name = row.get("name");
-            String required = row.get("required");
-            String value = row.get("value");
-            String defaultValue = row.get("defaultValue");
-
-            // only add if either required, or the value is != default value
-            String valueToAdd = null;
-            if ("true".equals(required)) {
-                valueToAdd = value != null ? value : defaultValue;
-                if (valueToAdd == null) {
-                    valueToAdd = "";
-                }
-            } else {
-                // if we have a value and no default then add it
-                if (value != null && defaultValue == null) {
-                    valueToAdd = value;
-                }
-                // otherwise only add if the value is != default value
-                if (value != null && defaultValue != null && !value.equals(defaultValue)) {
-                    valueToAdd = value;
-                }
-            }
-
-            if (valueToAdd != null) {
-                copy.put(name, valueToAdd);
-            }
-        }
-
-        return doAsEndpointUri(scheme, copy, ampersand, encode);
-    }
-
-    public String asEndpointUri(String scheme, Map<String, String> properties, boolean encode) throws URISyntaxException {
-        return doAsEndpointUri(scheme, properties, "&", encode);
-    }
-
-    public String asEndpointUriXml(String scheme, Map<String, String> properties, boolean encode) throws URISyntaxException {
-        return doAsEndpointUri(scheme, properties, "&amp;", encode);
-    }
-
-    String doAsEndpointUri(String scheme, Map<String, String> properties, String ampersand, boolean encode) throws URISyntaxException {
-        String json = jsonSchemaResolver.getComponentJSonSchema(scheme);
-        if (json == null) {
-            throw new IllegalArgumentException("Cannot find endpoint with scheme " + scheme);
-        }
-
-        // grab the syntax
-        String syntax = null;
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
-        for (Map<String, String> row : rows) {
-            if (row.containsKey("syntax")) {
-                syntax = row.get("syntax");
-                break;
-            }
-        }
-        if (syntax == null) {
-            throw new IllegalArgumentException("Endpoint with scheme " + scheme + " has no syntax defined in the json schema");
-        }
-
-        // do any properties filtering which can be needed for some special components
-        properties = filterProperties(scheme, properties);
-
-        rows = JSonSchemaHelper.parseJsonSchema("properties", json, true);
-
-        // clip the scheme from the syntax
-        syntax = after(syntax, ":");
-
-        String originalSyntax = syntax;
-
-        // build at first according to syntax (use a tree map as we want the uri options sorted)
-        Map<String, String> copy = new TreeMap<String, String>();
-        for (Map.Entry<String, String> entry : properties.entrySet()) {
-            String key = entry.getKey();
-            String value = entry.getValue() != null ? entry.getValue() : "";
-            if (syntax != null && syntax.contains(key)) {
-                syntax = syntax.replace(key, value);
-            } else {
-                copy.put(key, value);
-            }
-        }
-
-        // do we have all the options the original syntax needs (easy way)
-        String[] keys = syntaxKeys(originalSyntax);
-        boolean hasAllKeys = properties.keySet().containsAll(Arrays.asList(keys));
-
-        // build endpoint uri
-        StringBuilder sb = new StringBuilder();
-        sb.append(scheme);
-        sb.append(":");
-
-        if (hasAllKeys) {
-            // we have all the keys for the syntax so we can build the uri the easy way
-            sb.append(syntax);
-
-            if (!copy.isEmpty()) {
-                boolean hasQuestionmark = sb.toString().contains("?");
-                // the last option may already contain a ? char, if so we should use & instead of ?
-                sb.append(hasQuestionmark ? ampersand : '?');
-                String query = createQueryString(copy, ampersand, encode);
-                sb.append(query);
-            }
-        } else {
-            // TODO: revisit this and see if we can do this in another way
-            // oh darn some options is missing, so we need a complex way of building the uri
-
-            // the tokens between the options in the path
-            String[] tokens = syntax.split("\\w+");
-
-            // parse the syntax into each options
-            Matcher matcher = SYNTAX_PATTERN.matcher(originalSyntax);
-            List<String> options = new ArrayList<String>();
-            while (matcher.find()) {
-                String s = matcher.group(1);
-                options.add(s);
-            }
-
-            // need to preserve {{ and }} from the syntax
-            // (we need to use words only as its provisional placeholders)
-            syntax = syntax.replaceAll("\\{\\{", "BEGINCAMELPLACEHOLDER");
-            syntax = syntax.replaceAll("\\}\\}", "ENDCAMELPLACEHOLDER");
-
-            // parse the syntax into each options
-            Matcher matcher2 = SYNTAX_PATTERN.matcher(syntax);
-            List<String> options2 = new ArrayList<String>();
-            while (matcher2.find()) {
-                String s = matcher2.group(1);
-                s = s.replaceAll("BEGINCAMELPLACEHOLDER", "\\{\\{");
-                s = s.replaceAll("ENDCAMELPLACEHOLDER", "\\}\\}");
-                options2.add(s);
-            }
-
-            // build the endpoint
-            int range = 0;
-            boolean first = true;
-            boolean hasQuestionmark = false;
-            for (int i = 0; i < options.size(); i++) {
-                String key = options.get(i);
-                String key2 = options2.get(i);
-                String token = null;
-                if (tokens.length > i) {
-                    token = tokens[i];
-                }
-
-                boolean contains = properties.containsKey(key);
-                if (!contains) {
-                    // if the key are similar we have no explicit value and can try to find a default value if the option is required
-                    if (isPropertyRequired(rows, key)) {
-                        String value = getPropertyDefaultValue(rows, key);
-                        if (value != null) {
-                            properties.put(key, value);
-                            key2 = value;
-                        }
-                    }
-                }
-
-                // was the option provided?
-                if (properties.containsKey(key)) {
-                    if (!first && token != null) {
-                        sb.append(token);
-                    }
-                    hasQuestionmark |= key.contains("?") || (token != null && token.contains("?"));
-                    sb.append(key2);
-                    first = false;
-                }
-                range++;
-            }
-            // append any extra options that was in surplus for the last
-            while (range < options2.size()) {
-                String token = null;
-                if (tokens.length > range) {
-                    token = tokens[range];
-                }
-                String key2 = options2.get(range);
-                sb.append(token);
-                sb.append(key2);
-                hasQuestionmark |= key2.contains("?") || (token != null && token.contains("?"));
-                range++;
-            }
-
-
-            if (!copy.isEmpty()) {
-                // the last option may already contain a ? char, if so we should use & instead of ?
-                sb.append(hasQuestionmark ? ampersand : '?');
-                String query = createQueryString(copy, ampersand, encode);
-                sb.append(query);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    @Deprecated
-    private static String[] syntaxTokens(String syntax) {
-        // build tokens between the words
-        List<String> tokens = new ArrayList<>();
-        // preserve backwards behavior which had an empty token first
-        tokens.add("");
-
-        String current = "";
-        for (int i = 0; i < syntax.length(); i++) {
-            char ch = syntax.charAt(i);
-            if (Character.isLetterOrDigit(ch)) {
-                // reset for new current tokens
-                if (current.length() > 0) {
-                    tokens.add(current);
-                    current = "";
-                }
-            } else {
-                current += ch;
-            }
-        }
-        // anything left over?
-        if (current.length() > 0) {
-            tokens.add(current);
-        }
-
-        return tokens.toArray(new String[tokens.size()]);
-    }
-
-    private static String[] syntaxKeys(String syntax) {
-        // build tokens between the separators
-        List<String> tokens = new ArrayList<>();
-
-        String current = "";
-        for (int i = 0; i < syntax.length(); i++) {
-            char ch = syntax.charAt(i);
-            if (Character.isLetterOrDigit(ch)) {
-                current += ch;
-            } else {
-                // reset for new current tokens
-                if (current.length() > 0) {
-                    tokens.add(current);
-                    current = "";
-                }
-            }
-        }
-        // anything left over?
-        if (current.length() > 0) {
-            tokens.add(current);
-        }
-
-        return tokens.toArray(new String[tokens.size()]);
-    }
-
-    public SimpleValidationResult validateSimpleExpression(String simple) {
-        return doValidateSimple(null, simple, false);
-    }
-
-    public SimpleValidationResult validateSimpleExpression(ClassLoader classLoader, String simple) {
-        return doValidateSimple(classLoader, simple, false);
-    }
-
-    public SimpleValidationResult validateSimplePredicate(String simple) {
-        return doValidateSimple(null, simple, true);
-    }
-
-    public SimpleValidationResult validateSimplePredicate(ClassLoader classLoader, String simple) {
-        return doValidateSimple(classLoader, simple, true);
-    }
-
-    private SimpleValidationResult doValidateSimple(ClassLoader classLoader, String simple, boolean predicate) {
-        if (classLoader == null) {
-            classLoader = getClass().getClassLoader();
-        }
-
-        // if there are {{ }}} property placeholders then we need to resolve them to something else
-        // as the simple parse cannot resolve them before parsing as we dont run the actual Camel application
-        // with property placeholders setup so we need to dummy this by replace the {{ }} to something else
-        // therefore we use an more unlikely character: {{XXX}} to ~^XXX^~
-        String resolved = simple.replaceAll("\\{\\{(.+)\\}\\}", "~^$1^~");
-
-        SimpleValidationResult answer = new SimpleValidationResult(simple);
-
-        Object instance = null;
-        Class clazz = null;
-        try {
-            clazz = classLoader.loadClass("org.apache.camel.language.simple.SimpleLanguage");
-            instance = clazz.newInstance();
-        } catch (Exception e) {
-            // ignore
-        }
-
-        if (clazz != null && instance != null) {
-            Throwable cause = null;
-            try {
-                if (predicate) {
-                    instance.getClass().getMethod("createPredicate", String.class).invoke(instance, resolved);
-                } else {
-                    instance.getClass().getMethod("createExpression", String.class).invoke(instance, resolved);
-                }
-            } catch (InvocationTargetException e) {
-                cause = e.getTargetException();
-            } catch (Exception e) {
-                cause = e;
-            }
-
-            if (cause != null) {
-
-                // reverse ~^XXX^~ back to {{XXX}}
-                String errMsg = cause.getMessage();
-                errMsg = errMsg.replaceAll("\\~\\^(.+)\\^\\~", "{{$1}}");
-
-                answer.setError(errMsg);
-
-                // is it simple parser exception then we can grab the index where the problem is
-                if (cause.getClass().getName().equals("org.apache.camel.language.simple.types.SimpleIllegalSyntaxException")
-                    || cause.getClass().getName().equals("org.apache.camel.language.simple.types.SimpleParserException")) {
-                    try {
-                        // we need to grab the index field from those simple parser exceptions
-                        Method method = cause.getClass().getMethod("getIndex");
-                        Object result = method.invoke(cause);
-                        if (result != null) {
-                            int index = (int) result;
-                            answer.setIndex(index);
-                        }
-                    } catch (Throwable i) {
-                        // ignore
-                    }
-                }
-
-                // we need to grab the short message field from this simple syntax exception
-                if (cause.getClass().getName().equals("org.apache.camel.language.simple.types.SimpleIllegalSyntaxException")) {
-                    try {
-                        Method method = cause.getClass().getMethod("getShortMessage");
-                        Object result = method.invoke(cause);
-                        if (result != null) {
-                            String msg = (String) result;
-                            answer.setShortError(msg);
-                        }
-                    } catch (Throwable i) {
-                        // ignore
-                    }
-
-                    if (answer.getShortError() == null) {
-                        // fallback and try to make existing message short instead
-                        String msg = answer.getError();
-                        // grab everything before " at location " which would be regarded as the short message
-                        int idx = msg.indexOf(" at location ");
-                        if (idx > 0) {
-                            msg = msg.substring(0, idx);
-                            answer.setShortError(msg);
-                        }
-                    }
-                }
-            }
-        }
-
-        return answer;
-    }
-
-    public LanguageValidationResult validateLanguagePredicate(ClassLoader classLoader, String language, String text) {
-        return doValidateLanguage(classLoader, language, text, true);
-    }
-
-    public LanguageValidationResult validateLanguageExpression(ClassLoader classLoader, String language, String text) {
-        return doValidateLanguage(classLoader, language, text, false);
-    }
-
-    private LanguageValidationResult doValidateLanguage(ClassLoader classLoader, String language, String text, boolean predicate) {
-        if (classLoader == null) {
-            classLoader = getClass().getClassLoader();
-        }
-
-        SimpleValidationResult answer = new SimpleValidationResult(text);
-
-        String json = jsonSchemaResolver.getLanguageJSonSchema(language);
-        if (json == null) {
-            answer.setError("Unknown language " + language);
-            return answer;
-        }
-
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
-        String className = null;
-        for (Map<String, String> row : rows) {
-            if (row.containsKey("javaType")) {
-                className = row.get("javaType");
-            }
-        }
-
-        if (className == null) {
-            answer.setError("Cannot find javaType for language " + language);
-            return answer;
-        }
-
-        Object instance = null;
-        Class clazz = null;
-        try {
-            clazz = classLoader.loadClass(className);
-            instance = clazz.newInstance();
-        } catch (Exception e) {
-            // ignore
-        }
-
-        if (clazz != null && instance != null) {
-            Throwable cause = null;
-            try {
-                if (predicate) {
-                    instance.getClass().getMethod("createPredicate", String.class).invoke(instance, text);
-                } else {
-                    instance.getClass().getMethod("createExpression", String.class).invoke(instance, text);
-                }
-            } catch (InvocationTargetException e) {
-                cause = e.getTargetException();
-            } catch (Exception e) {
-                cause = e;
-            }
-
-            if (cause != null) {
-                answer.setError(cause.getMessage());
-            }
-        }
-
-        return answer;
-    }
-
-    /**
-     * Special logic for log endpoints to deal when showAll=true
-     */
-    private Map<String, String> filterProperties(String scheme, Map<String, String> options) {
-        if ("log".equals(scheme)) {
-            String showAll = options.get("showAll");
-            if ("true".equals(showAll)) {
-                Map<String, String> filtered = new LinkedHashMap<String, String>();
-                // remove all the other showXXX options when showAll=true
-                for (Map.Entry<String, String> entry : options.entrySet()) {
-                    String key = entry.getKey();
-                    boolean skip = key.startsWith("show") && !key.equals("showAll");
-                    if (!skip) {
-                        filtered.put(key, entry.getValue());
-                    }
-                }
-                return filtered;
-            }
-        }
-        // use as-is
-        return options;
-    }
-
-    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;
-    }
-
-    // CHECKSTYLE:ON
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/CamelContextJSonSchemaResolver.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/CamelContextJSonSchemaResolver.java b/camel-core/src/main/java/org/apache/camel/catalog/CamelContextJSonSchemaResolver.java
deleted file mode 100644
index 8d95488..0000000
--- a/camel-core/src/main/java/org/apache/camel/catalog/CamelContextJSonSchemaResolver.java
+++ /dev/null
@@ -1,80 +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.IOException;
-
-import org.apache.camel.CamelContext;
-
-/**
- * Uses runtime {@link CamelContext} to resolve the JSon schema files.
- */
-public class CamelContextJSonSchemaResolver implements JSonSchemaResolver {
-
-    private final CamelContext camelContext;
-
-    public CamelContextJSonSchemaResolver(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-
-    @Override
-    public String getComponentJSonSchema(String name) {
-        try {
-            return camelContext.getComponentParameterJsonSchema(name);
-        } catch (IOException e) {
-            // ignore
-        }
-        return null;
-    }
-
-    @Override
-    public String getDataFormatJSonSchema(String name) {
-        try {
-            return camelContext.getDataFormatParameterJsonSchema(name);
-        } catch (IOException e) {
-            // ignore
-        }
-        return null;
-    }
-
-    @Override
-    public String getLanguageJSonSchema(String name) {
-        try {
-            return camelContext.getLanguageParameterJsonSchema(name);
-        } catch (IOException e) {
-            // ignore
-        }
-        return null;
-    }
-
-    @Override
-    public String getOtherJSonSchema(String name) {
-        // not supported
-        return null;
-    }
-
-    @Override
-    public String getModelJSonSchema(String name) {
-        try {
-            return camelContext.getEipParameterJsonSchema(name);
-        } catch (IOException e) {
-            // ignore
-        }
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/CatalogHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/CatalogHelper.java b/camel-core/src/main/java/org/apache/camel/catalog/CatalogHelper.java
deleted file mode 100644
index caba4a3..0000000
--- a/camel-core/src/main/java/org/apache/camel/catalog/CatalogHelper.java
+++ /dev/null
@@ -1,179 +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.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.util.List;
-
-public final class CatalogHelper {
-
-    private CatalogHelper() {
-    }
-
-    /**
-     * Loads the entire stream into memory as a String and returns it.
-     * <p/>
-     * <b>Notice:</b> This implementation appends a <tt>\n</tt> as line
-     * terminator at the of the text.
-     * <p/>
-     * Warning, don't use for crazy big streams :)
-     */
-    public static void loadLines(InputStream in, List<String> lines) throws IOException {
-        try (final InputStreamReader isr = new InputStreamReader(in);
-            final BufferedReader reader = new LineNumberReader(isr)) {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                lines.add(line);
-            }
-        }
-    }
-
-    /**
-     * Loads the entire stream into memory as a String and returns it.
-     * <p/>
-     * <b>Notice:</b> This implementation appends a <tt>\n</tt> as line
-     * terminator at the of the text.
-     * <p/>
-     * Warning, don't use for crazy big streams :)
-     */
-    public static String loadText(InputStream in) throws IOException {
-        StringBuilder builder = new StringBuilder();
-        try (final InputStreamReader isr = new InputStreamReader(in);
-            final BufferedReader reader = new LineNumberReader(isr)) {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                builder.append(line);
-                builder.append("\n");
-            }
-            return builder.toString();
-        }
-    }
-
-    /**
-     * Matches the name with the pattern.
-     *
-     * @param name  the name
-     * @param pattern the pattern
-     * @return <tt>true</tt> if matched, or <tt>false</tt> if not
-     */
-    public static boolean matchWildcard(String name, String pattern) {
-        // we have wildcard support in that hence you can match with: file* to match any file endpoints
-        if (pattern.endsWith("*") && name.startsWith(pattern.substring(0, pattern.length() - 1))) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns the string after the given token
-     *
-     * @param text  the text
-     * @param after the token
-     * @return the text after the token, or <tt>null</tt> if text does not contain the token
-     */
-    public static String after(String text, String after) {
-        if (!text.contains(after)) {
-            return null;
-        }
-        return text.substring(text.indexOf(after) + after.length());
-    }
-
-    /**
-     * Returns the string before the given token
-     *
-     * @param text  the text
-     * @param before the token
-     * @return the text before the token, or <tt>null</tt> if text does not contain the token
-     */
-    public static String before(String text, String before) {
-        if (!text.contains(before)) {
-            return null;
-        }
-        return text.substring(0, text.indexOf(before));
-    }
-
-    /**
-     * Returns the string between the given tokens
-     *
-     * @param text  the text
-     * @param after the before token
-     * @param before the after token
-     * @return the text between the tokens, or <tt>null</tt> if text does not contain the tokens
-     */
-    public static String between(String text, String after, String before) {
-        text = after(text, after);
-        if (text == null) {
-            return null;
-        }
-        return before(text, before);
-    }
-
-    /**
-     * 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;
-        }
-    }
-
-    /**
-     * Removes all leading and ending quotes (single and double) from the string
-     *
-     * @param s  the string
-     * @return the string without leading and ending quotes (single and double)
-     */
-    public static String removeLeadingAndEndingQuotes(String s) {
-        if (isEmpty(s)) {
-            return s;
-        }
-
-        String copy = s.trim();
-        if (copy.startsWith("'") && copy.endsWith("'")) {
-            return copy.substring(1, copy.length() - 1);
-        }
-        if (copy.startsWith("\"") && copy.endsWith("\"")) {
-            return copy.substring(1, copy.length() - 1);
-        }
-
-        // no quotes, so return as-is
-        return s;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/CollectionStringBuffer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/CollectionStringBuffer.java b/camel-core/src/main/java/org/apache/camel/catalog/CollectionStringBuffer.java
deleted file mode 100644
index 2844ca9..0000000
--- a/camel-core/src/main/java/org/apache/camel/catalog/CollectionStringBuffer.java
+++ /dev/null
@@ -1,57 +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;
-
-public class CollectionStringBuffer {
-    private final StringBuilder buffer = new StringBuilder();
-    private String separator;
-    private boolean first = true;
-
-    public CollectionStringBuffer() {
-        this(", ");
-    }
-
-    public CollectionStringBuffer(String separator) {
-        this.separator = separator;
-    }
-
-    @Override
-    public String toString() {
-        return buffer.toString();
-    }
-
-    public void append(Object value) {
-        if (first) {
-            first = false;
-        } else {
-            buffer.append(separator);
-        }
-        buffer.append(value);
-    }
-
-    public String getSeparator() {
-        return separator;
-    }
-
-    public void setSeparator(String separator) {
-        this.separator = separator;
-    }
-
-    public boolean isEmpty() {
-        return first;
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/c66be7a8/camel-core/src/main/java/org/apache/camel/catalog/DefaultRuntimeCamelCatalog.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/catalog/DefaultRuntimeCamelCatalog.java b/camel-core/src/main/java/org/apache/camel/catalog/DefaultRuntimeCamelCatalog.java
deleted file mode 100644
index dd66c55..0000000
--- a/camel-core/src/main/java/org/apache/camel/catalog/DefaultRuntimeCamelCatalog.java
+++ /dev/null
@@ -1,136 +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.HashMap;
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-
-/**
- * Default {@link RuntimeCamelCatalog}.
- */
-public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements RuntimeCamelCatalog {
-
-    // cache of operation -> result
-    private final Map<String, Object> cache = new HashMap<String, Object>();
-    private boolean caching;
-
-    /**
-     * Creates the {@link RuntimeCamelCatalog} without caching enabled.
-     *
-     * @param camelContext  the camel context
-     */
-    public DefaultRuntimeCamelCatalog(CamelContext camelContext) {
-        this(camelContext, false);
-    }
-
-    /**
-     * Creates the {@link RuntimeCamelCatalog}
-     *
-     * @param camelContext  the camel context
-     * @param caching  whether to use cache
-     */
-    public DefaultRuntimeCamelCatalog(CamelContext camelContext, boolean caching) {
-        this.caching = caching;
-        setJSonSchemaResolver(new CamelContextJSonSchemaResolver(camelContext));
-    }
-
-    @Override
-    public void start() throws Exception {
-        // noop
-    }
-
-    @Override
-    public void stop() throws Exception {
-        cache.clear();
-    }
-
-    @Override
-    public String modelJSonSchema(String name) {
-        String answer = null;
-        if (caching) {
-            answer = (String) cache.get("model-" + name);
-        }
-
-        if (answer == null) {
-            answer = getJSonSchemaResolver().getModelJSonSchema(name);
-            if (caching) {
-                cache.put("model-" + name, answer);
-            }
-        }
-
-        return answer;
-    }
-
-    @Override
-    public String componentJSonSchema(String name) {
-        String answer = null;
-        if (caching) {
-            answer = (String) cache.get("component-" + name);
-        }
-
-        if (answer == null) {
-            answer = getJSonSchemaResolver().getComponentJSonSchema(name);
-            if (caching) {
-                cache.put("component-" + name, answer);
-            }
-        }
-
-        return answer;
-    }
-
-    @Override
-    public String dataFormatJSonSchema(String name) {
-        String answer = null;
-        if (caching) {
-            answer = (String) cache.get("dataformat-" + name);
-        }
-
-        if (answer == null) {
-            answer = getJSonSchemaResolver().getDataFormatJSonSchema(name);
-            if (caching) {
-                cache.put("dataformat-" + name, answer);
-            }
-        }
-
-        return answer;
-    }
-
-    @Override
-    public String languageJSonSchema(String name) {
-        // if we try to look method then its in the bean.json file
-        if ("method".equals(name)) {
-            name = "bean";
-        }
-
-        String answer = null;
-        if (caching) {
-            answer = (String) cache.get("language-" + name);
-        }
-
-        if (answer == null) {
-            answer = getJSonSchemaResolver().getLanguageJSonSchema(name);
-            if (caching) {
-                cache.put("language-" + name, answer);
-            }
-        }
-
-        return answer;
-    }
-
-}