[hibernate-commits] Hibernate SVN: r15899 - in core/trunk/envers/src: main/java/org/hibernate/envers/configuration/metadata/reader and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Feb 5 03:22:40 EST 2009


Author: adamw
Date: 2009-02-05 03:22:40 -0500 (Thu, 05 Feb 2009)
New Revision: 15899

Added:
   core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverride.java
   core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverrides.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponent.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentNamingTest.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentTestEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestAlternateEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntitySuperClass.java
Modified:
   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/PropertyAuditingData.java
Log:
HHH-3729: applying patch with tests

Thank you to Erik-Berndt Scheper for providing the patches!

Added: core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverride.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverride.java	                        (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverride.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,41 @@
+package org.hibernate.envers;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * The {@code AuditingOverride} annotation is used to override the auditing
+ * behavior of a field (or property) inside an embedded component.
+ *
+ * @author Erik-Berndt Scheper
+ * @see javax.persistence.Embedded
+ * @see javax.persistence.Embeddable
+ * @see javax.persistence.MappedSuperclass  
+ * @see javax.persistence.AssociationOverride
+ * @see AuditJoinTable
+ */
+ at Target({ TYPE, METHOD, FIELD })
+ at Retention(RUNTIME)
+public @interface AuditOverride {
+
+	/**
+	 * @return <strong>Required</strong> Name of the field (or property) whose mapping
+	 * is being overridden.
+	 */
+	String name();
+
+	/**
+	 * @return Indicates if the field (or property) is audited; defaults to {@code true}.
+	 */
+	boolean isAudited() default true;
+
+	/**
+	 * @return New {@link AuditJoinTable} used for this field (or property). Its value
+	 * is ignored if {@link #isAudited()} equals to {@code false}.
+	 */
+	AuditJoinTable auditJoinTable() default @AuditJoinTable;
+}

Added: core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverrides.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverrides.java	                        (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/AuditOverrides.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,32 @@
+package org.hibernate.envers;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * The {@code AuditingOverrides} annotation is used to override the auditing
+ * behavior for one ore more fields (or properties) inside an embedded
+ * component.
+ *
+ * @author Erik-Berndt Scheper
+ * @see javax.persistence.Embedded
+ * @see javax.persistence.Embeddable
+ * @see javax.persistence.MappedSuperclass
+ * @see javax.persistence.AssociationOverride
+ * @see javax.persistence.AssociationOverrides
+ * @see AuditJoinTable
+ * @see AuditOverride
+ */
+ at Target({ TYPE, METHOD, FIELD })
+ at Retention(RUNTIME)
+public @interface AuditOverrides {
+	/**
+	 * @return An array of {@link AuditOverride} values, to define the new auditing
+	 * behavior.
+	 */
+	AuditOverride[] value();
+}

Modified: 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	2009-02-05 03:48:51 UTC (rev 15898)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -1,26 +1,31 @@
 package org.hibernate.envers.configuration.metadata.reader;
 
+import static org.hibernate.envers.tools.Tools.newHashSet;
+
+import java.lang.annotation.Annotation;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.JoinColumn;
+import javax.persistence.MapKey;
+import javax.persistence.Version;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.envers.AuditJoinTable;
+import org.hibernate.envers.AuditOverride;
+import org.hibernate.envers.AuditOverrides;
+import org.hibernate.envers.Audited;
 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.Component;
 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}
@@ -28,6 +33,7 @@
  * {@link org.hibernate.envers.configuration.metadata.reader.AuditedPropertiesHolder},
  * filling all the auditing data.
  * @author Adam Warski (adam at warski dot org)
+ * @author Erik-Berndt Scheper
  */
 public class AuditedPropertiesReader {
 	private final ModificationStore defaultStore;
@@ -97,7 +103,6 @@
 					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,
@@ -164,6 +169,10 @@
 		propertyData.setAccessType(accessType);
 
 		addPropertyJoinTables(property, propertyData);
+		addPropertyAuditingOverrides(property, propertyData);
+		if (!processPropertyAuditingOverrides(property, propertyData)) {
+			return false; // not audited due to AuditOverride annotation
+		}
 		addPropertyMapKey(property, propertyData);
 
 		return true;
@@ -177,6 +186,7 @@
 	}
 
 	private void addPropertyJoinTables(XProperty property, PropertyAuditingData propertyData) {
+		// first set the join table based on the AuditJoinTable annotation
 		AuditJoinTable joinTable = property.getAnnotation(AuditJoinTable.class);
 		if (joinTable != null) {
 			propertyData.setJoinTable(joinTable);
@@ -185,6 +195,54 @@
 		}
 	}
 
+	/***
+	 * Add the {@link org.hibernate.envers.AuditOverride} annotations.
+	 * 
+	 * @param property the property being processed
+	 * @param propertyData the Envers auditing data for this property
+	 */
+	private void addPropertyAuditingOverrides(XProperty property, PropertyAuditingData propertyData) {
+		AuditOverride annotationOverride = property.getAnnotation(AuditOverride.class);
+		if (annotationOverride != null) {
+			propertyData.addAuditingOverride(annotationOverride);
+		}
+		AuditOverrides annotationOverrides = property.getAnnotation(AuditOverrides.class);
+		if (annotationOverrides != null) {
+			propertyData.addAuditingOverrides(annotationOverrides);
+		}
+	}
+
+	/**
+	 * Process the {@link org.hibernate.envers.AuditOverride} annotations for this property.
+	 * 
+	 * @param property
+	 *            the property for which the {@link org.hibernate.envers.AuditOverride}
+	 *            annotations are being processed
+	 * @param propertyData
+	 *            the Envers auditing data for this property
+	 * @return {@code false} if isAudited() of the override annotation was set to 
+	 */
+	private boolean processPropertyAuditingOverrides(XProperty property, PropertyAuditingData propertyData) {
+		// if this property is part of a component, process all override annotations
+		if (this.auditedPropertiesHolder instanceof ComponentAuditingData) {
+			List<AuditOverride> overrides = ((ComponentAuditingData) this.auditedPropertiesHolder).getAuditingOverrides();
+			for (AuditOverride override : overrides) {
+				if (property.getName().equals(override.name())) {
+					// the override applies to this property
+					if (!override.isAudited()) {
+						return false; 
+					} else {
+						if (override.auditJoinTable() != null) {
+							propertyData.setJoinTable(override.auditJoinTable());
+						}
+					}
+				}
+			}
+			
+		}
+		return true;
+	}
+
 	private static AuditJoinTable DEFAULT_AUDIT_JOIN_TABLE = new AuditJoinTable() {
 		public String name() { return ""; }
 		public String schema() { return ""; }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java	2009-02-05 03:48:51 UTC (rev 15898)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/PropertyAuditingData.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -24,6 +24,11 @@
  */
 package org.hibernate.envers.configuration.metadata.reader;
 
+import java.util.List;
+import java.util.ArrayList;
+
+import org.hibernate.envers.AuditOverride;
+import org.hibernate.envers.AuditOverrides;
 import org.hibernate.envers.ModificationStore;
 import org.hibernate.envers.AuditJoinTable;
 import org.hibernate.envers.entities.PropertyData;
@@ -38,6 +43,7 @@
     private String mapKey;
     private AuditJoinTable joinTable;
     private String accessType;
+    private final List<AuditOverride> auditJoinTableOverrides = new ArrayList<AuditOverride>(0);
 
     public PropertyAuditingData() {
     }
@@ -100,4 +106,33 @@
     public PropertyData getPropertyData() {
         return new PropertyData(name, beanName, accessType, store);
     }
+
+	public List<AuditOverride> getAuditingOverrides() {
+		return auditJoinTableOverrides; 
+	}
+
+	public void addAuditingOverride(AuditOverride annotation) {
+		if (annotation != null) {
+			String overrideName = annotation.name();
+			boolean present = false;
+			for (AuditOverride current : auditJoinTableOverrides) {
+				if (current.name().equals(overrideName)) {
+					present = true;
+					break;
+				}
+			}
+			if (!present) {
+				auditJoinTableOverrides.add(annotation);
+			}
+		}
+	}
+
+	public void addAuditingOverrides(AuditOverrides annotationOverrides) {
+		if (annotationOverrides != null) {
+			for (AuditOverride annotation : annotationOverrides.value()) {
+				addAuditingOverride(annotation);
+			}
+		}
+	}
+
 }

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponent.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponent.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponent.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,81 @@
+package org.hibernate.envers.test.integration.naming;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.FetchMode;
+
+/**
+ * An embeddable component containing a list of
+ * {@link VersionsJoinTableRangeTestEntitySuperClass}-instances
+ * 
+ * @author Erik-Berndt Scheper
+ * @param <T>
+ */
+ at Embeddable
+public final class VersionsJoinTableRangeComponent<T extends VersionsJoinTableRangeTestEntitySuperClass> {
+
+	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+	@org.hibernate.annotations.Fetch(value = FetchMode.SUBSELECT) 
+	@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
+	@JoinColumn(name = "VJTRCTE_ID", insertable = true, updatable = false, nullable = false)
+//	Note:	If this is processed without override annotation, then we should get a 
+//			org.hibernate.DuplicateMappingException: 
+//			Duplicate class/entity mapping JOIN_TABLE_COMPONENT_1_AUD
+	@org.hibernate.envers.AuditJoinTable(name = "JOIN_TABLE_COMPONENT_1_AUD", inverseJoinColumns = @JoinColumn(name = "VJTRTE_ID"))
+	private List<T> range = new ArrayList<T>();
+
+	// ********************** Accessor Methods ********************** //
+
+	protected List<T> getRange() {
+		return this.range;
+	}
+
+	// ********************** Common Methods ********************** //
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((range == null) ? 0 : range.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		VersionsJoinTableRangeComponent<?> other = (VersionsJoinTableRangeComponent<?>) obj;
+		if (range == null) {
+			if (other.range != null)
+				return false;
+		} else if (!range.equals(other.range))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder output = new StringBuilder();
+
+		output.append("VersionsJoinTableRangeComponent {");
+		output.append(" range = \"");
+		for (T instance : range) {
+			output.append(instance).append("\n");
+		}
+		output.append("\"}");
+
+		return output.toString();
+	}
+
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentNamingTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentNamingTest.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentNamingTest.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,295 @@
+/*
+ * 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.naming;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.Component1;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.PersistentClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for {@link VersionsJoinTableRangeComponentTestEntity}, to test
+ * various {@link org.hibernate.envers.AuditOverride} annotations.
+ * 
+ * @author Erik-Berndt Scheper
+ */
+public class VersionsJoinTableRangeComponentNamingTest extends
+		AbstractEntityTest {
+	private Integer vjrcte_id;
+	private Integer vjtrte_id;
+	private Integer vjtrtae_id1;
+
+	public void configure(Ejb3Configuration cfg) {
+		cfg.addAnnotatedClass(VersionsJoinTableRangeComponentTestEntity.class);
+		cfg.addAnnotatedClass(VersionsJoinTableRangeTestEntitySuperClass.class);
+		cfg.addAnnotatedClass(VersionsJoinTableRangeTestEntity.class);
+		cfg.addAnnotatedClass(VersionsJoinTableRangeTestAlternateEntity.class);
+	}
+
+	@BeforeClass(dependsOnMethods = "init")
+	public void initData() {
+
+		// Revision 1
+		EntityManager em = getEntityManager();
+		em.getTransaction().begin();
+
+		// create an instance of the test entity
+		VersionsJoinTableRangeComponentTestEntity vjrcte = new VersionsJoinTableRangeComponentTestEntity();
+		em.persist(vjrcte);
+		em.getTransaction().commit();
+
+		// Revision 2
+		em.getTransaction().begin();
+
+		vjrcte = em.find(VersionsJoinTableRangeComponentTestEntity.class,
+				vjrcte.getId());
+
+		// create a component containing a list of
+		// VersionsJoinTableRangeTestEntity-instances
+		VersionsJoinTableRangeTestEntity vjtrte = new VersionsJoinTableRangeTestEntity();
+		vjtrte.setGenericValue("generic1");
+		vjtrte.setValue("value1");
+		// and add it to the test entity
+		vjrcte.getComponent1().getRange().add(vjtrte);
+
+		// create a second component containing a list of
+		// VersionsJoinTableRangeTestAlternateEntity-instances
+		VersionsJoinTableRangeTestAlternateEntity vjtrtae1 = new VersionsJoinTableRangeTestAlternateEntity();
+		vjtrtae1.setGenericValue("generic2");
+		vjtrtae1.setAlternateValue("alternateValue2");
+		// and add it to the test entity
+		vjrcte.getComponent2().getRange().add(vjtrtae1);
+
+		// create a third component, and add it to the test entity
+		Component1 simpleComponent = new Component1("string1", "string2");
+		vjrcte.setComponent3(simpleComponent);
+
+		em.persist(vjtrte);
+		em.persist(vjtrtae1);
+		em.persist(vjrcte);
+
+		em.getTransaction().commit();
+
+		// Revision 2
+		em.getTransaction().begin();
+
+		vjrcte = em.find(VersionsJoinTableRangeComponentTestEntity.class,
+				vjrcte.getId());
+		vjtrte = em
+				.find(VersionsJoinTableRangeTestEntity.class, vjtrte.getId());
+		vjtrtae1 = em.find(VersionsJoinTableRangeTestAlternateEntity.class,
+				vjtrtae1.getId());
+
+		assert vjrcte != null;
+		assert vjtrte != null;
+		assert vjtrtae1 != null;
+
+		List<VersionsJoinTableRangeTestEntity> ent1List = vjrcte
+				.getComponent1().getRange();
+		assert ent1List.size() == 1;
+		assert vjtrte.equals(ent1List.get(0));
+
+		List<VersionsJoinTableRangeTestAlternateEntity> ent2List = vjrcte
+				.getComponent2().getRange();
+		assert ent2List.size() == 1;
+		assert vjtrtae1.equals(ent2List.get(0));
+
+		em.getTransaction().commit();
+
+		vjrcte_id = vjrcte.getId();
+		vjtrte_id = vjtrte.getId();
+		vjtrtae_id1 = vjtrtae1.getId();
+	}
+
+	@Test
+	public void testRevisionsCounts() {
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						VersionsJoinTableRangeComponentTestEntity.class,
+						vjrcte_id));
+		assert Arrays.asList(2).equals(
+				getAuditReader().getRevisions(
+						VersionsJoinTableRangeTestEntity.class, vjtrte_id));
+		assert Arrays.asList(2).equals(
+				getAuditReader().getRevisions(
+						VersionsJoinTableRangeTestAlternateEntity.class,
+						vjtrtae_id1));
+	}
+
+	@Test
+	public void testHistoryOfUniId1() {
+		VersionsJoinTableRangeTestEntity vjtrte = getEntityManager().find(
+				VersionsJoinTableRangeTestEntity.class, vjtrte_id);
+		VersionsJoinTableRangeTestAlternateEntity vjtrtae = getEntityManager()
+				.find(VersionsJoinTableRangeTestAlternateEntity.class,
+						vjtrtae_id1);
+
+		VersionsJoinTableRangeComponentTestEntity rev1 = getAuditReader().find(
+				VersionsJoinTableRangeComponentTestEntity.class, vjrcte_id, 1);
+		VersionsJoinTableRangeComponentTestEntity rev2 = getAuditReader().find(
+				VersionsJoinTableRangeComponentTestEntity.class, vjrcte_id, 2);
+
+		assert rev1.getComponent1().getRange().size() == 0;
+		assert rev1.getComponent2().getRange().size() == 0;
+
+		assert rev2.getComponent1().getRange().size() == 1;
+		assert rev2.getComponent1().getRange().get(0).equals(vjtrte);
+		assert rev2.getComponent2().getRange().size() == 1;
+		assert rev2.getComponent2().getRange().get(0).equals(vjtrtae);
+	}
+
+	/* The Audit join tables we expect */
+	private final static String COMPONENT_1_AUDIT_JOIN_TABLE_NAME = "JOIN_TABLE_COMPONENT_1_AUD";
+	private final static String COMPONENT_2_AUDIT_JOIN_TABLE_NAME = "JOIN_TABLE_COMPONENT_2_AUD";
+
+	/* The Audit join tables that should NOT be there */
+	private final static String UNMODIFIED_COMPONENT_1_AUDIT_JOIN_TABLE_NAME = "VersionsJoinTableRangeComponentTestEntity_VersionsJoinTableRangeTestEntity_AUD";
+	private final static String UNMODIFIED_COMPONENT_2_AUDIT_JOIN_TABLE_NAME = "VersionsJoinTableRangeComponentTestEntity_VersionsJoinTableRangeTestAlternateEntity_AUD";
+
+	@Test
+	public void testExpectedTableNameComponent1() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				COMPONENT_1_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass != null;
+		assert COMPONENT_1_AUDIT_JOIN_TABLE_NAME.equals(auditClass.getTable()
+				.getName());
+	}
+
+	@Test
+	public void testExpectedTableNameComponent2() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				COMPONENT_2_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass != null;
+		assert COMPONENT_2_AUDIT_JOIN_TABLE_NAME.equals(auditClass.getTable()
+				.getName());
+	}
+
+	@Test
+	public void testWrongTableNameComponent1() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				UNMODIFIED_COMPONENT_1_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass == null;
+	}
+
+	@Test
+	public void testWrongTableNameComponent2() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				UNMODIFIED_COMPONENT_2_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass == null;
+	}
+
+	@Test
+	public void testJoinColumnNamesComponent1() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				COMPONENT_1_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass != null;
+
+		@SuppressWarnings( { "unchecked" })
+		Iterator<Column> columns = auditClass.getTable().getColumnIterator();
+
+		boolean id1Found = false;
+		boolean id2Found = false;
+
+		while (columns.hasNext()) {
+			Column column = columns.next();
+			if ("VJTRCTE1_ID".equals(column.getName())) {
+				id1Found = true;
+			}
+
+			if ("VJTRTE_ID".equals(column.getName())) {
+				id2Found = true;
+			}
+		}
+
+		assert id1Found && id2Found;
+	}
+
+	@Test
+	public void testJoinColumnNamesComponent2() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				COMPONENT_2_AUDIT_JOIN_TABLE_NAME);
+		assert auditClass != null;
+
+		@SuppressWarnings( { "unchecked" })
+		Iterator<Column> columns = auditClass.getTable().getColumnIterator();
+
+		boolean id1Found = false;
+		boolean id2Found = false;
+
+		while (columns.hasNext()) {
+			Column column = columns.next();
+			if ("VJTRCTE2_ID".equals(column.getName())) {
+				id1Found = true;
+			}
+
+			if ("VJTRTAE_ID".equals(column.getName())) {
+				id2Found = true;
+			}
+		}
+
+		assert id1Found && id2Found;
+	}
+
+	/**
+	 * Verify that
+	 * {@link VersionsJoinTableRangeComponentTestEntity#getComponent3()} is
+	 * partially audited.
+	 */
+	@Test
+	public void testOverrideNotAudited() {
+		PersistentClass auditClass = getCfg().getClassMapping(
+				VersionsJoinTableRangeComponentTestEntity.class.getName()
+						+ "_AUD");
+		assert auditClass != null;
+
+		@SuppressWarnings( { "unchecked" })
+		Iterator<Column> columns = auditClass.getTable().getColumnIterator();
+
+		boolean auditColumn1Found = false;
+		boolean auditColumn2Found = false;
+
+		while (columns.hasNext()) {
+			Column column = columns.next();
+			if ("STR1".equals(column.getName())) {
+				auditColumn1Found = true;
+			}
+
+			if ("STR2".equals(column.getName())) {
+				auditColumn2Found = true;
+			}
+		}
+
+		assert auditColumn1Found && !auditColumn2Found;
+	}
+
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentTestEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentTestEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeComponentTestEntity.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,190 @@
+package org.hibernate.envers.test.integration.naming;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Table;
+
+import org.hibernate.envers.test.entities.components.Component1;
+import org.hibernate.envers.AuditOverride;
+import org.hibernate.envers.AuditOverrides;
+
+/**
+ * Test entity, containing two embedded components, which each contain a list of
+ * {@link VersionsJoinTableRangeTestEntitySuperClass}-instances
+ * 
+ * @author Erik-Berndt Scheper
+ */
+ at Entity
+ at Table(name = "COMPONENT_TEST_ENTITY")
+public class VersionsJoinTableRangeComponentTestEntity {
+	@Id
+	@GeneratedValue
+	@Column(name = "ID")
+	private Integer id;
+
+	/**
+	 * An embedded component, containing a list of
+	 * {@link VersionsJoinTableRangeTestEntity}-instances.
+	 */
+	@Embedded
+	@AssociationOverride(name = "range", joinColumns = { @JoinColumn(name = "VJTRCTE1_ID", insertable = true, updatable = false, nullable = false) })
+	@org.hibernate.envers.Audited
+	@AuditOverride(name = "range", auditJoinTable = @org.hibernate.envers.AuditJoinTable(name = "JOIN_TABLE_COMPONENT_1_AUD", inverseJoinColumns = @JoinColumn(name = "VJTRTE_ID")))
+	private VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestEntity> component1 = new VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestEntity>();
+
+	/**
+	 * An embedded component, containing a list of
+	 * {@link VersionsJoinTableRangeTestAlternateEntity}-instances.
+	 */
+	@Embedded
+	@AssociationOverride(name = "range", joinColumns = { @JoinColumn(name = "VJTRCTE2_ID", insertable = true, updatable = false, nullable = false) })
+	@org.hibernate.envers.Audited
+	@AuditOverrides(value = { @AuditOverride(name = "range", auditJoinTable = @org.hibernate.envers.AuditJoinTable(name = "JOIN_TABLE_COMPONENT_2_AUD", inverseJoinColumns = @JoinColumn(name = "VJTRTAE_ID"))) })
+	private VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestAlternateEntity> component2 = new VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestAlternateEntity>();
+
+	/**
+	 * An embedded component, containing a list of NOT AUDITED
+	 * {@link VersionsJoinTableRangeTestAlternateEntity}-instances.
+	 */
+    @Embedded
+    @AttributeOverrides(value={@AttributeOverride(name="str1", column=@Column(name="STR1")), @AttributeOverride(name="str2", column=@Column(name="STR2"))})
+	@org.hibernate.envers.Audited
+	@AuditOverrides(value={@AuditOverride(name="str2", isAudited = false)})
+    private Component1 component3;
+
+	/**
+	 * Default constructor
+	 */
+	public VersionsJoinTableRangeComponentTestEntity() {
+		super();
+	}
+
+	/**
+	 * @return the id
+	 */
+	public Integer getId() {
+		return id;
+	}
+
+	/**
+	 * @param id
+	 *            the id to set
+	 */
+	protected void setId(Integer id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return the component1
+	 */
+	public VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestEntity> getComponent1() {
+		return component1;
+	}
+
+	/**
+	 * @param component1
+	 *            the component1 to set
+	 */
+	public void setComponent1(
+			VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestEntity> component1) {
+		this.component1 = component1;
+	}
+
+	/**
+	 * @return the component2
+	 */
+	public VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestAlternateEntity> getComponent2() {
+		return component2;
+	}
+
+	/**
+	 * @param component2
+	 *            the component2 to set
+	 */
+	public void setComponent2(
+			VersionsJoinTableRangeComponent<VersionsJoinTableRangeTestAlternateEntity> component2) {
+		this.component2 = component2;
+	}
+
+	/**
+	 * @return the component3
+	 */
+	public Component1 getComponent3() {
+		return component3;
+	}
+
+	/**
+	 * @param component3
+	 *            the component3 to set
+	 */
+	public void setComponent3(Component1 component3) {
+		this.component3 = component3;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((component1 == null) ? 0 : component1.hashCode());
+		result = prime * result
+				+ ((component2 == null) ? 0 : component2.hashCode());
+		result = prime * result
+				+ ((component3 == null) ? 0 : component3.hashCode());
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		VersionsJoinTableRangeComponentTestEntity other = (VersionsJoinTableRangeComponentTestEntity) obj;
+		if (component1 == null) {
+			if (other.component1 != null)
+				return false;
+		} else if (!component1.equals(other.component1))
+			return false;
+		if (component2 == null) {
+			if (other.component2 != null)
+				return false;
+		} else if (!component2.equals(other.component2))
+			return false;
+		if (component3 == null) {
+			if (other.component3 != null)
+				return false;
+		} else if (!component3.equals(other.component3))
+			return false;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder output = new StringBuilder();
+
+		output.append("VersionsJoinTableRangeComponentTestEntity {");
+		output.append(" id = \"").append(this.getId()).append("\",");
+		output.append(" component1 = \"").append(this.component1)
+				.append("\", ");
+		output.append(" component2 = \"").append(this.component2).append("\"}");
+		output.append(" component3 = \"").append(this.component3).append("\"}");
+		return output.toString();
+	}
+
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestAlternateEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestAlternateEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestAlternateEntity.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,82 @@
+package org.hibernate.envers.test.integration.naming;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * Alternate implementation of mapped superclass for Audit join table test.
+ * 
+ * @author Erik-Berndt Scheper
+ * @see VersionsJoinTableRangeTestEntity
+ * @see VersionsJoinTableRangeTestEntitySuperClass
+ */
+ at Entity
+ at Table(name = "RANGE_TEST_ALTERNATE_ENTITY")
+ at org.hibernate.envers.Audited
+public class VersionsJoinTableRangeTestAlternateEntity extends
+		VersionsJoinTableRangeTestEntitySuperClass {
+
+	private String alternateValue;
+
+	/**
+	 * Default constructor
+	 */
+	public VersionsJoinTableRangeTestAlternateEntity() {
+		super();
+	}
+
+	/**
+	 * @return the alternateValue
+	 */
+	public String getAlternateValue() {
+		return alternateValue;
+	}
+
+	/**
+	 * @param alternateValue
+	 *            the alternateValue to set
+	 */
+	public void setAlternateValue(String alternateValue) {
+		this.alternateValue = alternateValue;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result
+				+ ((alternateValue == null) ? 0 : alternateValue.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		VersionsJoinTableRangeTestAlternateEntity other = (VersionsJoinTableRangeTestAlternateEntity) obj;
+		if (alternateValue == null) {
+			if (other.alternateValue != null)
+				return false;
+		} else if (!alternateValue.equals(other.alternateValue))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder output = new StringBuilder();
+
+		output.append("VersionsJoinTableRangeComponentTestEntity {");
+		output.append(" id = \"").append(getId()).append("\", ");
+		output.append(" genericValue = \"").append(getGenericValue()).append(
+				"\", ");
+		output.append(" alternateValue = \"").append(this.alternateValue)
+				.append("\"}");
+		return output.toString();
+	}
+
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntity.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,80 @@
+package org.hibernate.envers.test.integration.naming;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * Concrete implementation of mapped superclass for Audit join table test.
+ * 
+ * @author Erik-Berndt Scheper
+ * @see VersionsJoinTableRangeTestAlternateEntity
+ * @see VersionsJoinTableRangeTestEntitySuperClass
+ */
+ at Entity
+ at Table(name = "RANGE_TEST_ENTITY")
+ at org.hibernate.envers.Audited
+public class VersionsJoinTableRangeTestEntity extends
+		VersionsJoinTableRangeTestEntitySuperClass {
+
+	private String value;
+
+	/**
+	 * Default constructor
+	 */
+	public VersionsJoinTableRangeTestEntity() {
+		super();
+	}
+
+	/**
+	 * @return the value
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * @param value
+	 *            the value to set
+	 */
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result + ((value == null) ? 0 : value.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		VersionsJoinTableRangeTestEntity other = (VersionsJoinTableRangeTestEntity) obj;
+		if (value == null) {
+			if (other.value != null)
+				return false;
+		} else if (!value.equals(other.value))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder output = new StringBuilder();
+
+		output.append("VersionsJoinTableRangeComponentTestEntity {");
+		output.append(" id = \"").append(getId()).append("\", ");
+		output.append(" genericValue = \"").append(getGenericValue()).append(
+				"\", ");
+		output.append(" value = \"").append(this.value).append("\"}");
+		return output.toString();
+	}
+
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntitySuperClass.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntitySuperClass.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/naming/VersionsJoinTableRangeTestEntitySuperClass.java	2009-02-05 08:22:40 UTC (rev 15899)
@@ -0,0 +1,85 @@
+package org.hibernate.envers.test.integration.naming;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Mapped superclass for Audit join table test.
+ * 
+ * @author Erik-Berndt Scheper
+ */
+ at MappedSuperclass
+ at org.hibernate.annotations.ForceDiscriminator
+ at org.hibernate.envers.Audited
+public abstract class VersionsJoinTableRangeTestEntitySuperClass {
+
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	private String genericValue;
+
+	/**
+	 * @return the id
+	 */
+	public Integer getId() {
+		return id;
+	}
+
+	/**
+	 * @param id
+	 *            the id to set
+	 */
+	protected void setId(Integer id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return the genericValue
+	 */
+	public String getGenericValue() {
+		return genericValue;
+	}
+
+	/**
+	 * @param genericValue
+	 *            the genericValue to set
+	 */
+	public void setGenericValue(String genericValue) {
+		this.genericValue = genericValue;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((genericValue == null) ? 0 : genericValue.hashCode());
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		VersionsJoinTableRangeTestEntitySuperClass other = (VersionsJoinTableRangeTestEntitySuperClass) obj;
+		if (genericValue == null) {
+			if (other.genericValue != null)
+				return false;
+		} else if (!genericValue.equals(other.genericValue))
+			return false;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		return true;
+	}
+
+}




More information about the hibernate-commits mailing list