/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.envers.test.integration.reventity.trackmodifiedentities;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import org.hibernate.envers.CrossTypeRevisionChangesReader;
import org.hibernate.envers.RevisionType;
import org.hibernate.envers.configuration.EnversSettings;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.StrIntTestEntity;
import org.hibernate.envers.test.entities.StrTestEntity;
import org.hibernate.envers.test.tools.TestTools;
import org.hibernate.envers.tools.Pair;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Table;
import org.junit.Test;
/**
* Tests proper behavior of tracking modified entity names when {@code org.hibernate.envers.track_entities_changed_in_revision}
* parameter is set to {@code true}.
*
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
@SuppressWarnings({"unchecked"})
public class DefaultTrackingEntitiesTest extends BaseEnversJPAFunctionalTestCase {
private Integer steId = null;
private Integer siteId = null;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {StrTestEntity.class, StrIntTestEntity.class};
}
@Override
public void addConfigOptions(Map configuration) {
super.addConfigOptions( configuration );
configuration.put( EnversSettings.TRACK_ENTITIES_CHANGED_IN_REVISION, "true" );
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
// Revision 1 - Adding two entities
em.getTransaction().begin();
StrTestEntity ste = new StrTestEntity( "x" );
StrIntTestEntity site = new StrIntTestEntity( "y", 1 );
em.persist( ste );
em.persist( site );
steId = ste.getId();
siteId = site.getId();
em.getTransaction().commit();
// Revision 2 - Modifying one entity
em.getTransaction().begin();
site = em.find( StrIntTestEntity.class, siteId );
site.setNumber( 2 );
em.getTransaction().commit();
// Revision 3 - Deleting both entities
em.getTransaction().begin();
ste = em.find( StrTestEntity.class, steId );
site = em.find( StrIntTestEntity.class, siteId );
em.remove( ste );
em.remove( site );
em.getTransaction().commit();
}
@Test
public void testRevEntityTableCreation() {
for ( Table table : metadata().collectTableMappings() ) {
if ( "REVCHANGES".equals( table.getName() ) ) {
assert table.getColumnSpan() == 2;
assert table.getColumn( new Column( "REV" ) ) != null;
assert table.getColumn( new Column( "ENTITYNAME" ) ) != null;
return;
}
}
assert false;
}
@Test
public void testTrackAddedEntities() {
StrTestEntity ste = new StrTestEntity( "x", steId );
StrIntTestEntity site = new StrIntTestEntity( "y", 1, siteId );
assert TestTools.checkCollection( getCrossTypeRevisionChangesReader().findEntities( 1 ), ste, site );
}
@Test
public void testTrackModifiedEntities() {
StrIntTestEntity site = new StrIntTestEntity( "y", 2, siteId );
assert TestTools.checkCollection( getCrossTypeRevisionChangesReader().findEntities( 2 ), site );
}
@Test
public void testTrackDeletedEntities() {
StrTestEntity ste = new StrTestEntity( null, steId );
StrIntTestEntity site = new StrIntTestEntity( null, null, siteId );
assert TestTools.checkCollection( getCrossTypeRevisionChangesReader().findEntities( 3 ), site, ste );
}
@Test
public void testFindChangesInInvalidRevision() {
assert getCrossTypeRevisionChangesReader().findEntities( 4 ).isEmpty();
}
@Test
public void testTrackAddedEntitiesGroupByRevisionType() {
StrTestEntity ste = new StrTestEntity( "x", steId );
StrIntTestEntity site = new StrIntTestEntity( "y", 1, siteId );
Map<RevisionType, List<Object>> result = getCrossTypeRevisionChangesReader().findEntitiesGroupByRevisionType( 1 );
assert TestTools.checkCollection( result.get( RevisionType.ADD ), site, ste );
assert TestTools.checkCollection( result.get( RevisionType.MOD ) );
assert TestTools.checkCollection( result.get( RevisionType.DEL ) );
}
@Test
public void testTrackModifiedEntitiesGroupByRevisionType() {
StrIntTestEntity site = new StrIntTestEntity( "y", 2, siteId );
Map<RevisionType, List<Object>> result = getCrossTypeRevisionChangesReader().findEntitiesGroupByRevisionType( 2 );
assert TestTools.checkCollection( result.get( RevisionType.ADD ) );
assert TestTools.checkCollection( result.get( RevisionType.MOD ), site );
assert TestTools.checkCollection( result.get( RevisionType.DEL ) );
}
@Test
public void testTrackDeletedEntitiesGroupByRevisionType() {
StrTestEntity ste = new StrTestEntity( null, steId );
StrIntTestEntity site = new StrIntTestEntity( null, null, siteId );
Map<RevisionType, List<Object>> result = getCrossTypeRevisionChangesReader().findEntitiesGroupByRevisionType( 3 );
assert TestTools.checkCollection( result.get( RevisionType.ADD ) );
assert TestTools.checkCollection( result.get( RevisionType.MOD ) );
assert TestTools.checkCollection( result.get( RevisionType.DEL ), site, ste );
}
@Test
public void testFindChangedEntitiesByRevisionTypeADD() {
StrTestEntity ste = new StrTestEntity( "x", steId );
StrIntTestEntity site = new StrIntTestEntity( "y", 1, siteId );
assert TestTools.checkCollection(
getCrossTypeRevisionChangesReader().findEntities( 1, RevisionType.ADD ),
ste,
site
);
}
@Test
public void testFindChangedEntitiesByRevisionTypeMOD() {
StrIntTestEntity site = new StrIntTestEntity( "y", 2, siteId );
assert TestTools.checkCollection(
getCrossTypeRevisionChangesReader().findEntities( 2, RevisionType.MOD ),
site
);
}
@Test
public void testFindChangedEntitiesByRevisionTypeDEL() {
StrTestEntity ste = new StrTestEntity( null, steId );
StrIntTestEntity site = new StrIntTestEntity( null, null, siteId );
assert TestTools.checkCollection(
getCrossTypeRevisionChangesReader().findEntities( 3, RevisionType.DEL ),
ste,
site
);
}
@Test
public void testFindEntityTypesChangedInRevision() {
assert TestTools.makeSet(
Pair.make( StrTestEntity.class.getName(), StrTestEntity.class ),
Pair.make( StrIntTestEntity.class.getName(), StrIntTestEntity.class )
)
.equals( getCrossTypeRevisionChangesReader().findEntityTypes( 1 ) );
assert TestTools.makeSet( Pair.make( StrIntTestEntity.class.getName(), StrIntTestEntity.class ) )
.equals( getCrossTypeRevisionChangesReader().findEntityTypes( 2 ) );
assert TestTools.makeSet(
Pair.make( StrTestEntity.class.getName(), StrTestEntity.class ),
Pair.make( StrIntTestEntity.class.getName(), StrIntTestEntity.class )
)
.equals( getCrossTypeRevisionChangesReader().findEntityTypes( 3 ) );
}
private CrossTypeRevisionChangesReader getCrossTypeRevisionChangesReader() {
return getAuditReader().getCrossTypeRevisionChangesReader();
}
}