This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 3cb6590 CAMEL-16345: camel-main - Auto generate list of known
components, dataformats, languages for ENV variable resolver.
3cb6590 is described below
commit 3cb659073b29c43841a082b5ef6bab0c4b9ff036
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Mar 13 10:04:56 2021 +0100
CAMEL-16345: camel-main - Auto generate list of known components,
dataformats, languages for ENV variable resolver.
---
catalog/camel-catalog/pom.xml | 2 +
.../org/apache/camel/main/BaseMainSupport.java | 20 +-
.../java/org/apache/camel/main/MainHelper.java | 530 ++++++++++++++++++++-
.../java/org/apache/camel/main/MainHelperTest.java | 88 ++++
.../camel/maven/packaging/UpdateMainHelper.java | 171 +++++++
5 files changed, 808 insertions(+), 3 deletions(-)
diff --git a/catalog/camel-catalog/pom.xml b/catalog/camel-catalog/pom.xml
index 6f3e0cd..b83c673 100644
--- a/catalog/camel-catalog/pom.xml
+++ b/catalog/camel-catalog/pom.xml
@@ -129,6 +129,8 @@
<goal>prepare-assembly</goal>
<!-- update secrets in camel-util -->
<goal>update-sensitive-helper</goal>
+ <!-- update names in camel-main -->
+ <goal>update-main-helper</goal>
</goals>
<phase>process-resources</phase>
</execution>
diff --git
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index a67c4c1..025ca82 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -1180,8 +1180,24 @@ public abstract class BaseMainSupport extends
BaseService {
// load properties from ENV (override existing)
if
(mainConfigurationProperties.isAutoConfigurationEnvironmentVariablesEnabled()) {
- Properties propENV = loadEnvironmentVariablesAsProperties(
- new String[] { "camel.component.", "camel.dataformat.",
"camel.language." });
+ Map<String, String> env = MainHelper
+ .filterEnvVariables(new String[] { "camel.component.",
"camel.dataformat.", "camel.language." });
+ LOG.debug("Gathered {} ENV variables to configure components,
dataformats, languages", env.size());
+
+ // special configuration when using ENV variables as we need to
extract the ENV variables
+ // that are for the out of the box components first, and then
afterwards for any 3rd party custom components
+ Properties propENV = new OrderedProperties();
+ MainHelper.addComponentEnvVariables(env, propENV, false);
+ MainHelper.addDataFormatEnvVariables(env, propENV, false);
+ MainHelper.addLanguageEnvVariables(env, propENV, false);
+
+ if (!env.isEmpty()) {
+ LOG.debug("Remaining {} ENV variables to configure custom
components, dataformats, languages", env.size());
+ MainHelper.addComponentEnvVariables(env, propENV, true);
+ MainHelper.addDataFormatEnvVariables(env, propENV, true);
+ MainHelper.addLanguageEnvVariables(env, propENV, true);
+ }
+
if (!propENV.isEmpty()) {
prop.putAll(propENV);
}
diff --git
a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
index 383a074..00474b8 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
@@ -16,11 +16,15 @@
*/
package org.apache.camel.main;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
+import java.util.Set;
import java.util.function.Function;
import org.apache.camel.CamelContext;
@@ -40,6 +44,440 @@ import org.slf4j.LoggerFactory;
public final class MainHelper {
private static final Logger LOG =
LoggerFactory.getLogger(MainHelper.class);
+ private static final Set<String> COMPONENT_ENV_NAMES = new HashSet<>(
+ Arrays.asList(
+ // Generated by camel build tools - do NOT edit this list!
+ // COMPONENT-ENV-NAMES: START
+ "CAMEL_COMPONENT_ACTIVEMQ",
+ "CAMEL_COMPONENT_AHC",
+ "CAMEL_COMPONENT_AHC_WS",
+ "CAMEL_COMPONENT_AHC_WSS",
+ "CAMEL_COMPONENT_AMQP",
+ "CAMEL_COMPONENT_APNS",
+ "CAMEL_COMPONENT_ARANGODB",
+ "CAMEL_COMPONENT_AS2",
+ "CAMEL_COMPONENT_ASTERISK",
+ "CAMEL_COMPONENT_ATLASMAP",
+ "CAMEL_COMPONENT_ATMOS",
+ "CAMEL_COMPONENT_ATMOSPHERE_WEBSOCKET",
+ "CAMEL_COMPONENT_ATOM",
+ "CAMEL_COMPONENT_ATOMIX_MAP",
+ "CAMEL_COMPONENT_ATOMIX_MESSAGING",
+ "CAMEL_COMPONENT_ATOMIX_MULTIMAP",
+ "CAMEL_COMPONENT_ATOMIX_QUEUE",
+ "CAMEL_COMPONENT_ATOMIX_SET",
+ "CAMEL_COMPONENT_ATOMIX_VALUE",
+ "CAMEL_COMPONENT_AVRO",
+ "CAMEL_COMPONENT_AWS2_ATHENA",
+ "CAMEL_COMPONENT_AWS2_CW",
+ "CAMEL_COMPONENT_AWS2_DDB",
+ "CAMEL_COMPONENT_AWS2_DDBSTREAM",
+ "CAMEL_COMPONENT_AWS2_EC2",
+ "CAMEL_COMPONENT_AWS2_ECS",
+ "CAMEL_COMPONENT_AWS2_EKS",
+ "CAMEL_COMPONENT_AWS2_EVENTBRIDGE",
+ "CAMEL_COMPONENT_AWS2_IAM",
+ "CAMEL_COMPONENT_AWS2_KINESIS",
+ "CAMEL_COMPONENT_AWS2_KINESIS_FIREHOSE",
+ "CAMEL_COMPONENT_AWS2_KMS",
+ "CAMEL_COMPONENT_AWS2_LAMBDA",
+ "CAMEL_COMPONENT_AWS2_MQ",
+ "CAMEL_COMPONENT_AWS2_MSK",
+ "CAMEL_COMPONENT_AWS2_S3",
+ "CAMEL_COMPONENT_AWS2_SES",
+ "CAMEL_COMPONENT_AWS2_SNS",
+ "CAMEL_COMPONENT_AWS2_SQS",
+ "CAMEL_COMPONENT_AWS2_STS",
+ "CAMEL_COMPONENT_AWS2_TRANSLATE",
+ "CAMEL_COMPONENT_AWS_SECRETS_MANAGER",
+ "CAMEL_COMPONENT_AZURE_EVENTHUBS",
+ "CAMEL_COMPONENT_AZURE_STORAGE_BLOB",
+ "CAMEL_COMPONENT_AZURE_STORAGE_DATALAKE",
+ "CAMEL_COMPONENT_AZURE_STORAGE_QUEUE",
+ "CAMEL_COMPONENT_BEAN",
+ "CAMEL_COMPONENT_BEANSTALK",
+ "CAMEL_COMPONENT_BEAN_VALIDATOR",
+ "CAMEL_COMPONENT_BONITA",
+ "CAMEL_COMPONENT_BOX",
+ "CAMEL_COMPONENT_BRAINTREE",
+ "CAMEL_COMPONENT_BROWSE",
+ "CAMEL_COMPONENT_CAFFEINE_CACHE",
+ "CAMEL_COMPONENT_CAFFEINE_LOADCACHE",
+ "CAMEL_COMPONENT_CHATSCRIPT",
+ "CAMEL_COMPONENT_CHUNK",
+ "CAMEL_COMPONENT_CLASS",
+ "CAMEL_COMPONENT_CMIS",
+ "CAMEL_COMPONENT_CM_SMS",
+ "CAMEL_COMPONENT_COAP",
+ "CAMEL_COMPONENT_COAP+TCP",
+ "CAMEL_COMPONENT_COAPS",
+ "CAMEL_COMPONENT_COAPS+TCP",
+ "CAMEL_COMPONENT_COMETD",
+ "CAMEL_COMPONENT_COMETDS",
+ "CAMEL_COMPONENT_CONSUL",
+ "CAMEL_COMPONENT_CONTROLBUS",
+ "CAMEL_COMPONENT_CORDA",
+ "CAMEL_COMPONENT_COUCHBASE",
+ "CAMEL_COMPONENT_COUCHDB",
+ "CAMEL_COMPONENT_CQL",
+ "CAMEL_COMPONENT_CRON",
+ "CAMEL_COMPONENT_CRYPTO",
+ "CAMEL_COMPONENT_CRYPTO_CMS",
+ "CAMEL_COMPONENT_CXF",
+ "CAMEL_COMPONENT_CXFRS",
+ "CAMEL_COMPONENT_DATAFORMAT",
+ "CAMEL_COMPONENT_DATASET",
+ "CAMEL_COMPONENT_DATASET_TEST",
+ "CAMEL_COMPONENT_DEBEZIUM_MONGODB",
+ "CAMEL_COMPONENT_DEBEZIUM_MYSQL",
+ "CAMEL_COMPONENT_DEBEZIUM_POSTGRES",
+ "CAMEL_COMPONENT_DEBEZIUM_SQLSERVER",
+ "CAMEL_COMPONENT_DIGITALOCEAN",
+ "CAMEL_COMPONENT_DIRECT",
+ "CAMEL_COMPONENT_DIRECT_VM",
+ "CAMEL_COMPONENT_DISRUPTOR",
+ "CAMEL_COMPONENT_DISRUPTOR_VM",
+ "CAMEL_COMPONENT_DJL",
+ "CAMEL_COMPONENT_DNS",
+ "CAMEL_COMPONENT_DOCKER",
+ "CAMEL_COMPONENT_DOZER",
+ "CAMEL_COMPONENT_DRILL",
+ "CAMEL_COMPONENT_DROPBOX",
+ "CAMEL_COMPONENT_EHCACHE",
+ "CAMEL_COMPONENT_ELASTICSEARCH_REST",
+ "CAMEL_COMPONENT_ELSQL",
+ "CAMEL_COMPONENT_ETCD_KEYS",
+ "CAMEL_COMPONENT_ETCD_STATS",
+ "CAMEL_COMPONENT_ETCD_WATCH",
+ "CAMEL_COMPONENT_EXEC",
+ "CAMEL_COMPONENT_FACEBOOK",
+ "CAMEL_COMPONENT_FHIR",
+ "CAMEL_COMPONENT_FILE",
+ "CAMEL_COMPONENT_FILE_WATCH",
+ "CAMEL_COMPONENT_FLATPACK",
+ "CAMEL_COMPONENT_FLINK",
+ "CAMEL_COMPONENT_FOP",
+ "CAMEL_COMPONENT_FREEMARKER",
+ "CAMEL_COMPONENT_FTP",
+ "CAMEL_COMPONENT_FTPS",
+ "CAMEL_COMPONENT_GANGLIA",
+ "CAMEL_COMPONENT_GEOCODER",
+ "CAMEL_COMPONENT_GIT",
+ "CAMEL_COMPONENT_GITHUB",
+ "CAMEL_COMPONENT_GOOGLE_BIGQUERY",
+ "CAMEL_COMPONENT_GOOGLE_BIGQUERY_SQL",
+ "CAMEL_COMPONENT_GOOGLE_CALENDAR",
+ "CAMEL_COMPONENT_GOOGLE_CALENDAR_STREAM",
+ "CAMEL_COMPONENT_GOOGLE_DRIVE",
+ "CAMEL_COMPONENT_GOOGLE_MAIL",
+ "CAMEL_COMPONENT_GOOGLE_MAIL_STREAM",
+ "CAMEL_COMPONENT_GOOGLE_PUBSUB",
+ "CAMEL_COMPONENT_GOOGLE_SHEETS",
+ "CAMEL_COMPONENT_GOOGLE_SHEETS_STREAM",
+ "CAMEL_COMPONENT_GOOGLE_STORAGE",
+ "CAMEL_COMPONENT_GORA",
+ "CAMEL_COMPONENT_GRAPE",
+ "CAMEL_COMPONENT_GRAPHQL",
+ "CAMEL_COMPONENT_GRPC",
+ "CAMEL_COMPONENT_GUAVA_EVENTBUS",
+ "CAMEL_COMPONENT_HAZELCAST_ATOMICVALUE",
+ "CAMEL_COMPONENT_HAZELCAST_INSTANCE",
+ "CAMEL_COMPONENT_HAZELCAST_LIST",
+ "CAMEL_COMPONENT_HAZELCAST_MAP",
+ "CAMEL_COMPONENT_HAZELCAST_MULTIMAP",
+ "CAMEL_COMPONENT_HAZELCAST_QUEUE",
+ "CAMEL_COMPONENT_HAZELCAST_REPLICATEDMAP",
+ "CAMEL_COMPONENT_HAZELCAST_RINGBUFFER",
+ "CAMEL_COMPONENT_HAZELCAST_SEDA",
+ "CAMEL_COMPONENT_HAZELCAST_SET",
+ "CAMEL_COMPONENT_HAZELCAST_TOPIC",
+ "CAMEL_COMPONENT_HBASE",
+ "CAMEL_COMPONENT_HDFS",
+ "CAMEL_COMPONENT_HTTP",
+ "CAMEL_COMPONENT_HTTPS",
+ "CAMEL_COMPONENT_HWCLOUD_SMN",
+ "CAMEL_COMPONENT_IEC60870_CLIENT",
+ "CAMEL_COMPONENT_IEC60870_SERVER",
+ "CAMEL_COMPONENT_IGNITE_CACHE",
+ "CAMEL_COMPONENT_IGNITE_COMPUTE",
+ "CAMEL_COMPONENT_IGNITE_EVENTS",
+ "CAMEL_COMPONENT_IGNITE_IDGEN",
+ "CAMEL_COMPONENT_IGNITE_MESSAGING",
+ "CAMEL_COMPONENT_IGNITE_QUEUE",
+ "CAMEL_COMPONENT_IGNITE_SET",
+ "CAMEL_COMPONENT_IMAP",
+ "CAMEL_COMPONENT_IMAPS",
+ "CAMEL_COMPONENT_INFINISPAN",
+ "CAMEL_COMPONENT_INFINISPAN_EMBEDDED",
+ "CAMEL_COMPONENT_INFLUXDB",
+ "CAMEL_COMPONENT_IOTA",
+ "CAMEL_COMPONENT_IPFS",
+ "CAMEL_COMPONENT_IRC",
+ "CAMEL_COMPONENT_IRONMQ",
+ "CAMEL_COMPONENT_JBPM",
+ "CAMEL_COMPONENT_JCACHE",
+ "CAMEL_COMPONENT_JCLOUDS",
+ "CAMEL_COMPONENT_JCR",
+ "CAMEL_COMPONENT_JDBC",
+ "CAMEL_COMPONENT_JETTY",
+ "CAMEL_COMPONENT_JGROUPS",
+ "CAMEL_COMPONENT_JGROUPS_RAFT",
+ "CAMEL_COMPONENT_JING",
+ "CAMEL_COMPONENT_JIRA",
+ "CAMEL_COMPONENT_JMS",
+ "CAMEL_COMPONENT_JMX",
+ "CAMEL_COMPONENT_JOLT",
+ "CAMEL_COMPONENT_JOOQ",
+ "CAMEL_COMPONENT_JPA",
+ "CAMEL_COMPONENT_JSLT",
+ "CAMEL_COMPONENT_JSONATA",
+ "CAMEL_COMPONENT_JSON_VALIDATOR",
+ "CAMEL_COMPONENT_JT400",
+ "CAMEL_COMPONENT_KAFKA",
+ "CAMEL_COMPONENT_KAMELET",
+ "CAMEL_COMPONENT_KUBERNETES_CONFIG_MAPS",
+ "CAMEL_COMPONENT_KUBERNETES_CUSTOM_RESOURCES",
+ "CAMEL_COMPONENT_KUBERNETES_DEPLOYMENTS",
+ "CAMEL_COMPONENT_KUBERNETES_HPA",
+ "CAMEL_COMPONENT_KUBERNETES_JOB",
+ "CAMEL_COMPONENT_KUBERNETES_NAMESPACES",
+ "CAMEL_COMPONENT_KUBERNETES_NODES",
+ "CAMEL_COMPONENT_KUBERNETES_PERSISTENT_VOLUMES",
+ "CAMEL_COMPONENT_KUBERNETES_PERSISTENT_VOLUMES_CLAIMS",
+ "CAMEL_COMPONENT_KUBERNETES_PODS",
+ "CAMEL_COMPONENT_KUBERNETES_REPLICATION_CONTROLLERS",
+ "CAMEL_COMPONENT_KUBERNETES_RESOURCES_QUOTA",
+ "CAMEL_COMPONENT_KUBERNETES_SECRETS",
+ "CAMEL_COMPONENT_KUBERNETES_SERVICES",
+ "CAMEL_COMPONENT_KUBERNETES_SERVICE_ACCOUNTS",
+ "CAMEL_COMPONENT_KUDU",
+ "CAMEL_COMPONENT_LANGUAGE",
+ "CAMEL_COMPONENT_LDAP",
+ "CAMEL_COMPONENT_LDIF",
+ "CAMEL_COMPONENT_LOG",
+ "CAMEL_COMPONENT_LPR",
+ "CAMEL_COMPONENT_LUCENE",
+ "CAMEL_COMPONENT_LUMBERJACK",
+ "CAMEL_COMPONENT_MASTER",
+ "CAMEL_COMPONENT_METRICS",
+ "CAMEL_COMPONENT_MICROMETER",
+ "CAMEL_COMPONENT_MICROPROFILE_METRICS",
+ "CAMEL_COMPONENT_MILO_CLIENT",
+ "CAMEL_COMPONENT_MILO_SERVER",
+ "CAMEL_COMPONENT_MINA",
+ "CAMEL_COMPONENT_MINIO",
+ "CAMEL_COMPONENT_MLLP",
+ "CAMEL_COMPONENT_MOCK",
+ "CAMEL_COMPONENT_MONGODB",
+ "CAMEL_COMPONENT_MONGODB_GRIDFS",
+ "CAMEL_COMPONENT_MSV",
+ "CAMEL_COMPONENT_MUSTACHE",
+ "CAMEL_COMPONENT_MVEL",
+ "CAMEL_COMPONENT_MYBATIS",
+ "CAMEL_COMPONENT_MYBATIS_BEAN",
+ "CAMEL_COMPONENT_NAGIOS",
+ "CAMEL_COMPONENT_NATS",
+ "CAMEL_COMPONENT_NETTY",
+ "CAMEL_COMPONENT_NETTY_HTTP",
+ "CAMEL_COMPONENT_NITRITE",
+ "CAMEL_COMPONENT_NSQ",
+ "CAMEL_COMPONENT_OAIPMH",
+ "CAMEL_COMPONENT_OLINGO2",
+ "CAMEL_COMPONENT_OLINGO4",
+ "CAMEL_COMPONENT_OPENSHIFT_BUILDS",
+ "CAMEL_COMPONENT_OPENSHIFT_BUILD_CONFIGS",
+ "CAMEL_COMPONENT_OPENSTACK_CINDER",
+ "CAMEL_COMPONENT_OPENSTACK_GLANCE",
+ "CAMEL_COMPONENT_OPENSTACK_KEYSTONE",
+ "CAMEL_COMPONENT_OPENSTACK_NEUTRON",
+ "CAMEL_COMPONENT_OPENSTACK_NOVA",
+ "CAMEL_COMPONENT_OPENSTACK_SWIFT",
+ "CAMEL_COMPONENT_OPTAPLANNER",
+ "CAMEL_COMPONENT_PAHO",
+ "CAMEL_COMPONENT_PAHO_MQTT5",
+ "CAMEL_COMPONENT_PDF",
+ "CAMEL_COMPONENT_PGEVENT",
+ "CAMEL_COMPONENT_PG_REPLICATION_SLOT",
+ "CAMEL_COMPONENT_PLATFORM_HTTP",
+ "CAMEL_COMPONENT_POP3",
+ "CAMEL_COMPONENT_POP3S",
+ "CAMEL_COMPONENT_PUBNUB",
+ "CAMEL_COMPONENT_PULSAR",
+ "CAMEL_COMPONENT_QUARTZ",
+ "CAMEL_COMPONENT_QUICKFIX",
+ "CAMEL_COMPONENT_RABBITMQ",
+ "CAMEL_COMPONENT_REACTIVE_STREAMS",
+ "CAMEL_COMPONENT_REF",
+ "CAMEL_COMPONENT_REST",
+ "CAMEL_COMPONENT_RESTEASY",
+ "CAMEL_COMPONENT_REST_API",
+ "CAMEL_COMPONENT_REST_OPENAPI",
+ "CAMEL_COMPONENT_REST_SWAGGER",
+ "CAMEL_COMPONENT_ROBOTFRAMEWORK",
+ "CAMEL_COMPONENT_RSS",
+ "CAMEL_COMPONENT_SAGA",
+ "CAMEL_COMPONENT_SALESFORCE",
+ "CAMEL_COMPONENT_SAP_NETWEAVER",
+ "CAMEL_COMPONENT_SCHEDULER",
+ "CAMEL_COMPONENT_SCHEMATRON",
+ "CAMEL_COMPONENT_SCP",
+ "CAMEL_COMPONENT_SEDA",
+ "CAMEL_COMPONENT_SERVICE",
+ "CAMEL_COMPONENT_SERVICENOW",
+ "CAMEL_COMPONENT_SERVLET",
+ "CAMEL_COMPONENT_SFTP",
+ "CAMEL_COMPONENT_SIP",
+ "CAMEL_COMPONENT_SIPS",
+ "CAMEL_COMPONENT_SJMS",
+ "CAMEL_COMPONENT_SJMS2",
+ "CAMEL_COMPONENT_SLACK",
+ "CAMEL_COMPONENT_SMPP",
+ "CAMEL_COMPONENT_SMPPS",
+ "CAMEL_COMPONENT_SMTP",
+ "CAMEL_COMPONENT_SMTPS",
+ "CAMEL_COMPONENT_SNMP",
+ "CAMEL_COMPONENT_SOLR",
+ "CAMEL_COMPONENT_SOLRCLOUD",
+ "CAMEL_COMPONENT_SOLRS",
+ "CAMEL_COMPONENT_SOROUSH",
+ "CAMEL_COMPONENT_SPARK",
+ "CAMEL_COMPONENT_SPLUNK",
+ "CAMEL_COMPONENT_SPLUNK_HEC",
+ "CAMEL_COMPONENT_SPRING_BATCH",
+ "CAMEL_COMPONENT_SPRING_EVENT",
+ "CAMEL_COMPONENT_SPRING_INTEGRATION",
+ "CAMEL_COMPONENT_SPRING_LDAP",
+ "CAMEL_COMPONENT_SPRING_RABBITMQ",
+ "CAMEL_COMPONENT_SPRING_REDIS",
+ "CAMEL_COMPONENT_SPRING_WS",
+ "CAMEL_COMPONENT_SQL",
+ "CAMEL_COMPONENT_SQL_STORED",
+ "CAMEL_COMPONENT_SSH",
+ "CAMEL_COMPONENT_STAX",
+ "CAMEL_COMPONENT_STITCH",
+ "CAMEL_COMPONENT_STOMP",
+ "CAMEL_COMPONENT_STREAM",
+ "CAMEL_COMPONENT_STRING_TEMPLATE",
+ "CAMEL_COMPONENT_STUB",
+ "CAMEL_COMPONENT_TELEGRAM",
+ "CAMEL_COMPONENT_THRIFT",
+ "CAMEL_COMPONENT_TIKA",
+ "CAMEL_COMPONENT_TIMER",
+ "CAMEL_COMPONENT_TWILIO",
+ "CAMEL_COMPONENT_TWITTER_DIRECTMESSAGE",
+ "CAMEL_COMPONENT_TWITTER_SEARCH",
+ "CAMEL_COMPONENT_TWITTER_TIMELINE",
+ "CAMEL_COMPONENT_UNDERTOW",
+ "CAMEL_COMPONENT_VALIDATOR",
+ "CAMEL_COMPONENT_VELOCITY",
+ "CAMEL_COMPONENT_VERTX",
+ "CAMEL_COMPONENT_VERTX_HTTP",
+ "CAMEL_COMPONENT_VERTX_KAFKA",
+ "CAMEL_COMPONENT_VERTX_WEBSOCKET",
+ "CAMEL_COMPONENT_VM",
+ "CAMEL_COMPONENT_WEATHER",
+ "CAMEL_COMPONENT_WEB3J",
+ "CAMEL_COMPONENT_WEBHOOK",
+ "CAMEL_COMPONENT_WEBSOCKET",
+ "CAMEL_COMPONENT_WEBSOCKET_JSR356",
+ "CAMEL_COMPONENT_WEKA",
+ "CAMEL_COMPONENT_WORDPRESS",
+ "CAMEL_COMPONENT_WORKDAY",
+ "CAMEL_COMPONENT_XCHANGE",
+ "CAMEL_COMPONENT_XJ",
+ "CAMEL_COMPONENT_XMLSECURITY_SIGN",
+ "CAMEL_COMPONENT_XMLSECURITY_VERIFY",
+ "CAMEL_COMPONENT_XMPP",
+ "CAMEL_COMPONENT_XQUERY",
+ "CAMEL_COMPONENT_XSLT",
+ "CAMEL_COMPONENT_XSLT_SAXON",
+ "CAMEL_COMPONENT_YAMMER",
+ "CAMEL_COMPONENT_ZENDESK",
+ "CAMEL_COMPONENT_ZOOKEEPER",
+ "CAMEL_COMPONENT_ZOOKEEPER_MASTER"
+ // COMPONENT-ENV-NAMES: END
+ ));
+
+ private static final Set<String> DATAFORMAT_ENV_NAMES = new HashSet<>(
+ Arrays.asList(
+ // Generated by camel build tools - do NOT edit this list!
+ // DATAFORMAT-ENV-NAMES: START
+ "CAMEL_DATAFORMAT_ANY23",
+ "CAMEL_DATAFORMAT_ASN1",
+ "CAMEL_DATAFORMAT_AVRO",
+ "CAMEL_DATAFORMAT_BARCODE",
+ "CAMEL_DATAFORMAT_BASE64",
+ "CAMEL_DATAFORMAT_BEANIO",
+ "CAMEL_DATAFORMAT_BINDY_CSV",
+ "CAMEL_DATAFORMAT_BINDY_FIXED",
+ "CAMEL_DATAFORMAT_BINDY_KVP",
+ "CAMEL_DATAFORMAT_CBOR",
+ "CAMEL_DATAFORMAT_CRYPTO",
+ "CAMEL_DATAFORMAT_CSV",
+ "CAMEL_DATAFORMAT_FHIRJSON",
+ "CAMEL_DATAFORMAT_FHIRXML",
+ "CAMEL_DATAFORMAT_FLATPACK",
+ "CAMEL_DATAFORMAT_GROK",
+ "CAMEL_DATAFORMAT_GZIPDEFLATER",
+ "CAMEL_DATAFORMAT_HL7",
+ "CAMEL_DATAFORMAT_ICAL",
+ "CAMEL_DATAFORMAT_JACKSONXML",
+ "CAMEL_DATAFORMAT_JAXB",
+ "CAMEL_DATAFORMAT_JSONAPI",
+ "CAMEL_DATAFORMAT_JSON_FASTJSON",
+ "CAMEL_DATAFORMAT_JSON_GSON",
+ "CAMEL_DATAFORMAT_JSON_JACKSON",
+ "CAMEL_DATAFORMAT_JSON_JOHNZON",
+ "CAMEL_DATAFORMAT_JSON_JSONB",
+ "CAMEL_DATAFORMAT_JSON_XSTREAM",
+ "CAMEL_DATAFORMAT_LZF",
+ "CAMEL_DATAFORMAT_MIME_MULTIPART",
+ "CAMEL_DATAFORMAT_PGP",
+ "CAMEL_DATAFORMAT_PROTOBUF",
+ "CAMEL_DATAFORMAT_RSS",
+ "CAMEL_DATAFORMAT_SECUREXML",
+ "CAMEL_DATAFORMAT_SOAPJAXB",
+ "CAMEL_DATAFORMAT_SYSLOG",
+ "CAMEL_DATAFORMAT_TARFILE",
+ "CAMEL_DATAFORMAT_THRIFT",
+ "CAMEL_DATAFORMAT_TIDYMARKUP",
+ "CAMEL_DATAFORMAT_UNIVOCITY_CSV",
+ "CAMEL_DATAFORMAT_UNIVOCITY_FIXED",
+ "CAMEL_DATAFORMAT_UNIVOCITY_TSV",
+ "CAMEL_DATAFORMAT_XSTREAM",
+ "CAMEL_DATAFORMAT_YAML_SNAKEYAML",
+ "CAMEL_DATAFORMAT_ZIPDEFLATER",
+ "CAMEL_DATAFORMAT_ZIPFILE"
+ // DATAFORMAT-ENV-NAMES: END
+ ));
+
+ private static final Set<String> LANGUAGE_ENV_NAMES = new HashSet<>(
+ Arrays.asList(
+ // Generated by camel build tools - do NOT edit this list!
+ // LANGUAGE-ENV-NAMES: START
+ "CAMEL_LANGUAGE_BEAN",
+ "CAMEL_LANGUAGE_CONSTANT",
+ "CAMEL_LANGUAGE_CSIMPLE",
+ "CAMEL_LANGUAGE_DATASONNET",
+ "CAMEL_LANGUAGE_EXCHANGEPROPERTY",
+ "CAMEL_LANGUAGE_FILE",
+ "CAMEL_LANGUAGE_GROOVY",
+ "CAMEL_LANGUAGE_HEADER",
+ "CAMEL_LANGUAGE_HL7TERSER",
+ "CAMEL_LANGUAGE_JOOR",
+ "CAMEL_LANGUAGE_JSONPATH",
+ "CAMEL_LANGUAGE_MVEL",
+ "CAMEL_LANGUAGE_OGNL",
+ "CAMEL_LANGUAGE_REF",
+ "CAMEL_LANGUAGE_SIMPLE",
+ "CAMEL_LANGUAGE_SPEL",
+ "CAMEL_LANGUAGE_TOKENIZE",
+ "CAMEL_LANGUAGE_XPATH",
+ "CAMEL_LANGUAGE_XQUERY",
+ "CAMEL_LANGUAGE_XTOKENIZE"
+ // LANGUAGE-ENV-NAMES: END
+ ));
+
private MainHelper() {
}
@@ -68,7 +506,7 @@ public final class MainHelper {
System.getenv().forEach((k, v) -> {
k = k.toUpperCase(Locale.US);
if (k.startsWith(pk) || k.startsWith(pk2)) {
- String key = k.toLowerCase(Locale.ENGLISH).replace('_',
'.');
+ String key = k.toLowerCase(Locale.US).replace('_', '.');
answer.put(key, v);
}
});
@@ -77,6 +515,96 @@ public final class MainHelper {
return answer;
}
+ public static Map<String, String> filterEnvVariables(String[] prefixes) {
+ Map<String, String> answer = new HashMap<>();
+ System.getenv().forEach((k, v) -> {
+ final String uk = k.toUpperCase(Locale.US);
+ for (String prefix : prefixes) {
+ if (uk.startsWith(prefix)) {
+ answer.put(uk, v);
+ }
+ }
+ });
+ return answer;
+ }
+
+ public static void addComponentEnvVariables(Map<String, String> env,
Properties properties, boolean custom) {
+ Set<String> toRemove = new HashSet<>();
+ env.forEach((k, v) -> {
+ if (custom) {
+ toRemove.add(k);
+ String ck = "camel.component." +
k.substring(16).toLowerCase(Locale.US).replace('_', '-');
+ ck = ck.replaceFirst("-", ".");
+ properties.put(ck, v);
+ } else {
+ Optional<String> e =
COMPONENT_ENV_NAMES.stream().filter(k::startsWith).findFirst();
+ if (e.isPresent()) {
+ toRemove.add(k);
+ String cname = "camel.component." +
e.get().substring(16).toLowerCase(Locale.US).replace('_', '-');
+ String option = k.substring(cname.length() +
1).toLowerCase(Locale.US).replace('_', '-');
+ properties.put(cname + "." + option, v);
+ }
+ }
+ });
+ toRemove.forEach(env::remove);
+ }
+
+ public static void addDataFormatEnvVariables(Map<String, String> env,
Properties properties, boolean custom) {
+ Set<String> toRemove = new HashSet<>();
+ env.forEach((k, v) -> {
+ if (custom) {
+ toRemove.add(k);
+ String ck = "camel.dataformat." +
k.substring(17).toLowerCase(Locale.US).replace('_', '-');
+ ck = ck.replaceFirst("-", ".");
+ properties.put(ck, v);
+ } else {
+ Optional<String> e =
DATAFORMAT_ENV_NAMES.stream().filter(k::startsWith).findFirst();
+ if (e.isPresent()) {
+ toRemove.add(k);
+ String cname = "camel.dataformat." +
e.get().substring(17).toLowerCase(Locale.US).replace('_', '-');
+ String option = k.substring(cname.length() +
1).toLowerCase(Locale.US).replace('_', '-');
+ properties.put(cname + "." + option, v);
+ }
+ }
+ });
+ toRemove.forEach(env::remove);
+ }
+
+ public static void addLanguageEnvVariables(Map<String, String> env,
Properties properties, boolean custom) {
+ Set<String> toRemove = new HashSet<>();
+ env.forEach((k, v) -> {
+ if (custom) {
+ toRemove.add(k);
+ String ck = "camel.language." +
k.substring(15).toLowerCase(Locale.US).replace('_', '-');
+ ck = ck.replaceFirst("-", ".");
+ properties.put(ck, v);
+ } else {
+ Optional<String> e =
LANGUAGE_ENV_NAMES.stream().filter(k::startsWith).findFirst();
+ if (e.isPresent()) {
+ toRemove.add(k);
+ String cname = "camel.language." +
e.get().substring(15).toLowerCase(Locale.US).replace('_', '-');
+ String option = k.substring(cname.length() +
1).toLowerCase(Locale.US).replace('_', '-');
+ properties.put(cname + "." + option, v);
+ }
+ }
+ });
+ toRemove.forEach(env::remove);
+ }
+
+ private static String mapAsComponentName(String epk) {
+ for (String c : COMPONENT_ENV_NAMES) {
+ String ec = asEnvName(c);
+ if (epk.startsWith(ec)) {
+ return c.toUpperCase(Locale.US);
+ }
+ }
+ return null;
+ }
+
+ private static String asEnvName(String name) {
+ return name.toUpperCase(Locale.US).replace('-', '_');
+ }
+
public static Properties loadJvmSystemPropertiesAsProperties(String[]
prefixes) {
Properties answer = new OrderedProperties();
if (prefixes == null || prefixes.length == 0) {
diff --git
a/core/camel-main/src/test/java/org/apache/camel/main/MainHelperTest.java
b/core/camel-main/src/test/java/org/apache/camel/main/MainHelperTest.java
new file mode 100644
index 0000000..4469aff
--- /dev/null
+++ b/core/camel-main/src/test/java/org/apache/camel/main/MainHelperTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.main;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.camel.util.OrderedProperties;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class MainHelperTest {
+
+ @Test
+ public void testAddComponentEnvVariables() {
+ Map<String, String> env = MainHelper.filterEnvVariables(new String[] {
"CAMEL_COMPONENT_" });
+ env.put("CAMEL_COMPONENT_AWS2_S3_ACCESS_KEY", "mysecretkey");
+ Properties prop = new OrderedProperties();
+ MainHelper.addComponentEnvVariables(env, prop, false);
+
+ Assertions.assertEquals(0, env.size());
+ Assertions.assertEquals(1, prop.size());
+ Assertions.assertEquals("mysecretkey",
prop.getProperty("camel.component.aws2-s3.access-key"));
+ }
+
+ @Test
+ public void testAddDataFormatEnvVariables() {
+ Map<String, String> env = MainHelper.filterEnvVariables(new String[] {
"CAMEL_DATAFORMAT_" });
+ env.put("CAMEL_DATAFORMAT_BASE64_LINE_LENGTH", "64");
+ env.put("CAMEL_DATAFORMAT_JACKSONXML_PRETTYPRINT", "true");
+ Properties prop = new OrderedProperties();
+ MainHelper.addDataFormatEnvVariables(env, prop, false);
+
+ Assertions.assertEquals(0, env.size());
+ Assertions.assertEquals(2, prop.size());
+ Assertions.assertEquals("64",
prop.getProperty("camel.dataformat.base64.line-length"));
+ Assertions.assertEquals("true",
prop.getProperty("camel.dataformat.jacksonxml.prettyprint"));
+ }
+
+ @Test
+ public void testAddLanguageEnvVariables() {
+ Map<String, String> env = MainHelper.filterEnvVariables(new String[] {
"CAMEL_LANGUAGE_" });
+ env.put("CAMEL_LANGUAGE_JOOR_PRE_COMPILE", "false");
+ Properties prop = new OrderedProperties();
+ MainHelper.addLanguageEnvVariables(env, prop, false);
+
+ Assertions.assertEquals(0, env.size());
+ Assertions.assertEquals(1, prop.size());
+ Assertions.assertEquals("false",
prop.getProperty("camel.language.joor.pre-compile"));
+ }
+
+ @Test
+ public void testAddCustomComponentEnvVariables() {
+ Map<String, String> env = MainHelper.filterEnvVariables(new String[] {
"CAMEL_COMPONENT_" });
+ env.put("CAMEL_COMPONENT_AWS2_S3_ACCESS_KEY", "mysecretkey");
+ env.put("CAMEL_COMPONENT_FOO_VERBOSE", "true");
+ env.put("CAMEL_COMPONENT_FOO_PRETTY_PRINT", "false");
+ Properties prop = new OrderedProperties();
+ MainHelper.addComponentEnvVariables(env, prop, false);
+
+ Assertions.assertEquals(2, env.size());
+ Assertions.assertEquals(1, prop.size());
+ Assertions.assertEquals("mysecretkey",
prop.getProperty("camel.component.aws2-s3.access-key"));
+
+ MainHelper.addComponentEnvVariables(env, prop, true);
+
+ Assertions.assertEquals(0, env.size());
+ Assertions.assertEquals(3, prop.size());
+ Assertions.assertEquals("mysecretkey",
prop.getProperty("camel.component.aws2-s3.access-key"));
+ Assertions.assertEquals("true",
prop.getProperty("camel.component.foo.verbose"));
+ Assertions.assertEquals("false",
prop.getProperty("camel.component.foo.pretty-print"));
+ }
+
+}
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateMainHelper.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateMainHelper.java
new file mode 100644
index 0000000..b9dbbe7
--- /dev/null
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateMainHelper.java
@@ -0,0 +1,171 @@
+/*
+ * 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.maven.packaging;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.LanguageModel;
+import org.apache.camel.tooling.util.PackageHelper;
+import org.apache.camel.tooling.util.Strings;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
+
+/**
+ * Updates the MainHelper.java with the known component, data-format, and
language names.
+ */
+@Mojo(name = "update-main-helper", threadSafe = true)
+public class UpdateMainHelper extends AbstractGeneratorMojo {
+
+ private static final String COMPONENT_START_TOKEN = "//
COMPONENT-ENV-NAMES: START";
+ private static final String COMPONENT_END_TOKEN = "// COMPONENT-ENV-NAMES:
END";
+ private static final String DATAFORMAT_START_TOKEN = "//
DATAFORMAT-ENV-NAMES: START";
+ private static final String DATAFORMAT_END_TOKEN = "//
DATAFORMAT-ENV-NAMES: END";
+ private static final String LANGUAGE_START_TOKEN = "// LANGUAGE-ENV-NAMES:
START";
+ private static final String LANGUAGE_END_TOKEN = "// LANGUAGE-ENV-NAMES:
END";
+
+ @Parameter(defaultValue =
"${project.basedir}/src/generated/resources/org/apache/camel/catalog/")
+ protected File jsonDir;
+
+ @Parameter(defaultValue = "${project.basedir}/")
+ protected File baseDir;
+
+ /**
+ * Execute goal.
+ *
+ * @throws MojoExecutionException execution of the main class or one of
the threads it generated failed.
+ * @throws MojoFailureException something bad happened...
+ */
+ @Override
+ public void execute() throws MojoExecutionException, MojoFailureException {
+ File camelDir = findCamelDirectory(baseDir, "core/camel-main");
+ if (camelDir == null) {
+ getLog().debug("No core/camel-main folder found, skipping
execution");
+ return;
+ }
+
+ List<Path> jsonFiles =
PackageHelper.findJsonFiles(jsonDir.toPath()).collect(Collectors.toList());
+ Set<String> components = new TreeSet<>();
+ Set<String> dataformats = new TreeSet<>();
+ Set<String> languages = new TreeSet<>();
+
+ for (Path file : jsonFiles) {
+ final String name = PackageHelper.asName(file);
+
+ try {
+ String json = PackageHelper.loadText(file.toFile());
+ JsonObject obj = (JsonObject) Jsoner.deserialize(json);
+
+ Map<String, Object> model;
+ boolean isComponent = (model = obj.getMap("component")) !=
null;
+ boolean isDataFormat = !isComponent && (model =
obj.getMap("dataformat")) != null;
+ boolean isLanguage = !isComponent && !isDataFormat && (model =
obj.getMap("language")) != null;
+
+ // only check these kind
+ if (!isComponent && !isDataFormat && !isLanguage) {
+ continue;
+ }
+
+ if (isComponent) {
+ ComponentModel cm =
JsonMapper.generateComponentModel(json);
+ components.add(asEnvName("CAMEL_COMPONENT_",
cm.getScheme()));
+ if (cm.getAlternativeSchemes() != null) {
+ String[] aliases =
cm.getAlternativeSchemes().split(",");
+ for (String alias : aliases) {
+ components.add(asEnvName("CAMEL_COMPONENT_",
alias));
+ }
+ }
+ } else if (isDataFormat) {
+ DataFormatModel dm =
JsonMapper.generateDataFormatModel(json);
+ dataformats.add(asEnvName("CAMEL_DATAFORMAT_",
dm.getName()));
+ } else if (isLanguage) {
+ LanguageModel lm = JsonMapper.generateLanguageModel(json);
+ languages.add(asEnvName("CAMEL_LANGUAGE_", lm.getName()));
+ }
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error loading json: " +
name, e);
+ }
+ }
+
+ try {
+ boolean updated = updateMainHelper(camelDir, components,
COMPONENT_START_TOKEN, COMPONENT_END_TOKEN);
+ updated |= updateMainHelper(camelDir, dataformats,
DATAFORMAT_START_TOKEN, DATAFORMAT_END_TOKEN);
+ updated |= updateMainHelper(camelDir, languages,
LANGUAGE_START_TOKEN, LANGUAGE_END_TOKEN);
+ if (updated) {
+ getLog().info("Updated
camel-main/src/main/java/org/apache/camel/main/MainHelper.java file");
+ } else {
+ getLog().debug("No changes to
camel-main/src/main/java/org/apache/camel/main/MainHelper.java file");
+ }
+
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error updating MainHelper.java",
e);
+ }
+ }
+
+ private boolean updateMainHelper(File camelDir, Set<String> names, String
startToken, String endToken) throws Exception {
+ // load source code and update
+ File java = new File(camelDir,
"src/main/java/org/apache/camel/main/MainHelper.java");
+ String text = PackageHelper.loadText(java);
+ String spaces20 = " ";
+ String spaces12 = " ";
+
+ StringJoiner sb = new StringJoiner(",\n");
+ for (String name : names) {
+ sb.add(spaces20 + "\"" + name + "\"");
+ }
+ String changed = sb.toString();
+
+ String existing = Strings.between(text, startToken, endToken);
+ if (existing != null) {
+ // remove leading line breaks etc
+ existing = existing.trim();
+ changed = changed.trim();
+ if (existing.equals(changed)) {
+ return false;
+ } else {
+ String before = Strings.before(text, startToken);
+ String after = Strings.after(text, endToken);
+ text = before + startToken + "\n" + spaces20 + changed + "\n"
+ spaces12 + endToken + after;
+ PackageHelper.writeText(java, text);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private static String asEnvName(String prefix, String name) {
+ return prefix + name.toUpperCase(Locale.US).replace('-', '_');
+ }
+
+}