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]
