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 2024/04/15 09:09:57 UTC

(camel) branch tu created (now dc63cc8f707)

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

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


      at dc63cc8f707 CAMEL-20673: camel-core - Add type converter for string to TimeUnit

This branch includes the following new commits:

     new dc63cc8f707 CAMEL-20673: camel-core - Add type converter for string to TimeUnit

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 01/01: CAMEL-20673: camel-core - Add type converter for string to TimeUnit

Posted by da...@apache.org.
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 <cl...@gmail.com>
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"));
+    }
 }