gnodet-bot commented on code in PR #26459: URL: https://github.com/apache/camel/pull/26459#discussion_r4014820749
########## core/camel-core/src/test/java/org/apache/camel/processor/DataFormatMissingJarHintTest.java: ########## @@ -0,0 +1,90 @@ +/* + * 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.processor; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; Review Comment: **Nit (carried from prior review, not yet addressed): use AssertJ instead of JUnit assertions.** `ArtifactUtilsTest` and `SimpleSyntaxHintsTest` — both added in this same PR — use AssertJ exclusively (`assertThat`, `assertThatThrownBy`). This file is the odd one out. Replace the two static imports: ```suggestion import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; ``` And rewrite the assertions, e.g. for `testModelDataFormatSaysWhatToAdd`: ```java assertThatThrownBy(() -> { context.addRoutes(new RouteBuilder() { @Override public void configure() { from("direct:start").unmarshal().jaxb("com.foo").to("mock:result"); } }); context.start(); }).satisfies(e -> { String msg = messages(e); assertThat(msg).contains("Data format 'jaxb' could not be created."); assertThat(msg).contains("(the jaxb data format is in camel-jaxb; add camel-jaxb to the classpath)"); }); ``` Same pattern for the other two methods. ########## core/camel-util/src/main/java/org/apache/camel/util/ArtifactUtils.java: ########## @@ -0,0 +1,889 @@ +/* + * 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, which is what the runtime knows. The Spring + * Boot starter (artifactId-starter) and Quarkus extension (camel-quarkus-name) are a convention for the tooling + * that can check they exist, as camel-jbang export does; not every artifact has one. A core artifact is noted as + * part of camel-core. + */ + public static String dependencyHint(String artifactId) { Review Comment: **Nit: `dependencyHint(null)` throws `NullPointerException`.** `isCoreArtifact` calls `artifactId.startsWith(...)` without a null guard. All internal callers are safe (the `hint()` method only calls `dependencyHint(artifact)` when `artifact != null`), but the method is `public` — external callers passing `null` get an NPE with no indication of why. Add a guard: ```suggestion public static String dependencyHint(String artifactId) { if (artifactId == null || artifactId.isBlank()) { return ""; } if (isCoreArtifact(artifactId)) { return "add " + artifactId + " (part of camel-core) to the classpath"; } return "add " + artifactId + " to the classpath"; } ``` -- 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]
