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

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

commit dc63cc8f707107c36c7ea4c4db6b3fcb477b5cd8
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Apr 15 11:09:33 2024 +0200

    CAMEL-20673: camel-core - Add type converter for string to TimeUnit
---
 .../converter/CamelBaseBulkConverterLoader.java    | 11 +++++++-
 .../apache/camel/converter/DateTimeConverter.java  | 16 +++++++++++
 .../impl/converter/CoreTypeConverterRegistry.java  | 18 +++++--------
 .../camel/impl/converter/EnumTypeConverter.java    | 31 +++++++++++++++++-----
 .../camel/converter/DateTimeConverterTest.java     |  7 +++++
 5 files changed, 64 insertions(+), 19 deletions(-)

diff --git 
a/core/camel-base/src/generated/java/org/apache/camel/converter/CamelBaseBulkConverterLoader.java
 
b/core/camel-base/src/generated/java/org/apache/camel/converter/CamelBaseBulkConverterLoader.java
index d28d0c8abf9..0a03a566c99 100644
--- 
a/core/camel-base/src/generated/java/org/apache/camel/converter/CamelBaseBulkConverterLoader.java
+++ 
b/core/camel-base/src/generated/java/org/apache/camel/converter/CamelBaseBulkConverterLoader.java
@@ -43,7 +43,7 @@ public final class CamelBaseBulkConverterLoader implements 
TypeConverterLoader,
 
     @Override
     public int size() {
-        return 121;
+        return 122;
     }
 
     @Override
@@ -490,6 +490,10 @@ public final class CamelBaseBulkConverterLoader implements 
TypeConverterLoader,
             if (value instanceof java.lang.String) {
                 return 
org.apache.camel.converter.DateTimeConverter.toTimeZone((java.lang.String) 
value);
             }
