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)); } - }