This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch CAMEL-26168-twitter-dm-null-body
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b2e2f0017e82705da837e11f3c138ac8c5c5e508
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Nov 2 18:08:05 2026 +0100

    CAMEL-26168: camel-twitter - fail a direct message with no body, list only 
usable timeline types
    
    twitter-directmessage read the body with getBody(String.class), so a null 
body
    still looked up the user and sent a direct message with a null text. It now 
uses
    getMandatoryBody before the user lookup and fails with 
InvalidPayloadException.
    
    twitter-timeline listed PUBLIC and UNKNOWN as timelineType values, but 
neither
    has a consumer or producer (the public timeline left the Twitter API with
    twitter4j 3.0). The catalog now lists only HOME, USER, MENTIONS and LIST.
    
    TwitterConverter.toString(Status) no longer fails with a 
NullPointerException
    when the status has no user; it leaves the screen name out.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../catalog/components/twitter-directmessage.json  |  2 +-
 .../camel/catalog/components/twitter-timeline.json |  2 +-
 .../docs/twitter-directmessage-component.adoc      |  3 +-
 .../directmessage/twitter-directmessage.json       |  2 +-
 .../twitter/timeline/twitter-timeline.json         |  2 +-
 .../main/docs/twitter-directmessage-component.adoc |  3 +-
 .../directmessage/DirectMessageProducer.java       |  4 +-
 .../TwitterDirectMessageEndpoint.java              |  2 +-
 .../twitter/timeline/TwitterTimelineEndpoint.java  |  2 +-
 .../component/twitter/util/TwitterConverter.java   |  3 +
 .../twitter/DirectMessageProducerTest.java         | 77 ++++++++++++++++++++++
 .../component/twitter/TwitterConverterTest.java    | 55 ++++++++++++++++
 .../twitter/TwitterTimelineEndpointTest.java       | 41 ++++++++++++
 .../builder/endpoint/StaticEndpointBuilders.java   |  6 +-
 .../dsl/TwitterTimelineEndpointBuilderFactory.java |  8 +--
 15 files changed, 194 insertions(+), 18 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-directmessage.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-directmessage.json
