From c5ea27035d645fa5ac48a9e9373677e2ee2cdd46 Mon Sep 17 00:00:00 2001 From: Marcin Piela Date: Sat, 5 Oct 2024 14:09:54 +0200 Subject: [PATCH] Quasi-support for java.time types --- .../processor/core/ODataExpressionParser.java | 11 ++++++++++- .../processor/core/ODataJavaTimeCallback.java | 12 ++++++++++++ .../core/access/data/JPAEntityParser.java | 16 ++++++++-------- 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJavaTimeCallback.java diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java index ce4fa4f51..7066b5510 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java @@ -537,8 +537,17 @@ private static String evaluateComparingExpression(String uriLiteral, final EdmSi (Calendar) edmSimpleType.valueOfString(uriLiteral, EdmLiteralKind.DEFAULT, null, edmSimpleType .getDefaultType()); + Object realDateTime = datetime; + if (edmMappedType != null && datetime != null) { + String edmMappedTypeName = edmMappedType.getName(); + ODataJavaTimeCallback callback = ODataJPAContextImpl.getContextInThreadLocal().getServiceFactory().getCallback(ODataJavaTimeCallback.class); + if (callback != null) { + realDateTime = callback.convert(datetime, edmMappedTypeName); + } + } + if (!positionalParameters.containsKey(index)) { - positionalParameters.put(index, datetime); + positionalParameters.put(index, realDateTime); } uriLiteral = "?" + index; diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJavaTimeCallback.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJavaTimeCallback.java new file mode 100644 index 000000000..d798382d7 --- /dev/null +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJavaTimeCallback.java @@ -0,0 +1,12 @@ +package org.apache.olingo.odata2.jpa.processor.core; + +import org.apache.olingo.odata2.api.ODataCallback; + +import java.util.Calendar; + +/** + * Created by marcinpiela on 05/10/2024. + */ +public interface ODataJavaTimeCallback extends ODataCallback { + Object convert(Calendar calendar, String javaTimeType); +} diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java index 17279ce7a..8f0476537 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java @@ -34,6 +34,9 @@ import java.util.List; import java.util.Map; +import javax.xml.bind.annotation.adapters.XmlAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + import org.apache.olingo.odata2.api.edm.EdmAssociationEnd; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmMapping; @@ -242,7 +245,10 @@ public static Object getPropertyValue(final Method method, final Object entity, method.setAccessible(true); Class returnType = method.getReturnType(); - if (returnType.equals(char[].class)) { + if(method.isAnnotationPresent(XmlJavaTypeAdapter.class)) { + XmlAdapter xmlAdapter = method.getAnnotation(XmlJavaTypeAdapter.class).value().newInstance(); + propertyValue = xmlAdapter.marshal(method.invoke(entity)); + } else if (returnType.equals(char[].class)) { char[] ch = (char[]) method.invoke(entity); if (ch != null) { propertyValue = (String) String.valueOf((char[]) method.invoke(entity)); @@ -270,13 +276,7 @@ public static Object getPropertyValue(final Method method, final Object entity, propertyValue = method.invoke(entity); } } - } catch (IllegalAccessException e) { - throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e); - } catch (IllegalArgumentException e) { - throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e); - } catch (InvocationTargetException e) { - throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e); - } catch (SecurityException e) { + } catch (Exception e) { throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e); }