/*
* 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 org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.envers.test.AbstractEntityTest;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.components.Component1;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.PersistentClass;
import org.junit.Test;
import javax.persistence.EntityManager;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* 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);
}
@Test
@Priority(10)
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;
}
}