You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/08/10 14:33:07 UTC
[9/9] cayenne git commit: CAY-2447 Crypto support for LocalDateTime
CAY-2447 Crypto support for LocalDateTime
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/63518b81
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/63518b81
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/63518b81
Branch: refs/heads/master
Commit: 63518b81c6d8455a70558255cc160f91a26ed46d
Parents: c9d0fd3
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Aug 10 17:32:09 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Aug 10 17:32:09 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 2 +-
.../value/LocalDateTimeConverter.java | 27 ++++++++----
.../transformer/value/LocalTimeConverter.java | 1 +
.../value/LocalDateConverterTest.java | 14 +++----
.../value/LocalDateTimeConverterTest.java | 43 +++++++++++++++-----
.../value/LocalTimeConverterTest.java | 20 +++++----
6 files changed, 71 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index fff3063..d2e5421 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -14,12 +14,12 @@ Date:
Changes/New Features:
CAY-2446 Run Disjoint By Id queries outside of synchronized block
+CAY-2447 Crypto support for LocalDateTime
Bug Fixes:
CAY-2444 Change URI from http:// to https:// in xsi:schemaLocation
CAY-2445 Oracle: Problem with ExpressionFactory.notInExp()
-CAY-2447 Crypto support for LocalDateTime
----------------------------------
Release: 4.1.M2
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverter.java
index 91dd318..6307c46 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverter.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverter.java
@@ -5,10 +5,13 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Objects;
+import org.apache.cayenne.crypto.CayenneCryptoException;
+
/**
* @since 4.1
*/
public class LocalDateTimeConverter implements BytesConverter<LocalDateTime> {
+
public static final BytesConverter<LocalDateTime> INSTANCE = new LocalDateTimeConverter(LongConverter.INSTANCE);
private BytesConverter<Long> longConverter;
@@ -20,14 +23,22 @@ public class LocalDateTimeConverter implements BytesConverter<LocalDateTime> {
@Override
public LocalDateTime fromBytes(byte[] bytes) {
- int dateLength = 2;
- int timeLength = 8;
+ if (bytes.length < 2) {
+ throw new IllegalArgumentException("Unexpected number of bytes: " + bytes.length);
+ }
+
+ // long values converted to varying length byte arrays, so first byte is length
+ int dateLength = bytes[0];
+ if(dateLength <= 0 || dateLength >= bytes.length - 1) {
+ throw new CayenneCryptoException("Corrupted data for LocalDateTime: wrong encoded length");
+ }
+ int timeLength = bytes.length - 1 - dateLength;
byte[] date = new byte[dateLength];
byte[] time = new byte[timeLength];
- System.arraycopy(bytes, 0, date, 0, dateLength);
- System.arraycopy(bytes, dateLength, time, 0, timeLength);
+ System.arraycopy(bytes, 1, date, 0, dateLength);
+ System.arraycopy(bytes, dateLength + 1, time, 0, timeLength);
LocalDate localDate = LocalDate.ofEpochDay(longConverter.fromBytes(date));
LocalTime localTime = LocalTime.ofNanoOfDay(longConverter.fromBytes(time));
@@ -40,9 +51,11 @@ public class LocalDateTimeConverter implements BytesConverter<LocalDateTime> {
byte[] date = longConverter.toBytes(value.toLocalDate().toEpochDay());
byte[] time = longConverter.toBytes(value.toLocalTime().toNanoOfDay());
- byte [] datetime = new byte[date.length + time.length];
- System.arraycopy(date,0, datetime, 0, date.length);
- System.arraycopy(time,0, datetime, date.length, time.length);
+ byte [] datetime = new byte[date.length + time.length + 1];
+ // store date part length as first byte
+ datetime[0] = (byte)date.length;
+ System.arraycopy(date,0, datetime, 1, date.length);
+ System.arraycopy(time,0, datetime, date.length + 1, time.length);
return datetime;
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverter.java
index 82908ec..ae49c80 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverter.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverter.java
@@ -7,6 +7,7 @@ import java.util.Objects;
* @since 4.1
*/
public class LocalTimeConverter implements BytesConverter<LocalTime> {
+
public static final BytesConverter<LocalTime> INSTANCE = new LocalTimeConverter(LongConverter.INSTANCE);
private BytesConverter<Long> longConverter;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateConverterTest.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateConverterTest.java
index 9b5458a..7cf6aa8 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateConverterTest.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateConverterTest.java
@@ -2,7 +2,6 @@ package org.apache.cayenne.crypto.transformer.value;
import org.junit.Test;
-import java.text.ParseException;
import java.time.LocalDate;
import static org.junit.Assert.assertArrayEquals;
@@ -10,18 +9,15 @@ import static org.junit.Assert.assertEquals;
public class LocalDateConverterTest {
- private LocalDate localDate(String dateString) {
- return LocalDate.parse(dateString);
- }
-
@Test
- public void testFromBytes() throws ParseException {
- assertEquals(localDate("2015-01-07"), LocalDateConverter.INSTANCE.fromBytes(new byte[]{64, 58}));
+ public void testFromBytes() {
+ assertEquals(LocalDate.of(2015, 1, 7),
+ LocalDateConverter.INSTANCE.fromBytes(new byte[]{64, 58}));
}
@Test
- public void testToBytes() throws ParseException {
+ public void testToBytes() {
assertArrayEquals(new byte[]{64, 58},
- LocalDateConverter.INSTANCE.toBytes(localDate("2015-01-07")));
+ LocalDateConverter.INSTANCE.toBytes(LocalDate.of(2015, 1, 7)));
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverterTest.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverterTest.java
index 1cc9425..6be15e9 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverterTest.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalDateTimeConverterTest.java
@@ -2,28 +2,51 @@ package org.apache.cayenne.crypto.transformer.value;
import org.junit.Test;
-import java.text.ParseException;
import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
public class LocalDateTimeConverterTest {
- private LocalDateTime localDate(String dateString) {
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- return LocalDateTime.parse(dateString, formatter);
+ @Test
+ public void testFromBytes() {
+ assertEquals(LocalDateTime.of(2015, 1, 7, 11, 0, 2),
+ LocalDateTimeConverter.INSTANCE.fromBytes(new byte[]{2, 64, 58, 0, 0, 36, 4, -113, 36, 116, 0}));
+ }
+
+ @Test
+ public void testToBytes() {
+ byte[] bytes = LocalDateTimeConverter.INSTANCE
+ .toBytes(LocalDateTime.of(2015, 1, 7, 11, 0, 2));
+ assertArrayEquals(new byte[]{2, 64, 58, 0, 0, 36, 4, -113, 36, 116, 0}, bytes);
+ }
+
+ @Test
+ public void testToBytesBig() {
+ byte[] bytes = LocalDateTimeConverter.INSTANCE
+ .toBytes(LocalDateTime.of(123456, 12, 31, 23, 59, 59));
+ assertArrayEquals(new byte[]{4, 2, -91, 16, -9, 0, 0, 78, -108, 85, -76, 54, 0}, bytes);
+ }
+
+ @Test
+ public void testFromBytesBig() {
+ LocalDateTime localDateTime = LocalDateTimeConverter.INSTANCE
+ .fromBytes(new byte[]{4, 2, -91, 16, -9, 0, 0, 78, -108, 85, -76, 54, 0});
+ assertEquals(LocalDateTime.of(123456, 12, 31, 23, 59, 59), localDateTime);
}
@Test
- public void testFromBytes() throws ParseException {
- assertEquals(localDate("2015-01-07 11:00:02"), LocalDateTimeConverter.INSTANCE.fromBytes(new byte[]{64, 58, 0, 0, 36, 4, -113, 36, 116, 0}));
+ public void testToBytesSmall() {
+ byte[] bytes = LocalDateTimeConverter.INSTANCE
+ .toBytes(LocalDateTime.of(0, 1, 1, 0, 0, 0));
+ assertArrayEquals(new byte[]{4, -1, -11, 5, 88, 0}, bytes);
}
@Test
- public void testToBytes() throws ParseException {
- assertArrayEquals(new byte[]{64, 58, 0, 0, 36, 4, -113, 36, 116, 0},
- LocalDateTimeConverter.INSTANCE.toBytes(localDate("2015-01-07 11:00:02")));
+ public void testFromBytesSmall() {
+ LocalDateTime localDateTime = LocalDateTimeConverter.INSTANCE
+ .fromBytes(new byte[]{4, -1, -11, 5, 88, 0});
+ assertEquals(LocalDateTime.of(0, 1, 1, 0, 0, 0), localDateTime);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/63518b81/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverterTest.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverterTest.java
index 4743217..e0dca79 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverterTest.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/LocalTimeConverterTest.java
@@ -2,7 +2,6 @@ package org.apache.cayenne.crypto.transformer.value;
import org.junit.Test;
-import java.text.ParseException;
import java.time.LocalTime;
import static org.junit.Assert.assertArrayEquals;
@@ -10,19 +9,22 @@ import static org.junit.Assert.assertEquals;
public class LocalTimeConverterTest {
- private LocalTime localTime(String dateString) {
- return LocalTime.parse(dateString);
- }
-
@Test
- public void testFromBytes() throws ParseException {
- assertEquals(localTime("11:00:02"), LocalTimeConverter.INSTANCE.fromBytes(new byte[]{0, 0, 36, 4, -113, 36, 116, 0}));
+ public void testFromBytes() {
+ assertEquals(LocalTime.of(11, 0, 2),
+ LocalTimeConverter.INSTANCE.fromBytes(new byte[]{0, 0, 36, 4, -113, 36, 116, 0}));
+
+ assertEquals(LocalTime.of(0, 0, 0),
+ LocalTimeConverter.INSTANCE.fromBytes(new byte[]{0}));
}
@Test
- public void testToBytes() throws ParseException {
+ public void testToBytes() {
assertArrayEquals(new byte[]{0, 0, 36, 4, -113, 36, 116, 0},
- LocalTimeConverter.INSTANCE.toBytes(localTime("11:00:02")));
+ LocalTimeConverter.INSTANCE.toBytes(LocalTime.of(11, 0, 2)));
+
+ assertArrayEquals(new byte[]{0},
+ LocalTimeConverter.INSTANCE.toBytes(LocalTime.of(0, 0, 0)));
}
}