davsclaus commented on code in PR #26459:
URL: https://github.com/apache/camel/pull/26459#discussion_r4014588081


##########
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:
   Good catch — `htps` → `ftps` was indeed wrong. Fixed in 411346a8248d, though 
not by dropping the tie-break as suggested: `Map.ofEntries` iteration order is 
salted per JVM (it is not alphabetical), so "whichever comes first" would make 
the suggestion vary between runs. Instead, candidates at the same distance are 
tie-broken by the longer common prefix with the typed name (typos are seldom in 
the first letters), which gives `https` and `http` for both of your examples; 
if that still ties (e.g. `jm` vs `jms`/`jmx`) `closest()` returns null and no 
guess is made, per your own point that not guessing beats guessing wrong. 
`testClosestTie` covers all three cases plus `componentHint("htps")` against 
the real table.
   
   _Claude Code on behalf of davsclaus_



##########
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:
   Applied in 411346a8248d — null candidates are skipped (`continue`), with a 
test case. The only caller today passes `table.keySet()` so it could not happen 
yet, but `closest()` is public so the guard is worth having.
   
   _Claude Code on behalf of davsclaus_



##########
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:
   The pre-check is deliberate and the suggestion would change behaviour: 
`hint()` does not return `""` for an unknown name — it returns `(not a built-in 
Camel data format; did you mean 'x'?)` (or `(not a built-in Camel data 
format)`). Here the ref is a registry bean name, e.g. `custom("myFormat")`, so 
an unknown ref is the normal case and must not get a data-format did-you-mean; 
the hint is only wanted when the ref happens to be the name of a built-in data 
format whose jar is missing (`custom("jaxb")`). 
`DataFormatMissingJarHintTest.testDataFormatByRefThatIsNotBuiltInHasNoHint` 
pins this. The `createDataFormat()` site at line 130 differs because there the 
name is a model data format name, so a did-you-mean is right. The second 
`Map.get` is on a fatal error path, so it costs nothing.
   
   I did sharpen the code comment in 411346a8248d so the intent is clearer to 
the next reader.
   
   _Claude Code on behalf of davsclaus_



-- 
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]

Reply via email to