You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ff...@apache.org on 2023/05/09 13:05:12 UTC

[camel] branch main updated: [CAMEL-19324]Be able to convert all elements from CXF MessageContentsList.class to String.class if not in "CXF Context" (#10001)

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

ffang 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 86f2fa577b8 [CAMEL-19324]Be able to convert all elements from CXF MessageContentsList.class to String.class if not in "CXF Context" (#10001)
86f2fa577b8 is described below

commit 86f2fa577b868670a857bd320eb63928dc9bb2ed
Author: Freeman(Yue) Fang <fr...@gmail.com>
AuthorDate: Tue May 9 09:05:02 2023 -0400

    [CAMEL-19324]Be able to convert all elements from CXF MessageContentsList.class to String.class if not in "CXF Context" (#10001)
---
 .../camel/component/cxf/converter/CxfConverter.java  | 20 +++++++++++++++++++-
 .../camel/component/cxf/converter/ConverterTest.java | 11 +++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
index 222b0c6dce8..c3870e210cc 100644
--- a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
+++ b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
@@ -101,7 +101,8 @@ public final class CxfConverter {
     /**
      * Use a fallback type converter so we can convert the embedded list element if the value is MessageContentsList.
      * The algorithm of this converter finds the first non-null list element from the list and applies conversion to the
-     * list element.
+     * list element if can determine this MessageContentsList is used in CXF context(first element is the return value
+     * while others are Holders).
      *
      * @param  type     the desired type to be converted to
      * @param  exchange optional exchange which can be null
@@ -119,6 +120,23 @@ public final class CxfConverter {
         if (MessageContentsList.class.isAssignableFrom(value.getClass())) {
             MessageContentsList list = (MessageContentsList) value;
 
+            if (list.size() > 1 && type == String.class) {
+                //to check if the MessageContentsList is used in CXF context
+                //If not, use the general way to convert from List.class to String.class
+                boolean foundHolder = false;
+                for (Object embedded : list) {
+                    if (embedded != null && embedded.getClass().getName().equals("javax.xml.ws.Holder")) {
+                        foundHolder = true;
+                        break;
+                    }
+                }
+                if (!foundHolder) {
+                    // this isn't a typical CXF MessageContentsList
+                    // just using other fallback converters
+                    return null;
+                }
+            }
+
             // try to turn the first array element into the object that we want
             for (Object embedded : list) {
                 if (embedded != null) {
diff --git a/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/converter/ConverterTest.java b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/converter/ConverterTest.java
index 81fe256ac8b..7cf81bab063 100644
--- a/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/converter/ConverterTest.java
+++ b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/converter/ConverterTest.java
@@ -79,4 +79,15 @@ public class ConverterTest {
         assertNotNull(node);
     }
 
+    @Test
+    public void testMessageContentsListAsGeneralList() throws Exception {
+        CamelContext context = new DefaultCamelContext();
+        Exchange exchange = new DefaultExchange(context);
+        MessageContentsList list = new MessageContentsList();
+        list.add("hehe");
+        list.add("haha");
+        exchange.getIn().setBody(list);
+        String ret = exchange.getIn().getBody(String.class);
+        assertEquals(ret, "[hehe, haha]", "shouldn't miss list content");
+    }
 }