CAMEL-11756: camel-spring-boot2 - Work in progress
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a11b5399 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a11b5399 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a11b5399 Branch: refs/heads/boot2 Commit: a11b53990e09a4e872533cf8cfef030c9d21f141 Parents: 1acdd1f Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Sep 10 10:34:02 2017 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Sep 10 10:34:02 2017 +0200 ---------------------------------------------------------------------- apache-camel/pom.xml | 4 + .../src/main/descriptors/common-bin.xml | 1 + components/camel-spring-boot/pom.xml | 4 + .../security/CamelSSLAutoConfiguration.java | 2 +- .../util/HierarchicalPropertiesEvaluator.java | 3 +- components/camel-spring-boot2/pom.xml | 4 + .../security/CamelSSLAutoConfiguration.java | 2 +- .../util/HierarchicalPropertiesEvaluator.java | 1 + .../spring/boot/util/PropertySourceUtils.java | 91 ------- .../camel/spring/boot/util/RelaxedNames.java | 258 ------------------ .../boot/util/RelaxedPropertyResolver.java | 155 ----------- parent/pom.xml | 5 + tooling/camel-spring-boot-common/pom.xml | 50 ++++ .../spring/boot/common/PropertySourceUtils.java | 93 +++++++ .../camel/spring/boot/common/RelaxedNames.java | 260 +++++++++++++++++++ .../boot/common/RelaxedPropertyResolver.java | 162 ++++++++++++ .../src/main/resources/META-INF/LICENSE.txt | 203 +++++++++++++++ .../src/main/resources/META-INF/NOTICE.txt | 14 + .../maven/camel-package-maven-plugin/pom.xml | 5 + .../SpringBootAutoConfigurationMojo.java | 2 +- tooling/pom.xml | 1 + 21 files changed, 812 insertions(+), 508 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/apache-camel/pom.xml ---------------------------------------------------------------------- diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml index 9d8921c..64b68d5 100644 --- a/apache-camel/pom.xml +++ b/apache-camel/pom.xml @@ -951,6 +951,10 @@ </dependency> <dependency> <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot</artifactId> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/apache-camel/src/main/descriptors/common-bin.xml ---------------------------------------------------------------------- diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml index 6e9f085..efc78bf 100644 --- a/apache-camel/src/main/descriptors/common-bin.xml +++ b/apache-camel/src/main/descriptors/common-bin.xml @@ -529,6 +529,7 @@ <include>org.apache.camel:camel-spark-starter</include> <include>org.apache.camel:camel-splunk-starter</include> <include>org.apache.camel:camel-spring-batch-starter</include> + <include>org.apache.camel:camel-spring-boot-common</include> <include>org.apache.camel:camel-spring-boot</include> <include>org.apache.camel:camel-spring-boot2</include> <include>org.apache.camel:camel-spring-boot-starter</include> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/pom.xml b/components/camel-spring-boot/pom.xml index b709f96..8bc18b7 100644 --- a/components/camel-spring-boot/pom.xml +++ b/components/camel-spring-boot/pom.xml @@ -61,6 +61,10 @@ <dependency> <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java index d69e1a8..8f74a57 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java @@ -19,13 +19,13 @@ package org.apache.camel.spring.boot.security; import java.util.Map; import org.apache.camel.spring.boot.CamelAutoConfiguration; +import org.apache.camel.spring.boot.common.RelaxedPropertyResolver; import org.apache.camel.util.jsse.GlobalSSLContextParametersSupplier; import org.apache.camel.util.jsse.SSLContextParameters; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionMessage; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ConditionContext; http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java index fa66a11..3cf89b5 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java @@ -16,10 +16,11 @@ */ package org.apache.camel.spring.boot.util; -import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.apache.camel.spring.boot.common.RelaxedPropertyResolver; import org.springframework.core.env.Environment; public final class HierarchicalPropertiesEvaluator { + private HierarchicalPropertiesEvaluator() { } http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/pom.xml b/components/camel-spring-boot2/pom.xml index befe681..94e8ecc 100644 --- a/components/camel-spring-boot2/pom.xml +++ b/components/camel-spring-boot2/pom.xml @@ -70,6 +70,10 @@ <dependency> <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java index d8d54ad..8f74a57 100644 --- a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java +++ b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/security/CamelSSLAutoConfiguration.java @@ -19,7 +19,7 @@ package org.apache.camel.spring.boot.security; import java.util.Map; import org.apache.camel.spring.boot.CamelAutoConfiguration; -import org.apache.camel.spring.boot.util.RelaxedPropertyResolver; +import org.apache.camel.spring.boot.common.RelaxedPropertyResolver; import org.apache.camel.util.jsse.GlobalSSLContextParametersSupplier; import org.apache.camel.util.jsse.SSLContextParameters; import org.springframework.boot.autoconfigure.AutoConfigureBefore; http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java index a898d55..3cf89b5 100644 --- a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java +++ b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/HierarchicalPropertiesEvaluator.java @@ -16,6 +16,7 @@ */ package org.apache.camel.spring.boot.util; +import org.apache.camel.spring.boot.common.RelaxedPropertyResolver; import org.springframework.core.env.Environment; public final class HierarchicalPropertiesEvaluator { http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/PropertySourceUtils.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/PropertySourceUtils.java b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/PropertySourceUtils.java deleted file mode 100644 index 2b0e53c..0000000 --- a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/PropertySourceUtils.java +++ /dev/null @@ -1,91 +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 - * <p> - * http://www.apache.org/licenses/LICENSE-2.0 - * <p> - * 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.spring.boot.util; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.springframework.core.env.EnumerablePropertySource; -import org.springframework.core.env.PropertySource; -import org.springframework.core.env.PropertySources; - -/** - * Convenience class for manipulating PropertySources. - * - * @author Dave Syer - * @see PropertySource - * @see PropertySources - */ -public abstract class PropertySourceUtils { - - /** - * Return a Map of all values from the specified {@link PropertySources} that start - * with a particular key. - * @param propertySources the property sources to scan - * @param keyPrefix the key prefixes to test - * @return a map of all sub properties starting with the specified key prefixes. - * @see PropertySourceUtils#getSubProperties(PropertySources, String, String) - */ - public static Map<String, Object> getSubProperties(PropertySources propertySources, - String keyPrefix) { - return PropertySourceUtils.getSubProperties(propertySources, null, keyPrefix); - } - - /** - * Return a Map of all values from the specified {@link PropertySources} that start - * with a particular key. - * @param propertySources the property sources to scan - * @param rootPrefix a root prefix to be prepended to the keyPrefix (can be - * {@code null}) - * @param keyPrefix the key prefixes to test - * @return a map of all sub properties starting with the specified key prefixes. - * @see #getSubProperties(PropertySources, String, String) - */ - public static Map<String, Object> getSubProperties(PropertySources propertySources, - String rootPrefix, String keyPrefix) { - RelaxedNames keyPrefixes = new RelaxedNames(keyPrefix); - Map<String, Object> subProperties = new LinkedHashMap<String, Object>(); - for (PropertySource<?> source : propertySources) { - if (source instanceof EnumerablePropertySource) { - for (String name : ((EnumerablePropertySource<?>) source) - .getPropertyNames()) { - String key = PropertySourceUtils.getSubKey(name, rootPrefix, - keyPrefixes); - if (key != null && !subProperties.containsKey(key)) { - subProperties.put(key, source.getProperty(name)); - } - } - } - } - return Collections.unmodifiableMap(subProperties); - } - - private static String getSubKey(String name, String rootPrefixes, - RelaxedNames keyPrefix) { - rootPrefixes = (rootPrefixes == null ? "" : rootPrefixes); - for (String rootPrefix : new RelaxedNames(rootPrefixes)) { - for (String candidateKeyPrefix : keyPrefix) { - if (name.startsWith(rootPrefix + candidateKeyPrefix)) { - return name.substring((rootPrefix + candidateKeyPrefix).length()); - } - } - } - return null; - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedNames.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedNames.java b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedNames.java deleted file mode 100644 index 680a168..0000000 --- a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedNames.java +++ /dev/null @@ -1,258 +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 - * <p> - * http://www.apache.org/licenses/LICENSE-2.0 - * <p> - * 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.spring.boot.util; - -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.util.StringUtils; - -/** - * Generates relaxed name variations from a given source. - * - * @author Phillip Webb - * @author Dave Syer - * @see RelaxedPropertyResolver - */ -public final class RelaxedNames implements Iterable<String> { - - private static final Pattern CAMEL_CASE_PATTERN = Pattern.compile("([^A-Z-])([A-Z])"); - - private static final Pattern SEPARATED_TO_CAMEL_CASE_PATTERN = Pattern - .compile("[_\\-.]"); - - private final String name; - - private final Set<String> values = new LinkedHashSet<String>(); - - /** - * Create a new {@link RelaxedNames} instance. - * @param name the source name. For the maximum number of variations specify the name - * using dashed notation (e.g. {@literal my-property-name} - */ - public RelaxedNames(String name) { - this.name = (name == null ? "" : name); - initialize(RelaxedNames.this.name, this.values); - } - - @Override - public Iterator<String> iterator() { - return this.values.iterator(); - } - - private void initialize(String name, Set<String> values) { - if (values.contains(name)) { - return; - } - for (Variation variation : Variation.values()) { - for (Manipulation manipulation : Manipulation.values()) { - String result = name; - result = manipulation.apply(result); - result = variation.apply(result); - values.add(result); - initialize(result, values); - } - } - } - - /** - * Name variations. - */ - enum Variation { - - NONE { - - @Override - public String apply(String value) { - return value; - } - - }, - - LOWERCASE { - - @Override - public String apply(String value) { - return value.isEmpty() ? value : value.toLowerCase(); - } - - }, - - UPPERCASE { - - @Override - public String apply(String value) { - return value.isEmpty() ? value : value.toUpperCase(); - } - - }; - - public abstract String apply(String value); - - } - - /** - * Name manipulations. - */ - enum Manipulation { - - NONE { - - @Override - public String apply(String value) { - return value; - } - - }, - - HYPHEN_TO_UNDERSCORE { - - @Override - public String apply(String value) { - return value.indexOf('-') != -1 ? value.replace('-', '_') : value; - } - - }, - - UNDERSCORE_TO_PERIOD { - - @Override - public String apply(String value) { - return value.indexOf('_') != -1 ? value.replace('_', '.') : value; - } - - }, - - PERIOD_TO_UNDERSCORE { - - @Override - public String apply(String value) { - return value.indexOf('.') != -1 ? value.replace('.', '_') : value; - } - - }, - - CAMELCASE_TO_UNDERSCORE { - - @Override - public String apply(String value) { - if (value.isEmpty()) { - return value; - } - Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); - if (!matcher.find()) { - return value; - } - matcher = matcher.reset(); - StringBuffer result = new StringBuffer(); - while (matcher.find()) { - matcher.appendReplacement(result, matcher.group(1) + '_' - + StringUtils.uncapitalize(matcher.group(2))); - } - matcher.appendTail(result); - return result.toString(); - } - - }, - - CAMELCASE_TO_HYPHEN { - - @Override - public String apply(String value) { - if (value.isEmpty()) { - return value; - } - Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); - if (!matcher.find()) { - return value; - } - matcher = matcher.reset(); - StringBuffer result = new StringBuffer(); - while (matcher.find()) { - matcher.appendReplacement(result, matcher.group(1) + '-' - + StringUtils.uncapitalize(matcher.group(2))); - } - matcher.appendTail(result); - return result.toString(); - } - - }, - - SEPARATED_TO_CAMELCASE { - - @Override - public String apply(String value) { - return separatedToCamelCase(value, false); - } - - }, - - CASE_INSENSITIVE_SEPARATED_TO_CAMELCASE { - - @Override - public String apply(String value) { - return separatedToCamelCase(value, true); - } - - }; - - private static final char[] SUFFIXES = new char[] { '_', '-', '.' }; - - public abstract String apply(String value); - - private static String separatedToCamelCase(String value, - boolean caseInsensitive) { - if (value.isEmpty()) { - return value; - } - StringBuilder builder = new StringBuilder(); - for (String field : SEPARATED_TO_CAMEL_CASE_PATTERN.split(value)) { - field = (caseInsensitive ? field.toLowerCase() : field); - builder.append( - builder.length() == 0 ? field : StringUtils.capitalize(field)); - } - char lastChar = value.charAt(value.length() - 1); - for (char suffix : SUFFIXES) { - if (lastChar == suffix) { - builder.append(suffix); - break; - } - } - return builder.toString(); - } - - } - - /** - * Return a {@link RelaxedNames} for the given source camelCase source name. - * @param name the source name in camelCase - * @return the relaxed names - */ - public static RelaxedNames forCamelCase(String name) { - StringBuilder result = new StringBuilder(); - for (char c : name.toCharArray()) { - result.append(Character.isUpperCase(c) && result.length() > 0 - && result.charAt(result.length() - 1) != '-' - ? "-" + Character.toLowerCase(c) : c); - } - return new RelaxedNames(result.toString()); - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedPropertyResolver.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedPropertyResolver.java b/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedPropertyResolver.java deleted file mode 100644 index d169966..0000000 --- a/components/camel-spring-boot2/src/main/java/org/apache/camel/spring/boot/util/RelaxedPropertyResolver.java +++ /dev/null @@ -1,155 +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 - * <p> - * http://www.apache.org/licenses/LICENSE-2.0 - * <p> - * 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.spring.boot.util; - -import java.util.Map; - -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertyResolver; -import org.springframework.core.env.PropertySourcesPropertyResolver; -import org.springframework.util.Assert; - -/** - * {@link PropertyResolver} that attempts to resolve values using {@link RelaxedNames}. - * - * @author Phillip Webb - * @see RelaxedNames - */ -public class RelaxedPropertyResolver implements PropertyResolver { - - private final PropertyResolver resolver; - - private final String prefix; - - public RelaxedPropertyResolver(PropertyResolver resolver) { - this(resolver, null); - } - - public RelaxedPropertyResolver(PropertyResolver resolver, String prefix) { - Assert.notNull(resolver, "PropertyResolver must not be null"); - this.resolver = resolver; - this.prefix = (prefix == null ? "" : prefix); - } - - @Override - public String getRequiredProperty(String key) throws IllegalStateException { - return getRequiredProperty(key, String.class); - } - - @Override - public <T> T getRequiredProperty(String key, Class<T> targetType) - throws IllegalStateException { - T value = getProperty(key, targetType); - Assert.state(value != null, String.format("required key [%s] not found", key)); - return value; - } - - @Override - public String getProperty(String key) { - return getProperty(key, String.class, null); - } - - @Override - public String getProperty(String key, String defaultValue) { - return getProperty(key, String.class, defaultValue); - } - - @Override - public <T> T getProperty(String key, Class<T> targetType) { - return getProperty(key, targetType, null); - } - - @Override - public <T> T getProperty(String key, Class<T> targetType, T defaultValue) { - RelaxedNames prefixes = new RelaxedNames(this.prefix); - RelaxedNames keys = new RelaxedNames(key); - for (String prefix : prefixes) { - for (String relaxedKey : keys) { - if (this.resolver.containsProperty(prefix + relaxedKey)) { - return this.resolver.getProperty(prefix + relaxedKey, targetType); - } - } - } - return defaultValue; - } - - @Override - public boolean containsProperty(String key) { - RelaxedNames prefixes = new RelaxedNames(this.prefix); - RelaxedNames keys = new RelaxedNames(key); - for (String prefix : prefixes) { - for (String relaxedKey : keys) { - if (this.resolver.containsProperty(prefix + relaxedKey)) { - return true; - } - } - } - return false; - } - - @Override - public String resolvePlaceholders(String text) { - throw new UnsupportedOperationException( - "Unable to resolve placeholders with relaxed properties"); - } - - @Override - public String resolveRequiredPlaceholders(String text) - throws IllegalArgumentException { - throw new UnsupportedOperationException( - "Unable to resolve placeholders with relaxed properties"); - } - - /** - * Return a Map of all values from all underlying properties that start with the - * specified key. NOTE: this method can only be used if the underlying resolver is a - * {@link ConfigurableEnvironment}. - * @param keyPrefix the key prefix used to filter results - * @return a map of all sub properties starting with the specified key prefix. - * @see PropertySourceUtils#getSubProperties - */ - public Map<String, Object> getSubProperties(String keyPrefix) { - Assert.isInstanceOf(ConfigurableEnvironment.class, this.resolver, - "SubProperties not available."); - ConfigurableEnvironment env = (ConfigurableEnvironment) this.resolver; - return PropertySourceUtils.getSubProperties(env.getPropertySources(), this.prefix, - keyPrefix); - } - - /** - * Return a property resolver for the environment, preferring one that ignores - * unresolvable nested placeholders. - * @param environment the source environment - * @param prefix the prefix - * @return a property resolver for the environment - * @since 1.4.3 - */ - public static RelaxedPropertyResolver ignoringUnresolvableNestedPlaceholders( - Environment environment, String prefix) { - Assert.notNull(environment, "Environment must not be null"); - PropertyResolver resolver = environment; - if (environment instanceof ConfigurableEnvironment) { - resolver = new PropertySourcesPropertyResolver( - ((ConfigurableEnvironment) environment).getPropertySources()); - ((PropertySourcesPropertyResolver) resolver) - .setIgnoreUnresolvableNestedPlaceholders(true); - } - return new RelaxedPropertyResolver(resolver, prefix); - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index c0e6cc5..e3544cc 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -1950,6 +1950,11 @@ </dependency> <dependency> <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-common</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot</artifactId> <version>${project.version}</version> </dependency> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/pom.xml ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/pom.xml b/tooling/camel-spring-boot-common/pom.xml new file mode 100644 index 0000000..77e80b4 --- /dev/null +++ b/tooling/camel-spring-boot-common/pom.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.camel</groupId> + <artifactId>tooling</artifactId> + <version>2.20.0-SNAPSHOT</version> + </parent> + + <artifactId>camel-spring-boot-common</artifactId> + <name>Camel :: Spring Boot Common</name> + <description>Common API for using Apache Camel with Spring Boot 1.x and 2.x</description> + + <properties> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot</artifactId> + <version>${spring-boot-version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-autoconfigure</artifactId> + <version>${spring-boot-version}</version> + </dependency> + </dependencies> + +</project> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/PropertySourceUtils.java ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/PropertySourceUtils.java b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/PropertySourceUtils.java new file mode 100644 index 0000000..f7311f8 --- /dev/null +++ b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/PropertySourceUtils.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.spring.boot.common; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.springframework.core.env.EnumerablePropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.env.PropertySources; + +/** + * Convenience class for manipulating PropertySources. + * + * @author Dave Syer + * @see PropertySource + * @see PropertySources + * + * Source code copied from spring-boot 1.5.6.RELEASE + */ +public abstract class PropertySourceUtils { + + /** + * Return a Map of all values from the specified {@link PropertySources} that start + * with a particular key. + * @param propertySources the property sources to scan + * @param keyPrefix the key prefixes to test + * @return a map of all sub properties starting with the specified key prefixes. + * @see PropertySourceUtils#getSubProperties(PropertySources, String, String) + */ + public static Map<String, Object> getSubProperties(PropertySources propertySources, + String keyPrefix) { + return PropertySourceUtils.getSubProperties(propertySources, null, keyPrefix); + } + + /** + * Return a Map of all values from the specified {@link PropertySources} that start + * with a particular key. + * @param propertySources the property sources to scan + * @param rootPrefix a root prefix to be prepended to the keyPrefix (can be + * {@code null}) + * @param keyPrefix the key prefixes to test + * @return a map of all sub properties starting with the specified key prefixes. + * @see #getSubProperties(PropertySources, String, String) + */ + public static Map<String, Object> getSubProperties(PropertySources propertySources, + String rootPrefix, String keyPrefix) { + RelaxedNames keyPrefixes = new RelaxedNames(keyPrefix); + Map<String, Object> subProperties = new LinkedHashMap<String, Object>(); + for (PropertySource<?> source : propertySources) { + if (source instanceof EnumerablePropertySource) { + for (String name : ((EnumerablePropertySource<?>) source) + .getPropertyNames()) { + String key = PropertySourceUtils.getSubKey(name, rootPrefix, + keyPrefixes); + if (key != null && !subProperties.containsKey(key)) { + subProperties.put(key, source.getProperty(name)); + } + } + } + } + return Collections.unmodifiableMap(subProperties); + } + + private static String getSubKey(String name, String rootPrefixes, + RelaxedNames keyPrefix) { + rootPrefixes = (rootPrefixes == null ? "" : rootPrefixes); + for (String rootPrefix : new RelaxedNames(rootPrefixes)) { + for (String candidateKeyPrefix : keyPrefix) { + if (name.startsWith(rootPrefix + candidateKeyPrefix)) { + return name.substring((rootPrefix + candidateKeyPrefix).length()); + } + } + } + return null; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedNames.java ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedNames.java b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedNames.java new file mode 100644 index 0000000..b5db66e --- /dev/null +++ b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedNames.java @@ -0,0 +1,260 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.spring.boot.common; + +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.util.StringUtils; + +/** + * Generates relaxed name variations from a given source. + * + * @author Phillip Webb + * @author Dave Syer + * @see RelaxedPropertyResolver + * + * Source code copied from spring-boot 1.5.6.RELEASE + */ +public final class RelaxedNames implements Iterable<String> { + + private static final Pattern CAMEL_CASE_PATTERN = Pattern.compile("([^A-Z-])([A-Z])"); + + private static final Pattern SEPARATED_TO_CAMEL_CASE_PATTERN = Pattern + .compile("[_\\-.]"); + + private final String name; + + private final Set<String> values = new LinkedHashSet<String>(); + + /** + * Create a new {@link RelaxedNames} instance. + * @param name the source name. For the maximum number of variations specify the name + * using dashed notation (e.g. {@literal my-property-name} + */ + public RelaxedNames(String name) { + this.name = (name == null ? "" : name); + initialize(RelaxedNames.this.name, this.values); + } + + @Override + public Iterator<String> iterator() { + return this.values.iterator(); + } + + private void initialize(String name, Set<String> values) { + if (values.contains(name)) { + return; + } + for (Variation variation : Variation.values()) { + for (Manipulation manipulation : Manipulation.values()) { + String result = name; + result = manipulation.apply(result); + result = variation.apply(result); + values.add(result); + initialize(result, values); + } + } + } + + /** + * Name variations. + */ + enum Variation { + + NONE { + + @Override + public String apply(String value) { + return value; + } + + }, + + LOWERCASE { + + @Override + public String apply(String value) { + return value.isEmpty() ? value : value.toLowerCase(); + } + + }, + + UPPERCASE { + + @Override + public String apply(String value) { + return value.isEmpty() ? value : value.toUpperCase(); + } + + }; + + public abstract String apply(String value); + + } + + /** + * Name manipulations. + */ + enum Manipulation { + + NONE { + + @Override + public String apply(String value) { + return value; + } + + }, + + HYPHEN_TO_UNDERSCORE { + + @Override + public String apply(String value) { + return value.indexOf('-') != -1 ? value.replace('-', '_') : value; + } + + }, + + UNDERSCORE_TO_PERIOD { + + @Override + public String apply(String value) { + return value.indexOf('_') != -1 ? value.replace('_', '.') : value; + } + + }, + + PERIOD_TO_UNDERSCORE { + + @Override + public String apply(String value) { + return value.indexOf('.') != -1 ? value.replace('.', '_') : value; + } + + }, + + CAMELCASE_TO_UNDERSCORE { + + @Override + public String apply(String value) { + if (value.isEmpty()) { + return value; + } + Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); + if (!matcher.find()) { + return value; + } + matcher = matcher.reset(); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, matcher.group(1) + '_' + + StringUtils.uncapitalize(matcher.group(2))); + } + matcher.appendTail(result); + return result.toString(); + } + + }, + + CAMELCASE_TO_HYPHEN { + + @Override + public String apply(String value) { + if (value.isEmpty()) { + return value; + } + Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); + if (!matcher.find()) { + return value; + } + matcher = matcher.reset(); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, matcher.group(1) + '-' + + StringUtils.uncapitalize(matcher.group(2))); + } + matcher.appendTail(result); + return result.toString(); + } + + }, + + SEPARATED_TO_CAMELCASE { + + @Override + public String apply(String value) { + return separatedToCamelCase(value, false); + } + + }, + + CASE_INSENSITIVE_SEPARATED_TO_CAMELCASE { + + @Override + public String apply(String value) { + return separatedToCamelCase(value, true); + } + + }; + + private static final char[] SUFFIXES = new char[] { '_', '-', '.' }; + + public abstract String apply(String value); + + private static String separatedToCamelCase(String value, + boolean caseInsensitive) { + if (value.isEmpty()) { + return value; + } + StringBuilder builder = new StringBuilder(); + for (String field : SEPARATED_TO_CAMEL_CASE_PATTERN.split(value)) { + field = (caseInsensitive ? field.toLowerCase() : field); + builder.append( + builder.length() == 0 ? field : StringUtils.capitalize(field)); + } + char lastChar = value.charAt(value.length() - 1); + for (char suffix : SUFFIXES) { + if (lastChar == suffix) { + builder.append(suffix); + break; + } + } + return builder.toString(); + } + + } + + /** + * Return a {@link RelaxedNames} for the given source camelCase source name. + * @param name the source name in camelCase + * @return the relaxed names + */ + public static RelaxedNames forCamelCase(String name) { + StringBuilder result = new StringBuilder(); + for (char c : name.toCharArray()) { + result.append(Character.isUpperCase(c) && result.length() > 0 + && result.charAt(result.length() - 1) != '-' + ? "-" + Character.toLowerCase(c) : c); + } + return new RelaxedNames(result.toString()); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedPropertyResolver.java ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedPropertyResolver.java b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedPropertyResolver.java new file mode 100644 index 0000000..a046787 --- /dev/null +++ b/tooling/camel-spring-boot-common/src/main/java/org/apache/camel/spring/boot/common/RelaxedPropertyResolver.java @@ -0,0 +1,162 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.spring.boot.common; + +import java.util.Map; + +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.PropertyResolver; +import org.springframework.core.env.PropertySourcesPropertyResolver; +import org.springframework.util.Assert; + +/** + * {@link PropertyResolver} that attempts to resolve values using {@link RelaxedNames}. + * + * @author Phillip Webb + * @see RelaxedNames + * + * Source code copied from spring-boot 1.5.6.RELEASE + */ +public class RelaxedPropertyResolver implements PropertyResolver { + + private final PropertyResolver resolver; + + private final String prefix; + + public RelaxedPropertyResolver(PropertyResolver resolver) { + this(resolver, null); + } + + public RelaxedPropertyResolver(PropertyResolver resolver, String prefix) { + Assert.notNull(resolver, "PropertyResolver must not be null"); + this.resolver = resolver; + this.prefix = (prefix == null ? "" : prefix); + } + + @Override + public String getRequiredProperty(String key) throws IllegalStateException { + return getRequiredProperty(key, String.class); + } + + @Override + public <T> T getRequiredProperty(String key, Class<T> targetType) + throws IllegalStateException { + T value = getProperty(key, targetType); + Assert.state(value != null, String.format("required key [%s] not found", key)); + return value; + } + + @Override + public String getProperty(String key) { + return getProperty(key, String.class, null); + } + + @Override + public String getProperty(String key, String defaultValue) { + return getProperty(key, String.class, defaultValue); + } + + @Override + public <T> T getProperty(String key, Class<T> targetType) { + return getProperty(key, targetType, null); + } + + @Override + public <T> T getProperty(String key, Class<T> targetType, T defaultValue) { + RelaxedNames prefixes = new RelaxedNames(this.prefix); + RelaxedNames keys = new RelaxedNames(key); + for (String prefix : prefixes) { + for (String relaxedKey : keys) { + if (this.resolver.containsProperty(prefix + relaxedKey)) { + return this.resolver.getProperty(prefix + relaxedKey, targetType); + } + } + } + return defaultValue; + } + + // not implemented in spring boot 2 and not in use by us + public <T> Class<T> getPropertyAsClass(String key, Class<T> targetType) { + return null; + } + + @Override + public boolean containsProperty(String key) { + RelaxedNames prefixes = new RelaxedNames(this.prefix); + RelaxedNames keys = new RelaxedNames(key); + for (String prefix : prefixes) { + for (String relaxedKey : keys) { + if (this.resolver.containsProperty(prefix + relaxedKey)) { + return true; + } + } + } + return false; + } + + @Override + public String resolvePlaceholders(String text) { + throw new UnsupportedOperationException( + "Unable to resolve placeholders with relaxed properties"); + } + + @Override + public String resolveRequiredPlaceholders(String text) + throws IllegalArgumentException { + throw new UnsupportedOperationException( + "Unable to resolve placeholders with relaxed properties"); + } + + /** + * Return a Map of all values from all underlying properties that start with the + * specified key. NOTE: this method can only be used if the underlying resolver is a + * {@link ConfigurableEnvironment}. + * @param keyPrefix the key prefix used to filter results + * @return a map of all sub properties starting with the specified key prefix. + * @see PropertySourceUtils#getSubProperties + */ + public Map<String, Object> getSubProperties(String keyPrefix) { + Assert.isInstanceOf(ConfigurableEnvironment.class, this.resolver, + "SubProperties not available."); + ConfigurableEnvironment env = (ConfigurableEnvironment) this.resolver; + return PropertySourceUtils.getSubProperties(env.getPropertySources(), this.prefix, + keyPrefix); + } + + /** + * Return a property resolver for the environment, preferring one that ignores + * unresolvable nested placeholders. + * @param environment the source environment + * @param prefix the prefix + * @return a property resolver for the environment + * @since 1.4.3 + */ + public static RelaxedPropertyResolver ignoringUnresolvableNestedPlaceholders( + Environment environment, String prefix) { + Assert.notNull(environment, "Environment must not be null"); + PropertyResolver resolver = environment; + if (environment instanceof ConfigurableEnvironment) { + resolver = new PropertySourcesPropertyResolver( + ((ConfigurableEnvironment) environment).getPropertySources()); + ((PropertySourcesPropertyResolver) resolver) + .setIgnoreUnresolvableNestedPlaceholders(true); + } + return new RelaxedPropertyResolver(resolver, prefix); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/src/main/resources/META-INF/LICENSE.txt ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/src/main/resources/META-INF/LICENSE.txt b/tooling/camel-spring-boot-common/src/main/resources/META-INF/LICENSE.txt new file mode 100755 index 0000000..6b0b127 --- /dev/null +++ b/tooling/camel-spring-boot-common/src/main/resources/META-INF/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/camel-spring-boot-common/src/main/resources/META-INF/NOTICE.txt ---------------------------------------------------------------------- diff --git a/tooling/camel-spring-boot-common/src/main/resources/META-INF/NOTICE.txt b/tooling/camel-spring-boot-common/src/main/resources/META-INF/NOTICE.txt new file mode 100644 index 0000000..36faf60 --- /dev/null +++ b/tooling/camel-spring-boot-common/src/main/resources/META-INF/NOTICE.txt @@ -0,0 +1,14 @@ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Camel distribution. == + ========================================================================= + + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + This product includes software developed by the Spring Framework + Project (http://www.springframework.org). + + Please read the different LICENSE files present in the licenses directory of + this distribution. http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/maven/camel-package-maven-plugin/pom.xml ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/pom.xml b/tooling/maven/camel-package-maven-plugin/pom.xml index d9ad4cf..574390e 100644 --- a/tooling/maven/camel-package-maven-plugin/pom.xml +++ b/tooling/maven/camel-package-maven-plugin/pom.xml @@ -47,6 +47,11 @@ <dependencies> <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-common</artifactId> + </dependency> + + <dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> <version>${mvel-version}</version> http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java index 976010e..65f6445 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java @@ -52,6 +52,7 @@ import org.apache.camel.maven.packaging.model.OtherModel; import org.apache.camel.maven.packaging.model.OtherOptionModel; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriPath; +import org.apache.camel.spring.boot.common.RelaxedPropertyResolver; import org.apache.commons.io.FileUtils; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; @@ -78,7 +79,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; http://git-wip-us.apache.org/repos/asf/camel/blob/a11b5399/tooling/pom.xml ---------------------------------------------------------------------- diff --git a/tooling/pom.xml b/tooling/pom.xml index a01f18c..fc5d5c1 100644 --- a/tooling/pom.xml +++ b/tooling/pom.xml @@ -42,6 +42,7 @@ <module>spi-annotations</module> <module>apt</module> <module>camel-route-parser</module> + <module>camel-spring-boot-common</module> <module>swagger-rest-dsl-generator</module> <module>maven</module> <module>camel-manual</module>