This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openjpa.git
commit dbfb360e85bb29bb11f87e3d5406a4edd4e51bd3 Author: Mark Struberg <strub...@apache.org> AuthorDate: Tue Jan 22 22:07:32 2019 +0100 OPENJPA-2713 add OffsetTime support Works, but something is a bit fishy still. --- .../apache/openjpa/jdbc/sql/AbstractResult.java | 32 +++++++++++++ .../org/apache/openjpa/jdbc/sql/DBDictionary.java | 53 ++++++++++++++++++++++ .../org/apache/openjpa/jdbc/sql/MergedResult.java | 12 +++++ .../java/org/apache/openjpa/jdbc/sql/Result.java | 14 ++++++ .../apache/openjpa/jdbc/sql/ResultSetResult.java | 17 +++++++ .../openjpa/persistence/simple/Java8TimeTypes.java | 20 ++++++++ .../persistence/simple/TestJava8TimeTypes.java | 7 ++- 7 files changed, 154 insertions(+), 1 deletion(-) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java index ab925f1..8b2a01a 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java @@ -34,6 +34,8 @@ import java.sql.Types; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -562,6 +564,36 @@ public abstract class AbstractResult } @Override + public OffsetTime getOffsetTime(Object obj) throws SQLException { + return getOffsetTimeInternal(translate(obj, null), null); + } + + protected OffsetTime getOffsetTimeInternal(Object obj, Joins joins) throws SQLException { + Object val = checkNull(getObjectInternal(obj, JavaTypes.OFFSET_TIME, null, joins)); + if (val == null) + return null; + if (val instanceof OffsetTime) + return (OffsetTime) val; + + return OffsetTime.parse(val.toString()); + } + + @Override + public OffsetDateTime getOffsetDateTime(Object obj) throws SQLException { + return getOffsetDateTimeInternal(translate(obj, null), null); + } + + protected OffsetDateTime getOffsetDateTimeInternal(Object obj, Joins joins) throws SQLException { + Object val = checkNull(getObjectInternal(obj, JavaTypes.OFFSET_DATETIME, null, joins)); + if (val == null) + return null; + if (val instanceof OffsetDateTime) + return (OffsetDateTime) val; + + return OffsetDateTime.parse(val.toString()); + } + + @Override public char getChar(Object obj) throws SQLException { return getCharInternal(translate(obj, null), null); diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java index 81d249f..0fe52d5 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java @@ -48,6 +48,10 @@ import java.text.MessageFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -805,6 +809,24 @@ public class DBDictionary return tst != null ? tst.toLocalDateTime() : null; } + /** + * Retrieve the specified column of the SQL ResultSet to the proper + * {@link OffsetTime} java type. + */ + public OffsetTime getOffsetTime(ResultSet rs, int column) throws SQLException { + java.sql.Time time = rs.getTime(column); + return time != null ? time.toLocalTime().atOffset(OffsetDateTime.now().getOffset()) : null; + } + + /** + * Retrieve the specified column of the SQL ResultSet to the proper + * {@link OffsetDateTime} java type. + */ + public OffsetDateTime getOffsetDateTime(ResultSet rs, int column) throws SQLException { + Timestamp tst = rs.getTimestamp(column); + return tst != null ? tst.toLocalDateTime().atOffset(OffsetDateTime.now().getOffset()) : null; + } + private ProxyManager getProxyManager() { if (_proxyManager == null) { _proxyManager = conf.getProxyManagerInstance(); @@ -1242,6 +1264,31 @@ public class DBDictionary setTimestamp(stmnt, idx, java.sql.Timestamp.valueOf(val), null, col); } + + /** + * Set the given LocalTime value as a parameter to the statement. + * + */ + public void setOffsetTime(PreparedStatement stmnt, int idx, OffsetTime val, Column col) + throws SQLException { + // adjust to the default timezone right now. + // This is an ugly hack and cries for troubles in case the daylight saving changes... + // Which is also the reason why we cannot cache the offset. + // According to the Oracle docs the JDBC driver always assumes 'local time' ... + LocalTime localTime = val.withOffsetSameInstant(OffsetDateTime.now().getOffset()).toLocalTime(); + setLocalTime(stmnt, idx, localTime, col); + } + + /** + * Set the given LocalTime value as a parameter to the statement. + * + */ + public void setOffsetDateTime(PreparedStatement stmnt, int idx, OffsetDateTime val, Column col) + throws SQLException { + LocalDateTime localdt = val.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); + setLocalDateTime(stmnt, idx, localdt, col); + } + /** * Set the given value as a parameter to the statement. */ @@ -1461,6 +1508,12 @@ public class DBDictionary case JavaTypes.LOCAL_DATETIME: setLocalDateTime(stmnt, idx, (LocalDateTime) val, col); break; + case JavaTypes.OFFSET_TIME: + setOffsetTime(stmnt, idx, (OffsetTime) val, col); + break; + case JavaTypes.OFFSET_DATETIME: + setOffsetDateTime(stmnt, idx, (OffsetDateTime) val, col); + break; case JavaTypes.BIGDECIMAL: setBigDecimal(stmnt, idx, (BigDecimal) val, col); break; diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java index c22539e..237cc73 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java @@ -32,6 +32,8 @@ import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.Calendar; import java.util.Comparator; import java.util.Date; @@ -355,6 +357,16 @@ public class MergedResult implements Result { } @Override + public OffsetTime getOffsetTime(Object obj) throws SQLException { + return _res[_idx].getOffsetTime(obj); + } + + @Override + public OffsetDateTime getOffsetDateTime(Object obj) throws SQLException { + return _res[_idx].getOffsetDateTime(obj); + } + + @Override public char getChar(Object obj) throws SQLException { return _res[_idx].getChar(obj); diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java index 35abde7..8f28a33 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java @@ -32,6 +32,8 @@ import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.Calendar; import java.util.Date; import java.util.Locale; @@ -306,6 +308,18 @@ public interface Result /** * Return the value stored in the given column or id. */ + OffsetTime getOffsetTime(Object obj) + throws SQLException; + + /** + * Return the value stored in the given column or id. + */ + OffsetDateTime getOffsetDateTime(Object obj) + throws SQLException; + + /** + * Return the value stored in the given column or id. + */ char getChar(Object obj) throws SQLException; diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java index 143c524..ee7ddd3 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java @@ -36,6 +36,8 @@ import java.sql.Types; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.Calendar; import java.util.Date; import java.util.Locale; @@ -338,6 +340,17 @@ public class ResultSetResult return _dict.getLocalDateTime(_rs, ((Number) obj).intValue()); } + @Override + protected OffsetTime getOffsetTimeInternal(Object obj, Joins joins) + throws SQLException { + return _dict.getOffsetTime(_rs, ((Number) obj).intValue()); + } + + @Override + protected OffsetDateTime getOffsetDateTimeInternal(Object obj, Joins joins) + throws SQLException { + return _dict.getOffsetDateTime(_rs, ((Number) obj).intValue()); + } @Override protected char getCharInternal(Object obj, Joins joins) @@ -466,6 +479,10 @@ public class ResultSetResult return getLocalTimeInternal(obj, joins); case JavaTypes.LOCAL_DATETIME: return getLocalDateTimeInternal(obj, joins); + case JavaTypes.OFFSET_TIME: + return getOffsetTimeInternal(obj, joins); + case JavaTypes.OFFSET_DATETIME: + return getOffsetDateTimeInternal(obj, joins); case JavaTypes.BIGDECIMAL: return getBigDecimalInternal(obj, joins); case JavaTypes.NUMBER: diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/Java8TimeTypes.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/Java8TimeTypes.java index d5b1681..bfce8e3 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/Java8TimeTypes.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/Java8TimeTypes.java @@ -23,6 +23,8 @@ import javax.persistence.Id; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.Date; /** @@ -39,6 +41,8 @@ public class Java8TimeTypes { private LocalTime localTimeField; private LocalDate localDateField; private LocalDateTime localDateTimeField; + private OffsetTime offsetTimeField; + private OffsetDateTime offsetDateTimeField; public int getId() { return id; @@ -79,4 +83,20 @@ public class Java8TimeTypes { public void setLocalDateTimeField(LocalDateTime localDateTimeField) { this.localDateTimeField = localDateTimeField; } + + public OffsetTime getOffsetTimeField() { + return offsetTimeField; + } + + public void setOffsetTimeField(OffsetTime offsetTimeField) { + this.offsetTimeField = offsetTimeField; + } + + public OffsetDateTime getOffsetDateTimeField() { + return offsetDateTimeField; + } + + public void setOffsetDateTimeField(OffsetDateTime offsetDateTimeField) { + this.offsetDateTimeField = offsetDateTimeField; + } } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java index 3de2258..8175036 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/simple/TestJava8TimeTypes.java @@ -24,6 +24,7 @@ import javax.persistence.EntityManager; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneOffset; import java.util.Date; /** @@ -31,7 +32,7 @@ import java.util.Date; */ public class TestJava8TimeTypes extends SingleEMFTestCase { private static String VAL_LOCAL_DATE = "2019-01-01"; - private static String VAL_LOCAL_TIME = "14:57:15"; + private static String VAL_LOCAL_TIME = "04:57:15"; private static String VAL_LOCAL_DATETIME = "2019-01-01T01:00:00"; @Override @@ -48,6 +49,8 @@ public class TestJava8TimeTypes extends SingleEMFTestCase { e.setLocalTimeField(LocalTime.parse(VAL_LOCAL_TIME)); e.setLocalDateField(LocalDate.parse(VAL_LOCAL_DATE)); e.setLocalDateTimeField(LocalDateTime.parse(VAL_LOCAL_DATETIME)); + e.setOffsetTimeField(e.getLocalTimeField().atOffset(ZoneOffset.ofHours(-9))); + e.setOffsetDateTimeField(e.getLocalDateTimeField().atOffset(ZoneOffset.ofHours(-9))); em.persist(e); em.getTransaction().commit(); @@ -60,6 +63,8 @@ public class TestJava8TimeTypes extends SingleEMFTestCase { assertEquals(LocalTime.parse(VAL_LOCAL_TIME), eRead.getLocalTimeField()); assertEquals(LocalDate.parse(VAL_LOCAL_DATE), eRead.getLocalDateField()); assertEquals(LocalDateTime.parse(VAL_LOCAL_DATETIME), eRead.getLocalDateTimeField()); + assertEquals(e.getOffsetTimeField(), eRead.getOffsetTimeField()); + assertEquals(e.getOffsetDateTimeField(), eRead.getOffsetDateTimeField()); } }