Repository: deltaspike Updated Branches: refs/heads/master 08dd95a31 -> 67d5ef8bb
DELTASPIKE-987 support for @Version Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/67d5ef8b Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/67d5ef8b Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/67d5ef8b Branch: refs/heads/master Commit: 67d5ef8bbf68c29e1c9dd3e99f15b89e458ed59d Parents: 08dd95a Author: gpetracek <[email protected]> Authored: Thu Sep 17 00:06:04 2015 +0200 Committer: gpetracek <[email protected]> Committed: Thu Sep 17 00:06:04 2015 +0200 ---------------------------------------------------------------------- .../impl/handler/CdiQueryInvocationContext.java | 8 ++++++ .../data/impl/meta/unit/EntityDescriptor.java | 5 ++-- .../impl/meta/unit/EntityDescriptorReader.java | 20 +++++++++------ .../meta/unit/MappedSuperclassDescriptor.java | 5 ++-- .../data/impl/meta/unit/PersistenceUnits.java | 10 ++++++++ .../meta/unit/PersistentClassDescriptor.java | 10 +++++++- .../deltaspike/data/impl/util/EntityUtils.java | 27 ++++++++++++++++++++ .../unit/DescriptorHierarchyBuilderTest.java | 12 ++++----- 8 files changed, 78 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java index 0ca1cf2..2a19a40 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java @@ -22,6 +22,7 @@ import org.apache.deltaspike.data.api.SingleResultType; import org.apache.deltaspike.data.api.mapping.QueryInOutMapper; import org.apache.deltaspike.data.impl.meta.RepositoryMethod; import org.apache.deltaspike.data.impl.param.Parameters; +import org.apache.deltaspike.data.impl.property.Property; import org.apache.deltaspike.data.impl.util.EntityUtils; import org.apache.deltaspike.data.impl.util.bean.Destroyable; import org.apache.deltaspike.data.spi.QueryInvocationContext; @@ -30,6 +31,7 @@ import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.Query; import javax.persistence.QueryHint; +import java.io.Serializable; import java.lang.reflect.Method; import java.util.LinkedList; import java.util.List; @@ -92,6 +94,12 @@ public class CdiQueryInvocationContext implements QueryInvocationContext { try { + Property<Serializable> versionProperty = EntityUtils.getVersionProperty(entity); + if (versionProperty != null) + { + return versionProperty.getValue(entity) == null; + } + if (EntityUtils.primaryKeyValue(entity) == null) { return true; http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java index 662e687..9d8a78c 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptor.java @@ -27,9 +27,10 @@ class EntityDescriptor extends PersistentClassDescriptor protected final String tableName; - EntityDescriptor(String name, String packageName, String className, String idClass, String id, String tableName) + EntityDescriptor(String name, String packageName, String className, String idClass, String id, + String version, String tableName) { - super(name, packageName, className, idClass, id); + super(name, packageName, className, idClass, id, version); this.tableName = tableName; } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java index 170f7ea..6b60a20 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/EntityDescriptorReader.java @@ -56,9 +56,9 @@ public class EntityDescriptorReader extends DescriptorReader { @Override protected EntityDescriptor instance(String name, String packageName, String className, - String idClass, String id, String tableName) + String idClass, String id, String version, String tableName) { - return new EntityDescriptor(name, packageName, className, idClass, id, tableName); + return new EntityDescriptor(name, packageName, className, idClass, id, version, tableName); } @Override @@ -72,9 +72,9 @@ public class EntityDescriptorReader extends DescriptorReader { @Override protected MappedSuperclassDescriptor instance(String name, String packageName, String className, - String idClass, String id) + String idClass, String id, String version) { - return new MappedSuperclassDescriptor(name, packageName, className, idClass, id); + return new MappedSuperclassDescriptor(name, packageName, className, idClass, id, version); } @Override @@ -148,6 +148,7 @@ public class EntityDescriptorReader extends DescriptorReader protected String className; protected String idClass; protected String id; + protected String version; protected String embeddedId; public List<T> build(Document doc) @@ -161,6 +162,7 @@ public class EntityDescriptorReader extends DescriptorReader this.className = extractAttribute(mappings.item(i), "class"); this.idClass = extractNodeAttribute((Element) mappings.item(i), "id-class", "class"); this.id = extractNodeAttribute((Element) mappings.item(i), "id", "name"); + this.version = extractNodeAttribute((Element) mappings.item(i), "version", "name"); this.embeddedId = extractNodeAttribute((Element) mappings.item(i), "embedded-id", "name"); addFields((Element) mappings.item(i)); addInResult(); @@ -177,14 +179,15 @@ public class EntityDescriptorReader extends DescriptorReader private abstract class MappedSuperClassBuilder<T extends PersistentClassDescriptor> extends PersistenceBuilder { - protected abstract T instance(String name, String packageName, String className, String idClass, String id); + protected abstract T instance(String name, String packageName, String className, String idClass, String id, + String version); protected abstract String tagName(); @Override protected void addInResult() { - result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId)); + result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId, version)); } @Override @@ -200,14 +203,15 @@ public class EntityDescriptorReader extends DescriptorReader protected String tableName; protected abstract T instance(String name, String packageName, String className, String idClass, String id, - String tableName); + String version, String tableName); protected abstract String tagName(); @Override protected void addInResult() { - result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId, tableName)); + result.add(instance(name, packageName, className, idClass, id != null ? id : embeddedId, + version, tableName)); } @Override http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java index 6a6fcfa..6c5ffe9 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/MappedSuperclassDescriptor.java @@ -25,9 +25,10 @@ import java.io.Serializable; class MappedSuperclassDescriptor extends PersistentClassDescriptor { - MappedSuperclassDescriptor(String name, String packageName, String className, String idClass, String id) + MappedSuperclassDescriptor(String name, String packageName, String className, String idClass, String id, + String version) { - super(name, packageName, className, idClass, id); + super(name, packageName, className, idClass, id, version); } @Override http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java index 384dfb3..a3a2d75 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnits.java @@ -60,6 +60,16 @@ public final class PersistenceUnits return null; } + public String versionField(Class<?> entityClass) + { + EntityDescriptor entity = find(entityClass); + if (entity != null) + { + return entity.getVersion(); + } + return null; + } + public Class<?> primaryKeyIdClass(Class<?> entityClass) { EntityDescriptor entity = find(entityClass); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java index a0ba3fa..6c45b4f 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/unit/PersistentClassDescriptor.java @@ -31,15 +31,18 @@ abstract class PersistentClassDescriptor protected final Class<?> entityClass; protected final Class<? extends Serializable> idClass; protected final String id; + protected final String version; private PersistentClassDescriptor parent; - PersistentClassDescriptor(String name, String packageName, String className, String idClass, String id) + PersistentClassDescriptor(String name, String packageName, String className, String idClass, String id, + String version) { Class<?> clazz = entityClass(className, packageName); this.name = name; this.entityClass = clazz; this.idClass = idClass(clazz, idClass, packageName, id); this.id = id; + this.version = version; } public Class<? extends Serializable> getIdClass() @@ -52,6 +55,11 @@ abstract class PersistentClassDescriptor return id; } + public String getVersion() + { + return version; + } + public String getName() { return name; http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java index 0075ea5..b3e1ac5 100755 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java @@ -26,6 +26,7 @@ import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; +import javax.persistence.Version; import org.apache.deltaspike.data.impl.meta.unit.PersistenceUnits; import org.apache.deltaspike.data.impl.meta.verifier.EntityVerifier; @@ -111,4 +112,30 @@ public final class EntityUtils } return criteria; } + + public static Property<Serializable> getVersionProperty(Object entity) + { + Class<?> entityClass = entity.getClass(); + List<PropertyCriteria> criteriaList = new LinkedList<PropertyCriteria>(); + criteriaList.add(new AnnotatedPropertyCriteria(Version.class)); + + String fromMappingFiles = PersistenceUnits.instance().versionField(entityClass); + if (fromMappingFiles != null) + { + criteriaList.add(new NamedPropertyCriteria(fromMappingFiles)); + } + + for (PropertyCriteria criteria : criteriaList) + { + PropertyQuery<Serializable> query = + PropertyQueries.<Serializable> createQuery(entityClass).addCriteria(criteria); + Property<Serializable> result = query.getFirstResult(); + if (result != null) + { + return result; + } + } + + return null; + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/67d5ef8b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java index df0ed15..4cf9a43 100644 --- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java +++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java @@ -39,13 +39,13 @@ public class DescriptorHierarchyBuilderTest @Before public void before() { - entities.add(new EntityDescriptor("test", null, EntityLevel3.class.getName(), null, null, null)); - entities.add(new EntityDescriptor("test", null, EntityLevel5.class.getName(), null, null, null)); + entities.add(new EntityDescriptor("test", null, EntityLevel3.class.getName(), null, null, null, null)); + entities.add(new EntityDescriptor("test", null, EntityLevel5.class.getName(), null, null, null, null)); - superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel1.class.getName(), null, "id")); - superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel4.class.getName(), null, null)); - superClasses.add(new MappedSuperclassDescriptor("test", null, MappedUnrelated.class.getName(), null, null)); - superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel2.class.getName(), null, null)); + superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel1.class.getName(), null, "id", null)); + superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel4.class.getName(), null, null, null)); + superClasses.add(new MappedSuperclassDescriptor("test", null, MappedUnrelated.class.getName(), null, null, null)); + superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel2.class.getName(), null, null, null)); } @Test
