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 <nordman...@gmail.com>
Authored: Mon Aug 22 15:19:02 2016 +0300
Committer: Andrei Tomashpolskiy <nordman...@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));
     }
-
 }

Reply via email to