You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/04/04 10:18:51 UTC

[camel] 01/03: CAMEL-19244: camel-bean - Add support for declaring type in parameter values using 'type.class value' style

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit fbbb2753c14139472612fedae4529043fc3dd990
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Apr 3 21:09:28 2023 +0200

    CAMEL-19244: camel-bean - Add support for declaring type in parameter values using 'type.class value' style
---
 .../apache/camel/component/bean/BeanHelper.java    | 22 +++++++++++++++++-----
 .../org/apache/camel/component/bean/BeanInfo.java  |  4 ++--
 .../apache/camel/component/bean/MethodInfo.java    | 13 +++++++++----
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHelper.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHelper.java
index 25273912640..68bd15062c9 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHelper.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanHelper.java
@@ -35,7 +35,7 @@ public final class BeanHelper {
      * @param  value the value
      * @return       the parameter type the given value is being mapped as, or <tt>null</tt> if not valid.
      */
-    public static Class<?> getValidParameterType(String value) {
+    public static Class<?> getValidParameterType(ClassResolver resolver, String value) {
         if (ObjectHelper.isEmpty(value)) {
             return null;
         }
@@ -70,7 +70,12 @@ public final class BeanHelper {
 
         // numeric is valid
         boolean numeric = true;
-        for (char ch : value.toCharArray()) {
+        char[] chars = value.toCharArray();
+        for (int i = 0; i < chars.length; i++) {
+            char ch = chars[i];
+            if (i == 0 && ch == '-') {
+                continue;
+            }
             if (!Character.isDigit(ch)) {
                 numeric = false;
                 break;
@@ -90,13 +95,13 @@ public final class BeanHelper {
      * @param  value the value
      * @return       <tt>true</tt> if valid, <tt>false</tt> otherwise
      */
-    public static boolean isValidParameterValue(String value) {
+    public static boolean isValidParameterValue(ClassResolver classResolver, String value) {
         if (ObjectHelper.isEmpty(value)) {
             // empty value is valid
             return true;
         }
 
-        return getValidParameterType(value) != null;
+        return getValidParameterType(classResolver, value) != null;
     }
 
     /**
@@ -117,7 +122,14 @@ public final class BeanHelper {
      *                       assignable, <tt>false</tt> if not assignable
      */
     public static Boolean isAssignableToExpectedType(ClassResolver resolver, String parameterType, Class<?> expectedType) {
-        if (parameterType == null || !parameterType.endsWith(".class")) {
+        if (parameterType == null || !parameterType.contains(".class")) {
+            // not a class so return null
+            return null;
+        }
+        if (parameterType.contains(" ")) {
+            parameterType = StringHelper.before(parameterType, " ");
+        }
+        if (!parameterType.endsWith(".class")) {
             // not a class so return null
             return null;
         }
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanInfo.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanInfo.java
index baf5febbb9a..b918711dc1a 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanInfo.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/BeanInfo.java
@@ -682,7 +682,7 @@ public class BeanInfo {
                     parameter = parameter.trim();
                 }
 
-                Class<?> parameterType = BeanHelper.getValidParameterType(parameter);
+                Class<?> parameterType = BeanHelper.getValidParameterType(exchange.getContext().getClassResolver(), parameter);
                 Class<?> expectedType = info.getParameters().get(index).getType();
 
                 if (parameterType != null && expectedType != null) {
@@ -1113,7 +1113,7 @@ public class BeanInfo {
                         continue;
                     }
 
-                    if (BeanHelper.isValidParameterValue(qualifyType)) {
+                    if (BeanHelper.isValidParameterValue(getCamelContext().getClassResolver(), qualifyType)) {
                         // its a parameter value, so continue to next parameter
                         // as we should only check for FQN/type parameters
                         continue;
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
index 0a402f2e334..ee1b5cbb06f 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
@@ -259,7 +259,6 @@ public class MethodInfo {
         if (hasParameters) {
             if (parametersExpression != null) {
                 parametersExpression.init(camelContext);
-
                 return parametersExpression.evaluate(exchange, Object[].class);
             }
         }
@@ -648,10 +647,16 @@ public class MethodInfo {
 
             // convert the parameter value to a String
             String exp = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, parameterValue);
+            boolean valid;
             if (exp != null) {
-                // check if its a valid parameter value
-                boolean valid = BeanHelper.isValidParameterValue(exp);
+                int pos1 = exp.indexOf(' ');
+                int pos2 = exp.indexOf(".class");
+                if (pos1 != -1 && pos2 != -1 && pos1 > pos2) {
+                    exp = exp.substring(pos2 + 7); // clip <space>.class
+                }
 
+                // check if its a valid parameter value (no type declared via .class syntax)
+                valid = BeanHelper.isValidParameterValue(exchange.getContext().getClassResolver(), exp);
                 if (!valid) {
                     // it may be a parameter type instead, and if so, then we should return null,
                     // as this method is only for evaluating parameter values
@@ -697,7 +702,7 @@ public class MethodInfo {
                             // which may change the parameterValue, so we have to check it again to see if it is now valid
                             exp = exchange.getContext().getTypeConverter().tryConvertTo(String.class, parameterValue);
                             // re-validate if the parameter was not valid the first time
-                            valid = BeanHelper.isValidParameterValue(exp);
+                            valid = BeanHelper.isValidParameterValue(exchange.getContext().getClassResolver(), exp);
                         }
                     }
                 }