index f02838578628..e8a3c85efa58 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-directmessage.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-directmessage.json
@@ -45,7 +45,7 @@
   },
   "bodyTypes": {
     "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"twitter4j.v1.DirectMessage", "description": "One direct message of the account 
per exchange, with its text in getText(). It converts to text as the date, the 
sender id and the text" },
-    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"description": "The text of the direct message: bytes, a stream or a file are 
read as text, and a Map or a POJO is sent as its toString(). The 
CamelTwitterUser header overrides the user to send to" },
+    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"description": "The text of the direct message: bytes, a stream or a file are 
read as text, and a Map or a POJO is sent as its toString(). The 
CamelTwitterUser header overrides the user to send to. No body fails" },
     "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged" }
   },
   "properties": {
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-timeline.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-timeline.json
index c356d317b2a4..80f26bc3e628 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-timeline.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/twitter-timeline.json
@@ -48,7 +48,7 @@
     "producerOut": { "carriers": [ "unchanged", "pojo" ], "byOption": [ { 
"option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, 
{ "option": "exchangePattern", "value": "InOut", "carriers": [ "pojo" ], 
"javaType": "twitter4j.v1.Status" } ], "description": "Unchanged when the 
exchange expects no reply (InOnly). When it expects one (InOut), the twitter4j 
Status of the tweet posted, with its id" }
   },
   "properties": {
-    "timelineType": { "index": 0, "kind": "path", "displayName": "Timeline 
Type", "group": "common", "label": "", "required": true, "type": "enum", 
"javaType": "org.apache.camel.component.twitter.data.TimelineType", "enum": [ 
"PUBLIC", "HOME", "USER", "MENTIONS", "LIST", "UNKNOWN" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
timeline type to produce\/consume." },
+    "timelineType": { "index": 0, "kind": "path", "displayName": "Timeline 
Type", "group": "common", "label": "", "required": true, "type": "enum", 
"javaType": "org.apache.camel.component.twitter.data.TimelineType", "enum": [ 
"HOME", "USER", "MENTIONS", "LIST" ], "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The timeline type to 
produce\/consume." },
     "list": { "index": 1, "kind": "parameter", "displayName": "List", "group": 
"common", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "The list name when using timelineType=list" },
     "user": { "index": 2, "kind": "parameter", "displayName": "User", "group": 
"common", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "The username when using timelineType=user" },
     "sendEmptyMessageWhenIdle": { "index": 3, "kind": "parameter", 
"displayName": "Send Empty Message When Idle", "group": "consumer", "label": 
"consumer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If the polling consumer did not poll any files, you can 
enable this option to send an empty message (no body) instead." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/twitter-directmessage-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/twitter-directmessage-component.adoc
index 761c85bd952d..a6328ce9e8d4 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/twitter-directmessage-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/twitter-directmessage-component.adoc
@@ -48,7 +48,8 @@ The following route polls the direct messages of the account 
every minute, and l
             message: "${body.text}"
 ----
 
-A producer sends the message body as a direct message to the user of the URI. 
The `CamelTwitterUser` header overrides it:
+A producer sends the message body as a direct message to the user of the URI. 
The `CamelTwitterUser` header overrides it.
+A message with no body fails with an `InvalidPayloadException`, and no direct 
message is sent:
 
 [source,yaml]
 ----
diff --git 
a/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
 
b/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
index f02838578628..e8a3c85efa58 100644
--- 
a/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
+++ 
b/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
@@ -45,7 +45,7 @@
   },
   "bodyTypes": {
     "consumerOut": { "carriers": [ "pojo" ], "javaType": 
"twitter4j.v1.DirectMessage", "description": "One direct message of the account 
per exchange, with its text in getText(). It converts to text as the date, the 
sender id and the text" },
-    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"description": "The text of the direct message: bytes, a stream or a file are 
read as text, and a Map or a POJO is sent as its toString(). The 
CamelTwitterUser header overrides the user to send to" },
+    "producerIn": { "carriers": [ "text", "bytes", "stream", "file" ], 
"description": "The text of the direct message: bytes, a stream or a file are 
read as text, and a Map or a POJO is sent as its toString(). The 
CamelTwitterUser header overrides the user to send to. No body fails" },
     "producerOut": { "carriers": [ "unchanged" ], "description": "Unchanged" }
   },
   "properties": {
diff --git 
a/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/timeline/twitter-timeline.json
 
b/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/timeline/twitter-timeline.json
index c356d317b2a4..80f26bc3e628 100644
--- 
a/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/timeline/twitter-timeline.json
+++ 
b/components/camel-twitter/src/generated/resources/META-INF/org/apache/camel/component/twitter/timeline/twitter-timeline.json
@@ -48,7 +48,7 @@
     "producerOut": { "carriers": [ "unchanged", "pojo" ], "byOption": [ { 
"option": "exchangePattern", "value": "InOnly", "carriers": [ "unchanged" ] }, 
{ "option": "exchangePattern", "value": "InOut", "carriers": [ "pojo" ], 
"javaType": "twitter4j.v1.Status" } ], "description": "Unchanged when the 
exchange expects no reply (InOnly). When it expects one (InOut), the twitter4j 
Status of the tweet posted, with its id" }
   },
   "properties": {
-    "timelineType": { "index": 0, "kind": "path", "displayName": "Timeline 
Type", "group": "common", "label": "", "required": true, "type": "enum", 
"javaType": "org.apache.camel.component.twitter.data.TimelineType", "enum": [ 
"PUBLIC", "HOME", "USER", "MENTIONS", "LIST", "UNKNOWN" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
timeline type to produce\/consume." },
+    "timelineType": { "index": 0, "kind": "path", "displayName": "Timeline 
Type", "group": "common", "label": "", "required": true, "type": "enum", 
"javaType": "org.apache.camel.component.twitter.data.TimelineType", "enum": [ 
"HOME", "USER", "MENTIONS", "LIST" ], "deprecated": false, "deprecationNote": 
"", "autowired": false, "secret": false, "description": "The timeline type to 
produce\/consume." },
     "list": { "index": 1, "kind": "parameter", "displayName": "List", "group": 
"common", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "The list name when using timelineType=list" },
     "user": { "index": 2, "kind": "parameter", "displayName": "User", "group": 
"common", "label": "", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "The username when using timelineType=user" },
     "sendEmptyMessageWhenIdle": { "index": 3, "kind": "parameter", 
"displayName": "Send Empty Message When Idle", "group": "consumer", "label": 
"consumer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If the polling consumer did not poll any files, you can 
enable this option to send an empty message (no body) instead." },
diff --git 
a/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc 
b/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
index 761c85bd952d..a6328ce9e8d4 100644
--- 
a/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
+++ 
b/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
@@ -48,7 +48,8 @@ The following route polls the direct messages of the account 
every minute, and l
             message: "${body.text}"
 ----
 
-A producer sends the message body as a direct message to the user of the URI. 
The `CamelTwitterUser` header overrides it:
+A producer sends the message body as a direct message to the user of the URI. 
The `CamelTwitterUser` header overrides it.
+A message with no body fails with an `InvalidPayloadException`, and no direct 
message is sent:
 
 [source,yaml]
 ----
diff --git 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/DirectMessageProducer.java
 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/DirectMessageProducer.java
index f2abb80d9ae5..9aff302627e7 100644
--- 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/DirectMessageProducer.java
+++ 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/DirectMessageProducer.java
@@ -49,11 +49,11 @@ public class DirectMessageProducer extends DefaultProducer {
         if 
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(TwitterConstants.TWITTER_USER,
 String.class))) {
             toUsername = 
exchange.getIn().getHeader(TwitterConstants.TWITTER_USER, String.class);
         }
-        String text = exchange.getIn().getBody(String.class);
-
         if (toUsername.isEmpty()) {
             throw new CamelExchangeException("Username not configured on 
TwitterEndpoint", exchange);
         } else {
+            // fail before looking up the user, as a direct message must have 
a text
+            String text = exchange.getIn().getMandatoryBody(String.class);
             LOG.debug("Sending to: {} message: {}", toUsername, text);
             User userStatus = 
endpoint.getProperties().getTwitter().v1().users().showUser(toUsername);
             
endpoint.getProperties().getTwitter().v1().directMessages().sendDirectMessage(userStatus.getId(),
 text);
diff --git 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
index 47a6b6616176..085f8dc69da9 100644
--- 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
+++ 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
@@ -45,7 +45,7 @@ import static 
org.apache.camel.component.twitter.TwitterConstants.SCHEME_DIRECT_
            producerIn = @BodyType(value = { Carrier.TEXT, Carrier.BYTES, 
Carrier.STREAM, Carrier.FILE },
                                   description = "The text of the direct 
message: bytes, a stream or a file are read as text,"
                                                 + " and a Map or a POJO is 
sent as its toString(). The CamelTwitterUser header"
-                                                + " overrides the user to send 
to"),
+                                                + " overrides the user to send 
to. No body fails"),
            producerOut = @BodyType(value = Carrier.UNCHANGED, description = 
"Unchanged"))
 public class TwitterDirectMessageEndpoint extends AbstractTwitterEndpoint {
 
diff --git 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
index f4c93968789f..ee93c7c8f446 100644
--- 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
+++ 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
@@ -60,7 +60,7 @@ import static 
org.apache.camel.component.twitter.data.TimelineType.USER;
                                                  + " one (InOut), the 
twitter4j Status of the tweet posted, with its id"))
 public class TwitterTimelineEndpoint extends AbstractTwitterEndpoint {
 
-    @UriPath(description = "The timeline type to produce/consume.")
+    @UriPath(description = "The timeline type to produce/consume.", enums = 
"HOME,USER,MENTIONS,LIST")
     @Metadata(required = true)
     private TimelineType timelineType;
     @UriParam(description = "The username when using timelineType=user")
diff --git 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/util/TwitterConverter.java
 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/util/TwitterConverter.java
index 6a8341d8a4b6..ec97dedd5bf5 100644
--- 
a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/util/TwitterConverter.java
+++ 
b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/util/TwitterConverter.java
@@ -35,6 +35,9 @@ public final class TwitterConverter {
 
     @Converter
     public static String toString(Status status) {
+        if (status.getUser() == null) {
+            return status.getCreatedAt() + " " + status.getText();
+        }
         return status.getCreatedAt() + " (" +
                status.getUser().getScreenName() + ") " +
                status.getText();
diff --git 
a/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/DirectMessageProducerTest.java
 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/DirectMessageProducerTest.java
new file mode 100644
index 000000000000..017615669b10
--- /dev/null
+++ 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/DirectMessageProducerTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.twitter;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import 
org.apache.camel.component.twitter.directmessage.TwitterDirectMessageEndpoint;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import twitter4j.Twitter;
+import twitter4j.v1.DirectMessagesResources;
+import twitter4j.v1.TwitterV1;
+import twitter4j.v1.User;
+import twitter4j.v1.UsersResources;
+
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
+
+/**
+ * The direct message producer sends the body as the text of the direct 
message, and fails when there is no body.
+ */
+class DirectMessageProducerTest extends CamelTestSupport {
+
+    private static final String URI = 
"twitter-directmessage:camelfriend?consumerKey=a&consumerSecret=b&accessToken=c"
+                                      + "&accessTokenSecret=d";
+
+    private final UsersResources users = mock(UsersResources.class);
+    private final DirectMessagesResources directMessages = 
mock(DirectMessagesResources.class);
+
+    @BeforeEach
+    void setupTwitter() throws Exception {
+        User user = mock(User.class);
+        when(user.getId()).thenReturn(42L);
+        when(users.showUser("camelfriend")).thenReturn(user);
+        TwitterV1 v1 = mock(TwitterV1.class);
+        when(v1.users()).thenReturn(users);
+        when(v1.directMessages()).thenReturn(directMessages);
+        Twitter twitter = mock(Twitter.class);
+        when(twitter.v1()).thenReturn(v1);
+        context.getEndpoint(URI, 
TwitterDirectMessageEndpoint.class).getProperties().setTwitter(twitter);
+    }
+
+    @Test
+    void sendsBodyAsText() throws Exception {
+        Exchange out = template.send(URI, exchange -> 
exchange.getIn().setBody("Hello Camel"));
+
+        assertNull(out.getException());
+        verify(directMessages).sendDirectMessage(42L, "Hello Camel");
+    }
+
+    @Test
+    void nullBodyFailsWithoutSending() {
+        Exchange out = template.send(URI, exchange -> 
exchange.getIn().setBody(null));
+
+        assertInstanceOf(InvalidPayloadException.class, out.getException());
+        verifyNoInteractions(users, directMessages);
+    }
+}
diff --git 
a/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterConverterTest.java
 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterConverterTest.java
new file mode 100644
index 000000000000..54bff7d17f15
--- /dev/null
+++ 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterConverterTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.twitter;
+
+import java.time.LocalDateTime;
+
+import org.apache.camel.component.twitter.util.TwitterConverter;
+import org.junit.jupiter.api.Test;
+import twitter4j.v1.Status;
+import twitter4j.v1.User;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class TwitterConverterTest {
+
+    private static final LocalDateTime CREATED = LocalDateTime.of(2026, 11, 2, 
10, 0);
+
+    @Test
+    void statusConvertsToTextWithTheScreenName() {
+        User user = mock(User.class);
+        when(user.getScreenName()).thenReturn("camel");
+        Status status = status("Hello");
+        when(status.getUser()).thenReturn(user);
+
+        assertEquals(CREATED + " (camel) Hello", 
TwitterConverter.toString(status));
+    }
+
+    @Test
+    void statusWithoutUserConvertsToText() {
+        assertEquals(CREATED + " Hello", 
TwitterConverter.toString(status("Hello")));
+    }
+
+    private static Status status(String text) {
+        Status status = mock(Status.class);
+        when(status.getCreatedAt()).thenReturn(CREATED);
+        when(status.getText()).thenReturn(text);
+        return status;
+    }
+}
diff --git 
a/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterTimelineEndpointTest.java
 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterTimelineEndpointTest.java
new file mode 100644
index 000000000000..fb28b3a23414
--- /dev/null
+++ 
b/components/camel-twitter/src/test/java/org/apache/camel/component/twitter/TwitterTimelineEndpointTest.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.twitter;
+
+import java.util.List;
+
+import org.apache.camel.CatalogCamelContext;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TwitterTimelineEndpointTest extends CamelTestSupport {
+
+    @Test
+    void timelineTypesOnlyListTheTypesThatWork() throws Exception {
+        String json = ((CatalogCamelContext) 
context).getComponentParameterJsonSchema("twitter-timeline");
+        JsonObject properties = (JsonObject) ((JsonObject) 
Jsoner.deserialize(json)).get("properties");
+        JsonArray values = (JsonArray) ((JsonObject) 
properties.get("timelineType")).get("enum");
+
+        // public (no longer in the Twitter API) and unknown have no consumer 
nor producer
+        assertEquals(new JsonArray(List.of("HOME", "USER", "MENTIONS", 
"LIST")), values);
+    }
+}
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 9f5138a07c92..754f13ec2b02 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -17615,8 +17615,7 @@ public class StaticEndpointBuilders {
      * 
      * Path parameter: timelineType (required)
      * The timeline type to produce/consume.
-     * There are 6 enums and the value can be one of: PUBLIC, HOME, USER,
-     * MENTIONS, LIST, UNKNOWN
+     * There are 4 enums and the value can be one of: HOME, USER, MENTIONS, 
LIST
      * 
      * @param path timelineType
      * @return the dsl builder
@@ -17636,8 +17635,7 @@ public class StaticEndpointBuilders {
      * 
      * Path parameter: timelineType (required)
      * The timeline type to produce/consume.
-     * There are 6 enums and the value can be one of: PUBLIC, HOME, USER,
-     * MENTIONS, LIST, UNKNOWN
+     * There are 4 enums and the value can be one of: HOME, USER, MENTIONS, 
LIST
      * 
      * @param componentName to use a custom component name for the endpoint
      * instead of the default name
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/TwitterTimelineEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/TwitterTimelineEndpointBuilderFactory.java
index 156efaa1a8e1..9ab4f6ef64b8 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/TwitterTimelineEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/TwitterTimelineEndpointBuilderFactory.java
@@ -1691,8 +1691,8 @@ public interface TwitterTimelineEndpointBuilderFactory {
          * 
          * Path parameter: timelineType (required)
          * The timeline type to produce/consume.
-         * There are 6 enums and the value can be one of: PUBLIC, HOME, USER,
-         * MENTIONS, LIST, UNKNOWN
+         * There are 4 enums and the value can be one of: HOME, USER, MENTIONS,
+         * LIST
          * 
          * @param path timelineType
          * @return the dsl builder
@@ -1712,8 +1712,8 @@ public interface TwitterTimelineEndpointBuilderFactory {
          * 
          * Path parameter: timelineType (required)
          * The timeline type to produce/consume.
-         * There are 6 enums and the value can be one of: PUBLIC, HOME, USER,
-         * MENTIONS, LIST, UNKNOWN
+         * There are 4 enums and the value can be one of: HOME, USER, MENTIONS,
+         * LIST
          * 
          * @param componentName to use a custom component name for the endpoint
          * instead of the default name

Reply via email to