+        } else if (to == java.util.concurrent.TimeUnit.class) {
+            if (value instanceof java.lang.String) {
+                return 
org.apache.camel.converter.DateTimeConverter.toTimeUnit((java.lang.String) 
value);
+            }
         } else if (to == org.apache.camel.Processor.class) {
             if (value instanceof org.apache.camel.Expression) {
                 return 
org.apache.camel.converter.CamelConverter.toProcessor((org.apache.camel.Expression)
 value);
@@ -624,6 +628,7 @@ public final class CamelBaseBulkConverterLoader implements 
TypeConverterLoader,
         registry.addConverter(new 
TypeConvertible<>(java.util.Collection.class, java.util.Set.class), this);
         registry.addConverter(new TypeConvertible<>(java.util.Map.class, 
java.util.Set.class), this);
         registry.addConverter(new TypeConvertible<>(java.lang.String.class, 
java.util.TimeZone.class), this);
+        registry.addConverter(new TypeConvertible<>(java.lang.String.class, 
java.util.concurrent.TimeUnit.class), this);
         registry.addConverter(new 
TypeConvertible<>(org.apache.camel.Expression.class, 
org.apache.camel.Processor.class), this);
         registry.addConverter(new 
TypeConvertible<>(org.apache.camel.Predicate.class, 
org.apache.camel.Processor.class), this);
         registry.addConverter(new TypeConvertible<>(java.lang.String.class, 
org.apache.camel.spi.Resource.class), this);
@@ -1028,6 +1033,10 @@ public final class CamelBaseBulkConverterLoader 
implements TypeConverterLoader,
             if (from == java.lang.String.class) {
                 return this;
             }
+        } else if (to == java.util.concurrent.TimeUnit.class) {
+            if (from == java.lang.String.class) {
+                return this;
+            }
         } else if (to == org.apache.camel.Processor.class) {
             if (from == org.apache.camel.Expression.class) {
                 return this;
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/converter/DateTimeConverter.java
 
b/core/camel-base/src/main/java/org/apache/camel/converter/DateTimeConverter.java
index 230a44ebc96..b1714a9d17a 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/converter/DateTimeConverter.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/converter/DateTimeConverter.java
@@ -17,7 +17,9 @@
 package org.apache.camel.converter;
 
 import java.util.Date;
+import java.util.Locale;
 import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.Converter;
 
@@ -47,4 +49,18 @@ public final class DateTimeConverter {
     public static Long toLong(Date date) {
         return date.getTime();
     }
+
+    @Converter(order = 4)
+    public static TimeUnit toTimeUnit(String unit) {
+        String match = unit.toUpperCase(Locale.ROOT).trim();
+        return switch (match) {
+            case "DAYS" -> TimeUnit.DAYS;
+            case "HOURS" -> TimeUnit.HOURS;
+            case "MINUTES" -> TimeUnit.MINUTES;
+            case "SECONDS" -> TimeUnit.SECONDS;
+            case "MILLISECONDS" -> TimeUnit.MILLISECONDS;
+            case "NANOSECONDS" -> TimeUnit.NANOSECONDS;
+            default -> throw new IllegalStateException("Unexpected value: " + 
unit);
+        };
+    }
 }
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
index 4ba9f012425..c25436720de 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
@@ -23,7 +23,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
@@ -87,16 +87,6 @@ public abstract class CoreTypeConverterRegistry extends 
ServiceSupport implement
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public CamelContext getCamelContext() {
-        throw new UnsupportedOperationException();
-    }
-
     public <T> T convertTo(Class<T> type, Object value) {
         return convertTo(type, null, value);
     }
@@ -616,6 +606,12 @@ public abstract class CoreTypeConverterRegistry extends 
ServiceSupport implement
         this.typeConverterExists = typeConverterExists;
     }
 
+    @Override
+    protected void doBuild() throws Exception {
+        super.doBuild();
+        CamelContextAware.trySetCamelContext(enumTypeConverter, 
getCamelContext());
+    }
+
     @Override
     protected void doStop() throws Exception {
         super.doStop();
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
index 3fa3adf57c7..0be4f5ef072 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.impl.converter;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.TypeConverterRegistry;
@@ -26,7 +28,19 @@ import org.apache.camel.util.StringHelper;
 /**
  * A type converter which is used to convert from String to enum type
  */
-public class EnumTypeConverter extends TypeConverterSupport {
+public class EnumTypeConverter extends TypeConverterSupport implements 
CamelContextAware {
+
+    private CamelContext camelContext;
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
 
     @Override
     public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
@@ -37,7 +51,7 @@ public class EnumTypeConverter extends TypeConverterSupport {
     private <T> T doConvertTo(Class<T> type, Exchange exchange, Object value) {
         if (type.isEnum()) {
             // is there a direct enum type converter
-            TypeConverterRegistry tcr = exchange != null ? 
exchange.getContext().getTypeConverterRegistry() : null;
+            TypeConverterRegistry tcr = camelContext != null ? 
camelContext.getTypeConverterRegistry() : null;
             if (tcr != null) {
                 Class<?> fromType = value.getClass();
                 TypeConverter tc = tcr.lookup(type, value.getClass());
@@ -54,7 +68,8 @@ public class EnumTypeConverter extends TypeConverterSupport {
             }
 
             // convert to enum via its string based enum constant
-            String text = value.toString();
+            // (and trim in case there are leading/trailing white-space)
+            String text = value.toString().trim();
             Class<Enum<?>> enumClass = (Class<Enum<?>>) type;
 
             // we want to match case insensitive for enums
@@ -65,10 +80,12 @@ public class EnumTypeConverter extends TypeConverterSupport 
{
             }
 
             // add support for using dash or camel cased to common used upper 
cased underscore style for enum constants
-            text = StringHelper.asEnumConstantValue(text);
-            for (Enum<?> enumValue : enumClass.getEnumConstants()) {
-                if (enumValue.name().equalsIgnoreCase(text)) {
-                    return type.cast(enumValue);
+            String text2 = StringHelper.asEnumConstantValue(text);
+            if (!text2.equals(text)) {
+                for (Enum<?> enumValue : enumClass.getEnumConstants()) {
+                    if (enumValue.name().equalsIgnoreCase(text2)) {
+                        return type.cast(enumValue);
+                    }
                 }
             }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/converter/DateTimeConverterTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/converter/DateTimeConverterTest.java
index 35b5b9c4bfb..e8f4a1251d6 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/converter/DateTimeConverterTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/converter/DateTimeConverterTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.converter;
 
 import java.util.Date;
 import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.ContextTestSupport;
 import org.junit.jupiter.api.Test;
@@ -53,4 +54,10 @@ public class DateTimeConverterTest extends 
ContextTestSupport {
         long l = context.getTypeConverter().convertTo(Long.class, date);
         assertEquals(date.getTime(), l);
     }
+
+    @Test
+    public void testToTimeUnit() {
+        assertEquals(TimeUnit.DAYS, 
context.getTypeConverter().convertTo(TimeUnit.class, "DAYS"));
+        assertEquals(TimeUnit.MILLISECONDS, 
context.getTypeConverter().convertTo(TimeUnit.class, "MILLISECONDS"));
+    }
 }

Reply via email to