You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/08/18 15:05:30 UTC

[2/3] cayenne git commit: CAY-2103 cayenne-crypto: support for mapping non-String and non-binary types

CAY-2103 cayenne-crypto: support for mapping non-String and non-binary types


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/d9f64a7c
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/d9f64a7c
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/d9f64a7c

Branch: refs/heads/master
Commit: d9f64a7cc0ec99bfdb3284d78c7e776d80b8133a
Parents: c7ae3e1
Author: Andrei Tomashpolskiy <no...@gmail.com>
Authored: Thu Aug 18 17:42:39 2016 +0300
Committer: Andrei Tomashpolskiy <no...@gmail.com>
Committed: Thu Aug 18 17:42:39 2016 +0300

----------------------------------------------------------------------
 .../value/DefaultValueTransformerFactory.java   |  6 +++
 .../transformer/value/DoubleConverter.java      | 35 ++++++++++++++++
 .../transformer/value/FloatConverter.java       | 35 ++++++++++++++++
 .../transformer/value/DoubleConverterTest.java  | 43 ++++++++++++++++++++
 .../transformer/value/FloatConverterTest.java   | 43 ++++++++++++++++++++
 5 files changed, 162 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9f64a7c/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactory.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactory.java
index 2d68972..aa4e83c 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactory.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactory.java
@@ -144,6 +144,12 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
         map.put("byte[]", BytesToBytesConverter.INSTANCE);
         map.put(String.class.getName(), Utf8StringConverter.INSTANCE);
 
+        map.put(Double.class.getName(), DoubleConverter.INSTANCE);
+        map.put(Double.TYPE.getName(), DoubleConverter.INSTANCE);
+
+        map.put(Float.class.getName(), FloatConverter.INSTANCE);
+        map.put(Float.TYPE.getName(), FloatConverter.INSTANCE);
+
         map.put(Long.class.getName(), LongConverter.INSTANCE);
         map.put(Long.TYPE.getName(), LongConverter.INSTANCE);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9f64a7c/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DoubleConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DoubleConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DoubleConverter.java
new file mode 100644
index 0000000..1de0eee
--- /dev/null
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/DoubleConverter.java
@@ -0,0 +1,35 @@
+package org.apache.cayenne.crypto.transformer.value;
+
+/**
+ * Converts between double and byte[]
+ *
+ * @since 4.0
+ */
+public class DoubleConverter implements BytesConverter<Double> {
+
+    public static final BytesConverter<Double> INSTANCE = new DoubleConverter();
+    private static final int BYTES = 8;
+
+    static double getDouble(byte[] bytes) {
+
+        if (bytes.length > BYTES) {
+            throw new IllegalArgumentException("byte[] is too large for a single double value: " + bytes.length);
+        }
+
+        return Double.longBitsToDouble(LongConverter.getLong(bytes));
+    }
+
+    static byte[] getBytes(Double d) {
+        return LongConverter.getBytes(Double.doubleToLongBits(d));
+    }
+
+    @Override
+    public Double fromBytes(byte[] bytes) {
+        return getDouble(bytes);
+    }
+
+    @Override
+    public byte[] toBytes(Double value) {
+        return getBytes(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9f64a7c/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/FloatConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/FloatConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/FloatConverter.java
new file mode 100644
index 0000000..ad35014
--- /dev/null
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/FloatConverter.java
@@ -0,0 +1,35 @@
+package org.apache.cayenne.crypto.transformer.value;
+
+/**
+ * Converts between float and byte[]
+ *
+ * @since 4.0
+ */
+public class FloatConverter implements BytesConverter<Float> {
+
+    public static final BytesConverter<Float> INSTANCE = new FloatConverter();
+    private static final int BYTES = 4;
+
+    static float getFloat(byte[] bytes) {
+
+        if (bytes.length > BYTES) {
+            throw new IllegalArgumentException("byte[] is too large for a single float value: " + bytes.length);
+        }
+
+        return Float.intBitsToFloat(IntegerConverter.getInt(bytes));
+    }
+
+    static byte[] getBytes(float f) {
+        return IntegerConverter.getBytes(Float.floatToRawIntBits(f));
+    }
+
+    @Override
+    public Float fromBytes(byte[] bytes) {
+        return getFloat(bytes);
+    }
+
+    @Override
+    public byte[] toBytes(Float value) {
+        return getBytes(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9f64a7c/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DoubleConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DoubleConverterTest.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DoubleConverterTest.java
new file mode 100644
index 0000000..d25ca31
--- /dev/null
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DoubleConverterTest.java
@@ -0,0 +1,43 @@
+package org.apache.cayenne.crypto.transformer.value;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DoubleConverterTest {
+
+    @Test
+    public void testConverter() {
+        Double originalValue = 36.6d;
+        DoubleConverter converter = new DoubleConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_Negative() {
+        Double originalValue = -36.6d;
+        DoubleConverter converter = new DoubleConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_MaxValue() {
+        Double originalValue = Double.MAX_VALUE;
+        DoubleConverter converter = new DoubleConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_MinValue() {
+        Double originalValue = Double.MIN_VALUE;
+        DoubleConverter converter = new DoubleConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_Zero() {
+        Double originalValue = 0d;
+        DoubleConverter converter = new DoubleConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9f64a7c/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/FloatConverterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/FloatConverterTest.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/FloatConverterTest.java
new file mode 100644
index 0000000..7b367be
--- /dev/null
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/FloatConverterTest.java
@@ -0,0 +1,43 @@
+package org.apache.cayenne.crypto.transformer.value;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class FloatConverterTest {
+
+    @Test
+    public void testConverter() {
+        Float originalValue = 36.6f;
+        FloatConverter converter = new FloatConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_Negative() {
+        Float originalValue = -36.6f;
+        FloatConverter converter = new FloatConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_MaxValue() {
+        Float originalValue = Float.MAX_VALUE;
+        FloatConverter converter = new FloatConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_MinValue() {
+        Float originalValue = Float.MIN_VALUE;
+        FloatConverter converter = new FloatConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+
+    @Test
+    public void testConverter_Zero() {
+        Float originalValue = 0f;
+        FloatConverter converter = new FloatConverter();
+        assertEquals(originalValue, converter.fromBytes(converter.toBytes(originalValue)));
+    }
+}