Repository: cayenne Updated Branches: refs/heads/master 2e0acfef6 -> 1c73a0463
CAY-2296 Crypto: Get java type for DbAttribute bound to ObjAttributes with the same type Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/1c73a046 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/1c73a046 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/1c73a046 Branch: refs/heads/master Commit: 1c73a0463401b5c1d10bec4425ae02a9e90c3cce Parents: 2e0acfe Author: Nikita Timofeev <stari...@gmail.com> Authored: Thu May 4 16:43:16 2017 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Thu May 4 16:43:16 2017 +0300 ---------------------------------------------------------------------- cayenne-crypto/pom.xml | 9 ++-- .../value/DefaultValueTransformerFactory.java | 32 ++++++++------ .../org/apache/cayenne/crypto/db/Table5.java | 9 ++++ .../org/apache/cayenne/crypto/db/Table6.java | 9 ++++ .../apache/cayenne/crypto/db/auto/_Table5.java | 46 ++++++++++++++++++++ .../apache/cayenne/crypto/db/auto/_Table6.java | 37 ++++++++++++++++ .../value/DefaultValueTransformerFactoryIT.java | 21 +++++++++ .../src/test/resources/datamap.map.xml | 16 +++++++ docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 + 9 files changed, 161 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/pom.xml ---------------------------------------------------------------------- diff --git a/cayenne-crypto/pom.xml b/cayenne-crypto/pom.xml index daa2e1f..4b9eb12 100644 --- a/cayenne-crypto/pom.xml +++ b/cayenne-crypto/pom.xml @@ -27,6 +27,10 @@ <artifactId>cayenne-server</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> <!-- Test dependencies --> <dependency> @@ -59,11 +63,6 @@ </dependency> <dependency> <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <scope>test</scope> </dependency> http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/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 cca9619..4086368 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 @@ -26,6 +26,8 @@ import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.security.Key; import java.util.Collection; @@ -43,6 +45,8 @@ import java.util.concurrent.ConcurrentMap; */ public class DefaultValueTransformerFactory implements ValueTransformerFactory { + private static final Logger logger = LoggerFactory.getLogger(DefaultValueTransformerFactory.class); + public static final String DB_TO_BYTE_CONVERTERS_KEY = "org.apache.cayenne.crypto.transformer.value.DefaultValueTransformerFactory.dbToBytes"; @@ -148,24 +152,24 @@ public class DefaultValueTransformerFactory implements ValueTransformerFactory { DbEntity dbEntity = a.getEntity(); DataMap dataMap = dbEntity.getDataMap(); - Collection<ObjEntity> objEntities = dataMap.getMappedEntities(dbEntity); - - if (objEntities.size() != 1) { - return TypesMapping.getJavaBySqlType(a.getType()); - } - - Collection<String> javaTypes = new HashSet<String>(); - ObjEntity objEntity = objEntities.iterator().next(); - for (ObjAttribute oa : objEntity.getAttributes()) { - - // TODO: this won't pick up flattened attributes - if (a.getName().equals(oa.getDbAttributePath())) { - javaTypes.add(oa.getType()); + Collection<String> javaTypes = new HashSet<>(); + + for(ObjEntity objEntity : dataMap.getMappedEntities(dbEntity)) { + for (ObjAttribute oa : objEntity.getAttributes()) { + // TODO: this won't pick up flattened attributes + if (a.getName().equals(oa.getDbAttributePath())) { + javaTypes.add(oa.getType()); + } } } if (javaTypes.size() != 1) { - return TypesMapping.getJavaBySqlType(a.getType()); + String javaType = TypesMapping.getJavaBySqlType(a.getType()); + String attributeName = dbEntity.getName() + "." + a.getName(); + String msg = javaTypes.size() > 1 ? "ObjAttributes with different java types" : "No ObjAttributes"; + // Warn user about this problem as there is nothing else we can do + logger.warn(msg + " bound to DbAttribute '" + attributeName + "', " + javaType + " type will be used."); + return javaType; } return javaTypes.iterator().next(); http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table5.java ---------------------------------------------------------------------- diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table5.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table5.java new file mode 100644 index 0000000..8fd74ec --- /dev/null +++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table5.java @@ -0,0 +1,9 @@ +package org.apache.cayenne.crypto.db; + +import org.apache.cayenne.crypto.db.auto._Table5; + +public class Table5 extends _Table5 { + + private static final long serialVersionUID = 1L; + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table6.java ---------------------------------------------------------------------- diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table6.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table6.java new file mode 100644 index 0000000..5b37a7b --- /dev/null +++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table6.java @@ -0,0 +1,9 @@ +package org.apache.cayenne.crypto.db; + +import org.apache.cayenne.crypto.db.auto._Table6; + +public class Table6 extends _Table6 { + + private static final long serialVersionUID = 1L; + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java ---------------------------------------------------------------------- diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java new file mode 100644 index 0000000..3f4127f --- /dev/null +++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table5.java @@ -0,0 +1,46 @@ +package org.apache.cayenne.crypto.db.auto; + +import org.apache.cayenne.CayenneDataObject; +import org.apache.cayenne.exp.Property; + +/** + * Class _Table5 was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Table5 extends CayenneDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "ID"; + + public static final Property<Integer> CRYPTO_INT1 = Property.create("cryptoInt1", Integer.class); + public static final Property<Integer> CRYPTO_INT3 = Property.create("cryptoInt3", Integer.class); + public static final Property<Integer> CRYPTO_INT4 = Property.create("cryptoInt4", Integer.class); + + public void setCryptoInt1(int cryptoInt1) { + writeProperty("cryptoInt1", cryptoInt1); + } + public int getCryptoInt1() { + Object value = readProperty("cryptoInt1"); + return (value != null) ? (Integer) value : 0; + } + + public void setCryptoInt3(int cryptoInt3) { + writeProperty("cryptoInt3", cryptoInt3); + } + public int getCryptoInt3() { + Object value = readProperty("cryptoInt3"); + return (value != null) ? (Integer) value : 0; + } + + public void setCryptoInt4(int cryptoInt4) { + writeProperty("cryptoInt4", cryptoInt4); + } + public int getCryptoInt4() { + Object value = readProperty("cryptoInt4"); + return (value != null) ? (Integer) value : 0; + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java ---------------------------------------------------------------------- diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java new file mode 100644 index 0000000..cd5df66 --- /dev/null +++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table6.java @@ -0,0 +1,37 @@ +package org.apache.cayenne.crypto.db.auto; + +import org.apache.cayenne.CayenneDataObject; +import org.apache.cayenne.exp.Property; + +/** + * Class _Table6 was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Table6 extends CayenneDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "ID"; + + public static final Property<Long> CRYPTO_INT1 = Property.create("cryptoInt1", Long.class); + public static final Property<Integer> CRYPTO_INT4 = Property.create("cryptoInt4", Integer.class); + + public void setCryptoInt1(long cryptoInt1) { + writeProperty("cryptoInt1", cryptoInt1); + } + public long getCryptoInt1() { + Object value = readProperty("cryptoInt1"); + return (value != null) ? (Long) value : 0; + } + + public void setCryptoInt4(int cryptoInt4) { + writeProperty("cryptoInt4", cryptoInt4); + } + public int getCryptoInt4() { + Object value = readProperty("cryptoInt4"); + return (value != null) ? (Integer) value : 0; + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/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 9f42758..57db403 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 @@ -45,6 +45,7 @@ public class DefaultValueTransformerFactoryIT { private static DbEntity t1; private static DbEntity t2; private static DbEntity t3; + private static DbEntity t5; private static Map<String, BytesConverter<?>> dbToBytes, objectToBytes; @@ -56,6 +57,7 @@ public class DefaultValueTransformerFactoryIT { t1 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE1"); t2 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE2"); t3 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE3"); + t5 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE5"); dbToBytes = getDefaultDbConverters(); objectToBytes = getDefaultObjectConverters(); @@ -94,6 +96,25 @@ public class DefaultValueTransformerFactoryIT { } @Test + public void testGetAmbiguousJavaType() { + // this one have two bound ObjAttributes, warn should be in log + DbAttribute a1 = t5.getAttribute("CRYPTO_INT1"); + assertEquals("java.lang.String", f.getJavaType(a1)); + + // this one doesn't have any bindings, warn should be in log + DbAttribute a2 = t5.getAttribute("CRYPTO_INT2"); + assertEquals("byte[]", f.getJavaType(a2)); + + // this one have one binding + DbAttribute a3 = t5.getAttribute("CRYPTO_INT3"); + assertEquals("int", f.getJavaType(a3)); + + // this one have two bindings but with the same int type + DbAttribute a4 = t5.getAttribute("CRYPTO_INT4"); + assertEquals("int", f.getJavaType(a4)); + } + + @Test public void testCreateEncryptor() { DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING"); http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/cayenne-crypto/src/test/resources/datamap.map.xml ---------------------------------------------------------------------- diff --git a/cayenne-crypto/src/test/resources/datamap.map.xml b/cayenne-crypto/src/test/resources/datamap.map.xml index 51c0840..df8c422 100644 --- a/cayenne-crypto/src/test/resources/datamap.map.xml +++ b/cayenne-crypto/src/test/resources/datamap.map.xml @@ -25,6 +25,13 @@ <db-attribute name="PLAIN_INT" type="INTEGER"/> <db-attribute name="PLAIN_STRING" type="VARCHAR" length="200"/> </db-entity> + <db-entity name="TABLE5"> + <db-attribute name="CRYPTO_INT1" type="CLOB"/> + <db-attribute name="CRYPTO_INT2" type="BLOB"/> + <db-attribute name="CRYPTO_INT3" type="VARBINARY" length="255"/> + <db-attribute name="CRYPTO_INT4" type="BLOB"/> + <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/> + </db-entity> <obj-entity name="Table1" className="org.apache.cayenne.crypto.db.Table1" dbEntityName="TABLE1"> <obj-attribute name="cryptoInt" type="int" db-attribute-path="CRYPTO_INT"/> <obj-attribute name="cryptoString" type="java.lang.String" db-attribute-path="CRYPTO_STRING"/> @@ -42,4 +49,13 @@ <obj-attribute name="plainInt" type="int" db-attribute-path="PLAIN_INT"/> <obj-attribute name="plainString" type="java.lang.String" db-attribute-path="PLAIN_STRING"/> </obj-entity> + <obj-entity name="Table5" className="org.apache.cayenne.crypto.db.Table5" dbEntityName="TABLE5"> + <obj-attribute name="cryptoInt1" type="int" db-attribute-path="CRYPTO_INT1"/> + <obj-attribute name="cryptoInt3" type="int" db-attribute-path="CRYPTO_INT3"/> + <obj-attribute name="cryptoInt4" type="int" db-attribute-path="CRYPTO_INT4"/> + </obj-entity> + <obj-entity name="Table6" className="org.apache.cayenne.crypto.db.Table6" dbEntityName="TABLE5"> + <obj-attribute name="cryptoInt1" type="long" db-attribute-path="CRYPTO_INT1"/> + <obj-attribute name="cryptoInt4" type="int" db-attribute-path="CRYPTO_INT4"/> + </obj-entity> </data-map> http://git-wip-us.apache.org/repos/asf/cayenne/blob/1c73a046/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 40c9097..b9967ca 100644 --- a/docs/doc/src/main/resources/RELEASE-NOTES.txt +++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt @@ -35,6 +35,7 @@ CAY-2274 Modeler: Validate case when dependent PK is marked as âgeneratedâ CAY-2277 Create ClientRuntime with ClientRuntimeBuilder just like ServerRuntime CAY-2278 Extract cayenne-postcommit module from cayenne-lifecycle CAY-2280 Switch from commons-logging to slf4j +CAY-2296 cayenne-crypto: Get java type for DbAttribute bound to ObjAttributes with the same type Bug Fixes: