gnodet-bot commented on code in PR #26459:
URL: https://github.com/apache/camel/pull/26459#discussion_r4014298678
##########
core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/DataFormatReifier.java:
##########
@@ -97,7 +98,11 @@ public static DataFormat getDataFormat(CamelContext
camelContext, DataFormatDefi
if (type == null) {
dataFormat = camelContext.resolveDataFormat(ref);
if (dataFormat == null) {
- throw new IllegalArgumentException("Cannot find data
format in registry with ref: " + ref);
+ // the ref may be the name of a built-in data format whose
jar is missing
+ String artifact = ArtifactUtils.dataFormatArtifact(ref);
+ throw new IllegalArgumentException(
+ "Cannot find data format in registry with ref: " +
ref
+ + (artifact != null ?
ArtifactUtils.dataFormatHint(ref) : ""));
Review Comment:
**Redundant double-lookup.** `dataFormatArtifact(ref)` checks
`DATAFORMATS.get(ref)`, then if non-null, `dataFormatHint(ref)` immediately
does the same lookup again inside `hint()`. The `hint()` method already returns
`""` for unknown names (null guard at its top), so the outer pre-check adds
nothing. This also diverges from the pattern used at the `createDataFormat()`
call site below (line 130), which correctly calls `dataFormatHint(name)`
directly.
```suggestion
throw new IllegalArgumentException(
"Cannot find data format in registry with ref: "
+ ref
+ ArtifactUtils.dataFormatHint(ref));
```
##########
core/camel-util/src/main/java/org/apache/camel/util/ArtifactUtils.java:
##########
@@ -0,0 +1,865 @@
+/*
+ * 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.util;
+
+import java.util.Collection;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Which Camel artifact (Maven artifactId) ships a component, data format,
language or built-in bean.
+ * <p/>
+ * The runtime cannot tell this on its own: the metadata that knows is in the
jar that is missing. So the tables are
+ * generated from the catalog at build time (like {@link SensitiveUtils}) and
used by the error messages that say what
+ * to add to the classpath when a name cannot be resolved, or which known name
was likely meant.
+ */
+public final class ArtifactUtils {
+
+ // scheme -> artifactId, including alternative schemes
+ private static final Map<String, String> COMPONENTS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // COMPONENTS: START
+ Map.entry("a2a", "camel-a2a"),
+ Map.entry("activemq", "camel-activemq"),
+ Map.entry("activemq6", "camel-activemq6"),
+ Map.entry("ai-resource", "camel-ai-resource"),
+ Map.entry("ai-tool", "camel-ai-tool"),
+ Map.entry("alibaba-eventbridge", "camel-alibaba-eventbridge"),
+ Map.entry("alibaba-fc", "camel-alibaba-fc"),
+ Map.entry("alibaba-kms", "camel-alibaba-kms"),
+ Map.entry("alibaba-mns", "camel-alibaba-mns"),
+ Map.entry("alibaba-oss", "camel-alibaba-oss"),
+ Map.entry("alibaba-ots", "camel-alibaba-ots"),
+ Map.entry("alibaba-sls", "camel-alibaba-sls"),
+ Map.entry("alibaba-sms", "camel-alibaba-sms"),
+ Map.entry("amqp", "camel-amqp"),
+ Map.entry("arangodb", "camel-arangodb"),
+ Map.entry("as2", "camel-as2"),
+ Map.entry("asterisk", "camel-asterisk"),
+ Map.entry("atmosphere-websocket", "camel-atmosphere-websocket"),
+ Map.entry("atom", "camel-atom"),
+ Map.entry("avro", "camel-avro-rpc"),
+ Map.entry("aws-bedrock", "camel-aws-bedrock"),
+ Map.entry("aws-bedrock-agent", "camel-aws-bedrock"),
+ Map.entry("aws-bedrock-agent-runtime", "camel-aws-bedrock"),
+ Map.entry("aws-cloudtrail", "camel-aws-cloudtrail"),
+ Map.entry("aws-config", "camel-aws-config"),
+ Map.entry("aws-secrets-manager", "camel-aws-secrets-manager"),
+ Map.entry("aws-security-hub", "camel-aws-security-hub"),
+ Map.entry("aws2-athena", "camel-aws2-athena"),
+ Map.entry("aws2-comprehend", "camel-aws2-comprehend"),
+ Map.entry("aws2-cw", "camel-aws2-cw"),
+ Map.entry("aws2-ddb", "camel-aws2-ddb"),
+ Map.entry("aws2-ddbstream", "camel-aws2-ddb"),
+ Map.entry("aws2-ec2", "camel-aws2-ec2"),
+ Map.entry("aws2-ecs", "camel-aws2-ecs"),
+ Map.entry("aws2-eks", "camel-aws2-eks"),
+ Map.entry("aws2-eventbridge", "camel-aws2-eventbridge"),
+ Map.entry("aws2-iam", "camel-aws2-iam"),
+ Map.entry("aws2-kinesis", "camel-aws2-kinesis"),
+ Map.entry("aws2-kinesis-firehose", "camel-aws2-kinesis"),
+ Map.entry("aws2-kms", "camel-aws2-kms"),
+ Map.entry("aws2-lambda", "camel-aws2-lambda"),
+ Map.entry("aws2-mq", "camel-aws2-mq"),
+ Map.entry("aws2-msk", "camel-aws2-msk"),
+ Map.entry("aws2-polly", "camel-aws2-polly"),
+ Map.entry("aws2-redshift-data", "camel-aws2-redshift"),
+ Map.entry("aws2-rekognition", "camel-aws2-rekognition"),
+ Map.entry("aws2-s3", "camel-aws2-s3"),
+ Map.entry("aws2-s3-vectors", "camel-aws2-s3-vectors"),
+ Map.entry("aws2-ses", "camel-aws2-ses"),
+ Map.entry("aws2-sns", "camel-aws2-sns"),
+ Map.entry("aws2-sqs", "camel-aws2-sqs"),
+ Map.entry("aws2-step-functions", "camel-aws2-step-functions"),
+ Map.entry("aws2-sts", "camel-aws2-sts"),
+ Map.entry("aws2-textract", "camel-aws2-textract"),
+ Map.entry("aws2-timestream", "camel-aws2-timestream"),
+ Map.entry("aws2-transcribe", "camel-aws2-transcribe"),
+ Map.entry("aws2-translate", "camel-aws2-translate"),
+ Map.entry("azure-cosmosdb", "camel-azure-cosmosdb"),
+ Map.entry("azure-eventhubs", "camel-azure-eventhubs"),
+ Map.entry("azure-files", "camel-azure-files"),
+ Map.entry("azure-functions", "camel-azure-functions"),
+ Map.entry("azure-key-vault", "camel-azure-key-vault"),
+ Map.entry("azure-servicebus", "camel-azure-servicebus"),
+ Map.entry("azure-storage-blob", "camel-azure-storage-blob"),
+ Map.entry("azure-storage-datalake",
"camel-azure-storage-datalake"),
+ Map.entry("azure-storage-queue", "camel-azure-storage-queue"),
+ Map.entry("bean", "camel-bean"),
+ Map.entry("bean-validator", "camel-bean-validator"),
+ Map.entry("bonita", "camel-bonita"),
+ Map.entry("box", "camel-box"),
+ Map.entry("braintree", "camel-braintree"),
+ Map.entry("browse", "camel-browse"),
+ Map.entry("caffeine-cache", "camel-caffeine"),
+ Map.entry("caffeine-loadcache", "camel-caffeine"),
+ Map.entry("camunda", "camel-camunda"),
+ Map.entry("chatscript", "camel-chatscript"),
+ Map.entry("chunk", "camel-chunk"),
+ Map.entry("class", "camel-bean"),
+ Map.entry("clickhouse", "camel-clickhouse"),
+ Map.entry("clickup", "camel-clickup"),
+ Map.entry("cm-sms", "camel-cm-sms"),
+ Map.entry("coap", "camel-coap"),
+ Map.entry("coap+tcp", "camel-coap"),
+ Map.entry("coaps", "camel-coap"),
+ Map.entry("coaps+tcp", "camel-coap"),
+ Map.entry("cometd", "camel-cometd"),
+ Map.entry("cometds", "camel-cometd"),
+ Map.entry("consul", "camel-consul"),
+ Map.entry("controlbus", "camel-controlbus"),
+ Map.entry("couchbase", "camel-couchbase"),
+ Map.entry("couchdb", "camel-couchdb"),
+ Map.entry("cql", "camel-cassandraql"),
+ Map.entry("cron", "camel-cron"),
+ Map.entry("crypto", "camel-crypto"),
+ Map.entry("cxf", "camel-cxf-soap"),
+ Map.entry("cxfrs", "camel-cxf-rest"),
+ Map.entry("cyberark-vault", "camel-cyberark-vault"),
+ Map.entry("dapr", "camel-dapr"),
+ Map.entry("dataformat", "camel-dataformat"),
+ Map.entry("dataset", "camel-dataset"),
+ Map.entry("dataset-test", "camel-dataset"),
+ Map.entry("debezium-db2", "camel-debezium-db2"),
+ Map.entry("debezium-mongodb", "camel-debezium-mongodb"),
+ Map.entry("debezium-mysql", "camel-debezium-mysql"),
+ Map.entry("debezium-oracle", "camel-debezium-oracle"),
+ Map.entry("debezium-postgres", "camel-debezium-postgres"),
+ Map.entry("debezium-sqlserver", "camel-debezium-sqlserver"),
+ Map.entry("dfdl", "camel-dfdl"),
+ Map.entry("dhis2", "camel-dhis2"),
+ Map.entry("direct", "camel-direct"),
+ Map.entry("disruptor", "camel-disruptor"),
+ Map.entry("disruptor-vm", "camel-disruptor"),
+ Map.entry("djl", "camel-djl"),
+ Map.entry("dns", "camel-dns"),
+ Map.entry("docker", "camel-docker"),
+ Map.entry("docling", "camel-docling"),
+ Map.entry("drill", "camel-drill"),
+ Map.entry("dropbox", "camel-dropbox"),
+ Map.entry("duckdb", "camel-duckdb"),
+ Map.entry("dynamic-router", "camel-dynamic-router"),
+ Map.entry("dynamic-router-control", "camel-dynamic-router"),
+ Map.entry("ehcache", "camel-ehcache"),
+ Map.entry("elasticsearch", "camel-elasticsearch"),
+ Map.entry("elasticsearch-rest-client",
"camel-elasticsearch-rest-client"),
+ Map.entry("event", "camel-event"),
+ Map.entry("exec", "camel-exec"),
+ Map.entry("fhir", "camel-fhir"),
+ Map.entry("file", "camel-file"),
+ Map.entry("file-watch", "camel-file-watch"),
+ Map.entry("flatpack", "camel-flatpack"),
+ Map.entry("flink", "camel-flink"),
+ Map.entry("flowable", "camel-flowable"),
+ Map.entry("fop", "camel-fop"),
+ Map.entry("freemarker", "camel-freemarker"),
+ Map.entry("ftp", "camel-ftp"),
+ Map.entry("ftps", "camel-ftp"),
+ Map.entry("geocoder", "camel-geocoder"),
+ Map.entry("git", "camel-git"),
+ Map.entry("github2", "camel-github2"),
+ Map.entry("google-bigquery", "camel-google-bigquery"),
+ Map.entry("google-bigquery-sql", "camel-google-bigquery"),
+ Map.entry("google-calendar", "camel-google-calendar"),
+ Map.entry("google-calendar-stream", "camel-google-calendar"),
+ Map.entry("google-drive", "camel-google-drive"),
+ Map.entry("google-firestore", "camel-google-firestore"),
+ Map.entry("google-functions", "camel-google-functions"),
+ Map.entry("google-mail", "camel-google-mail"),
+ Map.entry("google-mail-stream", "camel-google-mail"),
+ Map.entry("google-pubsub", "camel-google-pubsub"),
+ Map.entry("google-secret-manager", "camel-google-secret-manager"),
+ Map.entry("google-sheets", "camel-google-sheets"),
+ Map.entry("google-sheets-stream", "camel-google-sheets"),
+ Map.entry("google-speech-to-text", "camel-google-speech-to-text"),
+ Map.entry("google-storage", "camel-google-storage"),
+ Map.entry("google-text-to-speech", "camel-google-text-to-speech"),
+ Map.entry("google-vertexai", "camel-google-vertexai"),
+ Map.entry("google-vision", "camel-google-vision"),
+ Map.entry("graphql", "camel-graphql"),
+ Map.entry("grpc", "camel-grpc"),
+ Map.entry("hashicorp-vault", "camel-hashicorp-vault"),
+ Map.entry("hazelcast-atomicvalue", "camel-hazelcast"),
+ Map.entry("hazelcast-instance", "camel-hazelcast"),
+ Map.entry("hazelcast-list", "camel-hazelcast"),
+ Map.entry("hazelcast-map", "camel-hazelcast"),
+ Map.entry("hazelcast-multimap", "camel-hazelcast"),
+ Map.entry("hazelcast-pncounter", "camel-hazelcast"),
+ Map.entry("hazelcast-queue", "camel-hazelcast"),
+ Map.entry("hazelcast-replicatedmap", "camel-hazelcast"),
+ Map.entry("hazelcast-ringbuffer", "camel-hazelcast"),
+ Map.entry("hazelcast-seda", "camel-hazelcast"),
+ Map.entry("hazelcast-set", "camel-hazelcast"),
+ Map.entry("hazelcast-topic", "camel-hazelcast"),
+ Map.entry("hivemq", "camel-hivemq"),
+ Map.entry("http", "camel-http"),
+ Map.entry("https", "camel-http"),
+ Map.entry("huggingface", "camel-huggingface"),
+ Map.entry("hwcloud-dms", "camel-huaweicloud-dms"),
+ Map.entry("hwcloud-frs", "camel-huaweicloud-frs"),
+ Map.entry("hwcloud-functiongraph",
"camel-huaweicloud-functiongraph"),
+ Map.entry("hwcloud-iam", "camel-huaweicloud-iam"),
+ Map.entry("hwcloud-imagerecognition",
"camel-huaweicloud-imagerecognition"),
+ Map.entry("hwcloud-obs", "camel-huaweicloud-obs"),
+ Map.entry("hwcloud-smn", "camel-huaweicloud-smn"),
+ Map.entry("ibm-cos", "camel-ibm-cos"),
+ Map.entry("ibm-secrets-manager", "camel-ibm-secrets-manager"),
+ Map.entry("ibm-watson-discovery", "camel-ibm-watson-discovery"),
+ Map.entry("ibm-watson-language", "camel-ibm-watson-language"),
+ Map.entry("ibm-watson-speech-to-text",
"camel-ibm-watson-speech-to-text"),
+ Map.entry("ibm-watson-text-to-speech",
"camel-ibm-watson-text-to-speech"),
+ Map.entry("ibm-watsonx-ai", "camel-ibm-watsonx-ai"),
+ Map.entry("ibm-watsonx-data", "camel-ibm-watsonx-data"),
+ Map.entry("iggy", "camel-iggy"),
+ Map.entry("ignite-cache", "camel-ignite"),
+ Map.entry("ignite-compute", "camel-ignite"),
+ Map.entry("ignite-events", "camel-ignite"),
+ Map.entry("ignite-idgen", "camel-ignite"),
+ Map.entry("ignite-messaging", "camel-ignite"),
+ Map.entry("ignite-queue", "camel-ignite"),
+ Map.entry("ignite-set", "camel-ignite"),
+ Map.entry("imap", "camel-mail"),
+ Map.entry("imaps", "camel-mail"),
+ Map.entry("infinispan", "camel-infinispan"),
+ Map.entry("infinispan-embedded", "camel-infinispan-embedded"),
+ Map.entry("influxdb", "camel-influxdb"),
+ Map.entry("influxdb2", "camel-influxdb2"),
+ Map.entry("jcache", "camel-jcache"),
+ Map.entry("jcr", "camel-jcr"),
+ Map.entry("jdbc", "camel-jdbc"),
+ Map.entry("jetty", "camel-jetty"),
+ Map.entry("jgroups", "camel-jgroups"),
+ Map.entry("jgroups-raft", "camel-jgroups-raft"),
+ Map.entry("jira", "camel-jira"),
+ Map.entry("jms", "camel-jms"),
+ Map.entry("jmx", "camel-jmx"),
+ Map.entry("jolt", "camel-jolt"),
+ Map.entry("jooq", "camel-jooq"),
+ Map.entry("jpa", "camel-jpa"),
+ Map.entry("jslt", "camel-jslt"),
+ Map.entry("json-validator", "camel-json-validator"),
+ Map.entry("jsonata", "camel-jsonata"),
+ Map.entry("jt400", "camel-jt400"),
+ Map.entry("jte", "camel-jte"),
+ Map.entry("kafka", "camel-kafka"),
+ Map.entry("kamelet", "camel-kamelet"),
+ Map.entry("keycloak", "camel-keycloak"),
+ Map.entry("knative", "camel-knative"),
+ Map.entry("kserve", "camel-kserve"),
+ Map.entry("kubernetes-config-maps", "camel-kubernetes"),
+ Map.entry("kubernetes-cronjob", "camel-kubernetes"),
+ Map.entry("kubernetes-custom-resources", "camel-kubernetes"),
+ Map.entry("kubernetes-deployments", "camel-kubernetes"),
+ Map.entry("kubernetes-events", "camel-kubernetes"),
+ Map.entry("kubernetes-hpa", "camel-kubernetes"),
+ Map.entry("kubernetes-job", "camel-kubernetes"),
+ Map.entry("kubernetes-namespaces", "camel-kubernetes"),
+ Map.entry("kubernetes-nodes", "camel-kubernetes"),
+ Map.entry("kubernetes-persistent-volumes", "camel-kubernetes"),
+ Map.entry("kubernetes-persistent-volumes-claims",
"camel-kubernetes"),
+ Map.entry("kubernetes-pods", "camel-kubernetes"),
+ Map.entry("kubernetes-replication-controllers",
"camel-kubernetes"),
+ Map.entry("kubernetes-resources-quota", "camel-kubernetes"),
+ Map.entry("kubernetes-secrets", "camel-kubernetes"),
+ Map.entry("kubernetes-service-accounts", "camel-kubernetes"),
+ Map.entry("kubernetes-services", "camel-kubernetes"),
+ Map.entry("kudu", "camel-kudu"),
+ Map.entry("langchain4j-agent", "camel-langchain4j-agent"),
+ Map.entry("langchain4j-chat", "camel-langchain4j-chat"),
+ Map.entry("langchain4j-embeddings",
"camel-langchain4j-embeddings"),
+ Map.entry("langchain4j-embeddingstore",
"camel-langchain4j-embeddingstore"),
+ Map.entry("langchain4j-ingest", "camel-langchain4j-ingest"),
+ Map.entry("langchain4j-web-search",
"camel-langchain4j-web-search"),
+ Map.entry("language", "camel-language"),
+ Map.entry("ldap", "camel-ldap"),
+ Map.entry("ldif", "camel-ldif"),
+ Map.entry("log", "camel-log"),
+ Map.entry("lpr", "camel-printer"),
+ Map.entry("lucene", "camel-lucene"),
+ Map.entry("lumberjack", "camel-lumberjack"),
+ Map.entry("mapstruct", "camel-mapstruct"),
+ Map.entry("master", "camel-master"),
+ Map.entry("metrics", "camel-metrics"),
+ Map.entry("micrometer", "camel-micrometer"),
+ Map.entry("milo-browse", "camel-milo"),
+ Map.entry("milo-client", "camel-milo"),
+ Map.entry("milo-server", "camel-milo"),
+ Map.entry("milvus", "camel-milvus"),
+ Map.entry("mina", "camel-mina"),
+ Map.entry("mina-sftp", "camel-mina-sftp"),
+ Map.entry("minio", "camel-minio"),
+ Map.entry("mllp", "camel-mllp"),
+ Map.entry("mock", "camel-mock"),
+ Map.entry("mongodb", "camel-mongodb"),
+ Map.entry("mongodb-gridfs", "camel-mongodb-gridfs"),
+ Map.entry("mustache", "camel-mustache"),
+ Map.entry("mvel", "camel-mvel"),
+ Map.entry("mybatis", "camel-mybatis"),
+ Map.entry("mybatis-bean", "camel-mybatis"),
+ Map.entry("nats", "camel-nats"),
+ Map.entry("neo4j", "camel-neo4j"),
+ Map.entry("netty", "camel-netty"),
+ Map.entry("netty-http", "camel-netty-http"),
+ Map.entry("oaipmh", "camel-oaipmh"),
+ Map.entry("olingo2", "camel-olingo2"),
+ Map.entry("olingo4", "camel-olingo4"),
+ Map.entry("once", "camel-once"),
+ Map.entry("opa", "camel-opa"),
+ Map.entry("openai", "camel-openai"),
+ Map.entry("opensearch", "camel-opensearch"),
+ Map.entry("openshift-build-configs", "camel-kubernetes"),
+ Map.entry("openshift-builds", "camel-kubernetes"),
+ Map.entry("openshift-deploymentconfigs", "camel-kubernetes"),
+ Map.entry("openstack-cinder", "camel-openstack"),
+ Map.entry("openstack-glance", "camel-openstack"),
+ Map.entry("openstack-keystone", "camel-openstack"),
+ Map.entry("openstack-neutron", "camel-openstack"),
+ Map.entry("openstack-nova", "camel-openstack"),
+ Map.entry("openstack-swift", "camel-openstack"),
+ Map.entry("opentelemetry-metrics", "camel-opentelemetry-metrics"),
+ Map.entry("optaplanner", "camel-optaplanner"),
+ Map.entry("paho", "camel-paho"),
+ Map.entry("paho-mqtt5", "camel-paho-mqtt5"),
+ Map.entry("pdf", "camel-pdf"),
+ Map.entry("pg-replication-slot", "camel-pg-replication-slot"),
+ Map.entry("pgevent", "camel-pgevent"),
+ Map.entry("pgvector", "camel-pgvector"),
+ Map.entry("pinecone", "camel-pinecone"),
+ Map.entry("platform-http", "camel-platform-http"),
+ Map.entry("plc4x", "camel-plc4x"),
+ Map.entry("pop3", "camel-mail"),
+ Map.entry("pop3s", "camel-mail"),
+ Map.entry("pqc", "camel-pqc"),
+ Map.entry("pubnub", "camel-pubnub"),
+ Map.entry("pulsar", "camel-pulsar"),
+ Map.entry("qdrant", "camel-qdrant"),
+ Map.entry("quartz", "camel-quartz"),
+ Map.entry("quickfix", "camel-quickfix"),
+ Map.entry("reactive-streams", "camel-reactive-streams"),
+ Map.entry("ref", "camel-ref"),
+ Map.entry("rest", "camel-rest"),
+ Map.entry("rest-api", "camel-rest"),
+ Map.entry("rest-openapi", "camel-rest-openapi"),
+ Map.entry("rest-postman", "camel-rest-postman"),
+ Map.entry("robotframework", "camel-robotframework"),
+ Map.entry("rocketmq", "camel-rocketmq"),
+ Map.entry("rss", "camel-rss"),
+ Map.entry("saga", "camel-saga"),
+ Map.entry("salesforce", "camel-salesforce"),
+ Map.entry("sap-netweaver", "camel-sap-netweaver"),
+ Map.entry("scheduler", "camel-scheduler"),
+ Map.entry("schematron", "camel-schematron"),
+ Map.entry("scp", "camel-jsch"),
+ Map.entry("seda", "camel-seda"),
+ Map.entry("servicenow", "camel-servicenow"),
+ Map.entry("servlet", "camel-servlet"),
+ Map.entry("sftp", "camel-ftp"),
+ Map.entry("shell", "camel-shell"),
+ Map.entry("sjms", "camel-sjms"),
+ Map.entry("sjms2", "camel-sjms2"),
+ Map.entry("slack", "camel-slack"),
+ Map.entry("smb", "camel-smb"),
+ Map.entry("smooks", "camel-smooks"),
+ Map.entry("smpp", "camel-smpp"),
+ Map.entry("smpps", "camel-smpp"),
+ Map.entry("smtp", "camel-mail"),
+ Map.entry("smtps", "camel-mail"),
+ Map.entry("snmp", "camel-snmp"),
+ Map.entry("solr", "camel-solr"),
+ Map.entry("spiffe", "camel-spiffe"),
+ Map.entry("splunk-hec", "camel-splunk-hec"),
+ Map.entry("spring-ai-chat", "camel-spring-ai-chat"),
+ Map.entry("spring-ai-embeddings", "camel-spring-ai-embeddings"),
+ Map.entry("spring-ai-image", "camel-spring-ai-image"),
+ Map.entry("spring-ai-vector-store",
"camel-spring-ai-vector-store"),
+ Map.entry("spring-batch", "camel-spring-batch"),
+ Map.entry("spring-event", "camel-spring"),
+ Map.entry("spring-jdbc", "camel-spring-jdbc"),
+ Map.entry("spring-ldap", "camel-spring-ldap"),
+ Map.entry("spring-rabbitmq", "camel-spring-rabbitmq"),
+ Map.entry("spring-redis", "camel-spring-redis"),
+ Map.entry("spring-ws", "camel-spring-ws"),
+ Map.entry("sql", "camel-sql"),
+ Map.entry("sql-stored", "camel-sql"),
+ Map.entry("ssh", "camel-ssh"),
+ Map.entry("state-store", "camel-state-store"),
+ Map.entry("stax", "camel-stax"),
+ Map.entry("stitch", "camel-stitch"),
+ Map.entry("stream", "camel-stream"),
+ Map.entry("string-template", "camel-stringtemplate"),
+ Map.entry("stripe", "camel-stripe"),
+ Map.entry("stub", "camel-stub"),
+ Map.entry("tahu-edge", "camel-tahu"),
+ Map.entry("tahu-host", "camel-tahu"),
+ Map.entry("telegram", "camel-telegram"),
+ Map.entry("tensorflow-serving", "camel-tensorflow-serving"),
+ Map.entry("thrift", "camel-thrift"),
+ Map.entry("thymeleaf", "camel-thymeleaf"),
+ Map.entry("tika", "camel-tika"),
+ Map.entry("timer", "camel-timer"),
+ Map.entry("twilio", "camel-twilio"),
+ Map.entry("twitter-directmessage", "camel-twitter"),
+ Map.entry("twitter-search", "camel-twitter"),
+ Map.entry("twitter-timeline", "camel-twitter"),
+ Map.entry("undertow", "camel-undertow"),
+ Map.entry("validator", "camel-validator"),
+ Map.entry("velocity", "camel-velocity"),
+ Map.entry("vertx", "camel-vertx"),
+ Map.entry("vertx-http", "camel-vertx-http"),
+ Map.entry("vertx-websocket", "camel-vertx-websocket"),
+ Map.entry("wasm", "camel-wasm"),
+ Map.entry("weather", "camel-weather"),
+ Map.entry("weaviate", "camel-weaviate"),
+ Map.entry("web3j", "camel-web3j"),
+ Map.entry("webhook", "camel-webhook"),
+ Map.entry("whatsapp", "camel-whatsapp"),
+ Map.entry("wordpress", "camel-wordpress"),
+ Map.entry("workday", "camel-workday"),
+ Map.entry("xchange", "camel-xchange"),
+ Map.entry("xj", "camel-xj"),
+ Map.entry("xmlsecurity-sign", "camel-xmlsecurity"),
+ Map.entry("xmlsecurity-verify", "camel-xmlsecurity"),
+ Map.entry("xmpp", "camel-xmpp"),
+ Map.entry("xquery", "camel-saxon"),
+ Map.entry("xslt", "camel-xslt"),
+ Map.entry("xslt-saxon", "camel-xslt-saxon"),
+ Map.entry("zendesk", "camel-zendesk"),
+ Map.entry("zookeeper", "camel-zookeeper"),
+ Map.entry("zookeeper-master", "camel-zookeeper-master")
+ // COMPONENTS: END
+ );
+
+ // name -> artifactId
+ private static final Map<String, String> LANGUAGES = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // LANGUAGES: START
+ Map.entry("bean", "camel-bean"),
+ Map.entry("constant", "camel-core-languages"),
+ Map.entry("datasonnet", "camel-datasonnet"),
+ Map.entry("exchangeProperty", "camel-core-languages"),
+ Map.entry("file", "camel-core-languages"),
+ Map.entry("groovy", "camel-groovy"),
+ Map.entry("header", "camel-core-languages"),
+ Map.entry("hl7terser", "camel-hl7"),
+ Map.entry("jactl", "camel-jactl"),
+ Map.entry("java", "camel-joor"),
+ Map.entry("joor", "camel-joor"),
+ Map.entry("jq", "camel-jq"),
+ Map.entry("js", "camel-javascript"),
+ Map.entry("jsonpath", "camel-jsonpath"),
+ Map.entry("mvel", "camel-mvel"),
+ Map.entry("ognl", "camel-ognl"),
+ Map.entry("python", "camel-python"),
+ Map.entry("python3", "camel-python3"),
+ Map.entry("quickjs", "camel-quickjs"),
+ Map.entry("ref", "camel-core-languages"),
+ Map.entry("simple", "camel-core-languages"),
+ Map.entry("spel", "camel-spring"),
+ Map.entry("tokenize", "camel-core-languages"),
+ Map.entry("variable", "camel-core-languages"),
+ Map.entry("wasm", "camel-wasm"),
+ Map.entry("xpath", "camel-xpath"),
+ Map.entry("xquery", "camel-saxon"),
+ Map.entry("xtokenize", "camel-stax")
+ // LANGUAGES: END
+ );
+
+ // name -> artifactId
+ private static final Map<String, String> DATAFORMATS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // DATAFORMATS: START
+ Map.entry("asn1", "camel-asn1"),
+ Map.entry("avro", "camel-avro"),
+ Map.entry("avroJackson", "camel-jackson-avro"),
+ Map.entry("barcode", "camel-barcode"),
+ Map.entry("base64", "camel-base64"),
+ Map.entry("beanio", "camel-beanio"),
+ Map.entry("bindyCsv", "camel-bindy"),
+ Map.entry("bindyFixed", "camel-bindy"),
+ Map.entry("bindyKvp", "camel-bindy"),
+ Map.entry("cbor", "camel-cbor"),
+ Map.entry("crypto", "camel-crypto"),
+ Map.entry("csv", "camel-csv"),
+ Map.entry("dfdl", "camel-dfdl"),
+ Map.entry("fastjson", "camel-fastjson"),
+ Map.entry("fhirJson", "camel-fhir"),
+ Map.entry("fhirXml", "camel-fhir"),
+ Map.entry("flatpack", "camel-flatpack"),
+ Map.entry("fory", "camel-fory"),
+ Map.entry("grok", "camel-grok"),
+ Map.entry("groovyJson", "camel-groovy"),
+ Map.entry("groovyXml", "camel-groovy"),
+ Map.entry("gson", "camel-gson"),
+ Map.entry("gzipDeflater", "camel-zip-deflater"),
+ Map.entry("hl7", "camel-hl7"),
+ Map.entry("ical", "camel-ical"),
+ Map.entry("iso8583", "camel-iso8583"),
+ Map.entry("jackson", "camel-jackson"),
+ Map.entry("jacksonXml", "camel-jacksonxml"),
+ Map.entry("jaxb", "camel-jaxb"),
+ Map.entry("jsonApi", "camel-jsonapi"),
+ Map.entry("jsonb", "camel-jsonb"),
+ Map.entry("lzf", "camel-lzf"),
+ Map.entry("mimeMultipart", "camel-mail"),
+ Map.entry("ocsf", "camel-ocsf"),
+ Map.entry("parquetAvro", "camel-parquet-avro"),
+ Map.entry("pgp", "camel-crypto-pgp"),
+ Map.entry("pqc", "camel-pqc"),
+ Map.entry("protobuf", "camel-protobuf"),
+ Map.entry("protobufJackson", "camel-jackson-protobuf"),
+ Map.entry("rss", "camel-rss"),
+ Map.entry("smooks", "camel-smooks"),
+ Map.entry("snakeYaml", "camel-snakeyaml"),
+ Map.entry("soap", "camel-soap"),
+ Map.entry("swiftMt", "camel-swift"),
+ Map.entry("swiftMx", "camel-swift"),
+ Map.entry("syslog", "camel-syslog"),
+ Map.entry("tarFile", "camel-tarfile"),
+ Map.entry("thrift", "camel-thrift"),
+ Map.entry("toon", "camel-toon"),
+ Map.entry("ubl", "camel-ubl"),
+ Map.entry("univocityCsv", "camel-univocity-parsers"),
+ Map.entry("univocityFixed", "camel-univocity-parsers"),
+ Map.entry("univocityTsv", "camel-univocity-parsers"),
+ Map.entry("xmlSecurity", "camel-xmlsecurity"),
+ Map.entry("zipDeflater", "camel-zip-deflater"),
+ Map.entry("zipFile", "camel-zipfile")
+ // DATAFORMATS: END
+ );
+
+ // simple class name -> javaType|interfaceType|artifactId
+ private static final Map<String, String> BEANS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // BEANS: START
+ Map.entry("AcceptAllHeaderFilterStrategy",
+
"org.apache.camel.support.AcceptAllHeaderFilterStrategy|org.apache.camel.spi.HeaderFilterStrategy|camel-support"),
+ Map.entry("CaffeineAggregationRepository",
+
"org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-caffeine"),
+ Map.entry("CaffeineIdempotentRepository",
+
"org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-caffeine"),
+ Map.entry("CaffeineKeyValueRepository",
+
"org.apache.camel.component.caffeine.processor.CaffeineKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-caffeine"),
+ Map.entry("CassandraAggregationRepository",
+
"org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-cassandraql"),
+ Map.entry("CassandraIdempotentRepository",
+
"org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-cassandraql"),
+ Map.entry("CassandraKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.cassandra.CassandraKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-cassandraql"),
+ Map.entry("ConsulClusterService",
+
"org.apache.camel.component.consul.cluster.ConsulClusterService|org.apache.camel.cluster.CamelClusterService|camel-consul"),
+ Map.entry("CronScheduledRoutePolicy",
+
"org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-quartz"),
+ Map.entry("DefaultHeaderFilterStrategy",
+
"org.apache.camel.support.DefaultHeaderFilterStrategy|org.apache.camel.spi.HeaderFilterStrategy|camel-support"),
+ Map.entry("DurationRoutePolicy",
+
"org.apache.camel.impl.engine.DurationRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-base-engine"),
+ Map.entry("DurationRoutePolicyFactory",
+
"org.apache.camel.impl.engine.DurationRoutePolicyFactory|org.apache.camel.spi.RoutePolicyFactory|camel-base-engine"),
+ Map.entry("EhcacheAggregationRepository",
+
"org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-ehcache"),
+ Map.entry("EhcacheIdempotentRepository",
+
"org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-ehcache"),
+ Map.entry("EhcacheKeyValueRepository",
+
"org.apache.camel.component.ehcache.processor.EhcacheKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-ehcache"),
+ Map.entry("ElasticsearchBulkRequestAggregationStrategy",
+
"org.apache.camel.component.es.aggregation.ElasticsearchBulkRequestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-elasticsearch"),
+ Map.entry("FileIdempotentRepository",
+
"org.apache.camel.support.processor.idempotent.FileIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("FileLockClusterService",
+
"org.apache.camel.component.file.cluster.FileLockClusterService|org.apache.camel.cluster.CamelClusterService|camel-file"),
+ Map.entry("GroupedBodyAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("GroupedExchangeAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("GroupedMessageAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("HazelcastAggregationRepository",
+
"org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-hazelcast"),
+ Map.entry("HazelcastIdempotentRepository",
+
"org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-hazelcast"),
+ Map.entry("HazelcastKeyValueRepository",
+
"org.apache.camel.component.hazelcast.HazelcastKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-hazelcast"),
+ Map.entry("InfinispanEmbeddedAggregationRepository",
+
"org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-infinispan-embedded"),
+ Map.entry("InfinispanEmbeddedClusterService",
+
"org.apache.camel.component.infinispan.embedded.cluster.InfinispanEmbeddedClusterService|org.apache.camel.cluster.CamelClusterService|camel-infinispan-embedded"),
+ Map.entry("InfinispanEmbeddedIdempotentRepository",
+
"org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-infinispan-embedded"),
+ Map.entry("InfinispanRemoteAggregationRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-infinispan"),
+ Map.entry("InfinispanRemoteClusterService",
+
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService|org.apache.camel.cluster.CamelClusterService|camel-infinispan"),
+ Map.entry("InfinispanRemoteIdempotentRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-infinispan"),
+ Map.entry("InfinispanRemoteKeyValueRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-infinispan"),
+ Map.entry("JCacheAggregationRepository",
+
"org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-jcache"),
+ Map.entry("JCacheIdempotentRepository",
+
"org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-jcache"),
+ Map.entry("JCacheKeyValueRepository",
+
"org.apache.camel.component.jcache.processor.JCacheKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-jcache"),
+ Map.entry("JGroupsRaftClusterService",
+
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService|org.apache.camel.cluster.CamelClusterService|camel-jgroups-raft"),
+ Map.entry("JdbcAggregationRepository",
+
"org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-sql"),
+ Map.entry("JdbcKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.jdbc.JdbcKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-sql"),
+ Map.entry("JdbcMessageIdRepository",
+
"org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository|org.apache.camel.spi.IdempotentRepository|camel-sql"),
+ Map.entry("JpaKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.jpa.JpaKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-jpa"),
+ Map.entry("KafkaIdempotentRepository",
+
"org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-kafka"),
+ Map.entry("KafkaKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.kafka.KafkaKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-kafka"),
+ Map.entry("KeyValueAggregationRepository",
+
"org.apache.camel.support.KeyValueAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-support"),
+ Map.entry("KeyValueIdempotentRepository",
+
"org.apache.camel.support.KeyValueIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("KubernetesClusterService",
+
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService|org.apache.camel.cluster.CamelClusterService|camel-kubernetes"),
+ Map.entry("LoggingHttpActivityListener",
+
"org.apache.camel.component.http.LoggingHttpActivityListener|org.apache.camel.component.http.HttpActivityListener|camel-http"),
+ Map.entry("MemoryAggregationRepository",
+
"org.apache.camel.processor.aggregate.MemoryAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-core-processor"),
+ Map.entry("MemoryIdempotentRepository",
+
"org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("MemoryKeyValueRepository",
+
"org.apache.camel.support.MemoryKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-support"),
+ Map.entry("MongoDbIdempotentRepository",
+
"org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-mongodb"),
+ Map.entry("OpensearchBulkRequestAggregationStrategy",
+
"org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-opensearch"),
+ Map.entry("RedisAggregationRepository",
+
"org.apache.camel.component.redis.processor.aggregate.RedisAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-redis"),
+ Map.entry("RedisKeyValueRepository",
+
"org.apache.camel.component.redis.RedisKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-redis"),
+ Map.entry("SimpleScheduledRoutePolicy",
+
"org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-quartz"),
+ Map.entry("SpringCacheIdempotentRepository",
+
"org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-spring"),
+ Map.entry("SpringRedisIdempotentRepository",
+
"org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-spring-redis"),
+ Map.entry("StringAggregationStrategy",
+
"org.apache.camel.processor.aggregate.StringAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("TarAggregationStrategy",
+
"org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy|org.apache.camel.AggregationStrategy|camel-tarfile"),
+ Map.entry("ThrottlingExceptionRoutePolicy",
+
"org.apache.camel.throttling.ThrottlingExceptionRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-support"),
+ Map.entry("ThrottlingInflightRoutePolicy",
+
"org.apache.camel.throttling.ThrottlingInflightRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-support"),
+ Map.entry("UseLatestAggregationStrategy",
+
"org.apache.camel.processor.aggregate.UseLatestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("UseOriginalAggregationStrategy",
+
"org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("XsltAggregationStrategy",
+
"org.apache.camel.component.xslt.XsltAggregationStrategy|org.apache.camel.AggregationStrategy|camel-xslt"),
+ Map.entry("XsltSaxonAggregationStrategy",
+
"org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy|org.apache.camel.AggregationStrategy|camel-xslt-saxon"),
+ Map.entry("ZipAggregationStrategy",
+
"org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy|org.apache.camel.AggregationStrategy|camel-zipfile"),
+ Map.entry("ZooKeeperClusterService",
+
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService|org.apache.camel.cluster.CamelClusterService|camel-zookeeper")
+ // BEANS: END
+ );
+
+ private ArtifactUtils() {
+ }
+
+ /** The artifactId of the component with the given scheme, or null if it
is not a built-in Camel component. */
+ public static String componentArtifact(String scheme) {
+ return scheme != null ? COMPONENTS.get(scheme) : null;
+ }
+
+ /** The artifactId of the language with the given name, or null if it is
not a built-in Camel language. */
+ public static String languageArtifact(String name) {
+ return name != null ? LANGUAGES.get(name) : null;
+ }
+
+ /** The artifactId of the data format with the given name, or null if it
is not a built-in Camel data format. */
+ public static String dataFormatArtifact(String name) {
+ return name != null ? DATAFORMATS.get(name) : null;
+ }
+
+ /** The artifactId of the built-in bean with the given simple class name,
or null if there is none. */
+ public static String beanArtifact(String name) {
+ return beanField(name, 2);
+ }
+
+ /** The fully qualified class name of the built-in bean with the given
simple class name, or null. */
+ public static String beanJavaType(String name) {
+ return beanField(name, 0);
+ }
+
+ /** The interface the built-in bean with the given simple class name
implements, or null. */
+ public static String beanInterface(String name) {
+ return beanField(name, 1);
+ }
+
+ private static String beanField(String name, int index) {
+ String value = name != null ? BEANS.get(name) : null;
+ if (value == null) {
+ return null;
+ }
+ String[] parts = value.split("\\|", -1);
+ return parts[index].isEmpty() ? null : parts[index];
+ }
+
+ /** The schemes of all built-in components, including alternative schemes.
*/
+ public static Set<String> componentNames() {
+ return COMPONENTS.keySet();
+ }
+
+ /** The names of all built-in languages. */
+ public static Set<String> languageNames() {
+ return LANGUAGES.keySet();
+ }
+
+ /** The names of all built-in data formats. */
+ public static Set<String> dataFormatNames() {
+ return DATAFORMATS.keySet();
+ }
+
+ /** The simple class names of all built-in beans. */
+ public static Set<String> beanNames() {
+ return BEANS.keySet();
+ }
+
+ /**
+ * What to add to the classpath for the artifact: the plain artifactId,
and its Spring Boot starter and Quarkus
+ * extension names, as the runtime cannot tell which of the three applies.
A core artifact (part of camel-core) has
+ * no starter or extension of its own.
+ */
+ public static String dependencyHint(String artifactId) {
+ if (isCoreArtifact(artifactId)) {
+ return "add " + artifactId + " (part of camel-core) to the
classpath";
+ }
+ String name = artifactId.startsWith("camel-") ?
artifactId.substring(6) : artifactId;
+ return "add " + artifactId + " to the classpath (" + artifactId +
"-starter on Spring Boot, camel-quarkus-" + name
+ + " on Quarkus)";
+ }
+
+ private static boolean isCoreArtifact(String artifactId) {
+ return artifactId.startsWith("camel-core-") ||
artifactId.equals("camel-core") || artifactId.equals("camel-base")
+ || artifactId.equals("camel-base-engine") ||
artifactId.equals("camel-support")
+ || artifactId.equals("camel-api") ||
artifactId.equals("camel-util");
+ }
+
+ /**
+ * The hint for a component scheme that could not be resolved: the
artifact to add when the scheme is a built-in
+ * component, or else the built-in scheme that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String componentHint(String scheme) {
+ return hint(scheme, "component", COMPONENTS);
+ }
+
+ /**
+ * The hint for a language name that could not be resolved: the artifact
to add when the name is a built-in
+ * language, or else the built-in language that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String languageHint(String name) {
+ return hint(name, "language", LANGUAGES);
+ }
+
+ /**
+ * The hint for a data format name that could not be resolved: the
artifact to add when the name is a built-in data
+ * format, or else the built-in data format that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String dataFormatHint(String name) {
+ return hint(name, "data format", DATAFORMATS);
+ }
+
+ private static String hint(String name, String kind, Map<String, String>
table) {
+ if (name == null || name.isBlank()) {
+ return "";
+ }
+ String artifact = table.get(name);
+ if (artifact != null) {
+ return " (the " + name + " " + kind + " is in " + artifact + "; "
+ dependencyHint(artifact) + ")";
+ }
+ String best = closest(name, table.keySet());
+ if (best != null) {
+ return " (not a built-in Camel " + kind + "; did you mean '" +
best + "'?)";
+ }
+ return " (not a built-in Camel " + kind + ")";
+ }
+
+ /**
+ * The candidate closest to the name, case-insensitively, when it is
within a few edits (one for names up to three
+ * characters, two, or a third of the name's length for longer names); the
shorter candidate wins a tie.
+ *
+ * @return the closest candidate, or null if none is close enough
+ */
+ public static String closest(String name, Collection<String> candidates) {
+ if (name == null || name.isBlank() || candidates == null) {
+ return null;
+ }
+ String best = null;
+ int bestDistance = Integer.MAX_VALUE;
+ int threshold = name.length() <= 3 ? 1 : Math.max(2, name.length() /
3);
+ String n = name.toLowerCase(Locale.ROOT);
+ for (String candidate : candidates) {
+ int d = distance(n, candidate.toLowerCase(Locale.ROOT));
+ if (d <= threshold && (d < bestDistance || d == bestDistance &&
candidate.length() < best.length())) {
Review Comment:
**Misleading tie-break.** When two candidates are equidistant, the code
picks the shorter one — but shorter isn't always the intended target. Concrete
counterexample from the actual COMPONENTS table: `"htps"` has DL-distance 1 to
both `"ftps"` and `"https"`. Since `ftps` (4 chars) < `https` (5 chars),
`closest()` returns `"ftps"`, producing `did you mean 'ftps'?` when the user
almost certainly meant `https`. The same happens with `"htp"` → `"ftp"` vs
`"http"`.
When candidates are tied, not guessing is safer than guessing wrong.
Dropping the length tie-break returns whichever was encountered first in
iteration order (alphabetical for `Map.ofEntries`), which is no worse than
random and avoids actively picking the wrong one:
```suggestion
if (d <= threshold && d < bestDistance) {
```
##########
core/camel-util/src/main/java/org/apache/camel/util/ArtifactUtils.java:
##########
@@ -0,0 +1,865 @@
+/*
+ * 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.util;
+
+import java.util.Collection;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Which Camel artifact (Maven artifactId) ships a component, data format,
language or built-in bean.
+ * <p/>
+ * The runtime cannot tell this on its own: the metadata that knows is in the
jar that is missing. So the tables are
+ * generated from the catalog at build time (like {@link SensitiveUtils}) and
used by the error messages that say what
+ * to add to the classpath when a name cannot be resolved, or which known name
was likely meant.
+ */
+public final class ArtifactUtils {
+
+ // scheme -> artifactId, including alternative schemes
+ private static final Map<String, String> COMPONENTS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // COMPONENTS: START
+ Map.entry("a2a", "camel-a2a"),
+ Map.entry("activemq", "camel-activemq"),
+ Map.entry("activemq6", "camel-activemq6"),
+ Map.entry("ai-resource", "camel-ai-resource"),
+ Map.entry("ai-tool", "camel-ai-tool"),
+ Map.entry("alibaba-eventbridge", "camel-alibaba-eventbridge"),
+ Map.entry("alibaba-fc", "camel-alibaba-fc"),
+ Map.entry("alibaba-kms", "camel-alibaba-kms"),
+ Map.entry("alibaba-mns", "camel-alibaba-mns"),
+ Map.entry("alibaba-oss", "camel-alibaba-oss"),
+ Map.entry("alibaba-ots", "camel-alibaba-ots"),
+ Map.entry("alibaba-sls", "camel-alibaba-sls"),
+ Map.entry("alibaba-sms", "camel-alibaba-sms"),
+ Map.entry("amqp", "camel-amqp"),
+ Map.entry("arangodb", "camel-arangodb"),
+ Map.entry("as2", "camel-as2"),
+ Map.entry("asterisk", "camel-asterisk"),
+ Map.entry("atmosphere-websocket", "camel-atmosphere-websocket"),
+ Map.entry("atom", "camel-atom"),
+ Map.entry("avro", "camel-avro-rpc"),
+ Map.entry("aws-bedrock", "camel-aws-bedrock"),
+ Map.entry("aws-bedrock-agent", "camel-aws-bedrock"),
+ Map.entry("aws-bedrock-agent-runtime", "camel-aws-bedrock"),
+ Map.entry("aws-cloudtrail", "camel-aws-cloudtrail"),
+ Map.entry("aws-config", "camel-aws-config"),
+ Map.entry("aws-secrets-manager", "camel-aws-secrets-manager"),
+ Map.entry("aws-security-hub", "camel-aws-security-hub"),
+ Map.entry("aws2-athena", "camel-aws2-athena"),
+ Map.entry("aws2-comprehend", "camel-aws2-comprehend"),
+ Map.entry("aws2-cw", "camel-aws2-cw"),
+ Map.entry("aws2-ddb", "camel-aws2-ddb"),
+ Map.entry("aws2-ddbstream", "camel-aws2-ddb"),
+ Map.entry("aws2-ec2", "camel-aws2-ec2"),
+ Map.entry("aws2-ecs", "camel-aws2-ecs"),
+ Map.entry("aws2-eks", "camel-aws2-eks"),
+ Map.entry("aws2-eventbridge", "camel-aws2-eventbridge"),
+ Map.entry("aws2-iam", "camel-aws2-iam"),
+ Map.entry("aws2-kinesis", "camel-aws2-kinesis"),
+ Map.entry("aws2-kinesis-firehose", "camel-aws2-kinesis"),
+ Map.entry("aws2-kms", "camel-aws2-kms"),
+ Map.entry("aws2-lambda", "camel-aws2-lambda"),
+ Map.entry("aws2-mq", "camel-aws2-mq"),
+ Map.entry("aws2-msk", "camel-aws2-msk"),
+ Map.entry("aws2-polly", "camel-aws2-polly"),
+ Map.entry("aws2-redshift-data", "camel-aws2-redshift"),
+ Map.entry("aws2-rekognition", "camel-aws2-rekognition"),
+ Map.entry("aws2-s3", "camel-aws2-s3"),
+ Map.entry("aws2-s3-vectors", "camel-aws2-s3-vectors"),
+ Map.entry("aws2-ses", "camel-aws2-ses"),
+ Map.entry("aws2-sns", "camel-aws2-sns"),
+ Map.entry("aws2-sqs", "camel-aws2-sqs"),
+ Map.entry("aws2-step-functions", "camel-aws2-step-functions"),
+ Map.entry("aws2-sts", "camel-aws2-sts"),
+ Map.entry("aws2-textract", "camel-aws2-textract"),
+ Map.entry("aws2-timestream", "camel-aws2-timestream"),
+ Map.entry("aws2-transcribe", "camel-aws2-transcribe"),
+ Map.entry("aws2-translate", "camel-aws2-translate"),
+ Map.entry("azure-cosmosdb", "camel-azure-cosmosdb"),
+ Map.entry("azure-eventhubs", "camel-azure-eventhubs"),
+ Map.entry("azure-files", "camel-azure-files"),
+ Map.entry("azure-functions", "camel-azure-functions"),
+ Map.entry("azure-key-vault", "camel-azure-key-vault"),
+ Map.entry("azure-servicebus", "camel-azure-servicebus"),
+ Map.entry("azure-storage-blob", "camel-azure-storage-blob"),
+ Map.entry("azure-storage-datalake",
"camel-azure-storage-datalake"),
+ Map.entry("azure-storage-queue", "camel-azure-storage-queue"),
+ Map.entry("bean", "camel-bean"),
+ Map.entry("bean-validator", "camel-bean-validator"),
+ Map.entry("bonita", "camel-bonita"),
+ Map.entry("box", "camel-box"),
+ Map.entry("braintree", "camel-braintree"),
+ Map.entry("browse", "camel-browse"),
+ Map.entry("caffeine-cache", "camel-caffeine"),
+ Map.entry("caffeine-loadcache", "camel-caffeine"),
+ Map.entry("camunda", "camel-camunda"),
+ Map.entry("chatscript", "camel-chatscript"),
+ Map.entry("chunk", "camel-chunk"),
+ Map.entry("class", "camel-bean"),
+ Map.entry("clickhouse", "camel-clickhouse"),
+ Map.entry("clickup", "camel-clickup"),
+ Map.entry("cm-sms", "camel-cm-sms"),
+ Map.entry("coap", "camel-coap"),
+ Map.entry("coap+tcp", "camel-coap"),
+ Map.entry("coaps", "camel-coap"),
+ Map.entry("coaps+tcp", "camel-coap"),
+ Map.entry("cometd", "camel-cometd"),
+ Map.entry("cometds", "camel-cometd"),
+ Map.entry("consul", "camel-consul"),
+ Map.entry("controlbus", "camel-controlbus"),
+ Map.entry("couchbase", "camel-couchbase"),
+ Map.entry("couchdb", "camel-couchdb"),
+ Map.entry("cql", "camel-cassandraql"),
+ Map.entry("cron", "camel-cron"),
+ Map.entry("crypto", "camel-crypto"),
+ Map.entry("cxf", "camel-cxf-soap"),
+ Map.entry("cxfrs", "camel-cxf-rest"),
+ Map.entry("cyberark-vault", "camel-cyberark-vault"),
+ Map.entry("dapr", "camel-dapr"),
+ Map.entry("dataformat", "camel-dataformat"),
+ Map.entry("dataset", "camel-dataset"),
+ Map.entry("dataset-test", "camel-dataset"),
+ Map.entry("debezium-db2", "camel-debezium-db2"),
+ Map.entry("debezium-mongodb", "camel-debezium-mongodb"),
+ Map.entry("debezium-mysql", "camel-debezium-mysql"),
+ Map.entry("debezium-oracle", "camel-debezium-oracle"),
+ Map.entry("debezium-postgres", "camel-debezium-postgres"),
+ Map.entry("debezium-sqlserver", "camel-debezium-sqlserver"),
+ Map.entry("dfdl", "camel-dfdl"),
+ Map.entry("dhis2", "camel-dhis2"),
+ Map.entry("direct", "camel-direct"),
+ Map.entry("disruptor", "camel-disruptor"),
+ Map.entry("disruptor-vm", "camel-disruptor"),
+ Map.entry("djl", "camel-djl"),
+ Map.entry("dns", "camel-dns"),
+ Map.entry("docker", "camel-docker"),
+ Map.entry("docling", "camel-docling"),
+ Map.entry("drill", "camel-drill"),
+ Map.entry("dropbox", "camel-dropbox"),
+ Map.entry("duckdb", "camel-duckdb"),
+ Map.entry("dynamic-router", "camel-dynamic-router"),
+ Map.entry("dynamic-router-control", "camel-dynamic-router"),
+ Map.entry("ehcache", "camel-ehcache"),
+ Map.entry("elasticsearch", "camel-elasticsearch"),
+ Map.entry("elasticsearch-rest-client",
"camel-elasticsearch-rest-client"),
+ Map.entry("event", "camel-event"),
+ Map.entry("exec", "camel-exec"),
+ Map.entry("fhir", "camel-fhir"),
+ Map.entry("file", "camel-file"),
+ Map.entry("file-watch", "camel-file-watch"),
+ Map.entry("flatpack", "camel-flatpack"),
+ Map.entry("flink", "camel-flink"),
+ Map.entry("flowable", "camel-flowable"),
+ Map.entry("fop", "camel-fop"),
+ Map.entry("freemarker", "camel-freemarker"),
+ Map.entry("ftp", "camel-ftp"),
+ Map.entry("ftps", "camel-ftp"),
+ Map.entry("geocoder", "camel-geocoder"),
+ Map.entry("git", "camel-git"),
+ Map.entry("github2", "camel-github2"),
+ Map.entry("google-bigquery", "camel-google-bigquery"),
+ Map.entry("google-bigquery-sql", "camel-google-bigquery"),
+ Map.entry("google-calendar", "camel-google-calendar"),
+ Map.entry("google-calendar-stream", "camel-google-calendar"),
+ Map.entry("google-drive", "camel-google-drive"),
+ Map.entry("google-firestore", "camel-google-firestore"),
+ Map.entry("google-functions", "camel-google-functions"),
+ Map.entry("google-mail", "camel-google-mail"),
+ Map.entry("google-mail-stream", "camel-google-mail"),
+ Map.entry("google-pubsub", "camel-google-pubsub"),
+ Map.entry("google-secret-manager", "camel-google-secret-manager"),
+ Map.entry("google-sheets", "camel-google-sheets"),
+ Map.entry("google-sheets-stream", "camel-google-sheets"),
+ Map.entry("google-speech-to-text", "camel-google-speech-to-text"),
+ Map.entry("google-storage", "camel-google-storage"),
+ Map.entry("google-text-to-speech", "camel-google-text-to-speech"),
+ Map.entry("google-vertexai", "camel-google-vertexai"),
+ Map.entry("google-vision", "camel-google-vision"),
+ Map.entry("graphql", "camel-graphql"),
+ Map.entry("grpc", "camel-grpc"),
+ Map.entry("hashicorp-vault", "camel-hashicorp-vault"),
+ Map.entry("hazelcast-atomicvalue", "camel-hazelcast"),
+ Map.entry("hazelcast-instance", "camel-hazelcast"),
+ Map.entry("hazelcast-list", "camel-hazelcast"),
+ Map.entry("hazelcast-map", "camel-hazelcast"),
+ Map.entry("hazelcast-multimap", "camel-hazelcast"),
+ Map.entry("hazelcast-pncounter", "camel-hazelcast"),
+ Map.entry("hazelcast-queue", "camel-hazelcast"),
+ Map.entry("hazelcast-replicatedmap", "camel-hazelcast"),
+ Map.entry("hazelcast-ringbuffer", "camel-hazelcast"),
+ Map.entry("hazelcast-seda", "camel-hazelcast"),
+ Map.entry("hazelcast-set", "camel-hazelcast"),
+ Map.entry("hazelcast-topic", "camel-hazelcast"),
+ Map.entry("hivemq", "camel-hivemq"),
+ Map.entry("http", "camel-http"),
+ Map.entry("https", "camel-http"),
+ Map.entry("huggingface", "camel-huggingface"),
+ Map.entry("hwcloud-dms", "camel-huaweicloud-dms"),
+ Map.entry("hwcloud-frs", "camel-huaweicloud-frs"),
+ Map.entry("hwcloud-functiongraph",
"camel-huaweicloud-functiongraph"),
+ Map.entry("hwcloud-iam", "camel-huaweicloud-iam"),
+ Map.entry("hwcloud-imagerecognition",
"camel-huaweicloud-imagerecognition"),
+ Map.entry("hwcloud-obs", "camel-huaweicloud-obs"),
+ Map.entry("hwcloud-smn", "camel-huaweicloud-smn"),
+ Map.entry("ibm-cos", "camel-ibm-cos"),
+ Map.entry("ibm-secrets-manager", "camel-ibm-secrets-manager"),
+ Map.entry("ibm-watson-discovery", "camel-ibm-watson-discovery"),
+ Map.entry("ibm-watson-language", "camel-ibm-watson-language"),
+ Map.entry("ibm-watson-speech-to-text",
"camel-ibm-watson-speech-to-text"),
+ Map.entry("ibm-watson-text-to-speech",
"camel-ibm-watson-text-to-speech"),
+ Map.entry("ibm-watsonx-ai", "camel-ibm-watsonx-ai"),
+ Map.entry("ibm-watsonx-data", "camel-ibm-watsonx-data"),
+ Map.entry("iggy", "camel-iggy"),
+ Map.entry("ignite-cache", "camel-ignite"),
+ Map.entry("ignite-compute", "camel-ignite"),
+ Map.entry("ignite-events", "camel-ignite"),
+ Map.entry("ignite-idgen", "camel-ignite"),
+ Map.entry("ignite-messaging", "camel-ignite"),
+ Map.entry("ignite-queue", "camel-ignite"),
+ Map.entry("ignite-set", "camel-ignite"),
+ Map.entry("imap", "camel-mail"),
+ Map.entry("imaps", "camel-mail"),
+ Map.entry("infinispan", "camel-infinispan"),
+ Map.entry("infinispan-embedded", "camel-infinispan-embedded"),
+ Map.entry("influxdb", "camel-influxdb"),
+ Map.entry("influxdb2", "camel-influxdb2"),
+ Map.entry("jcache", "camel-jcache"),
+ Map.entry("jcr", "camel-jcr"),
+ Map.entry("jdbc", "camel-jdbc"),
+ Map.entry("jetty", "camel-jetty"),
+ Map.entry("jgroups", "camel-jgroups"),
+ Map.entry("jgroups-raft", "camel-jgroups-raft"),
+ Map.entry("jira", "camel-jira"),
+ Map.entry("jms", "camel-jms"),
+ Map.entry("jmx", "camel-jmx"),
+ Map.entry("jolt", "camel-jolt"),
+ Map.entry("jooq", "camel-jooq"),
+ Map.entry("jpa", "camel-jpa"),
+ Map.entry("jslt", "camel-jslt"),
+ Map.entry("json-validator", "camel-json-validator"),
+ Map.entry("jsonata", "camel-jsonata"),
+ Map.entry("jt400", "camel-jt400"),
+ Map.entry("jte", "camel-jte"),
+ Map.entry("kafka", "camel-kafka"),
+ Map.entry("kamelet", "camel-kamelet"),
+ Map.entry("keycloak", "camel-keycloak"),
+ Map.entry("knative", "camel-knative"),
+ Map.entry("kserve", "camel-kserve"),
+ Map.entry("kubernetes-config-maps", "camel-kubernetes"),
+ Map.entry("kubernetes-cronjob", "camel-kubernetes"),
+ Map.entry("kubernetes-custom-resources", "camel-kubernetes"),
+ Map.entry("kubernetes-deployments", "camel-kubernetes"),
+ Map.entry("kubernetes-events", "camel-kubernetes"),
+ Map.entry("kubernetes-hpa", "camel-kubernetes"),
+ Map.entry("kubernetes-job", "camel-kubernetes"),
+ Map.entry("kubernetes-namespaces", "camel-kubernetes"),
+ Map.entry("kubernetes-nodes", "camel-kubernetes"),
+ Map.entry("kubernetes-persistent-volumes", "camel-kubernetes"),
+ Map.entry("kubernetes-persistent-volumes-claims",
"camel-kubernetes"),
+ Map.entry("kubernetes-pods", "camel-kubernetes"),
+ Map.entry("kubernetes-replication-controllers",
"camel-kubernetes"),
+ Map.entry("kubernetes-resources-quota", "camel-kubernetes"),
+ Map.entry("kubernetes-secrets", "camel-kubernetes"),
+ Map.entry("kubernetes-service-accounts", "camel-kubernetes"),
+ Map.entry("kubernetes-services", "camel-kubernetes"),
+ Map.entry("kudu", "camel-kudu"),
+ Map.entry("langchain4j-agent", "camel-langchain4j-agent"),
+ Map.entry("langchain4j-chat", "camel-langchain4j-chat"),
+ Map.entry("langchain4j-embeddings",
"camel-langchain4j-embeddings"),
+ Map.entry("langchain4j-embeddingstore",
"camel-langchain4j-embeddingstore"),
+ Map.entry("langchain4j-ingest", "camel-langchain4j-ingest"),
+ Map.entry("langchain4j-web-search",
"camel-langchain4j-web-search"),
+ Map.entry("language", "camel-language"),
+ Map.entry("ldap", "camel-ldap"),
+ Map.entry("ldif", "camel-ldif"),
+ Map.entry("log", "camel-log"),
+ Map.entry("lpr", "camel-printer"),
+ Map.entry("lucene", "camel-lucene"),
+ Map.entry("lumberjack", "camel-lumberjack"),
+ Map.entry("mapstruct", "camel-mapstruct"),
+ Map.entry("master", "camel-master"),
+ Map.entry("metrics", "camel-metrics"),
+ Map.entry("micrometer", "camel-micrometer"),
+ Map.entry("milo-browse", "camel-milo"),
+ Map.entry("milo-client", "camel-milo"),
+ Map.entry("milo-server", "camel-milo"),
+ Map.entry("milvus", "camel-milvus"),
+ Map.entry("mina", "camel-mina"),
+ Map.entry("mina-sftp", "camel-mina-sftp"),
+ Map.entry("minio", "camel-minio"),
+ Map.entry("mllp", "camel-mllp"),
+ Map.entry("mock", "camel-mock"),
+ Map.entry("mongodb", "camel-mongodb"),
+ Map.entry("mongodb-gridfs", "camel-mongodb-gridfs"),
+ Map.entry("mustache", "camel-mustache"),
+ Map.entry("mvel", "camel-mvel"),
+ Map.entry("mybatis", "camel-mybatis"),
+ Map.entry("mybatis-bean", "camel-mybatis"),
+ Map.entry("nats", "camel-nats"),
+ Map.entry("neo4j", "camel-neo4j"),
+ Map.entry("netty", "camel-netty"),
+ Map.entry("netty-http", "camel-netty-http"),
+ Map.entry("oaipmh", "camel-oaipmh"),
+ Map.entry("olingo2", "camel-olingo2"),
+ Map.entry("olingo4", "camel-olingo4"),
+ Map.entry("once", "camel-once"),
+ Map.entry("opa", "camel-opa"),
+ Map.entry("openai", "camel-openai"),
+ Map.entry("opensearch", "camel-opensearch"),
+ Map.entry("openshift-build-configs", "camel-kubernetes"),
+ Map.entry("openshift-builds", "camel-kubernetes"),
+ Map.entry("openshift-deploymentconfigs", "camel-kubernetes"),
+ Map.entry("openstack-cinder", "camel-openstack"),
+ Map.entry("openstack-glance", "camel-openstack"),
+ Map.entry("openstack-keystone", "camel-openstack"),
+ Map.entry("openstack-neutron", "camel-openstack"),
+ Map.entry("openstack-nova", "camel-openstack"),
+ Map.entry("openstack-swift", "camel-openstack"),
+ Map.entry("opentelemetry-metrics", "camel-opentelemetry-metrics"),
+ Map.entry("optaplanner", "camel-optaplanner"),
+ Map.entry("paho", "camel-paho"),
+ Map.entry("paho-mqtt5", "camel-paho-mqtt5"),
+ Map.entry("pdf", "camel-pdf"),
+ Map.entry("pg-replication-slot", "camel-pg-replication-slot"),
+ Map.entry("pgevent", "camel-pgevent"),
+ Map.entry("pgvector", "camel-pgvector"),
+ Map.entry("pinecone", "camel-pinecone"),
+ Map.entry("platform-http", "camel-platform-http"),
+ Map.entry("plc4x", "camel-plc4x"),
+ Map.entry("pop3", "camel-mail"),
+ Map.entry("pop3s", "camel-mail"),
+ Map.entry("pqc", "camel-pqc"),
+ Map.entry("pubnub", "camel-pubnub"),
+ Map.entry("pulsar", "camel-pulsar"),
+ Map.entry("qdrant", "camel-qdrant"),
+ Map.entry("quartz", "camel-quartz"),
+ Map.entry("quickfix", "camel-quickfix"),
+ Map.entry("reactive-streams", "camel-reactive-streams"),
+ Map.entry("ref", "camel-ref"),
+ Map.entry("rest", "camel-rest"),
+ Map.entry("rest-api", "camel-rest"),
+ Map.entry("rest-openapi", "camel-rest-openapi"),
+ Map.entry("rest-postman", "camel-rest-postman"),
+ Map.entry("robotframework", "camel-robotframework"),
+ Map.entry("rocketmq", "camel-rocketmq"),
+ Map.entry("rss", "camel-rss"),
+ Map.entry("saga", "camel-saga"),
+ Map.entry("salesforce", "camel-salesforce"),
+ Map.entry("sap-netweaver", "camel-sap-netweaver"),
+ Map.entry("scheduler", "camel-scheduler"),
+ Map.entry("schematron", "camel-schematron"),
+ Map.entry("scp", "camel-jsch"),
+ Map.entry("seda", "camel-seda"),
+ Map.entry("servicenow", "camel-servicenow"),
+ Map.entry("servlet", "camel-servlet"),
+ Map.entry("sftp", "camel-ftp"),
+ Map.entry("shell", "camel-shell"),
+ Map.entry("sjms", "camel-sjms"),
+ Map.entry("sjms2", "camel-sjms2"),
+ Map.entry("slack", "camel-slack"),
+ Map.entry("smb", "camel-smb"),
+ Map.entry("smooks", "camel-smooks"),
+ Map.entry("smpp", "camel-smpp"),
+ Map.entry("smpps", "camel-smpp"),
+ Map.entry("smtp", "camel-mail"),
+ Map.entry("smtps", "camel-mail"),
+ Map.entry("snmp", "camel-snmp"),
+ Map.entry("solr", "camel-solr"),
+ Map.entry("spiffe", "camel-spiffe"),
+ Map.entry("splunk-hec", "camel-splunk-hec"),
+ Map.entry("spring-ai-chat", "camel-spring-ai-chat"),
+ Map.entry("spring-ai-embeddings", "camel-spring-ai-embeddings"),
+ Map.entry("spring-ai-image", "camel-spring-ai-image"),
+ Map.entry("spring-ai-vector-store",
"camel-spring-ai-vector-store"),
+ Map.entry("spring-batch", "camel-spring-batch"),
+ Map.entry("spring-event", "camel-spring"),
+ Map.entry("spring-jdbc", "camel-spring-jdbc"),
+ Map.entry("spring-ldap", "camel-spring-ldap"),
+ Map.entry("spring-rabbitmq", "camel-spring-rabbitmq"),
+ Map.entry("spring-redis", "camel-spring-redis"),
+ Map.entry("spring-ws", "camel-spring-ws"),
+ Map.entry("sql", "camel-sql"),
+ Map.entry("sql-stored", "camel-sql"),
+ Map.entry("ssh", "camel-ssh"),
+ Map.entry("state-store", "camel-state-store"),
+ Map.entry("stax", "camel-stax"),
+ Map.entry("stitch", "camel-stitch"),
+ Map.entry("stream", "camel-stream"),
+ Map.entry("string-template", "camel-stringtemplate"),
+ Map.entry("stripe", "camel-stripe"),
+ Map.entry("stub", "camel-stub"),
+ Map.entry("tahu-edge", "camel-tahu"),
+ Map.entry("tahu-host", "camel-tahu"),
+ Map.entry("telegram", "camel-telegram"),
+ Map.entry("tensorflow-serving", "camel-tensorflow-serving"),
+ Map.entry("thrift", "camel-thrift"),
+ Map.entry("thymeleaf", "camel-thymeleaf"),
+ Map.entry("tika", "camel-tika"),
+ Map.entry("timer", "camel-timer"),
+ Map.entry("twilio", "camel-twilio"),
+ Map.entry("twitter-directmessage", "camel-twitter"),
+ Map.entry("twitter-search", "camel-twitter"),
+ Map.entry("twitter-timeline", "camel-twitter"),
+ Map.entry("undertow", "camel-undertow"),
+ Map.entry("validator", "camel-validator"),
+ Map.entry("velocity", "camel-velocity"),
+ Map.entry("vertx", "camel-vertx"),
+ Map.entry("vertx-http", "camel-vertx-http"),
+ Map.entry("vertx-websocket", "camel-vertx-websocket"),
+ Map.entry("wasm", "camel-wasm"),
+ Map.entry("weather", "camel-weather"),
+ Map.entry("weaviate", "camel-weaviate"),
+ Map.entry("web3j", "camel-web3j"),
+ Map.entry("webhook", "camel-webhook"),
+ Map.entry("whatsapp", "camel-whatsapp"),
+ Map.entry("wordpress", "camel-wordpress"),
+ Map.entry("workday", "camel-workday"),
+ Map.entry("xchange", "camel-xchange"),
+ Map.entry("xj", "camel-xj"),
+ Map.entry("xmlsecurity-sign", "camel-xmlsecurity"),
+ Map.entry("xmlsecurity-verify", "camel-xmlsecurity"),
+ Map.entry("xmpp", "camel-xmpp"),
+ Map.entry("xquery", "camel-saxon"),
+ Map.entry("xslt", "camel-xslt"),
+ Map.entry("xslt-saxon", "camel-xslt-saxon"),
+ Map.entry("zendesk", "camel-zendesk"),
+ Map.entry("zookeeper", "camel-zookeeper"),
+ Map.entry("zookeeper-master", "camel-zookeeper-master")
+ // COMPONENTS: END
+ );
+
+ // name -> artifactId
+ private static final Map<String, String> LANGUAGES = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // LANGUAGES: START
+ Map.entry("bean", "camel-bean"),
+ Map.entry("constant", "camel-core-languages"),
+ Map.entry("datasonnet", "camel-datasonnet"),
+ Map.entry("exchangeProperty", "camel-core-languages"),
+ Map.entry("file", "camel-core-languages"),
+ Map.entry("groovy", "camel-groovy"),
+ Map.entry("header", "camel-core-languages"),
+ Map.entry("hl7terser", "camel-hl7"),
+ Map.entry("jactl", "camel-jactl"),
+ Map.entry("java", "camel-joor"),
+ Map.entry("joor", "camel-joor"),
+ Map.entry("jq", "camel-jq"),
+ Map.entry("js", "camel-javascript"),
+ Map.entry("jsonpath", "camel-jsonpath"),
+ Map.entry("mvel", "camel-mvel"),
+ Map.entry("ognl", "camel-ognl"),
+ Map.entry("python", "camel-python"),
+ Map.entry("python3", "camel-python3"),
+ Map.entry("quickjs", "camel-quickjs"),
+ Map.entry("ref", "camel-core-languages"),
+ Map.entry("simple", "camel-core-languages"),
+ Map.entry("spel", "camel-spring"),
+ Map.entry("tokenize", "camel-core-languages"),
+ Map.entry("variable", "camel-core-languages"),
+ Map.entry("wasm", "camel-wasm"),
+ Map.entry("xpath", "camel-xpath"),
+ Map.entry("xquery", "camel-saxon"),
+ Map.entry("xtokenize", "camel-stax")
+ // LANGUAGES: END
+ );
+
+ // name -> artifactId
+ private static final Map<String, String> DATAFORMATS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // DATAFORMATS: START
+ Map.entry("asn1", "camel-asn1"),
+ Map.entry("avro", "camel-avro"),
+ Map.entry("avroJackson", "camel-jackson-avro"),
+ Map.entry("barcode", "camel-barcode"),
+ Map.entry("base64", "camel-base64"),
+ Map.entry("beanio", "camel-beanio"),
+ Map.entry("bindyCsv", "camel-bindy"),
+ Map.entry("bindyFixed", "camel-bindy"),
+ Map.entry("bindyKvp", "camel-bindy"),
+ Map.entry("cbor", "camel-cbor"),
+ Map.entry("crypto", "camel-crypto"),
+ Map.entry("csv", "camel-csv"),
+ Map.entry("dfdl", "camel-dfdl"),
+ Map.entry("fastjson", "camel-fastjson"),
+ Map.entry("fhirJson", "camel-fhir"),
+ Map.entry("fhirXml", "camel-fhir"),
+ Map.entry("flatpack", "camel-flatpack"),
+ Map.entry("fory", "camel-fory"),
+ Map.entry("grok", "camel-grok"),
+ Map.entry("groovyJson", "camel-groovy"),
+ Map.entry("groovyXml", "camel-groovy"),
+ Map.entry("gson", "camel-gson"),
+ Map.entry("gzipDeflater", "camel-zip-deflater"),
+ Map.entry("hl7", "camel-hl7"),
+ Map.entry("ical", "camel-ical"),
+ Map.entry("iso8583", "camel-iso8583"),
+ Map.entry("jackson", "camel-jackson"),
+ Map.entry("jacksonXml", "camel-jacksonxml"),
+ Map.entry("jaxb", "camel-jaxb"),
+ Map.entry("jsonApi", "camel-jsonapi"),
+ Map.entry("jsonb", "camel-jsonb"),
+ Map.entry("lzf", "camel-lzf"),
+ Map.entry("mimeMultipart", "camel-mail"),
+ Map.entry("ocsf", "camel-ocsf"),
+ Map.entry("parquetAvro", "camel-parquet-avro"),
+ Map.entry("pgp", "camel-crypto-pgp"),
+ Map.entry("pqc", "camel-pqc"),
+ Map.entry("protobuf", "camel-protobuf"),
+ Map.entry("protobufJackson", "camel-jackson-protobuf"),
+ Map.entry("rss", "camel-rss"),
+ Map.entry("smooks", "camel-smooks"),
+ Map.entry("snakeYaml", "camel-snakeyaml"),
+ Map.entry("soap", "camel-soap"),
+ Map.entry("swiftMt", "camel-swift"),
+ Map.entry("swiftMx", "camel-swift"),
+ Map.entry("syslog", "camel-syslog"),
+ Map.entry("tarFile", "camel-tarfile"),
+ Map.entry("thrift", "camel-thrift"),
+ Map.entry("toon", "camel-toon"),
+ Map.entry("ubl", "camel-ubl"),
+ Map.entry("univocityCsv", "camel-univocity-parsers"),
+ Map.entry("univocityFixed", "camel-univocity-parsers"),
+ Map.entry("univocityTsv", "camel-univocity-parsers"),
+ Map.entry("xmlSecurity", "camel-xmlsecurity"),
+ Map.entry("zipDeflater", "camel-zip-deflater"),
+ Map.entry("zipFile", "camel-zipfile")
+ // DATAFORMATS: END
+ );
+
+ // simple class name -> javaType|interfaceType|artifactId
+ private static final Map<String, String> BEANS = Map.ofEntries(
+ // Generated by camel build tools - do NOT edit this list!
+ // BEANS: START
+ Map.entry("AcceptAllHeaderFilterStrategy",
+
"org.apache.camel.support.AcceptAllHeaderFilterStrategy|org.apache.camel.spi.HeaderFilterStrategy|camel-support"),
+ Map.entry("CaffeineAggregationRepository",
+
"org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-caffeine"),
+ Map.entry("CaffeineIdempotentRepository",
+
"org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-caffeine"),
+ Map.entry("CaffeineKeyValueRepository",
+
"org.apache.camel.component.caffeine.processor.CaffeineKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-caffeine"),
+ Map.entry("CassandraAggregationRepository",
+
"org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-cassandraql"),
+ Map.entry("CassandraIdempotentRepository",
+
"org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-cassandraql"),
+ Map.entry("CassandraKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.cassandra.CassandraKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-cassandraql"),
+ Map.entry("ConsulClusterService",
+
"org.apache.camel.component.consul.cluster.ConsulClusterService|org.apache.camel.cluster.CamelClusterService|camel-consul"),
+ Map.entry("CronScheduledRoutePolicy",
+
"org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-quartz"),
+ Map.entry("DefaultHeaderFilterStrategy",
+
"org.apache.camel.support.DefaultHeaderFilterStrategy|org.apache.camel.spi.HeaderFilterStrategy|camel-support"),
+ Map.entry("DurationRoutePolicy",
+
"org.apache.camel.impl.engine.DurationRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-base-engine"),
+ Map.entry("DurationRoutePolicyFactory",
+
"org.apache.camel.impl.engine.DurationRoutePolicyFactory|org.apache.camel.spi.RoutePolicyFactory|camel-base-engine"),
+ Map.entry("EhcacheAggregationRepository",
+
"org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-ehcache"),
+ Map.entry("EhcacheIdempotentRepository",
+
"org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-ehcache"),
+ Map.entry("EhcacheKeyValueRepository",
+
"org.apache.camel.component.ehcache.processor.EhcacheKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-ehcache"),
+ Map.entry("ElasticsearchBulkRequestAggregationStrategy",
+
"org.apache.camel.component.es.aggregation.ElasticsearchBulkRequestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-elasticsearch"),
+ Map.entry("FileIdempotentRepository",
+
"org.apache.camel.support.processor.idempotent.FileIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("FileLockClusterService",
+
"org.apache.camel.component.file.cluster.FileLockClusterService|org.apache.camel.cluster.CamelClusterService|camel-file"),
+ Map.entry("GroupedBodyAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("GroupedExchangeAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("GroupedMessageAggregationStrategy",
+
"org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("HazelcastAggregationRepository",
+
"org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-hazelcast"),
+ Map.entry("HazelcastIdempotentRepository",
+
"org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-hazelcast"),
+ Map.entry("HazelcastKeyValueRepository",
+
"org.apache.camel.component.hazelcast.HazelcastKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-hazelcast"),
+ Map.entry("InfinispanEmbeddedAggregationRepository",
+
"org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-infinispan-embedded"),
+ Map.entry("InfinispanEmbeddedClusterService",
+
"org.apache.camel.component.infinispan.embedded.cluster.InfinispanEmbeddedClusterService|org.apache.camel.cluster.CamelClusterService|camel-infinispan-embedded"),
+ Map.entry("InfinispanEmbeddedIdempotentRepository",
+
"org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-infinispan-embedded"),
+ Map.entry("InfinispanRemoteAggregationRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-infinispan"),
+ Map.entry("InfinispanRemoteClusterService",
+
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService|org.apache.camel.cluster.CamelClusterService|camel-infinispan"),
+ Map.entry("InfinispanRemoteIdempotentRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-infinispan"),
+ Map.entry("InfinispanRemoteKeyValueRepository",
+
"org.apache.camel.component.infinispan.remote.InfinispanRemoteKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-infinispan"),
+ Map.entry("JCacheAggregationRepository",
+
"org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-jcache"),
+ Map.entry("JCacheIdempotentRepository",
+
"org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-jcache"),
+ Map.entry("JCacheKeyValueRepository",
+
"org.apache.camel.component.jcache.processor.JCacheKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-jcache"),
+ Map.entry("JGroupsRaftClusterService",
+
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService|org.apache.camel.cluster.CamelClusterService|camel-jgroups-raft"),
+ Map.entry("JdbcAggregationRepository",
+
"org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-sql"),
+ Map.entry("JdbcKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.jdbc.JdbcKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-sql"),
+ Map.entry("JdbcMessageIdRepository",
+
"org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository|org.apache.camel.spi.IdempotentRepository|camel-sql"),
+ Map.entry("JpaKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.jpa.JpaKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-jpa"),
+ Map.entry("KafkaIdempotentRepository",
+
"org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-kafka"),
+ Map.entry("KafkaKeyValueRepository",
+
"org.apache.camel.processor.keyvalue.kafka.KafkaKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-kafka"),
+ Map.entry("KeyValueAggregationRepository",
+
"org.apache.camel.support.KeyValueAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-support"),
+ Map.entry("KeyValueIdempotentRepository",
+
"org.apache.camel.support.KeyValueIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("KubernetesClusterService",
+
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService|org.apache.camel.cluster.CamelClusterService|camel-kubernetes"),
+ Map.entry("LoggingHttpActivityListener",
+
"org.apache.camel.component.http.LoggingHttpActivityListener|org.apache.camel.component.http.HttpActivityListener|camel-http"),
+ Map.entry("MemoryAggregationRepository",
+
"org.apache.camel.processor.aggregate.MemoryAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-core-processor"),
+ Map.entry("MemoryIdempotentRepository",
+
"org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-support"),
+ Map.entry("MemoryKeyValueRepository",
+
"org.apache.camel.support.MemoryKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-support"),
+ Map.entry("MongoDbIdempotentRepository",
+
"org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-mongodb"),
+ Map.entry("OpensearchBulkRequestAggregationStrategy",
+
"org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-opensearch"),
+ Map.entry("RedisAggregationRepository",
+
"org.apache.camel.component.redis.processor.aggregate.RedisAggregationRepository|org.apache.camel.spi.AggregationRepository|camel-redis"),
+ Map.entry("RedisKeyValueRepository",
+
"org.apache.camel.component.redis.RedisKeyValueRepository|org.apache.camel.spi.KeyValueRepository|camel-redis"),
+ Map.entry("SimpleScheduledRoutePolicy",
+
"org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-quartz"),
+ Map.entry("SpringCacheIdempotentRepository",
+
"org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-spring"),
+ Map.entry("SpringRedisIdempotentRepository",
+
"org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository|org.apache.camel.spi.IdempotentRepository|camel-spring-redis"),
+ Map.entry("StringAggregationStrategy",
+
"org.apache.camel.processor.aggregate.StringAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("TarAggregationStrategy",
+
"org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy|org.apache.camel.AggregationStrategy|camel-tarfile"),
+ Map.entry("ThrottlingExceptionRoutePolicy",
+
"org.apache.camel.throttling.ThrottlingExceptionRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-support"),
+ Map.entry("ThrottlingInflightRoutePolicy",
+
"org.apache.camel.throttling.ThrottlingInflightRoutePolicy|org.apache.camel.spi.RoutePolicy|camel-support"),
+ Map.entry("UseLatestAggregationStrategy",
+
"org.apache.camel.processor.aggregate.UseLatestAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("UseOriginalAggregationStrategy",
+
"org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy|org.apache.camel.AggregationStrategy|camel-core-processor"),
+ Map.entry("XsltAggregationStrategy",
+
"org.apache.camel.component.xslt.XsltAggregationStrategy|org.apache.camel.AggregationStrategy|camel-xslt"),
+ Map.entry("XsltSaxonAggregationStrategy",
+
"org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy|org.apache.camel.AggregationStrategy|camel-xslt-saxon"),
+ Map.entry("ZipAggregationStrategy",
+
"org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy|org.apache.camel.AggregationStrategy|camel-zipfile"),
+ Map.entry("ZooKeeperClusterService",
+
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService|org.apache.camel.cluster.CamelClusterService|camel-zookeeper")
+ // BEANS: END
+ );
+
+ private ArtifactUtils() {
+ }
+
+ /** The artifactId of the component with the given scheme, or null if it
is not a built-in Camel component. */
+ public static String componentArtifact(String scheme) {
+ return scheme != null ? COMPONENTS.get(scheme) : null;
+ }
+
+ /** The artifactId of the language with the given name, or null if it is
not a built-in Camel language. */
+ public static String languageArtifact(String name) {
+ return name != null ? LANGUAGES.get(name) : null;
+ }
+
+ /** The artifactId of the data format with the given name, or null if it
is not a built-in Camel data format. */
+ public static String dataFormatArtifact(String name) {
+ return name != null ? DATAFORMATS.get(name) : null;
+ }
+
+ /** The artifactId of the built-in bean with the given simple class name,
or null if there is none. */
+ public static String beanArtifact(String name) {
+ return beanField(name, 2);
+ }
+
+ /** The fully qualified class name of the built-in bean with the given
simple class name, or null. */
+ public static String beanJavaType(String name) {
+ return beanField(name, 0);
+ }
+
+ /** The interface the built-in bean with the given simple class name
implements, or null. */
+ public static String beanInterface(String name) {
+ return beanField(name, 1);
+ }
+
+ private static String beanField(String name, int index) {
+ String value = name != null ? BEANS.get(name) : null;
+ if (value == null) {
+ return null;
+ }
+ String[] parts = value.split("\\|", -1);
+ return parts[index].isEmpty() ? null : parts[index];
+ }
+
+ /** The schemes of all built-in components, including alternative schemes.
*/
+ public static Set<String> componentNames() {
+ return COMPONENTS.keySet();
+ }
+
+ /** The names of all built-in languages. */
+ public static Set<String> languageNames() {
+ return LANGUAGES.keySet();
+ }
+
+ /** The names of all built-in data formats. */
+ public static Set<String> dataFormatNames() {
+ return DATAFORMATS.keySet();
+ }
+
+ /** The simple class names of all built-in beans. */
+ public static Set<String> beanNames() {
+ return BEANS.keySet();
+ }
+
+ /**
+ * What to add to the classpath for the artifact: the plain artifactId,
and its Spring Boot starter and Quarkus
+ * extension names, as the runtime cannot tell which of the three applies.
A core artifact (part of camel-core) has
+ * no starter or extension of its own.
+ */
+ public static String dependencyHint(String artifactId) {
+ if (isCoreArtifact(artifactId)) {
+ return "add " + artifactId + " (part of camel-core) to the
classpath";
+ }
+ String name = artifactId.startsWith("camel-") ?
artifactId.substring(6) : artifactId;
+ return "add " + artifactId + " to the classpath (" + artifactId +
"-starter on Spring Boot, camel-quarkus-" + name
+ + " on Quarkus)";
+ }
+
+ private static boolean isCoreArtifact(String artifactId) {
+ return artifactId.startsWith("camel-core-") ||
artifactId.equals("camel-core") || artifactId.equals("camel-base")
+ || artifactId.equals("camel-base-engine") ||
artifactId.equals("camel-support")
+ || artifactId.equals("camel-api") ||
artifactId.equals("camel-util");
+ }
+
+ /**
+ * The hint for a component scheme that could not be resolved: the
artifact to add when the scheme is a built-in
+ * component, or else the built-in scheme that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String componentHint(String scheme) {
+ return hint(scheme, "component", COMPONENTS);
+ }
+
+ /**
+ * The hint for a language name that could not be resolved: the artifact
to add when the name is a built-in
+ * language, or else the built-in language that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String languageHint(String name) {
+ return hint(name, "language", LANGUAGES);
+ }
+
+ /**
+ * The hint for a data format name that could not be resolved: the
artifact to add when the name is a built-in data
+ * format, or else the built-in data format that was likely meant.
+ *
+ * @return the hint in parentheses with a leading space, or an empty
string if there is nothing to say
+ */
+ public static String dataFormatHint(String name) {
+ return hint(name, "data format", DATAFORMATS);
+ }
+
+ private static String hint(String name, String kind, Map<String, String>
table) {
+ if (name == null || name.isBlank()) {
+ return "";
+ }
+ String artifact = table.get(name);
+ if (artifact != null) {
+ return " (the " + name + " " + kind + " is in " + artifact + "; "
+ dependencyHint(artifact) + ")";
+ }
+ String best = closest(name, table.keySet());
+ if (best != null) {
+ return " (not a built-in Camel " + kind + "; did you mean '" +
best + "'?)";
+ }
+ return " (not a built-in Camel " + kind + ")";
+ }
+
+ /**
+ * The candidate closest to the name, case-insensitively, when it is
within a few edits (one for names up to three
+ * characters, two, or a third of the name's length for longer names); the
shorter candidate wins a tie.
+ *
+ * @return the closest candidate, or null if none is close enough
+ */
+ public static String closest(String name, Collection<String> candidates) {
+ if (name == null || name.isBlank() || candidates == null) {
+ return null;
+ }
+ String best = null;
+ int bestDistance = Integer.MAX_VALUE;
+ int threshold = name.length() <= 3 ? 1 : Math.max(2, name.length() /
3);
+ String n = name.toLowerCase(Locale.ROOT);
+ for (String candidate : candidates) {
+ int d = distance(n, candidate.toLowerCase(Locale.ROOT));
Review Comment:
**NPE on null elements in `candidates`.**
`candidate.toLowerCase(Locale.ROOT)` throws `NullPointerException` if any
element in the `Collection<String>` is `null`. The null guard at the top of
`closest()` covers a null `name` and a null `candidates` reference, but not
null *elements inside* the collection. Add a guard:
```suggestion
int d = distance(n, candidate == null ? "" :
candidate.toLowerCase(Locale.ROOT));
```
(Or `if (candidate == null) continue;` — either works. Without it, any
caller passing a collection with a null element gets a silent NPE instead of a
graceful skip.)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]