[hibernate-commits] Hibernate SVN: r15802 - in core/trunk/envers/src: main/java/org/hibernate/envers/configuration/metadata and 10 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Tue Jan 20 03:13:55 EST 2009
Author: adamw
Date: 2009-01-20 03:13:54 -0500 (Tue, 20 Jan 2009)
New Revision: 15802
Added:
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AnnotationsMetadataReader.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesHolder.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ClassAuditingData.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ComponentAuditingData.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PersistentPropertiesSource.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java
core/trunk/envers/src/main/java/org/hibernate/envers/tools/MappingTools.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponent.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponentTestEntity.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponent.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponentTestEntity.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/ManyToOneInComponent.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/OneToManyInComponent.java
Removed:
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentComponentPropertyAuditingData.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java
Modified:
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ComponentMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component1.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component2.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/basic/Simple.java
core/trunk/envers/src/test/resources/testng.xml
Log:
HHH-3563: relation support in components
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -37,9 +37,9 @@
import org.dom4j.io.DOMWriter;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
-import org.hibernate.envers.configuration.metadata.AnnotationsMetadataReader;
+import org.hibernate.envers.configuration.metadata.reader.AnnotationsMetadataReader;
import org.hibernate.envers.configuration.metadata.EntityXmlMappingData;
-import org.hibernate.envers.configuration.metadata.PersistentClassAuditingData;
+import org.hibernate.envers.configuration.metadata.reader.ClassAuditingData;
import org.hibernate.envers.configuration.metadata.AuditMetadataGenerator;
import org.hibernate.envers.entities.EntitiesConfigurations;
import org.hibernate.envers.tools.StringTools;
@@ -64,8 +64,8 @@
// Sorting the persistent class topologically - superclass always before subclass
Iterator<PersistentClass> classes = GraphTopologicalSort.sort(new PersistentClassGraphDefiner(cfg)).iterator();
- Map<PersistentClass, PersistentClassAuditingData> pcDatas =
- new HashMap<PersistentClass, PersistentClassAuditingData>();
+ Map<PersistentClass, ClassAuditingData> pcDatas =
+ new HashMap<PersistentClass, ClassAuditingData>();
Map<PersistentClass, EntityXmlMappingData> xmlMappings = new HashMap<PersistentClass, EntityXmlMappingData>();
// First pass
@@ -74,7 +74,7 @@
// Collecting information from annotations on the persistent class pc
AnnotationsMetadataReader annotationsMetadataReader =
new AnnotationsMetadataReader(globalCfg, reflectionManager, pc);
- PersistentClassAuditingData auditData = annotationsMetadataReader.getAuditData();
+ ClassAuditingData auditData = annotationsMetadataReader.getAuditData();
if (auditData.isAudited()) {
pcDatas.put(pc, auditData);
@@ -90,7 +90,7 @@
}
// Second pass
- for (Map.Entry<PersistentClass, PersistentClassAuditingData> pcDatasEntry : pcDatas.entrySet()) {
+ for (Map.Entry<PersistentClass, ClassAuditingData> pcDatasEntry : pcDatas.entrySet()) {
EntityXmlMappingData xmlMappingData = xmlMappings.get(pcDatasEntry.getKey());
auditMetaGen.generateSecondPass(pcDatasEntry.getKey(), pcDatasEntry.getValue(), xmlMappingData);
Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -1,286 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.envers.configuration.metadata;
-
-import java.lang.annotation.Annotation;
-import java.util.Set;
-import java.util.Iterator;
-import javax.persistence.MapKey;
-import javax.persistence.Version;
-import javax.persistence.JoinColumn;
-
-import org.hibernate.envers.SecondaryAuditTable;
-import org.hibernate.envers.*;
-import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.tools.Tools;
-import org.hibernate.envers.configuration.GlobalConfiguration;
-
-import org.hibernate.MappingException;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.jboss.envers.*;
-
-/**
- * A helper class to read versioning meta-data from annotations on a persistent class.
- * @author Adam Warski (adam at warski dot org)
- * @author Sebastian Komander
- */
-public final class AnnotationsMetadataReader {
- private final GlobalConfiguration globalCfg;
- private final ReflectionManager reflectionManager;
- private final PersistentClass pc;
-
- /**
- * This object is filled with information read from annotations and returned by the <code>getVersioningData</code>
- * method.
- */
- private final PersistentClassAuditingData auditData;
-
- /**
- * Not null if the whole class is annotated with @Audited; the variable then holds the value of this
- * annotation's "modStore" parameter.
- */
- private ModificationStore defaultStore;
-
- private Set<String> propertyPersistentProperties;
- private Set<String> fieldPersistentProperties;
-
- public AnnotationsMetadataReader(GlobalConfiguration globalCfg, ReflectionManager reflectionManager,
- PersistentClass pc) {
- this.globalCfg = globalCfg;
- this.reflectionManager = reflectionManager;
- this.pc = pc;
-
- auditData = new PersistentClassAuditingData();
-
- propertyPersistentProperties = Tools.newHashSet();
- fieldPersistentProperties = Tools.newHashSet();
- }
-
- private ModificationStore translateModStore(org.jboss.envers.ModificationStore store) {
- switch (store) {
- case FULL: return ModificationStore.FULL;
- default: throw new AssertionError("Illegal modification store: " + store + "!");
- }
- }
-
- /**
- * Checks if a property is audited and if yes, sets its modification store on the supplied property data.
- * @param property Property to check.
- * @param propertyData Property data, on which to set this property's modification store.
- * @param persistentProperties Persistent properties with the access type of the given property.
- * @return True, iff this property is audited.
- */
- private boolean ifPropertyAuditedAddStore(XProperty property, PersistentPropertyAuditingData propertyData,
- Set<String> persistentProperties) {
- // If this is not a persistent property, with the same access type as currently checked,
- // it's not audited as well.
- if (!persistentProperties.contains(property.getName())) {
- return false;
- }
-
- // check if a property is declared as not audited to exclude it
- // useful if a class is audited but some properties should be excluded
- NotAudited unVer = property.getAnnotation(NotAudited.class);
- if (unVer != null) {
- return false;
- } else {
- // if the optimistic locking field has to be unversioned and the current property
- // is the optimistic locking field, don't audit it
- if (globalCfg.isDoNotAuditOptimisticLockingField()) {
- Version jpaVer = property.getAnnotation(Version.class);
- if (jpaVer != null) {
- return false;
- }
- }
- }
-
- // Checking if this property is explicitly audited or if all properties are.
- Audited aud = property.getAnnotation(Audited.class);
- Versioned ver = property.getAnnotation(Versioned.class);
- if (aud != null) {
- propertyData.setStore(aud.modStore());
- return true;
- } else if (ver != null) {
- propertyData.setStore(translateModStore(ver.modStore()));
- return true;
- } else {
- if (defaultStore != null) {
- propertyData.setStore(defaultStore);
- return true;
- } else {
- return false;
- }
- }
- }
-
- private void addPropertyMapKey(XProperty property, PersistentPropertyAuditingData propertyData) {
- MapKey mapKey = property.getAnnotation(MapKey.class);
- if (mapKey != null) {
- propertyData.setMapKey(mapKey.name());
- }
- }
-
- private void addPropertyJoinTables(XProperty property, PersistentPropertyAuditingData propertyData) {
- AuditJoinTable joinTable = property.getAnnotation(AuditJoinTable.class);
- if (joinTable != null) {
- propertyData.setJoinTable(joinTable);
- } else {
- propertyData.setJoinTable(getDefaultAuditJoinTable());
- }
- }
-
- private void addFromProperties(Iterable<XProperty> properties, String accessType, Set<String> persistenProperties) {
- for (XProperty property : properties) {
- PersistentPropertyAuditingData propertyData = new PersistentPropertyAuditingData();
-
- if (ifPropertyAuditedAddStore(property, propertyData, persistenProperties)) {
- // Now we know that the property is audited
- auditData.getProperties().put(property.getName(), propertyData);
-
- propertyData.setName(property.getName());
- propertyData.setAccessType(accessType);
-
- addPropertyJoinTables(property, propertyData);
- addPropertyMapKey(property, propertyData);
- }
- }
- }
-
- private void addPropertiesFromClass(XClass clazz) {
- XClass superclazz = clazz.getSuperclass();
- if (!"java.lang.Object".equals(superclazz.getName())) {
- addPropertiesFromClass(superclazz);
- }
-
- addFromProperties(clazz.getDeclaredProperties("field"), "field", fieldPersistentProperties);
- addFromProperties(clazz.getDeclaredProperties("property"), "property", propertyPersistentProperties);
- }
-
- private void readDefaultAudited(XClass clazz) {
- Audited defaultAudited = clazz.getAnnotation(Audited.class);
-
- if (defaultAudited != null) {
- defaultStore = defaultAudited.modStore();
- auditData.setDefaultAudited(true);
- } else {
- Versioned defaultVersioned = clazz.getAnnotation(Versioned.class);
- if (defaultVersioned != null) {
- defaultStore = translateModStore(defaultVersioned.modStore());
- auditData.setDefaultAudited(true);
- }
- }
- }
-
- private void readPersistentProperties() {
- Iterator propertyIter = pc.getPropertyIterator();
- while (propertyIter.hasNext()) {
- Property property = (Property) propertyIter.next();
- if ("field".equals(property.getPropertyAccessorName())) {
- fieldPersistentProperties.add(property.getName());
- } else {
- propertyPersistentProperties.add(property.getName());
- }
- }
- }
-
- private void addAuditTable(XClass clazz) {
- AuditTable auditTable = clazz.getAnnotation(AuditTable.class);
- if (auditTable != null) {
- auditData.setAuditTable(auditTable);
- } else {
- auditData.setAuditTable(getDefaultAuditTable());
- }
- }
-
- private void addAuditSecondaryTables(XClass clazz) {
- // Getting information on secondary tables
- SecondaryAuditTable secondaryVersionsTable1 = clazz.getAnnotation(SecondaryAuditTable.class);
- if (secondaryVersionsTable1 != null) {
- auditData.getSecondaryTableDictionary().put(secondaryVersionsTable1.secondaryTableName(),
- secondaryVersionsTable1.secondaryAuditTableName());
- }
-
- SecondaryAuditTables secondaryAuditTables = clazz.getAnnotation(SecondaryAuditTables.class);
- if (secondaryAuditTables != null) {
- for (SecondaryAuditTable secondaryAuditTable2 : secondaryAuditTables.value()) {
- auditData.getSecondaryTableDictionary().put(secondaryAuditTable2.secondaryTableName(),
- secondaryAuditTable2.secondaryAuditTableName());
- }
- }
- }
-
- public PersistentClassAuditingData getAuditData() {
- if (pc.getClassName() == null) {
- return auditData;
- }
-
- readPersistentProperties();
-
- try {
- XClass clazz = reflectionManager.classForName(pc.getClassName(), this.getClass());
-
- readDefaultAudited(clazz);
- addPropertiesFromClass(clazz);
- addAuditTable(clazz);
- addAuditSecondaryTables(clazz);
- } catch (ClassNotFoundException e) {
- throw new MappingException(e);
- }
-
- return auditData;
- }
-
- private AuditTable defaultAuditTable;
- private AuditTable getDefaultAuditTable() {
- if (defaultAuditTable == null) {
- defaultAuditTable = new AuditTable() {
- public String value() { return ""; }
- public String schema() { return ""; }
- public String catalog() { return ""; }
- public Class<? extends Annotation> annotationType() { return this.getClass(); }
- };
- }
-
- return defaultAuditTable;
- }
-
- private AuditJoinTable defaultAuditJoinTable;
- private AuditJoinTable getDefaultAuditJoinTable() {
- if (defaultAuditJoinTable == null) {
- defaultAuditJoinTable = new AuditJoinTable() {
- public String name() { return ""; }
- public String schema() { return ""; }
- public String catalog() { return ""; }
- public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
- public Class<? extends Annotation> annotationType() { return this.getClass(); }
- };
- }
-
- return defaultAuditJoinTable;
- }
-}
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -30,6 +30,8 @@
import org.dom4j.Element;
import org.hibernate.envers.configuration.GlobalConfiguration;
import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
+import org.hibernate.envers.configuration.metadata.reader.ClassAuditingData;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.IdMappingData;
import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
@@ -100,14 +102,14 @@
}
@SuppressWarnings({"unchecked"})
- void addValue(Element parent, Value value, CompositeMapperBuilder currentMapper, String entityName,
- EntityXmlMappingData xmlMappingData, PersistentPropertyAuditingData persistentPropertyAuditingData,
+ void addValue(Element parent, Value value, CompositeMapperBuilder currentMapper, String entityName,
+ EntityXmlMappingData xmlMappingData, PropertyAuditingData propertyAuditingData,
boolean insertable, boolean firstPass) {
Type type = value.getType();
// only first pass
if (firstPass) {
- if (basicMetadataGenerator.addBasic(parent, persistentPropertyAuditingData, value, currentMapper,
+ if (basicMetadataGenerator.addBasic(parent, propertyAuditingData, value, currentMapper,
insertable, false)) {
// The property was mapped by the basic generator.
return;
@@ -116,18 +118,18 @@
if (type instanceof ComponentType) {
// both passes
- componentMetadataGenerator.addComponent(parent, persistentPropertyAuditingData, value, currentMapper,
+ componentMetadataGenerator.addComponent(parent, propertyAuditingData, value, currentMapper,
entityName, xmlMappingData, firstPass);
} else if (type instanceof ManyToOneType) {
// only second pass
if (!firstPass) {
- toOneRelationMetadataGenerator.addToOne(parent, persistentPropertyAuditingData, value, currentMapper,
+ toOneRelationMetadataGenerator.addToOne(parent, propertyAuditingData, value, currentMapper,
entityName, insertable);
}
} else if (type instanceof OneToOneType) {
// only second pass
if (!firstPass) {
- toOneRelationMetadataGenerator.addOneToOneNotOwning(persistentPropertyAuditingData, value,
+ toOneRelationMetadataGenerator.addOneToOneNotOwning(propertyAuditingData, value,
currentMapper, entityName);
}
} else if (type instanceof CollectionType) {
@@ -135,35 +137,35 @@
if (!firstPass) {
CollectionMetadataGenerator collectionMetadataGenerator = new CollectionMetadataGenerator(this,
(Collection) value, currentMapper, entityName, xmlMappingData,
- persistentPropertyAuditingData);
+ propertyAuditingData);
collectionMetadataGenerator.addCollection();
}
} else {
if (firstPass) {
// If we got here in the first pass, it means the basic mapper didn't map it, and none of the
// above branches either.
- throwUnsupportedTypeException(type, entityName, persistentPropertyAuditingData.getName());
+ throwUnsupportedTypeException(type, entityName, propertyAuditingData.getName());
}
}
}
@SuppressWarnings({"unchecked"})
private void addProperties(Element parent, Iterator<Property> properties, CompositeMapperBuilder currentMapper,
- PersistentClassAuditingData auditingData, String entityName, EntityXmlMappingData xmlMappingData,
+ ClassAuditingData auditingData, String entityName, EntityXmlMappingData xmlMappingData,
boolean firstPass) {
while (properties.hasNext()) {
Property property = properties.next();
String propertyName = property.getName();
- if (auditingData.getPropertyAuditingData(propertyName) != null) {
- addValue(parent, property.getValue(), currentMapper, entityName,
- xmlMappingData, auditingData.getPropertyAuditingData(propertyName),
- property.isInsertable(), firstPass);
+ PropertyAuditingData propertyAuditingData = auditingData.getPropertyAuditingData(propertyName);
+ if (propertyAuditingData != null) {
+ addValue(parent, property.getValue(), currentMapper, entityName, xmlMappingData, propertyAuditingData,
+ property.isInsertable(), firstPass);
}
}
}
@SuppressWarnings({"unchecked"})
- private void createJoins(PersistentClass pc, Element parent, PersistentClassAuditingData auditingData) {
+ private void createJoins(PersistentClass pc, Element parent, ClassAuditingData auditingData) {
Iterator<Join> joins = pc.getJoinIterator();
Map<Join, Element> joinElements = new HashMap<Join, Element>();
@@ -200,7 +202,7 @@
}
@SuppressWarnings({"unchecked"})
- private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PersistentClassAuditingData auditingData,
+ private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, ClassAuditingData auditingData,
String entityName, EntityXmlMappingData xmlMappingData,boolean firstPass) {
Iterator<Join> joins = pc.getJoinIterator();
@@ -255,7 +257,7 @@
}
@SuppressWarnings({"unchecked"})
- public void generateFirstPass(PersistentClass pc, PersistentClassAuditingData auditingData,
+ public void generateFirstPass(PersistentClass pc, ClassAuditingData auditingData,
EntityXmlMappingData xmlMappingData) {
String schema = auditingData.getAuditTable().schema();
if (StringTools.isEmpty(schema)) {
@@ -334,7 +336,7 @@
}
@SuppressWarnings({"unchecked"})
- public void generateSecondPass(PersistentClass pc, PersistentClassAuditingData auditingData,
+ public void generateSecondPass(PersistentClass pc, ClassAuditingData auditingData,
EntityXmlMappingData xmlMappingData) {
String entityName = pc.getEntityName();
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -28,6 +28,7 @@
import org.dom4j.Element;
import org.hibernate.envers.entities.mapper.SimpleMapperBuilder;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.SimpleValue;
@@ -43,16 +44,16 @@
* @author Adam Warski (adam at warski dot org)
*/
public final class BasicMetadataGenerator {
- boolean addBasic(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+ boolean addBasic(Element parent, PropertyAuditingData propertyAuditingData,
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
Type type = value.getType();
if (type instanceof ImmutableType || type instanceof MutableType) {
- addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
+ addSimpleValue(parent, propertyAuditingData, value, mapper, insertable, key);
} else if (type instanceof CustomType || type instanceof CompositeCustomType) {
- addCustomValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
+ addCustomValue(parent, propertyAuditingData, value, mapper, insertable, key);
} else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
- addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
+ addSimpleValue(parent, propertyAuditingData, value, mapper, insertable, key);
} else {
return false;
}
@@ -61,25 +62,25 @@
}
@SuppressWarnings({"unchecked"})
- private void addSimpleValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+ private void addSimpleValue(Element parent, PropertyAuditingData propertyAuditingData,
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
if (parent != null) {
- Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
+ Element prop_mapping = MetadataTools.addProperty(parent, propertyAuditingData.getName(),
value.getType().getName(), insertable, key);
MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
}
// A null mapper means that we only want to add xml mappings
if (mapper != null) {
- mapper.add(persistentPropertyAuditingData.getPropertyData());
+ mapper.add(propertyAuditingData.getPropertyData());
}
}
@SuppressWarnings({"unchecked"})
- private void addCustomValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+ private void addCustomValue(Element parent, PropertyAuditingData propertyAuditingData,
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
if (parent != null) {
- Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
+ Element prop_mapping = MetadataTools.addProperty(parent, propertyAuditingData.getName(),
null, insertable, key);
//CustomType propertyType = (CustomType) value.getType();
@@ -102,7 +103,7 @@
}
if (mapper != null) {
- mapper.add(persistentPropertyAuditingData.getPropertyData());
+ mapper.add(propertyAuditingData.getPropertyData());
}
}
}
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -36,6 +36,7 @@
import org.dom4j.Element;
import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.IdMappingData;
import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
@@ -89,7 +90,7 @@
private final CompositeMapperBuilder currentMapper;
private final String referencingEntityName;
private final EntityXmlMappingData xmlMappingData;
- private final PersistentPropertyAuditingData persistentPropertyAuditingData;
+ private final PropertyAuditingData propertyAuditingData;
private final EntityConfiguration referencingEntityConfiguration;
/**
@@ -97,7 +98,7 @@
*/
private final String referencedEntityName;
- /**
+ /**
* @param mainGenerator Main generator, giving access to configuration and the basic mapper.
* @param propertyValue Value of the collection, as mapped by Hibernate.
* @param currentMapper Mapper, to which the appropriate {@link org.hibernate.envers.entities.mapper.PropertyMapper}
@@ -105,22 +106,22 @@
* @param referencingEntityName Name of the entity that owns this collection.
* @param xmlMappingData In case this collection requires a middle table, additional mapping documents will
* be created using this object.
- * @param persistentPropertyAuditingData Property auditing (meta-)data. Among other things, holds the name of the
+ * @param propertyAuditingData Property auditing (meta-)data. Among other things, holds the name of the
* property that references the collection in the referencing entity, the user data for middle (join)
* table and the value of the <code>@MapKey</code> annotation, if there was one.
*/
public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
Collection propertyValue, CompositeMapperBuilder currentMapper,
String referencingEntityName, EntityXmlMappingData xmlMappingData,
- PersistentPropertyAuditingData persistentPropertyAuditingData) {
+ PropertyAuditingData propertyAuditingData) {
this.mainGenerator = mainGenerator;
this.propertyValue = propertyValue;
this.currentMapper = currentMapper;
this.referencingEntityName = referencingEntityName;
this.xmlMappingData = xmlMappingData;
- this.persistentPropertyAuditingData = persistentPropertyAuditingData;
+ this.propertyAuditingData = propertyAuditingData;
- this.propertyName = persistentPropertyAuditingData.getName();
+ this.propertyName = propertyAuditingData.getName();
referencingEntityConfiguration = mainGenerator.getEntitiesConfigurations().get(referencingEntityName);
if (referencingEntityConfiguration == null) {
@@ -189,7 +190,7 @@
// Creating common mapper data.
CommonCollectionMapperData commonCollectionMapperData = new CommonCollectionMapperData(
mainGenerator.getVerEntCfg(), referencedEntityName,
- persistentPropertyAuditingData.getPropertyData(),
+ propertyAuditingData.getPropertyData(),
referencingIdData, queryGenerator);
// Checking the type of the collection and adding an appropriate mapper.
@@ -235,9 +236,9 @@
// Generating the name of the middle table
String auditMiddleTableName;
String auditMiddleEntityName;
- if (!StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().name())) {
- auditMiddleTableName = persistentPropertyAuditingData.getJoinTable().name();
- auditMiddleEntityName = persistentPropertyAuditingData.getJoinTable().name();
+ if (!StringTools.isEmpty(propertyAuditingData.getJoinTable().name())) {
+ auditMiddleTableName = propertyAuditingData.getJoinTable().name();
+ auditMiddleEntityName = propertyAuditingData.getJoinTable().name();
} else {
String middleTableName = getMiddleTableName(propertyValue, referencingEntityName);
auditMiddleTableName = mainGenerator.getVerEntCfg().getAuditTableName(null, middleTableName);
@@ -301,7 +302,7 @@
// Generating the element mapping.
// ******
MiddleComponentData elementComponentData = addValueToMiddleTable(propertyValue.getElement(), middleEntityXml,
- queryGeneratorBuilder, referencedPrefix, persistentPropertyAuditingData.getJoinTable().inverseJoinColumns());
+ queryGeneratorBuilder, referencedPrefix, propertyAuditingData.getJoinTable().inverseJoinColumns());
// ******
// Generating the index mapping, if an index exists.
@@ -317,7 +318,7 @@
// Creating common data
CommonCollectionMapperData commonCollectionMapperData = new CommonCollectionMapperData(
mainGenerator.getVerEntCfg(), auditMiddleEntityName,
- persistentPropertyAuditingData.getPropertyData(),
+ propertyAuditingData.getPropertyData(),
referencingIdData, queryGenerator);
// Checking the type of the collection and adding an appropriate mapper.
@@ -332,7 +333,7 @@
private MiddleComponentData addIndex(Element middleEntityXml, QueryGeneratorBuilder queryGeneratorBuilder) {
if (propertyValue instanceof IndexedCollection) {
IndexedCollection indexedValue = (IndexedCollection) propertyValue;
- String mapKey = persistentPropertyAuditingData.getMapKey();
+ String mapKey = propertyAuditingData.getMapKey();
if (mapKey == null) {
// This entity doesn't specify a javax.persistence.MapKey. Mapping it to the middle entity.
return addValueToMiddleTable(indexedValue.getIndex(), middleEntityXml,
@@ -348,7 +349,7 @@
} else {
// The key of the map is a property of the entity.
return new MiddleComponentData(new MiddleMapKeyPropertyComponentMapper(mapKey,
- persistentPropertyAuditingData.getAccessType()), currentIndex);
+ propertyAuditingData.getAccessType()), currentIndex);
}
}
} else {
@@ -401,7 +402,7 @@
} else {
// Last but one parameter: collection components are always insertable
boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasic(xmlMapping,
- new PersistentPropertyAuditingData(prefix, "field", ModificationStore.FULL), value, null,
+ new PropertyAuditingData(prefix, "field", ModificationStore.FULL), value, null,
true, true);
if (mapped) {
@@ -419,30 +420,30 @@
MiddleComponentData indexComponentData) {
Type type = propertyValue.getType();
if (type instanceof SortedSetType) {
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new BasicCollectionMapper<Set>(commonCollectionMapperData,
TreeSet.class, SortedSetProxy.class, elementComponentData));
} else if (type instanceof SetType) {
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new BasicCollectionMapper<Set>(commonCollectionMapperData,
HashSet.class, SetProxy.class, elementComponentData));
} else if (type instanceof SortedMapType) {
// Indexed collection, so <code>indexComponentData</code> is not null.
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new MapCollectionMapper<Map>(commonCollectionMapperData,
TreeMap.class, SortedMapProxy.class, elementComponentData, indexComponentData));
} else if (type instanceof MapType) {
// Indexed collection, so <code>indexComponentData</code> is not null.
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new MapCollectionMapper<Map>(commonCollectionMapperData,
HashMap.class, MapProxy.class, elementComponentData, indexComponentData));
} else if (type instanceof BagType) {
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new BasicCollectionMapper<List>(commonCollectionMapperData,
ArrayList.class, ListProxy.class, elementComponentData));
} else if (type instanceof ListType) {
// Indexed collection, so <code>indexComponentData</code> is not null.
- currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+ currentMapper.addComposite(propertyAuditingData.getPropertyData(),
new ListCollectionMapper(commonCollectionMapperData,
elementComponentData, indexComponentData));
} else {
@@ -462,10 +463,10 @@
}
private Element createMiddleEntityXml(String auditMiddleTableName, String auditMiddleEntityName) {
- String schema = StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().schema()) ?
- propertyValue.getCollectionTable().getSchema() : persistentPropertyAuditingData.getJoinTable().schema();
- String catalog = StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().catalog()) ?
- propertyValue.getCollectionTable().getCatalog() : persistentPropertyAuditingData.getJoinTable().catalog();
+ String schema = StringTools.isEmpty(propertyAuditingData.getJoinTable().schema()) ?
+ propertyValue.getCollectionTable().getSchema() : propertyAuditingData.getJoinTable().schema();
+ String catalog = StringTools.isEmpty(propertyAuditingData.getJoinTable().catalog()) ?
+ propertyValue.getCollectionTable().getCatalog() : propertyAuditingData.getJoinTable().catalog();
Element middleEntityXml = MetadataTools.createEntity(xmlMappingData.newAdditionalMapping(),
new AuditTableData(auditMiddleEntityName, auditMiddleTableName, schema, catalog), null);
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ComponentMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ComponentMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ComponentMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -5,7 +5,8 @@
import org.hibernate.mapping.Component;
import org.hibernate.mapping.Property;
import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.configuration.metadata.reader.ComponentAuditingData;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import java.util.Iterator;
@@ -21,25 +22,24 @@
}
@SuppressWarnings({"unchecked"})
- public void addComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+ public void addComponent(Element parent, PropertyAuditingData propertyAuditingData,
Value value, CompositeMapperBuilder mapper, String entityName,
EntityXmlMappingData xmlMappingData, boolean firstPass) {
Component prop_component = (Component) value;
- CompositeMapperBuilder componentMapper = mapper.addComponent(persistentPropertyAuditingData.getPropertyData());
+ CompositeMapperBuilder componentMapper = mapper.addComponent(propertyAuditingData.getPropertyData());
+ // The property auditing data must be for a component.
+ ComponentAuditingData componentAuditingData = (ComponentAuditingData) propertyAuditingData;
+
// Adding all properties of the component
Iterator<Property> properties = (Iterator<Property>) prop_component.getPropertyIterator();
while (properties.hasNext()) {
Property property = properties.next();
- // The name of the property in the entity will consist of the name of the component property concatenated
- // with the name of the property in the bean, to avoid conflicts.
- PersistentPropertyAuditingData propertyAuditingData = new PersistentComponentPropertyAuditingData(
- persistentPropertyAuditingData.getName() + "_" + property.getName(),
- property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL);
- mainGenerator.addValue(parent, property.getValue(), componentMapper,
- entityName, xmlMappingData, propertyAuditingData, property.isInsertable(), firstPass);
+ mainGenerator.addValue(parent, property.getValue(), componentMapper, entityName, xmlMappingData,
+ componentAuditingData.getPropertyAuditingData(property.getName()),
+ property.isInsertable(), firstPass);
}
}
}
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -28,6 +28,7 @@
import org.dom4j.Element;
import org.dom4j.tree.DefaultElement;
import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import org.hibernate.envers.entities.IdMappingData;
import org.hibernate.envers.entities.PropertyData;
import org.hibernate.envers.entities.mapper.SimpleMapperBuilder;
@@ -130,8 +131,8 @@
ModificationStore.FULL);
}
- private PersistentPropertyAuditingData getIdPersistentPropertyAuditingData(Property property) {
- return new PersistentPropertyAuditingData(property.getName(), property.getPropertyAccessorName(),
+ private PropertyAuditingData getIdPersistentPropertyAuditingData(Property property) {
+ return new PropertyAuditingData(property.getName(), property.getPropertyAccessorName(),
ModificationStore.FULL);
}
}
Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -1,81 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.envers.configuration.metadata;
-
-import java.util.Map;
-
-import org.hibernate.envers.AuditTable;
-import org.hibernate.envers.tools.Tools;
-
-/**
- * @author Adam Warski (adam at warski dot org)
- * @author Sebastian Komander
-*/
-public class PersistentClassAuditingData {
- public PersistentClassAuditingData() {
- properties = Tools.newHashMap();
- secondaryTableDictionary = Tools.newHashMap();
- }
-
- private Map<String, PersistentPropertyAuditingData> properties;
- private AuditTable auditTable;
- private Map<String, String> secondaryTableDictionary;
- /**
- * True if the class is audited globally (this helps to cover the cases when there are no fields in the class,
- * but it's still audited).
- */
- private boolean defaultAudited;
-
- public Map<String, PersistentPropertyAuditingData> getProperties() {
- return properties;
- }
-
- public PersistentPropertyAuditingData getPropertyAuditingData(String propertyName) {
- return properties.get(propertyName);
- }
-
- public Map<String, String> getSecondaryTableDictionary() {
- return secondaryTableDictionary;
- }
-
- public AuditTable getAuditTable() {
- return auditTable;
- }
-
- public void setAuditTable(AuditTable auditTable) {
- this.auditTable = auditTable;
- }
-
- public void setDefaultAudited(boolean defaultAudited) {
- this.defaultAudited = defaultAudited;
- }
-
- public boolean isAudited() {
- if (defaultAudited || properties.size() > 0) {
- return true;
- } else {
- return false;
- }
- }
-}
Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentComponentPropertyAuditingData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentComponentPropertyAuditingData.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentComponentPropertyAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -1,46 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- *
- */
-package org.hibernate.envers.configuration.metadata;
-
-import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.entities.PropertyData;
-
-/**
- * @author Adam Warski (adam at warski dot org)
- */
-public class PersistentComponentPropertyAuditingData extends PersistentPropertyAuditingData {
- private final String beanName;
-
- public PersistentComponentPropertyAuditingData(String name, String beanName, String accessType,
- ModificationStore store) {
- super(name, accessType, store);
-
- this.beanName = beanName;
- }
-
- public PropertyData getPropertyData() {
- return new PropertyData(getName(), beanName, getAccessType(), getStore());
- }
-}
\ No newline at end of file
Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -1,93 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- *
- */
-package org.hibernate.envers.configuration.metadata;
-
-import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.AuditJoinTable;
-import org.hibernate.envers.entities.PropertyData;
-
-/**
- * @author Adam Warski (adam at warski dot org)
- */
-public class PersistentPropertyAuditingData {
- private String name;
- private ModificationStore store;
- private String mapKey;
- private AuditJoinTable joinTable;
- private String accessType;
-
- public PersistentPropertyAuditingData() {
- }
-
- public PersistentPropertyAuditingData(String name, String accessType, ModificationStore store) {
- this.name = name;
- this.accessType = accessType;
- this.store = store;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public ModificationStore getStore() {
- return store;
- }
-
- public void setStore(ModificationStore store) {
- this.store = store;
- }
-
- public String getMapKey() {
- return mapKey;
- }
-
- public void setMapKey(String mapKey) {
- this.mapKey = mapKey;
- }
-
- public AuditJoinTable getJoinTable() {
- return joinTable;
- }
-
- public void setJoinTable(AuditJoinTable joinTable) {
- this.joinTable = joinTable;
- }
-
- public String getAccessType() {
- return accessType;
- }
-
- public void setAccessType(String accessType) {
- this.accessType = accessType;
- }
-
- public PropertyData getPropertyData() {
- return new PropertyData(name, name, accessType, store);
- }
-}
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -31,6 +31,7 @@
import org.hibernate.envers.entities.mapper.id.IdMapper;
import org.hibernate.envers.entities.mapper.relation.OneToOneNotOwningMapper;
import org.hibernate.envers.entities.mapper.relation.ToOneIdMapper;
+import org.hibernate.envers.configuration.metadata.reader.PropertyAuditingData;
import org.hibernate.MappingException;
import org.hibernate.mapping.OneToOne;
@@ -49,7 +50,7 @@
}
@SuppressWarnings({"unchecked"})
- void addToOne(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
+ void addToOne(Element parent, PropertyAuditingData propertyAuditingData, Value value,
CompositeMapperBuilder mapper, String entityName, boolean insertable) {
String referencedEntityName = ((ToOne) value).getReferencedEntityName();
@@ -60,30 +61,30 @@
IdMappingData idMapping = configuration.getIdMappingData();
- String lastPropertyPrefix = persistentPropertyAuditingData.getName() + "_";
+ String lastPropertyPrefix = propertyAuditingData.getName() + "_";
// Generating the id mapper for the relation
IdMapper relMapper = idMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix);
// Storing information about this relation
mainGenerator.getEntitiesConfigurations().get(entityName).addToOneRelation(
- persistentPropertyAuditingData.getName(), referencedEntityName, relMapper);
+ propertyAuditingData.getName(), referencedEntityName, relMapper);
// Adding an element to the mapping corresponding to the references entity id's
Element properties = (Element) idMapping.getXmlRelationMapping().clone();
- properties.addAttribute("name", persistentPropertyAuditingData.getName());
+ properties.addAttribute("name", propertyAuditingData.getName());
MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix,
MetadataTools.getColumnNameIterator(value.getColumnIterator()), false, insertable);
parent.add(properties);
// Adding mapper for the id
- PropertyData propertyData = persistentPropertyAuditingData.getPropertyData();
+ PropertyData propertyData = propertyAuditingData.getPropertyData();
mapper.addComposite(propertyData, new ToOneIdMapper(relMapper, propertyData, referencedEntityName));
}
@SuppressWarnings({"unchecked"})
- void addOneToOneNotOwning(PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
+ void addOneToOneNotOwning(PropertyAuditingData propertyAuditingData, Value value,
CompositeMapperBuilder mapper, String entityName) {
OneToOne propertyValue = (OneToOne) value;
@@ -108,11 +109,11 @@
// Storing information about this relation
mainGenerator.getEntitiesConfigurations().get(entityName).addToOneNotOwningRelation(
- persistentPropertyAuditingData.getName(), owningReferencePropertyName,
+ propertyAuditingData.getName(), owningReferencePropertyName,
referencedEntityName, ownedIdMapper);
// Adding mapper for the id
- PropertyData propertyData = persistentPropertyAuditingData.getPropertyData();
+ PropertyData propertyData = propertyAuditingData.getPropertyData();
mapper.addComposite(propertyData, new OneToOneNotOwningMapper(owningReferencePropertyName,
referencedEntityName, propertyData));
}
Copied: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AnnotationsMetadataReader.java (from rev 15742, core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AnnotationsMetadataReader.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AnnotationsMetadataReader.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,153 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.configuration.metadata.reader;
+
+import java.lang.annotation.Annotation;
+import java.util.Iterator;
+
+import org.hibernate.envers.SecondaryAuditTable;
+import org.hibernate.envers.*;
+import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.configuration.GlobalConfiguration;
+
+import org.hibernate.MappingException;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.jboss.envers.*;
+
+/**
+ * A helper class to read versioning meta-data from annotations on a persistent class.
+ * @author Adam Warski (adam at warski dot org)
+ * @author Sebastian Komander
+ */
+public final class AnnotationsMetadataReader {
+ private final GlobalConfiguration globalCfg;
+ private final ReflectionManager reflectionManager;
+ private final PersistentClass pc;
+
+ /**
+ * This object is filled with information read from annotations and returned by the <code>getVersioningData</code>
+ * method.
+ */
+ private final ClassAuditingData auditData;
+
+ public AnnotationsMetadataReader(GlobalConfiguration globalCfg, ReflectionManager reflectionManager,
+ PersistentClass pc) {
+ this.globalCfg = globalCfg;
+ this.reflectionManager = reflectionManager;
+ this.pc = pc;
+
+ auditData = new ClassAuditingData();
+ }
+
+ private ModificationStore getDefaultAudited(XClass clazz) {
+ Audited defaultAudited = clazz.getAnnotation(Audited.class);
+
+ if (defaultAudited != null) {
+ return defaultAudited.modStore();
+ } else {
+ Versioned defaultVersioned = clazz.getAnnotation(Versioned.class);
+ if (defaultVersioned != null) {
+ return ModificationStore.FULL;
+ } else {
+ return null;
+ }
+ }
+ }
+
+ private void addAuditTable(XClass clazz) {
+ AuditTable auditTable = clazz.getAnnotation(AuditTable.class);
+ if (auditTable != null) {
+ auditData.setAuditTable(auditTable);
+ } else {
+ auditData.setAuditTable(getDefaultAuditTable());
+ }
+ }
+
+ private void addAuditSecondaryTables(XClass clazz) {
+ // Getting information on secondary tables
+ SecondaryAuditTable secondaryVersionsTable1 = clazz.getAnnotation(SecondaryAuditTable.class);
+ if (secondaryVersionsTable1 != null) {
+ auditData.getSecondaryTableDictionary().put(secondaryVersionsTable1.secondaryTableName(),
+ secondaryVersionsTable1.secondaryAuditTableName());
+ }
+
+ SecondaryAuditTables secondaryAuditTables = clazz.getAnnotation(SecondaryAuditTables.class);
+ if (secondaryAuditTables != null) {
+ for (SecondaryAuditTable secondaryAuditTable2 : secondaryAuditTables.value()) {
+ auditData.getSecondaryTableDictionary().put(secondaryAuditTable2.secondaryTableName(),
+ secondaryAuditTable2.secondaryAuditTableName());
+ }
+ }
+ }
+
+ public ClassAuditingData getAuditData() {
+ if (pc.getClassName() == null) {
+ return auditData;
+ }
+
+ try {
+ XClass xclass = reflectionManager.classForName(pc.getClassName(), this.getClass());
+
+ ModificationStore defaultStore = getDefaultAudited(xclass);
+ if (defaultStore != null) {
+ auditData.setDefaultAudited(true);
+ }
+
+ new AuditedPropertiesReader(defaultStore, new PersistentClassPropertiesSource(xclass), auditData,
+ globalCfg, "").read();
+
+ addAuditTable(xclass);
+ addAuditSecondaryTables(xclass);
+ } catch (ClassNotFoundException e) {
+ throw new MappingException(e);
+ }
+
+ return auditData;
+ }
+
+ private AuditTable defaultAuditTable = new AuditTable() {
+ public String value() { return ""; }
+ public String schema() { return ""; }
+ public String catalog() { return ""; }
+ public Class<? extends Annotation> annotationType() { return this.getClass(); }
+ };
+
+ private AuditTable getDefaultAuditTable() {
+ return defaultAuditTable;
+ }
+
+ private class PersistentClassPropertiesSource implements PersistentPropertiesSource {
+ private final XClass xclass;
+
+ private PersistentClassPropertiesSource(XClass xclass) { this.xclass = xclass; }
+
+ @SuppressWarnings({"unchecked"})
+ public Iterator<Property> getPropertyIterator() { return pc.getPropertyIterator(); }
+ public Property getProperty(String propertyName) { return pc.getProperty(propertyName); }
+ public XClass getXClass() { return xclass; }
+ }
+}
Added: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesHolder.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesHolder.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesHolder.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,20 @@
+package org.hibernate.envers.configuration.metadata.reader;
+
+/**
+ * Implementations hold other audited properties.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public interface AuditedPropertiesHolder {
+ /**
+ * Add an audited property.
+ * @param propertyName Name of the audited property.
+ * @param auditingData Data for the audited property.
+ */
+ void addPropertyAuditingData(String propertyName, PropertyAuditingData auditingData);
+
+ /**
+ * @param propertyName Name of a property.
+ * @return Auditing data for the property.
+ */
+ PropertyAuditingData getPropertyAuditingData(String propertyName);
+}
Added: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,210 @@
+package org.hibernate.envers.configuration.metadata.reader;
+
+import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.NotAudited;
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.AuditJoinTable;
+import org.hibernate.envers.configuration.GlobalConfiguration;
+import static org.hibernate.envers.tools.Tools.*;
+import org.hibernate.envers.tools.MappingTools;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Value;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.jboss.envers.Versioned;
+
+import javax.persistence.Version;
+import javax.persistence.MapKey;
+import javax.persistence.JoinColumn;
+import java.util.Iterator;
+import java.util.Set;
+import java.lang.annotation.Annotation;
+
+/**
+ * Reads persistent properties form a
+ * {@link org.hibernate.envers.configuration.metadata.reader.PersistentPropertiesSource}
+ * and adds the ones that are audited to a
+ * {@link org.hibernate.envers.configuration.metadata.reader.AuditedPropertiesHolder},
+ * filling all the auditing data.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class AuditedPropertiesReader {
+ private final ModificationStore defaultStore;
+ private final PersistentPropertiesSource persistentPropertiesSource;
+ private final AuditedPropertiesHolder auditedPropertiesHolder;
+ private final GlobalConfiguration globalCfg;
+ private final String propertyNamePrefix;
+
+ private final Set<String> propertyAccessedPersistentProperties;
+ private final Set<String> fieldAccessedPersistentProperties;
+
+ public AuditedPropertiesReader(ModificationStore defaultStore,
+ PersistentPropertiesSource persistentPropertiesSource,
+ AuditedPropertiesHolder auditedPropertiesHolder,
+ GlobalConfiguration globalCfg,
+ String propertyNamePrefix) {
+ this.defaultStore = defaultStore;
+ this.persistentPropertiesSource = persistentPropertiesSource;
+ this.auditedPropertiesHolder = auditedPropertiesHolder;
+ this.globalCfg = globalCfg;
+ this.propertyNamePrefix = propertyNamePrefix;
+
+ propertyAccessedPersistentProperties = newHashSet();
+ fieldAccessedPersistentProperties = newHashSet();
+ }
+
+ public void read() {
+ // First reading the access types for the persistent properties.
+ readPersistentPropertiesAccess();
+
+ // Adding all properties from the given class.
+ addPropertiesFromClass(persistentPropertiesSource.getXClass());
+ }
+
+ private void readPersistentPropertiesAccess() {
+ Iterator propertyIter = persistentPropertiesSource.getPropertyIterator();
+ while (propertyIter.hasNext()) {
+ Property property = (Property) propertyIter.next();
+ if ("field".equals(property.getPropertyAccessorName())) {
+ fieldAccessedPersistentProperties.add(property.getName());
+ } else {
+ propertyAccessedPersistentProperties.add(property.getName());
+ }
+ }
+ }
+
+ private void addPropertiesFromClass(XClass clazz) {
+ XClass superclazz = clazz.getSuperclass();
+ if (!"java.lang.Object".equals(superclazz.getName())) {
+ addPropertiesFromClass(superclazz);
+ }
+
+ addFromProperties(clazz.getDeclaredProperties("field"), "field", fieldAccessedPersistentProperties);
+ addFromProperties(clazz.getDeclaredProperties("property"), "property", propertyAccessedPersistentProperties);
+ }
+
+ private void addFromProperties(Iterable<XProperty> properties, String accessType, Set<String> persistentProperties) {
+ for (XProperty property : properties) {
+ // If this is not a persistent property, with the same access type as currently checked,
+ // it's not audited as well.
+ if (persistentProperties.contains(property.getName())) {
+ Value propertyValue = persistentPropertiesSource.getProperty(property.getName()).getValue();
+
+ PropertyAuditingData propertyData;
+ boolean isAudited;
+ if (propertyValue instanceof Component) {
+ ComponentAuditingData componentData = new ComponentAuditingData();
+ isAudited = fillPropertyData(property, componentData, accessType);
+
+ // TODO: component stuff
+ PersistentPropertiesSource componentPropertiesSource = new ComponentPropertiesSource(
+ property.getType(), (Component) propertyValue);
+ new AuditedPropertiesReader(ModificationStore.FULL, componentPropertiesSource, componentData,
+ globalCfg, propertyNamePrefix+ MappingTools.createComponentPrefix(property.getName()))
+ .read();
+
+ propertyData = componentData;
+ } else {
+ propertyData = new PropertyAuditingData();
+ isAudited = fillPropertyData(property, propertyData, accessType);
+ }
+
+ if (isAudited) {
+ // Now we know that the property is audited
+ auditedPropertiesHolder.addPropertyAuditingData(property.getName(), propertyData);
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks if a property is audited and if yes, fills all of its data.
+ * @param property Property to check.
+ * @param propertyData Property data, on which to set this property's modification store.
+ * @param accessType Access type for the property.
+ * @return False if this property is not audited.
+ */
+ private boolean fillPropertyData(XProperty property, PropertyAuditingData propertyData,
+ String accessType) {
+
+ // check if a property is declared as not audited to exclude it
+ // useful if a class is audited but some properties should be excluded
+ NotAudited unVer = property.getAnnotation(NotAudited.class);
+ if (unVer != null) {
+ return false;
+ } else {
+ // if the optimistic locking field has to be unversioned and the current property
+ // is the optimistic locking field, don't audit it
+ if (globalCfg.isDoNotAuditOptimisticLockingField()) {
+ Version jpaVer = property.getAnnotation(Version.class);
+ if (jpaVer != null) {
+ return false;
+ }
+ }
+ }
+
+ // Checking if this property is explicitly audited or if all properties are.
+ Audited aud = property.getAnnotation(Audited.class);
+ Versioned ver = property.getAnnotation(Versioned.class);
+ if (aud != null) {
+ propertyData.setStore(aud.modStore());
+ } else if (ver != null) {
+ propertyData.setStore(ModificationStore.FULL);
+ } else {
+ if (defaultStore != null) {
+ propertyData.setStore(defaultStore);
+ } else {
+ return false;
+ }
+ }
+
+ propertyData.setName(propertyNamePrefix + property.getName());
+ propertyData.setBeanName(property.getName());
+ propertyData.setAccessType(accessType);
+
+ addPropertyJoinTables(property, propertyData);
+ addPropertyMapKey(property, propertyData);
+
+ return true;
+ }
+
+ private void addPropertyMapKey(XProperty property, PropertyAuditingData propertyData) {
+ MapKey mapKey = property.getAnnotation(MapKey.class);
+ if (mapKey != null) {
+ propertyData.setMapKey(mapKey.name());
+ }
+ }
+
+ private void addPropertyJoinTables(XProperty property, PropertyAuditingData propertyData) {
+ AuditJoinTable joinTable = property.getAnnotation(AuditJoinTable.class);
+ if (joinTable != null) {
+ propertyData.setJoinTable(joinTable);
+ } else {
+ propertyData.setJoinTable(DEFAULT_AUDIT_JOIN_TABLE);
+ }
+ }
+
+ private static AuditJoinTable DEFAULT_AUDIT_JOIN_TABLE = new AuditJoinTable() {
+ public String name() { return ""; }
+ public String schema() { return ""; }
+ public String catalog() { return ""; }
+ public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
+ public Class<? extends Annotation> annotationType() { return this.getClass(); }
+ };
+
+ private class ComponentPropertiesSource implements PersistentPropertiesSource {
+ private final XClass xclass;
+ private final Component component;
+
+ private ComponentPropertiesSource(XClass xclass, Component component) {
+ this.xclass = xclass;
+ this.component = component;
+ }
+
+ @SuppressWarnings({"unchecked"})
+ public Iterator<Property> getPropertyIterator() { return component.getPropertyIterator(); }
+ public Property getProperty(String propertyName) { return component.getProperty(propertyName); }
+ public XClass getXClass() { return xclass; }
+ }
+}
Copied: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ClassAuditingData.java (from rev 15742, core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ClassAuditingData.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ClassAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.configuration.metadata.reader;
+
+import java.util.Map;
+
+import org.hibernate.envers.AuditTable;
+import static org.hibernate.envers.tools.Tools.*;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ * @author Sebastian Komander
+*/
+public class ClassAuditingData implements AuditedPropertiesHolder {
+ private final Map<String, PropertyAuditingData> properties;
+ private final Map<String, String> secondaryTableDictionary;
+
+ private AuditTable auditTable;
+
+ /**
+ * True if the class is audited globally (this helps to cover the cases when there are no fields in the class,
+ * but it's still audited).
+ */
+ private boolean defaultAudited;
+
+ public ClassAuditingData() {
+ properties = newHashMap();
+ secondaryTableDictionary = newHashMap();
+ }
+
+ public void addPropertyAuditingData(String propertyName, PropertyAuditingData auditingData) {
+ properties.put(propertyName, auditingData);
+ }
+
+ public PropertyAuditingData getPropertyAuditingData(String propertyName) {
+ return properties.get(propertyName);
+ }
+
+ public Map<String, String> getSecondaryTableDictionary() {
+ return secondaryTableDictionary;
+ }
+
+ public AuditTable getAuditTable() {
+ return auditTable;
+ }
+
+ public void setAuditTable(AuditTable auditTable) {
+ this.auditTable = auditTable;
+ }
+
+ public void setDefaultAudited(boolean defaultAudited) {
+ this.defaultAudited = defaultAudited;
+ }
+
+ public boolean isAudited() {
+ return defaultAudited || properties.size() > 0;
+ }
+}
Copied: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ComponentAuditingData.java (from rev 15744, core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentComponentPropertyAuditingData.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ComponentAuditingData.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ComponentAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,49 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.envers.configuration.metadata.reader;
+
+import static org.hibernate.envers.tools.Tools.*;
+
+import java.util.Map;
+
+/**
+ * Audit mapping meta-data for component.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ComponentAuditingData extends PropertyAuditingData implements AuditedPropertiesHolder {
+ private final Map<String, PropertyAuditingData> properties;
+
+ public ComponentAuditingData() {
+ this.properties = newHashMap();
+ }
+
+ public void addPropertyAuditingData(String propertyName, PropertyAuditingData auditingData) {
+ properties.put(propertyName, auditingData);
+ }
+
+ public PropertyAuditingData getPropertyAuditingData(String propertyName) {
+ return properties.get(propertyName);
+ }
+}
\ No newline at end of file
Property changes on: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/ComponentAuditingData.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PersistentPropertiesSource.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PersistentPropertiesSource.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PersistentPropertiesSource.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,16 @@
+package org.hibernate.envers.configuration.metadata.reader;
+
+import org.hibernate.mapping.Property;
+import org.hibernate.annotations.common.reflection.XClass;
+
+import java.util.Iterator;
+
+/**
+ * A source of data on persistent properties of a class or component.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public interface PersistentPropertiesSource {
+ Iterator<Property> getPropertyIterator();
+ Property getProperty(String propertyName);
+ XClass getXClass();
+}
Copied: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java (from rev 15744, core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,103 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ *
+ */
+package org.hibernate.envers.configuration.metadata.reader;
+
+import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.AuditJoinTable;
+import org.hibernate.envers.entities.PropertyData;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PropertyAuditingData {
+ private String name;
+ private String beanName;
+ private ModificationStore store;
+ private String mapKey;
+ private AuditJoinTable joinTable;
+ private String accessType;
+
+ public PropertyAuditingData() {
+ }
+
+ public PropertyAuditingData(String name, String accessType, ModificationStore store) {
+ this.name = name;
+ this.beanName = name;
+ this.accessType = accessType;
+ this.store = store;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getBeanName() {
+ return beanName;
+ }
+
+ public void setBeanName(String beanName) {
+ this.beanName = beanName;
+ }
+
+ public ModificationStore getStore() {
+ return store;
+ }
+
+ public void setStore(ModificationStore store) {
+ this.store = store;
+ }
+
+ public String getMapKey() {
+ return mapKey;
+ }
+
+ public void setMapKey(String mapKey) {
+ this.mapKey = mapKey;
+ }
+
+ public AuditJoinTable getJoinTable() {
+ return joinTable;
+ }
+
+ public void setJoinTable(AuditJoinTable joinTable) {
+ this.joinTable = joinTable;
+ }
+
+ public String getAccessType() {
+ return accessType;
+ }
+
+ public void setAccessType(String accessType) {
+ this.accessType = accessType;
+ }
+
+ public PropertyData getPropertyData() {
+ return new PropertyData(name, beanName, accessType, store);
+ }
+}
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -32,6 +32,7 @@
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.reflection.ReflectionTools;
import org.hibernate.envers.tools.Tools;
+import org.hibernate.envers.tools.MappingTools;
import org.hibernate.collection.PersistentCollection;
import org.hibernate.property.Getter;
@@ -120,9 +121,30 @@
PersistentCollection newColl,
Serializable oldColl,
Serializable id) {
+ // Name of the properyt, to which we will delegate the mapping.
+ String delegatePropertyName;
+
+ // Checking if the property name doesn't reference a collection in a component - then the name will containa a .
+ int dotIndex = referencingPropertyName.indexOf('.');
+ if (dotIndex != -1) {
+ // Computing the name of the component
+ String componentName = referencingPropertyName.substring(0, dotIndex);
+ // And the name of the property in the component
+ String propertyInComponentName = MappingTools.createComponentPrefix(componentName)
+ + referencingPropertyName.substring(dotIndex+1);
+
+ // We need to get the mapper for the component.
+ referencingPropertyName = componentName;
+ // As this is a component, we delegate to the property in the component.
+ delegatePropertyName = propertyInComponentName;
+ } else {
+ // If this is not a component, we delegate to the same property.
+ delegatePropertyName = referencingPropertyName;
+ }
+
PropertyMapper mapper = properties.get(propertyDatas.get(referencingPropertyName));
if (mapper != null) {
- return mapper.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id);
+ return mapper.mapCollectionChanges(delegatePropertyName, newColl, oldColl, id);
} else {
return null;
}
Added: core/trunk/envers/src/main/java/org/hibernate/envers/tools/MappingTools.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/tools/MappingTools.java (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/tools/MappingTools.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,15 @@
+package org.hibernate.envers.tools;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class MappingTools {
+ /**
+ * @param componentName Name of the component, that is, name of the property in the entity that references the
+ * component.
+ * @return A prefix for properties in the given component.
+ */
+ public static String createComponentPrefix(String componentName) {
+ return componentName + "_";
+ }
+}
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component1.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component1.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component1.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -23,9 +23,12 @@
*/
package org.hibernate.envers.test.entities.components;
+import javax.persistence.Embeddable;
+
/**
* @author Adam Warski (adam at warski dot org)
*/
+ at Embeddable
public class Component1 {
private String str1;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component2.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component2.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component2.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -23,9 +23,12 @@
*/
package org.hibernate.envers.test.entities.components;
+import javax.persistence.Embeddable;
+
/**
* @author Adam Warski (adam at warski dot org)
*/
+ at Embeddable
public class Component2 {
private String str5;
Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponent.java (from rev 15742, core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/Component1.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponent.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponent.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,88 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components.relations;
+
+import org.hibernate.envers.test.entities.StrTestEntity;
+
+import javax.persistence.ManyToOne;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Embeddable
+public class ManyToOneComponent {
+ @ManyToOne
+ private StrTestEntity entity;
+
+ private String data;
+
+ public ManyToOneComponent(StrTestEntity entity, String data) {
+ this.entity = entity;
+ this.data = data;
+ }
+
+ public ManyToOneComponent() {
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public StrTestEntity getEntity() {
+ return entity;
+ }
+
+ public void setEntity(StrTestEntity entity) {
+ this.entity = entity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ManyToOneComponent that = (ManyToOneComponent) o;
+
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+ if (entity != null ? !entity.equals(that.entity) : that.entity != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = entity != null ? entity.hashCode() : 0;
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "ManyToOneComponent(str1 = " + data + ")";
+ }
+}
\ No newline at end of file
Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponent.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponentTestEntity.java (from rev 15742, core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentTestEntity.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponentTestEntity.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponentTestEntity.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,97 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components.relations;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class ManyToOneComponentTestEntity {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Embedded
+ @Audited
+ private ManyToOneComponent comp1;
+
+ public ManyToOneComponentTestEntity() {
+ }
+
+ public ManyToOneComponentTestEntity(Integer id, ManyToOneComponent comp1) {
+ this.id = id;
+ this.comp1 = comp1;
+ }
+
+ public ManyToOneComponentTestEntity(ManyToOneComponent comp1) {
+ this.comp1 = comp1;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public ManyToOneComponent getComp1() {
+ return comp1;
+ }
+
+ public void setComp1(ManyToOneComponent comp1) {
+ this.comp1 = comp1;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ManyToOneComponentTestEntity that = (ManyToOneComponentTestEntity) o;
+
+ if (comp1 != null ? !comp1.equals(that.comp1) : that.comp1 != null) return false;
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + (comp1 != null ? comp1.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "MTOCTE(id = " + id + ", comp1 = " + comp1 + ")";
+ }
+}
\ No newline at end of file
Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/ManyToOneComponentTestEntity.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponent.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponent.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponent.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,89 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components.relations;
+
+import org.hibernate.envers.test.entities.StrTestEntity;
+
+import javax.persistence.OneToMany;
+import javax.persistence.Embeddable;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Embeddable
+public class OneToManyComponent {
+ @OneToMany
+ private Set<StrTestEntity> entities = new HashSet<StrTestEntity>();
+
+ private String data;
+
+ public OneToManyComponent(String data) {
+ this.data = data;
+ }
+
+ public OneToManyComponent() {
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public Set<StrTestEntity> getEntities() {
+ return entities;
+ }
+
+ public void setEntities(Set<StrTestEntity> entities) {
+ this.entities = entities;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ OneToManyComponent that = (OneToManyComponent) o;
+
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+ if (entities != null ? !entities.equals(that.entities) : that.entities != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = entities != null ? entities.hashCode() : 0;
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "OneToManyComponent(data = " + data + ")";
+ }
+}
\ No newline at end of file
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponentTestEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponentTestEntity.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/relations/OneToManyComponentTestEntity.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,97 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components.relations;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class OneToManyComponentTestEntity {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Embedded
+ @Audited
+ private OneToManyComponent comp1;
+
+ public OneToManyComponentTestEntity() {
+ }
+
+ public OneToManyComponentTestEntity(Integer id, OneToManyComponent comp1) {
+ this.id = id;
+ this.comp1 = comp1;
+ }
+
+ public OneToManyComponentTestEntity(OneToManyComponent comp1) {
+ this.comp1 = comp1;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public OneToManyComponent getComp1() {
+ return comp1;
+ }
+
+ public void setComp1(OneToManyComponent comp1) {
+ this.comp1 = comp1;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ OneToManyComponentTestEntity that = (OneToManyComponentTestEntity) o;
+
+ if (comp1 != null ? !comp1.equals(that.comp1) : that.comp1 != null) return false;
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + (comp1 != null ? comp1.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "OTMCTE(id = " + id + ", comp1 = " + comp1 + ")";
+ }
+}
\ No newline at end of file
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -42,7 +42,7 @@
cfg.addAnnotatedClass(MixedAccessTypeEntity.class);
}
- @BeforeClass(dependsOnMethods = "init")
+ @Test
public void initData() {
EntityManager em = getEntityManager();
em.getTransaction().begin();
@@ -57,12 +57,12 @@
em.getTransaction().commit();
}
- @Test
+ @Test(dependsOnMethods = "initData")
public void testRevisionsCounts() {
assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(MixedAccessTypeEntity.class, id1));
}
- @Test
+ @Test(dependsOnMethods = "initData")
public void testHistoryOfId1() {
MixedAccessTypeEntity ver1 = new MixedAccessTypeEntity(id1, "data");
MixedAccessTypeEntity ver2 = new MixedAccessTypeEntity(id1, "data2");
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/basic/Simple.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/basic/Simple.java 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/basic/Simple.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -43,7 +43,7 @@
cfg.addAnnotatedClass(IntTestEntity.class);
}
- @BeforeClass(dependsOnMethods = "init")
+ @Test
public void initData() {
EntityManager em = getEntityManager();
em.getTransaction().begin();
@@ -58,12 +58,12 @@
em.getTransaction().commit();
}
- @Test
+ @Test(dependsOnMethods = "initData")
public void testRevisionsCounts() {
assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(IntTestEntity.class, id1));
}
- @Test
+ @Test(dependsOnMethods = "initData")
public void testHistoryOfId1() {
IntTestEntity ver1 = new IntTestEntity(10, id1);
IntTestEntity ver2 = new IntTestEntity(20, id1);
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/ManyToOneInComponent.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/ManyToOneInComponent.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/ManyToOneInComponent.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,109 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.components.relations;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.relations.ManyToOneComponentTestEntity;
+import org.hibernate.envers.test.entities.components.relations.ManyToOneComponent;
+import org.hibernate.envers.test.entities.StrTestEntity;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ManyToOneInComponent extends AbstractEntityTest {
+ private Integer mtocte_id1;
+ private Integer ste_id1;
+ private Integer ste_id2;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(ManyToOneComponentTestEntity.class);
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ }
+
+ @Test
+ public void initData() {
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ StrTestEntity ste1 = new StrTestEntity();
+ ste1.setStr("str1");
+
+ StrTestEntity ste2 = new StrTestEntity();
+ ste2.setStr("str2");
+
+ em.persist(ste1);
+ em.persist(ste2);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ ManyToOneComponentTestEntity mtocte1 = new ManyToOneComponentTestEntity(new ManyToOneComponent(ste1, "data1"));
+
+ em.persist(mtocte1);
+
+ em.getTransaction().commit();
+
+ // Revision 3
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ mtocte1 = em.find(ManyToOneComponentTestEntity.class, mtocte1.getId());
+ mtocte1.getComp1().setEntity(ste2);
+
+ em.getTransaction().commit();
+
+ mtocte_id1 = mtocte1.getId();
+ ste_id1 = ste1.getId();
+ ste_id2 = ste2.getId();
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testRevisionsCounts() {
+ assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(ManyToOneComponentTestEntity.class, mtocte_id1));
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testHistoryOfId1() {
+ StrTestEntity ste1 = getEntityManager().find(StrTestEntity.class, ste_id1);
+ StrTestEntity ste2 = getEntityManager().find(StrTestEntity.class, ste_id2);
+
+ ManyToOneComponentTestEntity ver2 = new ManyToOneComponentTestEntity(mtocte_id1, new ManyToOneComponent(ste1, "data1"));
+ ManyToOneComponentTestEntity ver3 = new ManyToOneComponentTestEntity(mtocte_id1, new ManyToOneComponent(ste2, "data1"));
+
+ assert getAuditReader().find(ManyToOneComponentTestEntity.class, mtocte_id1, 1) == null;
+ assert getAuditReader().find(ManyToOneComponentTestEntity.class, mtocte_id1, 2).equals(ver2);
+ assert getAuditReader().find(ManyToOneComponentTestEntity.class, mtocte_id1, 3).equals(ver3);
+ }
+}
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/OneToManyInComponent.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/OneToManyInComponent.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/relations/OneToManyInComponent.java 2009-01-20 08:13:54 UTC (rev 15802)
@@ -0,0 +1,112 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.components.relations;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.relations.OneToManyComponentTestEntity;
+import org.hibernate.envers.test.entities.components.relations.OneToManyComponent;
+import org.hibernate.envers.test.entities.StrTestEntity;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class OneToManyInComponent extends AbstractEntityTest {
+ private Integer otmcte_id1;
+ private Integer ste_id1;
+ private Integer ste_id2;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(OneToManyComponentTestEntity.class);
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ }
+
+ @Test
+ public void initData() {
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ StrTestEntity ste1 = new StrTestEntity();
+ ste1.setStr("str1");
+
+ StrTestEntity ste2 = new StrTestEntity();
+ ste2.setStr("str2");
+
+ em.persist(ste1);
+ em.persist(ste2);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ OneToManyComponentTestEntity otmcte1 = new OneToManyComponentTestEntity(new OneToManyComponent("data1"));
+ otmcte1.getComp1().getEntities().add(ste1);
+
+ em.persist(otmcte1);
+
+ em.getTransaction().commit();
+
+ // Revision 3
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ otmcte1 = em.find(OneToManyComponentTestEntity.class, otmcte1.getId());
+ otmcte1.getComp1().getEntities().add(ste2);
+
+ em.getTransaction().commit();
+
+ otmcte_id1 = otmcte1.getId();
+ ste_id1 = ste1.getId();
+ ste_id2 = ste2.getId();
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testRevisionsCounts() {
+ assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(OneToManyComponentTestEntity.class, otmcte_id1));
+ }
+
+ @Test(dependsOnMethods = "initData")
+ public void testHistoryOfId1() {
+ StrTestEntity ste1 = getEntityManager().find(StrTestEntity.class, ste_id1);
+ StrTestEntity ste2 = getEntityManager().find(StrTestEntity.class, ste_id2);
+
+ OneToManyComponentTestEntity ver2 = new OneToManyComponentTestEntity(otmcte_id1, new OneToManyComponent("data1"));
+ ver2.getComp1().getEntities().add(ste1);
+ OneToManyComponentTestEntity ver3 = new OneToManyComponentTestEntity(otmcte_id1, new OneToManyComponent("data1"));
+ ver3.getComp1().getEntities().add(ste1);
+ ver3.getComp1().getEntities().add(ste2);
+
+ assert getAuditReader().find(OneToManyComponentTestEntity.class, otmcte_id1, 1) == null;
+ assert getAuditReader().find(OneToManyComponentTestEntity.class, otmcte_id1, 2).equals(ver2);
+ assert getAuditReader().find(OneToManyComponentTestEntity.class, otmcte_id1, 3).equals(ver3);
+ }
+}
\ No newline at end of file
Modified: core/trunk/envers/src/test/resources/testng.xml
===================================================================
--- core/trunk/envers/src/test/resources/testng.xml 2009-01-19 23:42:12 UTC (rev 15801)
+++ core/trunk/envers/src/test/resources/testng.xml 2009-01-20 08:13:54 UTC (rev 15802)
@@ -9,6 +9,7 @@
<package name="org.hibernate.envers.test.integration.collection" />
<package name="org.hibernate.envers.test.integration.collection.mapkey" />
<package name="org.hibernate.envers.test.integration.components" />
+ <package name="org.hibernate.envers.test.integration.components.relations" />
<package name="org.hibernate.envers.test.integration.customtype" />
<package name="org.hibernate.envers.test.integration.data" />
<package name="org.hibernate.envers.test.integration.flush" />
More information about the hibernate-commits
mailing list