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
The following commit(s) were added to refs/heads/main by this push:
new c15bcb303cf CAMEL-18119 - Allow Simple expressions to render any
Object that can be converted to Date (#7627)
c15bcb303cf is described below
commit c15bcb303cfe436a03025d1491773a975337e9b7
Author: adessaigne <[email protected]>
AuthorDate: Tue May 17 20:23:21 2022 +0200
CAMEL-18119 - Allow Simple expressions to render any Object that can be
converted to Date (#7627)
---
.../language/simple/SimpleExpressionBuilder.java | 10 ++++-
.../apache/camel/language/simple/SimpleTest.java | 18 +++++++++
.../language/simple/myconverter/MyCustomDate.java | 46 ++++++++++++++++++++++
.../simple/myconverter/MyCustomDateConverter.java | 35 ++++++++++++++++
.../services/org/apache/camel/TypeConverter | 1 +
5 files changed, 108 insertions(+), 2 deletions(-)
diff --git
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
index 02713092669..af825f9ea9b 100644
---
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
+++
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
@@ -481,7 +481,10 @@ public final class SimpleExpressionBuilder {
} else if (obj instanceof Long) {
date = new Date((Long) obj);
} else {
- throw new IllegalArgumentException("Cannot find
Date/long object at command: " + command);
+ date =
exchange.getContext().getTypeConverter().tryConvertTo(Date.class, exchange,
obj);
+ if (date == null) {
+ throw new IllegalArgumentException("Cannot find
Date/long object at command: " + command);
+ }
}
} else if (command.startsWith("exchangeProperty.")) {
String key = command.substring(command.lastIndexOf('.') +
1);
@@ -491,7 +494,10 @@ public final class SimpleExpressionBuilder {
} else if (obj instanceof Long) {
date = new Date((Long) obj);
} else {
- throw new IllegalArgumentException("Cannot find
Date/long object at command: " + command);
+ date =
exchange.getContext().getTypeConverter().tryConvertTo(Date.class, exchange,
obj);
+ if (date == null) {
+ throw new IllegalArgumentException("Cannot find
Date/long object at command: " + command);
+ }
}
} else if ("file".equals(command)) {
Long num =
exchange.getIn().getHeader(Exchange.FILE_LAST_MODIFIED, Long.class);
diff --git
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 4026f6c0b84..2fdc1574dd5 100644
---
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -38,6 +38,7 @@ import org.apache.camel.LanguageTestSupport;
import org.apache.camel.Predicate;
import org.apache.camel.component.bean.MethodNotFoundException;
import org.apache.camel.language.bean.RuntimeBeanExpressionException;
+import org.apache.camel.language.simple.myconverter.MyCustomDate;
import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException;
import org.apache.camel.spi.Language;
import org.apache.camel.spi.Registry;
@@ -604,6 +605,23 @@ public class SimpleTest extends LanguageTestSupport {
assertExpression("${date:header.birthday:yyyy-MM-dd'T'HH:mm:ss:SSS}",
"1974-04-20T08:55:47:123");
}
+ @Test
+ public void testDateWithConverterExpressions() throws Exception {
+ exchange.getIn().setHeader("birthday", new MyCustomDate(1974,
Calendar.APRIL, 20));
+ exchange.setProperty("birthday", new MyCustomDate(1974,
Calendar.APRIL, 20));
+ exchange.getIn().setHeader("other", new ArrayList<>());
+
+ assertExpression("${date:header.birthday:yyyyMMdd}", "19740420");
+ assertExpression("${date:exchangeProperty.birthday:yyyyMMdd}",
"19740420");
+
+ try {
+ assertExpression("${date:header.other:yyyyMMdd}", "19740420");
+ fail("Should thrown an exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals("Cannot find Date/long object at command:
header.other", e.getMessage());
+ }
+ }
+
@Test
public void testDateWithTimezone() throws Exception {
Calendar cal = Calendar.getInstance();
diff --git
a/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDate.java
b/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDate.java
new file mode 100644
index 00000000000..614bf762153
--- /dev/null
+++
b/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDate.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.simple.myconverter;
+
+/**
+ * This custom date object allows to check that Simple expressions can call
+ * custom type converters when needing real java.util.Date instances
+ */
+public final class MyCustomDate {
+
+ private final int year;
+ private final int month;
+ private final int date;
+
+ public MyCustomDate(int year, int month, int date) {
+ this.year = year;
+ this.month = month;
+ this.date = date;
+ }
+
+ public int getYear() {
+ return year;
+ }
+
+ public int getMonth() {
+ return month;
+ }
+
+ public int getDate() {
+ return date;
+ }
+}
diff --git
a/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDateConverter.java
b/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDateConverter.java
new file mode 100644
index 00000000000..c38cdc416ab
--- /dev/null
+++
b/core/camel-core/src/test/java/org/apache/camel/language/simple/myconverter/MyCustomDateConverter.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.simple.myconverter;
+
+import java.util.*;
+
+import org.apache.camel.Converter;
+
+@Converter
+public final class MyCustomDateConverter {
+ private MyCustomDateConverter() {
+ // Prevent instantiation
+ }
+
+ @Converter
+ public static Date toDate(MyCustomDate value) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(value.getYear(), value.getMonth(), value.getDate());
+ return cal.getTime();
+ }
+}
diff --git
a/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/TypeConverter
b/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/TypeConverter
index 20f38720e99..68f1a31a3cb 100644
---
a/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/TypeConverter
+++
b/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/TypeConverter
@@ -16,3 +16,4 @@
#
org.apache.camel.converter.myconverter
+org.apache.camel.language.simple.myconverter