Author: adamw
Date: 2008-08-25 03:25:19 -0400 (Mon, 25 Aug 2008)
New Revision: 128
Added:
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java
Modified:
trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java
trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
Log:
ENVERS-31: applying patch contributed by Nicolas DC
Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-25
07:10:44 UTC (rev 127)
+++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-25
07:25:19 UTC (rev 128)
@@ -47,7 +47,7 @@
PersistentClass pc = classes.next();
// Collecting information from annotations on the persistent class pc
PersistentClassVersioningData versioningData =
- annotationsMetadataReader.getVersioningData(pc, reflectionManager);
+ annotationsMetadataReader.getVersioningData(pc, reflectionManager,
globalCfg);
if (versioningData.isVersioned()) {
pcDatas.put(pc, versioningData);
Modified: trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java 2008-08-25
07:10:44 UTC (rev 127)
+++ trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java 2008-08-25
07:25:19 UTC (rev 128)
@@ -4,6 +4,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Nicolas Doroskevich
*/
public class GlobalConfiguration {
// Should a revision be generated when a not-owned relation field changes
@@ -11,6 +12,9 @@
// Should a warning, instead of an error and an exception, be logged, when an
unsupported type is versioned
private final boolean warnOnUnsupportedTypes;
+
+ // Should the optimistic locking property of an entity be considered unversioned
+ private final boolean unversionedOptimisticLockingField;
public GlobalConfiguration(Properties properties) {
String generateRevisionsForCollectionsStr =
properties.getProperty("org.jboss.envers.revisionOnCollectionChange",
@@ -20,6 +24,10 @@
String warnOnUnsupportedTypesStr =
properties.getProperty("org.jboss.envers.warnOnUnsupportedTypes",
"false");
warnOnUnsupportedTypes = Boolean.parseBoolean(warnOnUnsupportedTypesStr);
+
+ String ignoreOptimisticLockingPropertyStr =
properties.getProperty("org.jboss.envers.unversionedOptimisticLockingField",
+ "false");
+ unversionedOptimisticLockingField =
Boolean.parseBoolean(ignoreOptimisticLockingPropertyStr);
}
public boolean isGenerateRevisionsForCollections() {
@@ -29,4 +37,9 @@
public boolean isWarnOnUnsupportedTypes() {
return warnOnUnsupportedTypes;
}
+
+ public boolean isUnversionedOptimisticLockingField() {
+ return unversionedOptimisticLockingField;
+ }
+
}
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-25
07:10:44 UTC (rev 127)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-25
07:25:19 UTC (rev 128)
@@ -21,6 +21,9 @@
*/
package org.jboss.envers.configuration.metadata;
+import javax.persistence.Version;
+
+import org.jboss.envers.configuration.GlobalConfiguration;
import org.jboss.envers.tools.reflection.YClass;
import org.jboss.envers.tools.reflection.YProperty;
import org.jboss.envers.tools.reflection.YReflectionManager;
@@ -34,7 +37,8 @@
* @author Sebastian Komander
*/
public class AnnotationsMetadataReader {
- private void addFromProperties(Iterable<YProperty> properties,
PersistentClassVersioningData versioningData) {
+ private void addFromProperties(Iterable<YProperty> properties,
PersistentClassVersioningData versioningData,
+ GlobalConfiguration globalCfg) {
for (YProperty property : properties) {
Versioned ver = property.getAnnotation(Versioned.class);
if (ver != null) {
@@ -46,21 +50,32 @@
Unversioned unVer = property.getAnnotation(Unversioned.class);
if (unVer != null) {
versioningData.unversionedProperties.add(property.getName());
+ } else {
+ // if the optimistic locking field has to be unversioned and the current
property
+ // is the optimistic locking field, add it to the unversioned properties
list
+ if (globalCfg.isUnversionedOptimisticLockingField()) {
+ Version jpaVer = property.getAnnotation(Version.class);
+ if (jpaVer != null) {
+ versioningData.unversionedProperties.add(property.getName());
+ }
+ }
}
}
}
- private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData
versioningData) {
+ private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData
versioningData,
+ GlobalConfiguration globalCfg) {
YClass superclazz = clazz.getSuperclass();
if (!"java.lang.Object".equals(superclazz.getName())) {
- addPropertiesFromClass(superclazz, versioningData);
+ addPropertiesFromClass(superclazz, versioningData, globalCfg);
}
- addFromProperties(clazz.getDeclaredProperties("field"),
versioningData);
- addFromProperties(clazz.getDeclaredProperties("property"),
versioningData);
+ addFromProperties(clazz.getDeclaredProperties("field"), versioningData,
globalCfg);
+ addFromProperties(clazz.getDeclaredProperties("property"),
versioningData, globalCfg);
}
- public PersistentClassVersioningData getVersioningData(PersistentClass pc,
YReflectionManager reflectionManager) {
+ public PersistentClassVersioningData getVersioningData(PersistentClass pc,
YReflectionManager reflectionManager,
+ GlobalConfiguration globalCfg) {
PersistentClassVersioningData versioningData = new
PersistentClassVersioningData();
if (pc.getClassName() == null) {
@@ -75,7 +90,7 @@
versioningData.propertyStoreInfo.defaultStore =
defaultVersioned.modStore();
}
- addPropertiesFromClass(clazz, versioningData);
+ addPropertiesFromClass(clazz, versioningData, globalCfg);
VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class);
if (versionsTable != null) {
Added:
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java
===================================================================
---
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java 2008-08-25
07:25:19 UTC (rev 128)
@@ -0,0 +1,70 @@
+package org.jboss.envers.test.integration.properties;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.jboss.envers.test.integration.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Nicolas Doroskevich
+ */
+public class UnversionedOptimisticLockingField extends AbstractEntityTest {
+ private Integer id1;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(UnversionedOptimisticLockingFieldEntity.class);
+
+ cfg.setProperty("org.jboss.envers.unversionedOptimisticLockingField",
"true");
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+ UnversionedOptimisticLockingFieldEntity olfe = new
UnversionedOptimisticLockingFieldEntity("x");
+ em.persist(olfe);
+ id1 = olfe.getId();
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ olfe = em.find(UnversionedOptimisticLockingFieldEntity.class, id1);
+ olfe.setStr("y");
+ em.getTransaction().commit();
+ }
+
+ @Test
+ public void testRevisionCounts() {
+ assert Arrays.asList(1, 2).equals(
+ getVersionsReader().getRevisions(UnversionedOptimisticLockingFieldEntity.class,
+ id1));
+ }
+
+ @Test
+ public void testHistoryOfId1() {
+ UnversionedOptimisticLockingFieldEntity ver1 = new
UnversionedOptimisticLockingFieldEntity(id1, "x");
+ UnversionedOptimisticLockingFieldEntity ver2 = new
UnversionedOptimisticLockingFieldEntity(id1, "y");
+
+ assert getVersionsReader().find(UnversionedOptimisticLockingFieldEntity.class, id1, 1)
+ .equals(ver1);
+ assert getVersionsReader().find(UnversionedOptimisticLockingFieldEntity.class, id1, 2)
+ .equals(ver2);
+ }
+
+ @Test
+ public void testMapping() {
+ PersistentClass pc =
getCfg().getClassMapping(UnversionedOptimisticLockingFieldEntity.class.getName() +
"_versions");
+ Iterator pi = pc.getPropertyIterator();
+ while(pi.hasNext()) {
+ Property p = (Property) pi.next();
+ assert !"optLocking".equals(p.getName());
+ }
+ }
+}
Added:
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java
===================================================================
---
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java 2008-08-25
07:25:19 UTC (rev 128)
@@ -0,0 +1,81 @@
+package org.jboss.envers.test.integration.properties;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+import org.jboss.envers.Versioned;
+
+/**
+ * @author Nicolas Doroskevich
+ */
+@Versioned
+@Entity
+public class UnversionedOptimisticLockingFieldEntity {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ private String str;
+
+ @Version
+ private int optLocking;
+
+ public UnversionedOptimisticLockingFieldEntity() {
+ }
+
+ public UnversionedOptimisticLockingFieldEntity(String str) {
+ this.str = str;
+ }
+
+ public UnversionedOptimisticLockingFieldEntity(Integer id, String str) {
+ this.id = id;
+ this.str = str;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public int getOptLocking() {
+ return optLocking;
+ }
+
+ public void setOptLocking(int optLocking) {
+ this.optLocking = optLocking;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof UnversionedOptimisticLockingFieldEntity)) return false;
+
+ UnversionedOptimisticLockingFieldEntity that =
(UnversionedOptimisticLockingFieldEntity) o;
+
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+ if (str != null ? !str.equals(that.str) : that.str != null) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (id != null ? id.hashCode() : 0);
+ result = 31 * result + (str != null ? str.hashCode() : 0);
+ return result;
+ }
+
+}