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/25 08:32:20 UTC

[1/4] cayenne git commit: CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory

Repository: cayenne
Updated Branches:
  refs/heads/master a97fc4ebc -> a5b833d5f


CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory


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

Branch: refs/heads/master
Commit: e7978a4d34613af4b44115a8ae510e7fe47ff105
Parents: 938fbb3
Author: Andrei Tomashpolskiy <no...@gmail.com>
Authored: Mon Aug 22 15:19:02 2016 +0300
Committer: Andrei Tomashpolskiy <no...@gmail.com>
Committed: Mon Aug 22 15:19:02 2016 +0300

----------------------------------------------------------------------
 .../cayenne/crypto/CryptoModuleBuilder.java     | 40 +++++++++
 .../value/DefaultValueTransformerFactory.java   | 86 +++++---------------
 .../value/DefaultValueTransformerFactoryIT.java | 18 ++--
 3 files changed, 72 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e7978a4d/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
index 8d19b85..23e768b 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.crypto.transformer.DefaultTransformerFactory;
 import org.apache.cayenne.crypto.transformer.TransformerFactory;
 import org.apache.cayenne.crypto.transformer.bytes.BytesTransformerFactory;
 import org.apache.cayenne.crypto.transformer.bytes.DefaultBytesTransformerFactory;
+import org.apache.cayenne.crypto.transformer.value.BytesConverter;
 import org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory;
 import org.apache.cayenne.crypto.transformer.value.ValueTransformerFactory;
 import org.apache.cayenne.di.Binder;
