This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 866cb966b6b8 CAMEL-20552 - Create an Azure Event Grid component
(#19941)
866cb966b6b8 is described below
commit 866cb966b6b806a7f309fb69232dbdedba7d5b41
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Nov 17 18:53:31 2025 +0100
CAMEL-20552 - Create an Azure Event Grid component (#19941)
Signed-off-by: Andrea Cosentino <[email protected]>
---
bom/camel-bom/pom.xml | 5 +
catalog/camel-allcomponents/pom.xml | 5 +
.../camel-azure/camel-azure-eventgrid/pom.xml | 72 ++++++++++
.../eventgrid/EventGridComponentConfigurer.java | 111 ++++++++++++++
.../eventgrid/EventGridEndpointConfigurer.java | 95 ++++++++++++
.../eventgrid/EventGridEndpointUriFactory.java | 80 +++++++++++
.../component/azure/eventgrid/azure-eventgrid.json | 52 +++++++
.../services/org/apache/camel/component.properties | 7 +
.../org/apache/camel/component/azure-eventgrid | 2 +
.../camel/configurer/azure-eventgrid-component | 2 +
.../camel/configurer/azure-eventgrid-endpoint | 2 +
.../camel/urifactory/azure-eventgrid-endpoint | 2 +
.../component/azure/eventgrid/CredentialType.java | 39 +++++
.../azure/eventgrid/EventGridComponent.java | 115 +++++++++++++++
.../azure/eventgrid/EventGridConfiguration.java | 126 ++++++++++++++++
.../azure/eventgrid/EventGridConstants.java | 41 ++++++
.../azure/eventgrid/EventGridEndpoint.java | 90 ++++++++++++
.../azure/eventgrid/EventGridProducer.java | 160 +++++++++++++++++++++
.../org/apache/camel/component/azure-eventgrid | 1 +
.../azure/eventgrid/EventGridComponentTest.java | 100 +++++++++++++
components/camel-azure/pom.xml | 1 +
.../ROOT/examples/json/azure-eventgrid.json | 1 +
parent/pom.xml | 5 +
23 files changed, 1114 insertions(+)
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 35074ea948e7..b78616a5ab9c 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -276,6 +276,11 @@
<artifactId>camel-azure-cosmosdb</artifactId>
<version>4.17.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-azure-eventgrid</artifactId>
+ <version>4.17.0-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-azure-eventhubs</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml
b/catalog/camel-allcomponents/pom.xml
index 7edb1f43e46b..6b79e23afacf 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -276,6 +276,11 @@
<artifactId>camel-azure-cosmosdb</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-azure-eventgrid</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-azure-eventhubs</artifactId>
diff --git a/components/camel-azure/camel-azure-eventgrid/pom.xml
b/components/camel-azure/camel-azure-eventgrid/pom.xml
new file mode 100644
index 000000000000..32334343bd63
--- /dev/null
+++ b/components/camel-azure/camel-azure-eventgrid/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-azure-parent</artifactId>
+ <version>4.17.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-azure-eventgrid</artifactId>
+ <packaging>jar</packaging>
+
+ <name>Camel :: Azure :: Event Grid</name>
+ <description>Camel Azure Event Grid Component</description>
+
+ <properties>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-support</artifactId>
+ </dependency>
+
+ <!-- azure sdk -->
+ <dependency>
+ <groupId>com.azure</groupId>
+ <artifactId>azure-messaging-eventgrid</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.azure</groupId>
+ <artifactId>azure-identity</artifactId>
+ </dependency>
+
+ <!-- for testing -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-junit5</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>${mockito-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridComponentConfigurer.java
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridComponentConfigurer.java
new file mode 100644
index 000000000000..a3b9b81df4b6
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridComponentConfigurer.java
@@ -0,0 +1,111 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.azure.eventgrid;
+
+import javax.annotation.processing.Generated;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointSchemaGeneratorMojo")
+@SuppressWarnings("unchecked")
+public class EventGridComponentConfigurer extends PropertyConfigurerSupport
implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ private org.apache.camel.component.azure.eventgrid.EventGridConfiguration
getOrCreateConfiguration(EventGridComponent target) {
+ if (target.getConfiguration() == null) {
+ target.setConfiguration(new
org.apache.camel.component.azure.eventgrid.EventGridConfiguration());
+ }
+ return target.getConfiguration();
+ }
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String
name, Object value, boolean ignoreCase) {
+ EventGridComponent target = (EventGridComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey":
getOrCreateConfiguration(target).setAccessKey(property(camelContext,
java.lang.String.class, value)); return true;
+ case "autowiredenabled":
+ case "autowiredEnabled":
target.setAutowiredEnabled(property(camelContext, boolean.class, value));
return true;
+ case "azurekeycredential":
+ case "azureKeyCredential":
getOrCreateConfiguration(target).setAzureKeyCredential(property(camelContext,
com.azure.core.credential.AzureKeyCredential.class, value)); return true;
+ case "configuration": target.setConfiguration(property(camelContext,
org.apache.camel.component.azure.eventgrid.EventGridConfiguration.class,
value)); return true;
+ case "credentialtype":
+ case "credentialType":
getOrCreateConfiguration(target).setCredentialType(property(camelContext,
org.apache.camel.component.azure.eventgrid.CredentialType.class, value));
return true;
+ case "lazystartproducer":
+ case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
+ case "publisherclient":
+ case "publisherClient":
getOrCreateConfiguration(target).setPublisherClient(property(camelContext,
com.azure.messaging.eventgrid.EventGridPublisherClient.class, value)); return
true;
+ case "tokencredential":
+ case "tokenCredential":
getOrCreateConfiguration(target).setTokenCredential(property(camelContext,
com.azure.core.credential.TokenCredential.class, value)); return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public String[] getAutowiredNames() {
+ return new String[]{"azureKeyCredential", "publisherClient",
"tokenCredential"};
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey": return java.lang.String.class;
+ case "autowiredenabled":
+ case "autowiredEnabled": return boolean.class;
+ case "azurekeycredential":
+ case "azureKeyCredential": return
com.azure.core.credential.AzureKeyCredential.class;
+ case "configuration": return
org.apache.camel.component.azure.eventgrid.EventGridConfiguration.class;
+ case "credentialtype":
+ case "credentialType": return
org.apache.camel.component.azure.eventgrid.CredentialType.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ case "publisherclient":
+ case "publisherClient": return
com.azure.messaging.eventgrid.EventGridPublisherClient.class;
+ case "tokencredential":
+ case "tokenCredential": return
com.azure.core.credential.TokenCredential.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ EventGridComponent target = (EventGridComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey": return
getOrCreateConfiguration(target).getAccessKey();
+ case "autowiredenabled":
+ case "autowiredEnabled": return target.isAutowiredEnabled();
+ case "azurekeycredential":
+ case "azureKeyCredential": return
getOrCreateConfiguration(target).getAzureKeyCredential();
+ case "configuration": return target.getConfiguration();
+ case "credentialtype":
+ case "credentialType": return
getOrCreateConfiguration(target).getCredentialType();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ case "publisherclient":
+ case "publisherClient": return
getOrCreateConfiguration(target).getPublisherClient();
+ case "tokencredential":
+ case "tokenCredential": return
getOrCreateConfiguration(target).getTokenCredential();
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getCollectionValueType(Object target, String name, boolean
ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "publisherclient":
+ case "publisherClient": return com.azure.core.models.CloudEvent.class;
+ default: return null;
+ }
+ }
+}
+
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointConfigurer.java
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointConfigurer.java
new file mode 100644
index 000000000000..70d7eedd5207
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointConfigurer.java
@@ -0,0 +1,95 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.azure.eventgrid;
+
+import javax.annotation.processing.Generated;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointSchemaGeneratorMojo")
+@SuppressWarnings("unchecked")
+public class EventGridEndpointConfigurer extends PropertyConfigurerSupport
implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String
name, Object value, boolean ignoreCase) {
+ EventGridEndpoint target = (EventGridEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey":
target.getConfiguration().setAccessKey(property(camelContext,
java.lang.String.class, value)); return true;
+ case "azurekeycredential":
+ case "azureKeyCredential":
target.getConfiguration().setAzureKeyCredential(property(camelContext,
com.azure.core.credential.AzureKeyCredential.class, value)); return true;
+ case "credentialtype":
+ case "credentialType":
target.getConfiguration().setCredentialType(property(camelContext,
org.apache.camel.component.azure.eventgrid.CredentialType.class, value));
return true;
+ case "lazystartproducer":
+ case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
+ case "publisherclient":
+ case "publisherClient":
target.getConfiguration().setPublisherClient(property(camelContext,
com.azure.messaging.eventgrid.EventGridPublisherClient.class, value)); return
true;
+ case "tokencredential":
+ case "tokenCredential":
target.getConfiguration().setTokenCredential(property(camelContext,
com.azure.core.credential.TokenCredential.class, value)); return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public String[] getAutowiredNames() {
+ return new String[]{"azureKeyCredential", "publisherClient",
"tokenCredential"};
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey": return java.lang.String.class;
+ case "azurekeycredential":
+ case "azureKeyCredential": return
com.azure.core.credential.AzureKeyCredential.class;
+ case "credentialtype":
+ case "credentialType": return
org.apache.camel.component.azure.eventgrid.CredentialType.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ case "publisherclient":
+ case "publisherClient": return
com.azure.messaging.eventgrid.EventGridPublisherClient.class;
+ case "tokencredential":
+ case "tokenCredential": return
com.azure.core.credential.TokenCredential.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ EventGridEndpoint target = (EventGridEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "accesskey":
+ case "accessKey": return target.getConfiguration().getAccessKey();
+ case "azurekeycredential":
+ case "azureKeyCredential": return
target.getConfiguration().getAzureKeyCredential();
+ case "credentialtype":
+ case "credentialType": return
target.getConfiguration().getCredentialType();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ case "publisherclient":
+ case "publisherClient": return
target.getConfiguration().getPublisherClient();
+ case "tokencredential":
+ case "tokenCredential": return
target.getConfiguration().getTokenCredential();
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getCollectionValueType(Object target, String name, boolean
ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "publisherclient":
+ case "publisherClient": return com.azure.core.models.CloudEvent.class;
+ default: return null;
+ }
+ }
+}
+
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointUriFactory.java
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointUriFactory.java
new file mode 100644
index 000000000000..35f146868c54
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/java/org/apache/camel/component/azure/eventgrid/EventGridEndpointUriFactory.java
@@ -0,0 +1,80 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.azure.eventgrid;
+
+import javax.annotation.processing.Generated;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.GenerateEndpointUriFactoryMojo")
+public class EventGridEndpointUriFactory extends
org.apache.camel.support.component.EndpointUriFactorySupport implements
EndpointUriFactory {
+
+ private static final String BASE = ":topicEndpoint";
+
+ private static final Set<String> PROPERTY_NAMES;
+ private static final Set<String> SECRET_PROPERTY_NAMES;
+ private static final Map<String, String> MULTI_VALUE_PREFIXES;
+ static {
+ Set<String> props = new HashSet<>(7);
+ props.add("accessKey");
+ props.add("azureKeyCredential");
+ props.add("credentialType");
+ props.add("lazyStartProducer");
+ props.add("publisherClient");
+ props.add("tokenCredential");
+ props.add("topicEndpoint");
+ PROPERTY_NAMES = Collections.unmodifiableSet(props);
+ Set<String> secretProps = new HashSet<>(3);
+ secretProps.add("accessKey");
+ secretProps.add("azureKeyCredential");
+ secretProps.add("tokenCredential");
+ SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
+ MULTI_VALUE_PREFIXES = Collections.emptyMap();
+ }
+
+ @Override
+ public boolean isEnabled(String scheme) {
+ return "azure-eventgrid".equals(scheme);
+ }
+
+ @Override
+ public String buildUri(String scheme, Map<String, Object> properties,
boolean encode) throws URISyntaxException {
+ String syntax = scheme + BASE;
+ String uri = syntax;
+
+ Map<String, Object> copy = new HashMap<>(properties);
+
+ uri = buildPathParameter(syntax, uri, "topicEndpoint", null, true,
copy);
+ uri = buildQueryParameters(uri, copy, encode);
+ return uri;
+ }
+
+ @Override
+ public Set<String> propertyNames() {
+ return PROPERTY_NAMES;
+ }
+
+ @Override
+ public Set<String> secretPropertyNames() {
+ return SECRET_PROPERTY_NAMES;
+ }
+
+ @Override
+ public Map<String, String> multiValuePrefixes() {
+ return MULTI_VALUE_PREFIXES;
+ }
+
+ @Override
+ public boolean isLenientProperties() {
+ return false;
+ }
+}
+
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/org/apache/camel/component/azure/eventgrid/azure-eventgrid.json
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/org/apache/camel/component/azure/eventgrid/azure-eventgrid.json
new file mode 100644
index 000000000000..8a16730595f9
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/org/apache/camel/component/azure/eventgrid/azure-eventgrid.json
@@ -0,0 +1,52 @@
+{
+ "component": {
+ "kind": "component",
+ "name": "azure-eventgrid",
+ "title": "Azure Event Grid",
+ "description": "Send events to Azure Event Grid topics.",
+ "deprecated": false,
+ "firstVersion": "4.17.0",
+ "label": "cloud,messaging",
+ "javaType":
"org.apache.camel.component.azure.eventgrid.EventGridComponent",
+ "supportLevel": "Preview",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-azure-eventgrid",
+ "version": "4.17.0-SNAPSHOT",
+ "scheme": "azure-eventgrid",
+ "extendsScheme": "",
+ "syntax": "azure-eventgrid:topicEndpoint",
+ "async": false,
+ "api": false,
+ "consumerOnly": false,
+ "producerOnly": true,
+ "lenientProperties": false,
+ "browsable": false,
+ "remote": true
+ },
+ "componentProperties": {
+ "configuration": { "index": 0, "kind": "property", "displayName":
"Configuration", "group": "producer", "label": "", "required": false, "type":
"object", "javaType":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"deprecated": false, "autowired": false, "secret": false, "description": "The
component configurations" },
+ "lazyStartProducer": { "index": 1, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
+ "publisherClient": { "index": 2, "kind": "property", "displayName":
"Publisher Client", "group": "producer", "label": "producer", "required":
false, "type": "object", "javaType":
"com.azure.messaging.eventgrid.EventGridPublisherClient<com.azure.core.models.CloudEvent>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "descri [...]
+ "autowiredEnabled": { "index": 3, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ "accessKey": { "index": 4, "kind": "property", "displayName": "Access
Key", "group": "security", "label": "security", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": false, "autowired":
false, "secret": true, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "The access key for the
Event Grid topic. Required when using ACCESS_KEY credential type." },
+ "azureKeyCredential": { "index": 5, "kind": "property", "displayName":
"Azure Key Credential", "group": "security", "label": "security", "required":
false, "type": "object", "javaType":
"com.azure.core.credential.AzureKeyCredential", "deprecated": false,
"deprecationNote": "", "autowired": true, "secret": true, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "The Azure Key Credential
for [...]
+ "credentialType": { "index": 6, "kind": "property", "displayName":
"Credential Type", "group": "security", "label": "security", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.azure.eventgrid.CredentialType", "enum": [
"ACCESS_KEY", "AZURE_IDENTITY", "TOKEN_CREDENTIAL" ], "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "ACCESS_KEY",
"configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration", "configur
[...]
+ "tokenCredential": { "index": 7, "kind": "property", "displayName": "Token
Credential", "group": "security", "label": "security", "required": false,
"type": "object", "javaType": "com.azure.core.credential.TokenCredential",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": true,
"configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "Provide custom
authentication credentia [...]
+ },
+ "headers": {
+ "CamelAzureEventGridEventType": { "index": 0, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The event type of the event.",
"constantName":
"org.apache.camel.component.azure.eventgrid.EventGridConstants#EVENT_TYPE" },
+ "CamelAzureEventGridSubject": { "index": 1, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The subject of the event.",
"constantName":
"org.apache.camel.component.azure.eventgrid.EventGridConstants#SUBJECT" },
+ "CamelAzureEventGridEventTime": { "index": 2, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "OffsetDateTime", "deprecated": false, "deprecationNote": "",
"autowired": false, "secret": false, "description": "The time the event was
generated.", "constantName":
"org.apache.camel.component.azure.eventgrid.EventGridConstants#EVENT_TIME" },
+ "CamelAzureEventGridId": { "index": 3, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The unique identifier for the event.", "constantName":
"org.apache.camel.component.azure.eventgrid.EventGridConstants#ID" },
+ "CamelAzureEventGridDataVersion": { "index": 4, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The schema version of the data
object.", "constantName":
"org.apache.camel.component.azure.eventgrid.EventGridConstants#DATA_VERSION" }
+ },
+ "properties": {
+ "topicEndpoint": { "index": 0, "kind": "path", "displayName": "Topic
Endpoint", "group": "producer", "label": "", "required": true, "type":
"string", "javaType": "java.lang.String", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false,
"configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "The topic endpoint URL
where events will be published." },
+ "publisherClient": { "index": 1, "kind": "parameter", "displayName":
"Publisher Client", "group": "producer", "label": "producer", "required":
false, "type": "object", "javaType":
"com.azure.messaging.eventgrid.EventGridPublisherClient<com.azure.core.models.CloudEvent>",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret":
false, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "descr [...]
+ "lazyStartProducer": { "index": 2, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ "accessKey": { "index": 3, "kind": "parameter", "displayName": "Access
Key", "group": "security", "label": "security", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": false, "autowired":
false, "secret": true, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "The access key for the
Event Grid topic. Required when using ACCESS_KEY credential type." },
+ "azureKeyCredential": { "index": 4, "kind": "parameter", "displayName":
"Azure Key Credential", "group": "security", "label": "security", "required":
false, "type": "object", "javaType":
"com.azure.core.credential.AzureKeyCredential", "deprecated": false,
"deprecationNote": "", "autowired": true, "secret": true, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "The Azure Key Credential
for [...]
+ "credentialType": { "index": 5, "kind": "parameter", "displayName":
"Credential Type", "group": "security", "label": "security", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.azure.eventgrid.CredentialType", "enum": [
"ACCESS_KEY", "AZURE_IDENTITY", "TOKEN_CREDENTIAL" ], "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "ACCESS_KEY",
"configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration", "configu
[...]
+ "tokenCredential": { "index": 6, "kind": "parameter", "displayName":
"Token Credential", "group": "security", "label": "security", "required":
false, "type": "object", "javaType":
"com.azure.core.credential.TokenCredential", "deprecated": false,
"deprecationNote": "", "autowired": true, "secret": true, "configurationClass":
"org.apache.camel.component.azure.eventgrid.EventGridConfiguration",
"configurationField": "configuration", "description": "Provide custom
authentication credenti [...]
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component.properties
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 000000000000..99f75e8c17f1
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=azure-eventgrid
+groupId=org.apache.camel
+artifactId=camel-azure-eventgrid
+version=4.17.0-SNAPSHOT
+projectName=Camel :: Azure :: Event Grid
+projectDescription=Camel Azure Event Grid Component
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
new file mode 100644
index 000000000000..2530bcc72614
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.azure.eventgrid.EventGridComponent
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-component
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-component
new file mode 100644
index 000000000000..1b30694205e2
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.azure.eventgrid.EventGridComponentConfigurer
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-endpoint
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-endpoint
new file mode 100644
index 000000000000..701da4995bfe
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/configurer/azure-eventgrid-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.azure.eventgrid.EventGridEndpointConfigurer
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/urifactory/azure-eventgrid-endpoint
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/urifactory/azure-eventgrid-endpoint
new file mode 100644
index 000000000000..a6fa9bfa06fc
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/services/org/apache/camel/urifactory/azure-eventgrid-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.azure.eventgrid.EventGridEndpointUriFactory
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/CredentialType.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/CredentialType.java
new file mode 100644
index 000000000000..a091748c393e
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/CredentialType.java
@@ -0,0 +1,39 @@
+/*
+ * 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.component.azure.eventgrid;
+
+public enum CredentialType {
+ /**
+ * EventGrid Access Key
+ */
+ ACCESS_KEY,
+ /**
+ * Includes:
+ * <uL>
+ * <li>Service principal with secret</li>
+ * <li>Service principal with certificate</li>
+ * <li>username and password</li>
+ * </uL>
+ *
+ * @see com.azure.identity.DefaultAzureCredentialBuilder
+ */
+ AZURE_IDENTITY,
+ /**
+ * EventGrid Token Credential
+ */
+ TOKEN_CREDENTIAL,
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridComponent.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridComponent.java
new file mode 100644
index 000000000000..4c9ffee79df1
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridComponent.java
@@ -0,0 +1,115 @@
+/*
+ * 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.component.azure.eventgrid;
+
+import java.util.Map;
+
+import com.azure.identity.DefaultAzureCredential;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Azure EventGrid component
+ */
+@Component("azure-eventgrid")
+public class EventGridComponent extends DefaultComponent {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(EventGridComponent.class);
+
+ @Metadata
+ private EventGridConfiguration configuration = new
EventGridConfiguration();
+
+ public EventGridComponent() {
+ }
+
+ @Override
+ protected Endpoint createEndpoint(String uri, String remaining,
Map<String, Object> parameters) throws Exception {
+ final EventGridConfiguration configuration = this.configuration.copy();
+
+ // Set the topic endpoint from the remaining part if not using a
custom client
+ if (configuration.getPublisherClient() == null &&
ObjectHelper.isNotEmpty(remaining)) {
+ configuration.setTopicEndpoint(remaining);
+ }
+
+ final EventGridEndpoint endpoint = new EventGridEndpoint(uri, this,
configuration);
+ setProperties(endpoint, parameters);
+
+ // Ensure we use default credential type if not configured
+ if (endpoint.getConfiguration().getTokenCredential() == null
+ && endpoint.getConfiguration().getAzureKeyCredential() == null
+ && endpoint.getConfiguration().getAccessKey() == null) {
+ if (endpoint.getConfiguration().getCredentialType() == null) {
+
endpoint.getConfiguration().setCredentialType(CredentialType.AZURE_IDENTITY);
+ }
+ } else if (endpoint.getConfiguration().getTokenCredential() != null) {
+ boolean azure = endpoint.getConfiguration().getTokenCredential()
instanceof DefaultAzureCredential;
+ endpoint.getConfiguration()
+ .setCredentialType(azure ? CredentialType.AZURE_IDENTITY :
CredentialType.TOKEN_CREDENTIAL);
+ } else if (endpoint.getConfiguration().getAzureKeyCredential() != null
+ || endpoint.getConfiguration().getAccessKey() != null) {
+
endpoint.getConfiguration().setCredentialType(CredentialType.ACCESS_KEY);
+ }
+
+ validateConfigurations(configuration);
+
+ return endpoint;
+ }
+
+ /**
+ * The component configurations
+ */
+ public EventGridConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ public void setConfiguration(EventGridConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ private void validateConfigurations(final EventGridConfiguration
configuration) {
+ if (configuration.getPublisherClient() == null) {
+ if (ObjectHelper.isEmpty(configuration.getTopicEndpoint())) {
+ throw new IllegalArgumentException("Topic endpoint must be
specified.");
+ }
+
+ if (!isAccessKeySet(configuration) &&
!isTokenCredentialSet(configuration)
+ && !isAzureIdentitySet(configuration)) {
+ throw new IllegalArgumentException(
+ "Azure EventGrid AccessKey, AzureKeyCredential,
TokenCredential or Azure Identity must be specified.");
+ }
+ }
+ }
+
+ private boolean isAccessKeySet(final EventGridConfiguration configuration)
{
+ return ObjectHelper.isNotEmpty(configuration.getAccessKey())
+ ||
ObjectHelper.isNotEmpty(configuration.getAzureKeyCredential());
+ }
+
+ private boolean isTokenCredentialSet(final EventGridConfiguration
configuration) {
+ return ObjectHelper.isNotEmpty(configuration.getTokenCredential());
+ }
+
+ private boolean isAzureIdentitySet(final EventGridConfiguration
configuration) {
+ return ObjectHelper.isNotEmpty(configuration.getCredentialType())
+ &&
configuration.getCredentialType().equals(CredentialType.AZURE_IDENTITY);
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConfiguration.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConfiguration.java
new file mode 100644
index 000000000000..545f0ffdfc64
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConfiguration.java
@@ -0,0 +1,126 @@
+/*
+ * 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.component.azure.eventgrid;
+
+import com.azure.core.credential.AzureKeyCredential;
+import com.azure.core.credential.TokenCredential;
+import com.azure.messaging.eventgrid.EventGridPublisherClient;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+@UriParams
+public class EventGridConfiguration implements Cloneable {
+
+ @UriPath
+ @Metadata(required = true)
+ private String topicEndpoint;
+
+ @UriParam(label = "security", secret = true)
+ private String accessKey;
+
+ @UriParam(label = "security", secret = true)
+ @Metadata(autowired = true)
+ private AzureKeyCredential azureKeyCredential;
+
+ @UriParam(label = "security", secret = true)
+ @Metadata(autowired = true)
+ private TokenCredential tokenCredential;
+
+ @UriParam(label = "security", enums =
"ACCESS_KEY,AZURE_IDENTITY,TOKEN_CREDENTIAL", defaultValue = "ACCESS_KEY")
+ private CredentialType credentialType = CredentialType.ACCESS_KEY;
+
+ @UriParam(label = "producer")
+ @Metadata(autowired = true)
+ private EventGridPublisherClient<com.azure.core.models.CloudEvent>
publisherClient;
+
+ /**
+ * The topic endpoint URL where events will be published.
+ */
+ public String getTopicEndpoint() {
+ return topicEndpoint;
+ }
+
+ public void setTopicEndpoint(String topicEndpoint) {
+ this.topicEndpoint = topicEndpoint;
+ }
+
+ /**
+ * The access key for the Event Grid topic. Required when using ACCESS_KEY
credential type.
+ */
+ public String getAccessKey() {
+ return accessKey;
+ }
+
+ public void setAccessKey(String accessKey) {
+ this.accessKey = accessKey;
+ }
+
+ /**
+ * The Azure Key Credential for authentication. This is automatically
created from the accessKey if not provided.
+ */
+ public AzureKeyCredential getAzureKeyCredential() {
+ return azureKeyCredential;
+ }
+
+ public void setAzureKeyCredential(AzureKeyCredential azureKeyCredential) {
+ this.azureKeyCredential = azureKeyCredential;
+ }
+
+ /**
+ * Provide custom authentication credentials using an implementation of
{@link TokenCredential}.
+ */
+ public TokenCredential getTokenCredential() {
+ return tokenCredential;
+ }
+
+ public void setTokenCredential(TokenCredential tokenCredential) {
+ this.tokenCredential = tokenCredential;
+ }
+
+ /**
+ * Determines the credential strategy to adopt
+ */
+ public CredentialType getCredentialType() {
+ return credentialType;
+ }
+
+ public void setCredentialType(CredentialType credentialType) {
+ this.credentialType = credentialType;
+ }
+
+ /**
+ * The EventGrid publisher client. If provided, it will be used instead of
creating a new one.
+ */
+ public EventGridPublisherClient<com.azure.core.models.CloudEvent>
getPublisherClient() {
+ return publisherClient;
+ }
+
+ public void
setPublisherClient(EventGridPublisherClient<com.azure.core.models.CloudEvent>
publisherClient) {
+ this.publisherClient = publisherClient;
+ }
+
+ public EventGridConfiguration copy() {
+ try {
+ return (EventGridConfiguration) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeCamelException(e);
+ }
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConstants.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConstants.java
new file mode 100644
index 000000000000..ea35056e20cb
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridConstants.java
@@ -0,0 +1,41 @@
+/*
+ * 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.component.azure.eventgrid;
+
+import org.apache.camel.spi.Metadata;
+
+public final class EventGridConstants {
+ public static final String HEADER_PREFIX = "CamelAzureEventGrid";
+
+ @Metadata(description = "The event type of the event.", javaType =
"String")
+ public static final String EVENT_TYPE = HEADER_PREFIX + "EventType";
+
+ @Metadata(description = "The subject of the event.", javaType = "String")
+ public static final String SUBJECT = HEADER_PREFIX + "Subject";
+
+ @Metadata(description = "The time the event was generated.", javaType =
"OffsetDateTime")
+ public static final String EVENT_TIME = HEADER_PREFIX + "EventTime";
+
+ @Metadata(description = "The unique identifier for the event.", javaType =
"String")
+ public static final String ID = HEADER_PREFIX + "Id";
+
+ @Metadata(description = "The schema version of the data object.", javaType
= "String")
+ public static final String DATA_VERSION = HEADER_PREFIX + "DataVersion";
+
+ private EventGridConstants() {
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridEndpoint.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridEndpoint.java
new file mode 100644
index 000000000000..0600086f0e10
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridEndpoint.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.component.azure.eventgrid;
+
+import java.util.Map;
+
+import org.apache.camel.Category;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.EndpointServiceLocation;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Send events to Azure Event Grid topics.
+ */
+@UriEndpoint(firstVersion = "4.17.0", scheme = "azure-eventgrid", title =
"Azure Event Grid",
+ syntax = "azure-eventgrid:topicEndpoint", producerOnly = true,
category = {
+ Category.CLOUD, Category.MESSAGING },
+ headersClass = EventGridConstants.class)
+public class EventGridEndpoint extends DefaultEndpoint implements
EndpointServiceLocation {
+
+ @UriParam
+ private EventGridConfiguration configuration;
+
+ public EventGridEndpoint(final String uri, final Component component,
final EventGridConfiguration configuration) {
+ super(uri, component);
+ this.configuration = configuration;
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ return new EventGridProducer(this);
+ }
+
+ @Override
+ public Consumer createConsumer(Processor processor) throws Exception {
+ throw new UnsupportedOperationException("Consumer is not supported for
Azure Event Grid component");
+ }
+
+ /**
+ * The component configurations
+ */
+ public EventGridConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ public void setConfiguration(EventGridConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Override
+ public String getServiceUrl() {
+ if (ObjectHelper.isNotEmpty(configuration.getTopicEndpoint())) {
+ return configuration.getTopicEndpoint();
+ }
+ return null;
+ }
+
+ @Override
+ public String getServiceProtocol() {
+ return "eventgrid";
+ }
+
+ @Override
+ public Map<String, String> getServiceMetadata() {
+ if (configuration.getTopicEndpoint() != null) {
+ return Map.of("topicEndpoint", configuration.getTopicEndpoint());
+ }
+ return null;
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridProducer.java
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridProducer.java
new file mode 100644
index 000000000000..5b0de8105eb5
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/java/org/apache/camel/component/azure/eventgrid/EventGridProducer.java
@@ -0,0 +1,160 @@
+/*
+ * 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.component.azure.eventgrid;
+
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import com.azure.core.credential.AzureKeyCredential;
+import com.azure.core.models.CloudEvent;
+import com.azure.core.util.BinaryData;
+import com.azure.identity.DefaultAzureCredentialBuilder;
+import com.azure.messaging.eventgrid.EventGridPublisherClient;
+import com.azure.messaging.eventgrid.EventGridPublisherClientBuilder;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EventGridProducer extends DefaultProducer {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(EventGridProducer.class);
+
+ private EventGridPublisherClient<CloudEvent> publisherClient;
+
+ public EventGridProducer(final Endpoint endpoint) {
+ super(endpoint);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ EventGridConfiguration configuration = getConfiguration();
+ publisherClient = configuration.getPublisherClient();
+
+ if (publisherClient == null) {
+ // Create the client
+ publisherClient = createEventGridPublisherClient(configuration);
+ }
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ final Message message = exchange.getMessage();
+ final Object body = message.getBody();
+
+ // Handle both single event and list of events
+ List<CloudEvent> events = new ArrayList<>();
+
+ if (body instanceof List) {
+ List<?> bodyList = (List<?>) body;
+ for (Object item : bodyList) {
+ events.add(createCloudEvent(item, message));
+ }
+ } else {
+ events.add(createCloudEvent(body, message));
+ }
+
+ LOG.debug("Publishing {} events to Event Grid", events.size());
+ publisherClient.sendEvents(events);
+ }
+
+ private CloudEvent createCloudEvent(Object data, Message message) {
+ // Extract CloudEvent properties from headers or use defaults
+ String eventType = message.getHeader(EventGridConstants.EVENT_TYPE,
String.class);
+ String subject = message.getHeader(EventGridConstants.SUBJECT,
String.class);
+ String id = message.getHeader(EventGridConstants.ID, String.class);
+ String dataVersion =
message.getHeader(EventGridConstants.DATA_VERSION, String.class);
+ OffsetDateTime eventTime =
message.getHeader(EventGridConstants.EVENT_TIME, OffsetDateTime.class);
+
+ // Set defaults if not provided
+ if (ObjectHelper.isEmpty(eventType)) {
+ eventType = "Camel.Event";
+ }
+ if (ObjectHelper.isEmpty(subject)) {
+ subject = "/camel/event";
+ }
+ if (ObjectHelper.isEmpty(id)) {
+ id = UUID.randomUUID().toString();
+ }
+ if (eventTime == null) {
+ eventTime = OffsetDateTime.now();
+ }
+
+ // Create CloudEvent
+ CloudEvent event = new CloudEvent("/camel", eventType,
BinaryData.fromObject(data), null, null);
+ event.setSubject(subject);
+ event.setId(id);
+ event.setTime(eventTime);
+
+ return event;
+ }
+
+ private EventGridPublisherClient<CloudEvent>
createEventGridPublisherClient(EventGridConfiguration configuration) {
+ EventGridPublisherClientBuilder builder = new
EventGridPublisherClientBuilder()
+ .endpoint(configuration.getTopicEndpoint());
+
+ // Configure authentication based on credential type
+ switch (configuration.getCredentialType()) {
+ case ACCESS_KEY:
+ AzureKeyCredential credential =
configuration.getAzureKeyCredential();
+ if (credential == null &&
ObjectHelper.isNotEmpty(configuration.getAccessKey())) {
+ credential = new
AzureKeyCredential(configuration.getAccessKey());
+ }
+ if (credential == null) {
+ throw new IllegalArgumentException("Access key or Azure
key credential must be provided");
+ }
+ builder.credential(credential);
+ break;
+ case TOKEN_CREDENTIAL:
+ if (configuration.getTokenCredential() == null) {
+ throw new IllegalArgumentException("Token credential must
be provided");
+ }
+ builder.credential(configuration.getTokenCredential());
+ break;
+ case AZURE_IDENTITY:
+ builder.credential(new
DefaultAzureCredentialBuilder().build());
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown credential type: "
+ configuration.getCredentialType());
+ }
+
+ return builder.buildCloudEventPublisherClient();
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ // EventGridPublisherClient doesn't need explicit cleanup
+ publisherClient = null;
+ super.doStop();
+ }
+
+ @Override
+ public EventGridEndpoint getEndpoint() {
+ return (EventGridEndpoint) super.getEndpoint();
+ }
+
+ public EventGridConfiguration getConfiguration() {
+ return getEndpoint().getConfiguration();
+ }
+}
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/main/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
b/components/camel-azure/camel-azure-eventgrid/src/main/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
new file mode 100644
index 000000000000..077d7282e87b
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/main/resources/META-INF/services/org/apache/camel/component/azure-eventgrid
@@ -0,0 +1 @@
+class=org.apache.camel.component.azure.eventgrid.EventGridComponent
diff --git
a/components/camel-azure/camel-azure-eventgrid/src/test/java/org/apache/camel/component/azure/eventgrid/EventGridComponentTest.java
b/components/camel-azure/camel-azure-eventgrid/src/test/java/org/apache/camel/component/azure/eventgrid/EventGridComponentTest.java
new file mode 100644
index 000000000000..dc67591aa2ca
--- /dev/null
+++
b/components/camel-azure/camel-azure-eventgrid/src/test/java/org/apache/camel/component/azure/eventgrid/EventGridComponentTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.component.azure.eventgrid;
+
+import com.azure.identity.DefaultAzureCredential;
+import com.azure.identity.DefaultAzureCredentialBuilder;
+import org.apache.camel.ResolveEndpointFailedException;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class EventGridComponentTest extends CamelTestSupport {
+
+ @Test
+ public void testCreateEndpointWithNoTopicEndpoint() {
+ ResolveEndpointFailedException exception =
assertThrows(ResolveEndpointFailedException.class,
+ () ->
context.getEndpoint("azure-eventgrid:?accessKey=string"));
+
+ assertTrue(exception.getMessage().contains("Topic endpoint must be
specified"));
+ }
+
+ @Test
+ public void testCreateEndpointWithNoCredentials() {
+ final String expectedErrorMessage
+ = "Azure EventGrid AccessKey, AzureKeyCredential,
TokenCredential or Azure Identity must be specified";
+
+ ResolveEndpointFailedException exception =
assertThrows(ResolveEndpointFailedException.class,
+ () ->
context.getEndpoint("azure-eventgrid:https://mytopic.eventgrid.azure.net/api/events"));
+
+ assertTrue(exception.getMessage().contains(expectedErrorMessage));
+ }
+
+ @Test
+ public void testCreateEndpointWithAccessKey() {
+ final String uri =
"azure-eventgrid:https://mytopic.eventgrid.azure.net/api/events?accessKey=dummyKey";
+
+ final EventGridEndpoint endpoint = context.getEndpoint(uri,
EventGridEndpoint.class);
+
+ assertNotNull(endpoint);
+ assertEquals("https://mytopic.eventgrid.azure.net/api/events",
endpoint.getConfiguration().getTopicEndpoint());
+ assertEquals("dummyKey", endpoint.getConfiguration().getAccessKey());
+ assertEquals(CredentialType.ACCESS_KEY,
endpoint.getConfiguration().getCredentialType());
+ }
+
+ @Test
+ public void testCreateEndpointWithAzureIdentity() {
+ final String uri
+ =
"azure-eventgrid:https://mytopic.eventgrid.azure.net/api/events?credentialType=AZURE_IDENTITY";
+
+ final EventGridEndpoint endpoint = context.getEndpoint(uri,
EventGridEndpoint.class);
+
+ assertNotNull(endpoint);
+ assertEquals("https://mytopic.eventgrid.azure.net/api/events",
endpoint.getConfiguration().getTopicEndpoint());
+ assertEquals(CredentialType.AZURE_IDENTITY,
endpoint.getConfiguration().getCredentialType());
+ }
+
+ @Test
+ public void testCreateEndpointWithTokenCredential() {
+ final DefaultAzureCredential tokenCredential = new
DefaultAzureCredentialBuilder().build();
+ context.getRegistry().bind("tokenCredential", tokenCredential);
+
+ final String uri
+ =
"azure-eventgrid:https://mytopic.eventgrid.azure.net/api/events?tokenCredential=#tokenCredential";
+
+ final EventGridEndpoint endpoint = context.getEndpoint(uri,
EventGridEndpoint.class);
+
+ assertNotNull(endpoint);
+ assertSame(tokenCredential,
endpoint.getConfiguration().getTokenCredential());
+ assertEquals(CredentialType.AZURE_IDENTITY,
endpoint.getConfiguration().getCredentialType());
+ }
+
+ @Test
+ public void testProducerOnlyComponent() {
+ final String uri =
"azure-eventgrid:https://mytopic.eventgrid.azure.net/api/events?accessKey=dummyKey";
+
+ final EventGridEndpoint endpoint = context.getEndpoint(uri,
EventGridEndpoint.class);
+
+ assertThrows(UnsupportedOperationException.class, () ->
endpoint.createConsumer(exchange -> {
+ }));
+ }
+}
diff --git a/components/camel-azure/pom.xml b/components/camel-azure/pom.xml
index 8bc7d93ed7cf..adc8c6887bdc 100644
--- a/components/camel-azure/pom.xml
+++ b/components/camel-azure/pom.xml
@@ -46,6 +46,7 @@
<modules>
<module>camel-azure-eventhubs</module>
+ <module>camel-azure-eventgrid</module>
<module>camel-azure-storage-blob</module>
<module>camel-azure-storage-datalake</module>
<module>camel-azure-storage-queue</module>
diff --git a/docs/components/modules/ROOT/examples/json/azure-eventgrid.json
b/docs/components/modules/ROOT/examples/json/azure-eventgrid.json
new file mode 120000
index 000000000000..f8c8f2b8fd9a
--- /dev/null
+++ b/docs/components/modules/ROOT/examples/json/azure-eventgrid.json
@@ -0,0 +1 @@
+../../../../../../components/camel-azure/camel-azure-eventgrid/src/generated/resources/META-INF/org/apache/camel/component/azure/eventgrid/azure-eventgrid.json
\ No newline at end of file
diff --git a/parent/pom.xml b/parent/pom.xml
index 844d34fe3f09..1e3fc8dc5b83 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -942,6 +942,11 @@
<artifactId>camel-azure-cosmosdb</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-azure-eventgrid</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-azure-eventhubs</artifactId>