Skip to content

Commit 32acb7d

Browse files
authored
CAMEL-23219 - google-mail-stream: Expose threadId, Message-ID and lab… (#22116)
* CAMEL-23219 - google-mail-stream: Expose threadId, Message-ID and labelIds as exchange headers * fix regen
1 parent 05cffa5 commit 32acb7d

6 files changed

Lines changed: 226 additions & 2 deletions

File tree

catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail-stream.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@
5050
"CamelGoogleMailStreamCc": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The carbon copy of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_CC" },
5151
"CamelGoogleMailStreamBcc": { "index": 3, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The blind carbon cpoy of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_BCC" },
5252
"CamelGoogleMailStreamSubject": { "index": 4, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subject of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_SUBJECT" },
53-
"CamelGoogleMailId": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_ID" }
53+
"CamelGoogleMailId": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_ID" },
54+
"CamelGoogleMailStreamThreadId": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The thread ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_THREAD_ID" },
55+
"CamelGoogleMailStreamMessageId": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Message-ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_MESSAGE_ID" },
56+
"CamelGoogleMailStreamLabelIds": { "index": 8, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "java.util.List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The label IDs of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_LABEL_IDS" }
5457
},
5558
"properties": {
5659
"index": { "index": 0, "kind": "path", "displayName": "Index", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Currently not in use" },

components/camel-google/camel-google-mail/src/generated/resources/META-INF/org/apache/camel/component/google/mail/stream/google-mail-stream.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@
5050
"CamelGoogleMailStreamCc": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The carbon copy of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_CC" },
5151
"CamelGoogleMailStreamBcc": { "index": 3, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The blind carbon cpoy of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_BCC" },
5252
"CamelGoogleMailStreamSubject": { "index": 4, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subject of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_SUBJECT" },
53-
"CamelGoogleMailId": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_ID" }
53+
"CamelGoogleMailId": { "index": 5, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_ID" },
54+
"CamelGoogleMailStreamThreadId": { "index": 6, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The thread ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_THREAD_ID" },
55+
"CamelGoogleMailStreamMessageId": { "index": 7, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Message-ID of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_MESSAGE_ID" },
56+
"CamelGoogleMailStreamLabelIds": { "index": 8, "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "java.util.List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The label IDs of the message", "constantName": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConstants#MAIL_LABEL_IDS" }
5457
},
5558
"properties": {
5659
"index": { "index": 0, "kind": "path", "displayName": "Index", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Currently not in use" },

components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ public final class GoogleMailStreamConstants {
3535
public static final String MAIL_SUBJECT = "CamelGoogleMailStreamSubject";
3636
@Metadata(description = "The ID of the message", javaType = "String")
3737
public static final String MAIL_ID = "CamelGoogleMailId";
38+
@Metadata(description = "The thread ID of the message", javaType = "String")
39+
public static final String MAIL_THREAD_ID = "CamelGoogleMailStreamThreadId";
40+
@Metadata(description = "The Message-ID of the message", javaType = "String")
41+
public static final String MAIL_MESSAGE_ID = "CamelGoogleMailStreamMessageId";
42+
@Metadata(description = "The label IDs of the message", javaType = "java.util.List<String>")
43+
public static final String MAIL_LABEL_IDS = "CamelGoogleMailStreamLabelIds";
3844

3945
/**
4046
* Prevent instantiation.

components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConsumer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ public Exchange createExchange(ExchangePattern pattern, com.google.api.services.
185185
exchange.setPattern(pattern);
186186
org.apache.camel.Message message = exchange.getIn();
187187
exchange.getIn().setHeader(GoogleMailStreamConstants.MAIL_ID, mail.getId());
188+
exchange.getIn().setHeader(GoogleMailStreamConstants.MAIL_THREAD_ID, mail.getThreadId());
189+
exchange.getIn().setHeader(GoogleMailStreamConstants.MAIL_LABEL_IDS, mail.getLabelIds());
188190
if (getConfiguration().isRaw()) {
189191
message.setBody(mail.getRaw());
190192
} else {
@@ -217,6 +219,9 @@ private void configureHeaders(org.apache.camel.Message message, List<MessagePart
217219
if ("BCC".equalsIgnoreCase(headerName)) {
218220
message.setHeader(GoogleMailStreamConstants.MAIL_BCC, header.getValue());
219221
}
222+
if ("MESSAGE-ID".equalsIgnoreCase(headerName)) {
223+
message.setHeader(GoogleMailStreamConstants.MAIL_MESSAGE_ID, header.getValue());
224+
}
220225
}
221226
}
222227

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.camel.component.google.mail.stream;
18+
19+
import java.util.ArrayList;
20+
import java.util.Collections;
21+
import java.util.List;
22+
23+
import com.google.api.services.gmail.model.Message;
24+
import com.google.api.services.gmail.model.MessagePart;
25+
import com.google.api.services.gmail.model.MessagePartBody;
26+
import com.google.api.services.gmail.model.MessagePartHeader;
27+
import org.apache.camel.CamelContext;
28+
import org.apache.camel.Exchange;
29+
import org.apache.camel.ExchangePattern;
30+
import org.apache.camel.impl.DefaultCamelContext;
31+
import org.junit.jupiter.api.AfterEach;
32+
import org.junit.jupiter.api.BeforeEach;
33+
import org.junit.jupiter.api.Test;
34+
35+
import static org.junit.jupiter.api.Assertions.assertEquals;
36+
import static org.junit.jupiter.api.Assertions.assertNotNull;
37+
import static org.junit.jupiter.api.Assertions.assertNull;
38+
39+
public class GoogleMailStreamConsumerHeadersTest {
40+
41+
private CamelContext camelContext;
42+
private GoogleMailStreamConsumer consumer;
43+
44+
@BeforeEach
45+
void setUp() throws Exception {
46+
camelContext = new DefaultCamelContext();
47+
camelContext.start();
48+
49+
GoogleMailStreamComponent component = new GoogleMailStreamComponent(camelContext);
50+
camelContext.addComponent("google-mail-stream", component);
51+
52+
GoogleMailStreamEndpoint endpoint = (GoogleMailStreamEndpoint) camelContext
53+
.getEndpoint(
54+
"google-mail-stream://test?clientId=a&clientSecret=b&applicationName=c&accessToken=d&refreshToken=e");
55+
56+
consumer = new GoogleMailStreamConsumer(endpoint, exchange -> {
57+
}, "UNREAD", Collections.emptyList());
58+
consumer.start();
59+
}
60+
61+
@AfterEach
62+
void tearDown() throws Exception {
63+
if (consumer != null) {
64+
consumer.stop();
65+
}
66+
if (camelContext != null) {
67+
camelContext.stop();
68+
}
69+
}
70+
71+
@Test
72+
void testThreadIdHeader() {
73+
Message mail = createTestMessage("msg-123", "thread-456");
74+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
75+
76+
assertEquals("thread-456", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_THREAD_ID));
77+
}
78+
79+
@Test
80+
void testMessageIdHeader() {
81+
Message mail = createTestMessage("msg-123", "thread-456");
82+
addHeader(mail, "Message-ID", "<abc123@mail.gmail.com>");
83+
84+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
85+
86+
assertEquals("<abc123@mail.gmail.com>", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_MESSAGE_ID));
87+
}
88+
89+
@Test
90+
void testAllHeaders() {
91+
Message mail = createTestMessage("msg-123", "thread-456");
92+
mail.setLabelIds(List.of("INBOX", "UNREAD"));
93+
addHeader(mail, "Subject", "Test Subject");
94+
addHeader(mail, "To", "to@example.com");
95+
addHeader(mail, "From", "from@example.com");
96+
addHeader(mail, "Cc", "cc@example.com");
97+
addHeader(mail, "Bcc", "bcc@example.com");
98+
addHeader(mail, "Message-ID", "<test@example.com>");
99+
100+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
101+
102+
assertEquals("msg-123", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_ID));
103+
assertEquals("thread-456", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_THREAD_ID));
104+
assertEquals(List.of("INBOX", "UNREAD"), exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_LABEL_IDS));
105+
assertEquals("Test Subject", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_SUBJECT));
106+
assertEquals("to@example.com", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_TO));
107+
assertEquals("from@example.com", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_FROM));
108+
assertEquals("cc@example.com", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_CC));
109+
assertEquals("bcc@example.com", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_BCC));
110+
assertEquals("<test@example.com>", exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_MESSAGE_ID));
111+
}
112+
113+
@Test
114+
void testLabelIdsHeader() {
115+
Message mail = createTestMessage("msg-123", "thread-456");
116+
List<String> labels = List.of("INBOX", "UNREAD", "CATEGORY_PERSONAL");
117+
mail.setLabelIds(labels);
118+
119+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
120+
121+
List<String> result = exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_LABEL_IDS, List.class);
122+
assertNotNull(result);
123+
assertEquals(3, result.size());
124+
assertEquals("INBOX", result.get(0));
125+
assertEquals("UNREAD", result.get(1));
126+
assertEquals("CATEGORY_PERSONAL", result.get(2));
127+
}
128+
129+
@Test
130+
void testNullLabelIdsHeader() {
131+
Message mail = createTestMessage("msg-123", "thread-456");
132+
133+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
134+
135+
assertNull(exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_LABEL_IDS));
136+
}
137+
138+
@Test
139+
void testMissingMessageIdHeader() {
140+
Message mail = createTestMessage("msg-123", "thread-456");
141+
142+
Exchange exchange = consumer.createExchange(ExchangePattern.InOnly, mail);
143+
144+
assertNull(exchange.getIn().getHeader(GoogleMailStreamConstants.MAIL_MESSAGE_ID));
145+
}
146+
147+
private Message createTestMessage(String id, String threadId) {
148+
Message mail = new Message();
149+
mail.setId(id);
150+
mail.setThreadId(threadId);
151+
152+
MessagePartBody body = new MessagePartBody();
153+
body.setData(null);
154+
155+
MessagePart payload = new MessagePart();
156+
payload.setHeaders(new ArrayList<>());
157+
payload.setParts(null);
158+
payload.setBody(body);
159+
160+
mail.setPayload(payload);
161+
return mail;
162+
}
163+
164+
private void addHeader(Message mail, String name, String value) {
165+
List<MessagePartHeader> headers = mail.getPayload().getHeaders();
166+
MessagePartHeader header = new MessagePartHeader();
167+
header.setName(name);
168+
header.setValue(value);
169+
headers.add(header);
170+
}
171+
}

dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GoogleMailStreamEndpointBuilderFactory.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,42 @@ public String googleMailStreamSubject() {
10791079
public String googleMailId() {
10801080
return "CamelGoogleMailId";
10811081
}
1082+
/**
1083+
* The thread ID of the message.
1084+
*
1085+
* The option is a: {@code String} type.
1086+
*
1087+
* Group: consumer
1088+
*
1089+
* @return the name of the header {@code GoogleMailStreamThreadId}.
1090+
*/
1091+
public String googleMailStreamThreadId() {
1092+
return "CamelGoogleMailStreamThreadId";
1093+
}
1094+
/**
1095+
* The Message-ID of the message.
1096+
*
1097+
* The option is a: {@code String} type.
1098+
*
1099+
* Group: consumer
1100+
*
1101+
* @return the name of the header {@code GoogleMailStreamMessageId}.
1102+
*/
1103+
public String googleMailStreamMessageId() {
1104+
return "CamelGoogleMailStreamMessageId";
1105+
}
1106+
/**
1107+
* The label IDs of the message.
1108+
*
1109+
* The option is a: {@code java.util.List<String>} type.
1110+
*
1111+
* Group: consumer
1112+
*
1113+
* @return the name of the header {@code GoogleMailStreamLabelIds}.
1114+
*/
1115+
public String googleMailStreamLabelIds() {
1116+
return "CamelGoogleMailStreamLabelIds";
1117+
}
10821118
}
10831119
static GoogleMailStreamEndpointBuilder endpointBuilder(String componentName, String path) {
10841120
class GoogleMailStreamEndpointBuilderImpl extends AbstractEndpointBuilder implements GoogleMailStreamEndpointBuilder, AdvancedGoogleMailStreamEndpointBuilder {

0 commit comments

Comments
 (0)