@@ -41,6 +42,9 @@ import org.apache.cayenne.di.Module;
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * A builder of a Cayenne DI module that will contain all extension to Cayenne
@@ -59,6 +63,9 @@ public class CryptoModuleBuilder {
     private Class<? extends ValueTransformerFactory> valueTransformerFactoryType;
     private Class<? extends BytesTransformerFactory> bytesTransformerFactoryType;
 
+    private Map<String, BytesConverter<?>> extraObjectToBytes;
+    private Map<Integer, BytesConverter<?>> extraDbToBytes;
+
     private String columnMapperPattern;
     private ColumnMapper columnMapper;
     private Class<? extends ColumnMapper> columnMapperType;
@@ -120,6 +127,22 @@ public class CryptoModuleBuilder {
         return this;
     }
 
+    public <T> CryptoModuleBuilder objectToBytesConverter(Class<T> objectType, BytesConverter<T> converter) {
+        if (extraObjectToBytes == null) {
+            extraObjectToBytes = new HashMap<>();
+        }
+        extraObjectToBytes.put(objectType.getName(), Objects.requireNonNull(converter));
+        return this;
+    }
+
+    public CryptoModuleBuilder dbToBytesConverter(int sqlType, BytesConverter<?> converter) {
+        if (extraDbToBytes == null) {
+            extraDbToBytes = new HashMap<>();
+        }
+        extraDbToBytes.put(sqlType, Objects.requireNonNull(converter));
+        return this;
+    }
+
     public CryptoModuleBuilder bytesTransformer(Class<? extends BytesTransformerFactory> factoryType) {
         this.bytesTransformerFactoryType = factoryType;
         return this;
@@ -303,6 +326,23 @@ public class CryptoModuleBuilder {
                 binder.bind(CipherFactory.class).to(cipherFactoryType);
                 binder.bind(TransformerFactory.class).to(DefaultTransformerFactory.class);
                 binder.bind(ValueTransformerFactory.class).to(valueTransformerFactoryType);
+
+                MapBuilder<BytesConverter<?>> extraDbToBytesBinder =
+                        binder.bindMap(DefaultValueTransformerFactory.EXTRA_DB_TO_BYTE_CONVERTERS_KEY);
+                if (extraDbToBytes != null) {
+                    for (Map.Entry<Integer, BytesConverter<?>> extraConverter : extraDbToBytes.entrySet()) {
+                        extraDbToBytesBinder.put(extraConverter.getKey().toString(), extraConverter.getValue());
+                    }
+                }
+
+                MapBuilder<BytesConverter<?>> extraObjectToBytesBinder =
+                        binder.bindMap(DefaultValueTransformerFactory.EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY);
+                if (extraObjectToBytes != null) {
+                    for (Map.Entry<String, BytesConverter<?>> extraConverter : extraObjectToBytes.entrySet()) {
+                        extraObjectToBytesBinder.put(extraConverter.getKey(), extraConverter.getValue());
+                    }
+                }
+
                 binder.bind(BytesTransformerFactory.class).to(bytesTransformerFactoryType);
 
                 if (keySource != null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e7978a4d/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 6c4d194..1bb778a 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
@@ -47,27 +47,38 @@ import java.util.concurrent.ConcurrentMap;
  */
 public class DefaultValueTransformerFactory implements ValueTransformerFactory {
 
+    public static final String EXTRA_DB_TO_BYTE_CONVERTERS_KEY =
+            "org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory.dbToBytes";
+
+    public static final String EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY =
+            "org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory.objectToBytes";
+
     private final Key defaultKey;
 
     private final Map<String, BytesConverter<?>> objectToBytes;
     private final Map<Integer, BytesConverter<?>> dbToBytes;
 
-    private final Map<String, BytesConverter<?>> bytesToObject;
-    private final Map<Integer, BytesConverter<?>> bytesToDb;
-
     private final ConcurrentMap<DbAttribute, ValueEncryptor> encryptors;
     private final ConcurrentMap<DbAttribute, ValueDecryptor> decryptors;
 
-    public DefaultValueTransformerFactory(@Inject KeySource keySource) {
+    public DefaultValueTransformerFactory(@Inject KeySource keySource,
+                      @Inject(EXTRA_DB_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> extraDbToBytes,
+                      @Inject(EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> extraObjectToBytes) {
+
         this.defaultKey = keySource.getKey(keySource.getDefaultKeyAlias());
 
-        this.encryptors = new ConcurrentHashMap<DbAttribute, ValueEncryptor>();
-        this.decryptors = new ConcurrentHashMap<DbAttribute, ValueDecryptor>();
+        this.encryptors = new ConcurrentHashMap<>();
+        this.decryptors = new ConcurrentHashMap<>();
 
         this.objectToBytes = createObjectToBytesConverters();
+        for (Map.Entry<String, BytesConverter<?>> extraConverter : extraObjectToBytes.entrySet()) {
+            objectToBytes.put(extraConverter.getKey(), extraConverter.getValue());
+        }
+
         this.dbToBytes = createDbToBytesConverters();
-        this.bytesToObject = createBytesToObjectConverters();
-        this.bytesToDb = createBytesToDbConverters();
+        for (Map.Entry<String, BytesConverter<?>> extraConverter : extraDbToBytes.entrySet()) {
+            dbToBytes.put(Integer.valueOf(extraConverter.getKey()), extraConverter.getValue());
+        }
     }
 
     @Override
@@ -120,26 +131,6 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
         return map;
     }
 
-    protected Map<Integer, BytesConverter<?>> createBytesToDbConverters() {
-        Map<Integer, BytesConverter<?>> map = new HashMap<>();
-
-        map.put(Types.BINARY, BytesToBytesConverter.INSTANCE);
-        map.put(Types.BLOB, BytesToBytesConverter.INSTANCE);
-        map.put(Types.VARBINARY, BytesToBytesConverter.INSTANCE);
-        map.put(Types.LONGVARBINARY, BytesToBytesConverter.INSTANCE);
-
-        map.put(Types.CHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.NCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.CLOB, Base64StringConverter.INSTANCE);
-        map.put(Types.NCLOB, Base64StringConverter.INSTANCE);
-        map.put(Types.LONGVARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.LONGNVARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.VARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.NVARCHAR, Base64StringConverter.INSTANCE);
-
-        return map;
-    }
-
     protected Map<String, BytesConverter<?>> createObjectToBytesConverters() {
         Map<String, BytesConverter<?>> map = new HashMap<>();
 
@@ -174,41 +165,6 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
         return map;
     }
 
-    protected Map<String, BytesConverter<?>> createBytesToObjectConverters() {
-
-        Map<String, BytesConverter<?>> map = new HashMap<>();
-
-        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);
-
-        map.put(Integer.class.getName(), IntegerConverter.INSTANCE);
-        map.put(Integer.TYPE.getName(), IntegerConverter.INSTANCE);
-
-        map.put(Short.class.getName(), ShortConverter.INSTANCE);
-        map.put(Short.TYPE.getName(), ShortConverter.INSTANCE);
-
-        map.put(Byte.class.getName(), ByteConverter.INSTANCE);
-        map.put(Byte.TYPE.getName(), ByteConverter.INSTANCE);
-
-        map.put(Boolean.class.getName(), BooleanConverter.INSTANCE);
-        map.put(Boolean.TYPE.getName(), BooleanConverter.INSTANCE);
-
-        map.put(Date.class.getName(), UtilDateConverter.INSTANCE);
-        map.put(BigInteger.class.getName(), BigIntegerConverter.INSTANCE);
-        map.put(BigDecimal.class.getName(), BigDecimalConverter.INSTANCE);
-
-        return map;
-    }
-
     protected ValueEncryptor createEncryptor(DbAttribute a) {
 
         String type = getJavaType(a);
@@ -219,7 +175,7 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
                     + " has no object-to-bytes conversion");
         }
 
-        BytesConverter<?> fromBytes = bytesToDb.get(a.getType());
+        BytesConverter<?> fromBytes = dbToBytes.get(a.getType());
         if (fromBytes == null) {
             throw new IllegalArgumentException("The type " + TypesMapping.getSqlNameByType(a.getType())
                     + " for attribute " + a + " has no bytes-to-db conversion");
@@ -237,7 +193,7 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
         }
 
         String type = getJavaType(a);
-        BytesConverter<?> fromBytes = bytesToObject.get(type);
+        BytesConverter<?> fromBytes = objectToBytes.get(type);
         if (fromBytes == null) {
             throw new IllegalArgumentException("The type " + type + " for attribute " + a
                     + " has no bytes-to-object conversion");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e7978a4d/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
index 1bb896a..1baf0fc 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
@@ -22,10 +22,12 @@ import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.crypto.key.KeySource;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import java.sql.Types;
+import java.util.Collections;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -40,6 +42,8 @@ public class DefaultValueTransformerFactoryIT {
     private static DbEntity t2;
     private static DbEntity t3;
 
+    private DefaultValueTransformerFactory f;
+
     @BeforeClass
     public static void beforeClass() throws Exception {
         ServerRuntime runtime = new ServerRuntime("cayenne-crypto.xml");
@@ -48,11 +52,16 @@ public class DefaultValueTransformerFactoryIT {
         t3 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE3");
     }
 
+    @Before
+    public void before() {
+        f = new DefaultValueTransformerFactory(mock(KeySource.class),
+                Collections.<String, BytesConverter<?>>emptyMap(),
+                Collections.<String, BytesConverter<?>>emptyMap());
+    }
+
     @Test
     public void testGetJavaType() {
 
-        DefaultValueTransformerFactory f = new DefaultValueTransformerFactory(mock(KeySource.class));
-
         DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
         assertEquals("java.lang.String", f.getJavaType(t1_ct));
 
@@ -79,7 +88,6 @@ public class DefaultValueTransformerFactoryIT {
 
     @Test
     public void testCreateEncryptor() {
-        DefaultValueTransformerFactory f = new DefaultValueTransformerFactory(mock(KeySource.class));
 
         DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
 
@@ -100,7 +108,6 @@ public class DefaultValueTransformerFactoryIT {
 
     @Test
     public void testCreateDecryptor() {
-        DefaultValueTransformerFactory f = new DefaultValueTransformerFactory(mock(KeySource.class));
 
         DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
 
@@ -129,7 +136,6 @@ public class DefaultValueTransformerFactoryIT {
 
     @Test
     public void testEncryptor() {
-        DefaultValueTransformerFactory f = new DefaultValueTransformerFactory(mock(KeySource.class));
 
         DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
 
@@ -148,7 +154,6 @@ public class DefaultValueTransformerFactoryIT {
 
     @Test
     public void testDecryptor() {
-        DefaultValueTransformerFactory f = new DefaultValueTransformerFactory(mock(KeySource.class));
 
         DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
 
@@ -164,5 +169,4 @@ public class DefaultValueTransformerFactoryIT {
         assertSame(t2, f.decryptor(t2_cb));
         assertSame(t2, f.decryptor(t2_cb));
     }
-
 }


[2/4] cayenne git commit: CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory

Posted by aa...@apache.org.
CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory


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

Branch: refs/heads/master
Commit: 888a852ba90f6cca2af99a3ad226b3fea050cef0
Parents: e7978a4
Author: Andrei Tomashpolskiy <no...@gmail.com>
Authored: Tue Aug 23 13:54:59 2016 +0300
Committer: Andrei Tomashpolskiy <no...@gmail.com>
Committed: Tue Aug 23 13:54:59 2016 +0300

----------------------------------------------------------------------
 .../cayenne/crypto/CryptoModuleBuilder.java     | 79 ++++++++++++++++++--
 .../value/Base64StringConverter.java            |  2 +-
 .../transformer/value/BooleanConverter.java     |  2 +-
 .../value/BytesToBytesConverter.java            |  2 +-
 .../value/DefaultValueTransformerFactory.java   | 78 +++----------------
 .../value/DefaultValueTransformerFactoryIT.java | 69 ++++++++++++++++-
 6 files changed, 150 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
index 23e768b..151e320 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/CryptoModuleBuilder.java
@@ -32,16 +32,33 @@ import org.apache.cayenne.crypto.transformer.DefaultTransformerFactory;
 import org.apache.cayenne.crypto.transformer.TransformerFactory;
 import org.apache.cayenne.crypto.transformer.bytes.BytesTransformerFactory;
 import org.apache.cayenne.crypto.transformer.bytes.DefaultBytesTransformerFactory;
+import org.apache.cayenne.crypto.transformer.value.Base64StringConverter;
+import org.apache.cayenne.crypto.transformer.value.BigDecimalConverter;
+import org.apache.cayenne.crypto.transformer.value.BigIntegerConverter;
+import org.apache.cayenne.crypto.transformer.value.BooleanConverter;
+import org.apache.cayenne.crypto.transformer.value.ByteConverter;
 import org.apache.cayenne.crypto.transformer.value.BytesConverter;
+import org.apache.cayenne.crypto.transformer.value.BytesToBytesConverter;
 import org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory;
+import org.apache.cayenne.crypto.transformer.value.DoubleConverter;
+import org.apache.cayenne.crypto.transformer.value.FloatConverter;
+import org.apache.cayenne.crypto.transformer.value.IntegerConverter;
+import org.apache.cayenne.crypto.transformer.value.LongConverter;
+import org.apache.cayenne.crypto.transformer.value.ShortConverter;
+import org.apache.cayenne.crypto.transformer.value.Utf8StringConverter;
+import org.apache.cayenne.crypto.transformer.value.UtilDateConverter;
 import org.apache.cayenne.crypto.transformer.value.ValueTransformerFactory;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.MapBuilder;
 import org.apache.cayenne.di.Module;
 
 import java.io.File;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.sql.Types;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -327,19 +344,21 @@ public class CryptoModuleBuilder {
                 binder.bind(TransformerFactory.class).to(DefaultTransformerFactory.class);
                 binder.bind(ValueTransformerFactory.class).to(valueTransformerFactoryType);
 
-                MapBuilder<BytesConverter<?>> extraDbToBytesBinder =
-                        binder.bindMap(DefaultValueTransformerFactory.EXTRA_DB_TO_BYTE_CONVERTERS_KEY);
+                MapBuilder<BytesConverter<?>> dbToBytesBinder =
+                        binder.bindMap(DefaultValueTransformerFactory.DB_TO_BYTE_CONVERTERS_KEY);
+                contributeDefaultDbConverters(dbToBytesBinder);
                 if (extraDbToBytes != null) {
                     for (Map.Entry<Integer, BytesConverter<?>> extraConverter : extraDbToBytes.entrySet()) {
-                        extraDbToBytesBinder.put(extraConverter.getKey().toString(), extraConverter.getValue());
+                        dbToBytesBinder.put(extraConverter.getKey().toString(), extraConverter.getValue());
                     }
                 }
 
-                MapBuilder<BytesConverter<?>> extraObjectToBytesBinder =
-                        binder.bindMap(DefaultValueTransformerFactory.EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY);
+                MapBuilder<BytesConverter<?>> objectToBytesBinder =
+                        binder.bindMap(DefaultValueTransformerFactory.OBJECT_TO_BYTE_CONVERTERS_KEY);
+                contributeDefaultObjectConverters(objectToBytesBinder);
                 if (extraObjectToBytes != null) {
                     for (Map.Entry<String, BytesConverter<?>> extraConverter : extraObjectToBytes.entrySet()) {
-                        extraObjectToBytesBinder.put(extraConverter.getKey(), extraConverter.getValue());
+                        objectToBytesBinder.put(extraConverter.getKey(), extraConverter.getValue());
                     }
                 }
 
@@ -364,4 +383,52 @@ public class CryptoModuleBuilder {
             }
         };
     }
+
+    private static void contributeDefaultDbConverters(MapBuilder<BytesConverter<?>> mapBuilder) {
+
+        mapBuilder.put(String.valueOf(Types.BINARY), BytesToBytesConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.BLOB), BytesToBytesConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.VARBINARY), BytesToBytesConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.LONGVARBINARY), BytesToBytesConverter.INSTANCE);
+
+        mapBuilder.put(String.valueOf(Types.CHAR), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.NCHAR), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.CLOB), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.NCLOB), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.LONGVARCHAR), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.LONGNVARCHAR), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.VARCHAR), Base64StringConverter.INSTANCE);
+        mapBuilder.put(String.valueOf(Types.NVARCHAR), Base64StringConverter.INSTANCE);
+    }
+
+    private static void contributeDefaultObjectConverters(MapBuilder<BytesConverter<?>> mapBuilder) {
+
+        mapBuilder.put("byte[]", BytesToBytesConverter.INSTANCE);
+        mapBuilder.put(String.class.getName(), Utf8StringConverter.INSTANCE);
+
+        mapBuilder.put(Double.class.getName(), DoubleConverter.INSTANCE);
+        mapBuilder.put(Double.TYPE.getName(), DoubleConverter.INSTANCE);
+
+        mapBuilder.put(Float.class.getName(), FloatConverter.INSTANCE);
+        mapBuilder.put(Float.TYPE.getName(), FloatConverter.INSTANCE);
+
+        mapBuilder.put(Long.class.getName(), LongConverter.INSTANCE);
+        mapBuilder.put(Long.TYPE.getName(), LongConverter.INSTANCE);
+
+        mapBuilder.put(Integer.class.getName(), IntegerConverter.INSTANCE);
+        mapBuilder.put(Integer.TYPE.getName(), IntegerConverter.INSTANCE);
+
+        mapBuilder.put(Short.class.getName(), ShortConverter.INSTANCE);
+        mapBuilder.put(Short.TYPE.getName(), ShortConverter.INSTANCE);
+
+        mapBuilder.put(Byte.class.getName(), ByteConverter.INSTANCE);
+        mapBuilder.put(Byte.TYPE.getName(), ByteConverter.INSTANCE);
+
+        mapBuilder.put(Boolean.class.getName(), BooleanConverter.INSTANCE);
+        mapBuilder.put(Boolean.TYPE.getName(), BooleanConverter.INSTANCE);
+
+        mapBuilder.put(Date.class.getName(), UtilDateConverter.INSTANCE);
+        mapBuilder.put(BigInteger.class.getName(), BigIntegerConverter.INSTANCE);
+        mapBuilder.put(BigDecimal.class.getName(), BigDecimalConverter.INSTANCE);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/Base64StringConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/Base64StringConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/Base64StringConverter.java
index 652bdf5..497659e 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/Base64StringConverter.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/Base64StringConverter.java
@@ -25,7 +25,7 @@ import javax.xml.bind.DatatypeConverter;
  */
 public class Base64StringConverter implements BytesConverter<String> {
 
-    static final BytesConverter<String> INSTANCE = new Base64StringConverter();
+    public static final BytesConverter<String> INSTANCE = new Base64StringConverter();
 
     @Override
     public byte[] toBytes(String value) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BooleanConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BooleanConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BooleanConverter.java
index 5282dbd..fb1a08f 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BooleanConverter.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BooleanConverter.java
@@ -25,7 +25,7 @@ package org.apache.cayenne.crypto.transformer.value;
  */
 public class BooleanConverter implements BytesConverter<Boolean> {
 
-    static final BytesConverter<Boolean> INSTANCE = new BooleanConverter();
+    public static final BytesConverter<Boolean> INSTANCE = new BooleanConverter();
 
     @Override
     public Boolean fromBytes(byte[] bytes) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java
index 0eb9e20..57b8d4e 100644
--- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java
+++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java
@@ -24,7 +24,7 @@ package org.apache.cayenne.crypto.transformer.value;
 // we can't use <byte[]> , so parameterizing this converter to Object
 public class BytesToBytesConverter implements BytesConverter<Object> {
 
-    static final BytesConverter<Object> INSTANCE = new BytesToBytesConverter();
+    public static final BytesConverter<Object> INSTANCE = new BytesToBytesConverter();
 
     @Override
     public byte[] toBytes(Object value) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/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 1bb778a..cca9619 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
@@ -27,12 +27,8 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.security.Key;
-import java.sql.Types;
 import java.util.Collection;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -47,10 +43,10 @@ import java.util.concurrent.ConcurrentMap;
  */
 public class DefaultValueTransformerFactory implements ValueTransformerFactory {
 
-    public static final String EXTRA_DB_TO_BYTE_CONVERTERS_KEY =
+    public static final String DB_TO_BYTE_CONVERTERS_KEY =
             "org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory.dbToBytes";
 
-    public static final String EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY =
+    public static final String OBJECT_TO_BYTE_CONVERTERS_KEY =
             "org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory.objectToBytes";
 
     private final Key defaultKey;
@@ -62,23 +58,21 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
     private final ConcurrentMap<DbAttribute, ValueDecryptor> decryptors;
 
     public DefaultValueTransformerFactory(@Inject KeySource keySource,
-                      @Inject(EXTRA_DB_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> extraDbToBytes,
-                      @Inject(EXTRA_OBJECT_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> extraObjectToBytes) {
+                      @Inject(DB_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> dbToBytes,
+                      @Inject(OBJECT_TO_BYTE_CONVERTERS_KEY) Map<String, BytesConverter<?>> objectToBytes) {
 
         this.defaultKey = keySource.getKey(keySource.getDefaultKeyAlias());
 
         this.encryptors = new ConcurrentHashMap<>();
         this.decryptors = new ConcurrentHashMap<>();
 
-        this.objectToBytes = createObjectToBytesConverters();
-        for (Map.Entry<String, BytesConverter<?>> extraConverter : extraObjectToBytes.entrySet()) {
-            objectToBytes.put(extraConverter.getKey(), extraConverter.getValue());
-        }
+        this.objectToBytes = objectToBytes;
 
-        this.dbToBytes = createDbToBytesConverters();
-        for (Map.Entry<String, BytesConverter<?>> extraConverter : extraDbToBytes.entrySet()) {
-            dbToBytes.put(Integer.valueOf(extraConverter.getKey()), extraConverter.getValue());
+        Map<Integer, BytesConverter<?>> m = new HashMap<>();
+        for (Map.Entry<String, BytesConverter<?>> extraConverter : dbToBytes.entrySet()) {
+            m.put(Integer.valueOf(extraConverter.getKey()), extraConverter.getValue());
         }
+        this.dbToBytes = m;
     }
 
     @Override
@@ -111,60 +105,6 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory {
         return e;
     }
 
-    protected Map<Integer, BytesConverter<?>> createDbToBytesConverters() {
-        Map<Integer, BytesConverter<?>> map = new HashMap<>();
-
-        map.put(Types.BINARY, BytesToBytesConverter.INSTANCE);
-        map.put(Types.BLOB, BytesToBytesConverter.INSTANCE);
-        map.put(Types.VARBINARY, BytesToBytesConverter.INSTANCE);
-        map.put(Types.LONGVARBINARY, BytesToBytesConverter.INSTANCE);
-
-        map.put(Types.CHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.NCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.CLOB, Base64StringConverter.INSTANCE);
-        map.put(Types.NCLOB, Base64StringConverter.INSTANCE);
-        map.put(Types.LONGVARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.LONGNVARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.VARCHAR, Base64StringConverter.INSTANCE);
-        map.put(Types.NVARCHAR, Base64StringConverter.INSTANCE);
-
-        return map;
-    }
-
-    protected Map<String, BytesConverter<?>> createObjectToBytesConverters() {
-        Map<String, BytesConverter<?>> map = new HashMap<>();
-
-        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);
-
-        map.put(Integer.class.getName(), IntegerConverter.INSTANCE);
-        map.put(Integer.TYPE.getName(), IntegerConverter.INSTANCE);
-
-        map.put(Short.class.getName(), ShortConverter.INSTANCE);
-        map.put(Short.TYPE.getName(), ShortConverter.INSTANCE);
-
-        map.put(Byte.class.getName(), ByteConverter.INSTANCE);
-        map.put(Byte.TYPE.getName(), ByteConverter.INSTANCE);
-
-        map.put(Boolean.class.getName(), BooleanConverter.INSTANCE);
-        map.put(Boolean.TYPE.getName(), BooleanConverter.INSTANCE);
-
-        map.put(Date.class.getName(), UtilDateConverter.INSTANCE);
-        map.put(BigInteger.class.getName(), BigIntegerConverter.INSTANCE);
-        map.put(BigDecimal.class.getName(), BigDecimalConverter.INSTANCE);
-
-        return map;
-    }
-
     protected ValueEncryptor createEncryptor(DbAttribute a) {
 
         String type = getJavaType(a);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/888a852b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
index 1baf0fc..e40137e 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/DefaultValueTransformerFactoryIT.java
@@ -26,8 +26,12 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.sql.Types;
-import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -42,6 +46,8 @@ public class DefaultValueTransformerFactoryIT {
     private static DbEntity t2;
     private static DbEntity t3;
 
+    private static Map<String, BytesConverter<?>> dbToBytes, objectToBytes;
+
     private DefaultValueTransformerFactory f;
 
     @BeforeClass
@@ -50,13 +56,14 @@ public class DefaultValueTransformerFactoryIT {
         t1 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE1");
         t2 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE2");
         t3 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE3");
+
+        dbToBytes = getDefaultDbConverters();
+        objectToBytes = getDefaultObjectConverters();
     }
 
     @Before
     public void before() {
-        f = new DefaultValueTransformerFactory(mock(KeySource.class),
-                Collections.<String, BytesConverter<?>>emptyMap(),
-                Collections.<String, BytesConverter<?>>emptyMap());
+        f = new DefaultValueTransformerFactory(mock(KeySource.class), dbToBytes, objectToBytes);
     }
 
     @Test
@@ -169,4 +176,58 @@ public class DefaultValueTransformerFactoryIT {
         assertSame(t2, f.decryptor(t2_cb));
         assertSame(t2, f.decryptor(t2_cb));
     }
+
+    private static Map<String, BytesConverter<?>> getDefaultDbConverters() {
+        Map<String, BytesConverter<?>> dbToBytes = new HashMap<>();
+
+        dbToBytes.put(String.valueOf(Types.BINARY), BytesToBytesConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.BLOB), BytesToBytesConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.VARBINARY), BytesToBytesConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.LONGVARBINARY), BytesToBytesConverter.INSTANCE);
+
+        dbToBytes.put(String.valueOf(Types.CHAR), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.NCHAR), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.CLOB), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.NCLOB), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.LONGVARCHAR), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.LONGNVARCHAR), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.VARCHAR), Base64StringConverter.INSTANCE);
+        dbToBytes.put(String.valueOf(Types.NVARCHAR), Base64StringConverter.INSTANCE);
+
+        return dbToBytes;
+    }
+
+    private static Map<String, BytesConverter<?>> getDefaultObjectConverters() {
+        Map<String, BytesConverter<?>> objectToBytes = new HashMap<>();
+
+        objectToBytes.put("byte[]", BytesToBytesConverter.INSTANCE);
+        objectToBytes.put(String.class.getName(), Utf8StringConverter.INSTANCE);
+
+        objectToBytes.put(Double.class.getName(), DoubleConverter.INSTANCE);
+        objectToBytes.put(Double.TYPE.getName(), DoubleConverter.INSTANCE);
+
+        objectToBytes.put(Float.class.getName(), FloatConverter.INSTANCE);
+        objectToBytes.put(Float.TYPE.getName(), FloatConverter.INSTANCE);
+
+        objectToBytes.put(Long.class.getName(), LongConverter.INSTANCE);
+        objectToBytes.put(Long.TYPE.getName(), LongConverter.INSTANCE);
+
+        objectToBytes.put(Integer.class.getName(), IntegerConverter.INSTANCE);
+        objectToBytes.put(Integer.TYPE.getName(), IntegerConverter.INSTANCE);
+
+        objectToBytes.put(Short.class.getName(), ShortConverter.INSTANCE);
+        objectToBytes.put(Short.TYPE.getName(), ShortConverter.INSTANCE);
+
+        objectToBytes.put(Byte.class.getName(), ByteConverter.INSTANCE);
+        objectToBytes.put(Byte.TYPE.getName(), ByteConverter.INSTANCE);
+
+        objectToBytes.put(Boolean.class.getName(), BooleanConverter.INSTANCE);
+        objectToBytes.put(Boolean.TYPE.getName(), BooleanConverter.INSTANCE);
+
+        objectToBytes.put(Date.class.getName(), UtilDateConverter.INSTANCE);
+        objectToBytes.put(BigInteger.class.getName(), BigIntegerConverter.INSTANCE);
+        objectToBytes.put(BigDecimal.class.getName(), BigDecimalConverter.INSTANCE);
+
+        return objectToBytes;
+    }
 }


[4/4] cayenne git commit: CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory

Posted by aa...@apache.org.
CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory


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

Branch: refs/heads/master
Commit: a5b833d5fb8524bcb3cf194f58c1524905bc7a5e
Parents: c7276d6
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Thu Aug 25 11:29:29 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Thu Aug 25 11:29:29 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/a5b833d5/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 0555097..cd3d28a 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -27,6 +27,7 @@ CAY-2090 Untangle HttpRemoteService from ServiceContext thread local setup
 CAY-2100 Add supporting generated keys for PostgreSQL
 CAY-2102 EJBQL: db: path not supported in select columns
 CAY-2103 cayenne-crypto: support for mapping non-String and non-binary types
+CAY-2106: cayenne-crypto: allow DI contribution of type converters inside ValueTransformerFactory
 
 Bug Fixes:
 


[3/4] cayenne git commit: Merge branch '108'

Posted by aa...@apache.org.
Merge branch '108'


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

Branch: refs/heads/master
Commit: c7276d67d48877a7b86933d341d275de0f5074f6
Parents: a97fc4e 888a852
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Thu Aug 25 11:27:06 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Thu Aug 25 11:27:06 2016 +0300

----------------------------------------------------------------------
 .../cayenne/crypto/CryptoModuleBuilder.java     | 107 ++++++++++++++
 .../value/Base64StringConverter.java            |   2 +-
 .../transformer/value/BooleanConverter.java     |   2 +-
 .../value/BytesToBytesConverter.java            |   2 +-
 .../value/DefaultValueTransformerFactory.java   | 146 +++----------------
 .../value/DefaultValueTransformerFactoryIT.java |  77 +++++++++-
 6 files changed, 202 insertions(+), 134 deletions(-)
----------------------------------------------------------------------