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")); + } }
