/*
* 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.components.dynamic;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import org.hibernate.MappingException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.envers.configuration.EnversSettings;
import org.hibernate.envers.internal.tools.StringTools;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.test.BaseEnversFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.testing.ServiceRegistryBuilder;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import junit.framework.Assert;
/**
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
* @author Lukasz Zuchowski (author at zuchos dot com)
*/
@TestForIssue(jiraKey = "HHH-8049")
public class AuditedDynamicComponentTest extends BaseEnversFunctionalTestCase {
@Override
protected String[] getMappings() {
return new String[] { "mappings/dynamicComponents/mapAudited.hbm.xml" };
}
//@Test
public void testAuditedDynamicComponentFailure() throws URISyntaxException {
final Configuration config = new Configuration();
final URL hbm = Thread.currentThread().getContextClassLoader().getResource(
"mappings/dynamicComponents/mapAudited.hbm.xml"
);
config.addFile( new File( hbm.toURI() ) );
final String auditStrategy = getAuditStrategy();
if ( !StringTools.isEmpty( auditStrategy ) ) {
config.setProperty( EnversSettings.AUDIT_STRATEGY, auditStrategy );
}
final ServiceRegistry serviceRegistry = ServiceRegistryBuilder.buildServiceRegistry( config.getProperties() );
try {
config.buildSessionFactory( serviceRegistry );
Assert.fail( "MappingException expected" );
}
catch ( MappingException e ) {
Assert.assertEquals(
"Audited dynamic-component properties are not supported. Consider applying @NotAudited annotation to "
+ AuditedDynamicComponentEntity.class.getName() + "#customFields.",
e.getMessage()
);
}
finally {
ServiceRegistryBuilder.destroy( serviceRegistry );
}
}
@Test
@Priority(10)
public void initData() {
Session session = openSession();
SimpleEntity simpleEntity = new SimpleEntity( 1L, "Very simple entity" );
// Revision 1
session.getTransaction().begin();
session.save( simpleEntity );
session.getTransaction().commit();
// Revision 2
session.getTransaction().begin();
AuditedDynamicComponentEntity entity = new AuditedDynamicComponentEntity( 1L, "static field value" );
entity.getCustomFields().put( "prop1", 13 );
entity.getCustomFields().put( "prop2", 0.1f );
entity.getCustomFields().put( "prop3", simpleEntity );
entity.getCustomFields().put( "prop4", true );
session.save( entity );
session.getTransaction().commit();
// revision 3
session.getTransaction().begin();
SimpleEntity simpleEntity2 = new SimpleEntity( 2L, "Not so simple entity" );
session.save( simpleEntity2 );
entity = (AuditedDynamicComponentEntity) session.get( AuditedDynamicComponentEntity.class, entity.getId() );
entity.getCustomFields().put( "prop3", simpleEntity2 );
session.update( entity );
session.getTransaction().commit();
// Revision 4
session.getTransaction().begin();
entity = (AuditedDynamicComponentEntity) session.get( AuditedDynamicComponentEntity.class, entity.getId() );
entity.getCustomFields().put( "prop1", 2 );
entity.getCustomFields().put( "prop4", false );
session.update( entity );
session.getTransaction().commit();
// Revision 5
session.getTransaction().begin();
entity = (AuditedDynamicComponentEntity) session.load( AuditedDynamicComponentEntity.class, entity.getId() );
entity.getCustomFields().remove( "prop2" );
session.update( entity );
session.getTransaction().commit();
// Revision 6
session.getTransaction().begin();
entity = (AuditedDynamicComponentEntity) session.load( AuditedDynamicComponentEntity.class, entity.getId() );
entity.getCustomFields().clear();
session.update( entity );
session.getTransaction().commit();
// Revision 7
session.getTransaction().begin();
entity = (AuditedDynamicComponentEntity) session.load( AuditedDynamicComponentEntity.class, entity.getId() );
session.delete( entity );
session.getTransaction().commit();
session.close();
}
@Test
public void testRevisionsCounts() {
Assert.assertEquals(
Arrays.asList( 2, 3, 4, 5, 6, 7 ),
getAuditReader().getRevisions( AuditedDynamicComponentEntity.class, 1L )
);
}
@Test
public void testHistoryOfId1() {
// Revision 2
AuditedDynamicComponentEntity entity = new AuditedDynamicComponentEntity( 1L, "static field value" );
entity.getCustomFields().put( "prop1", 13 );
entity.getCustomFields().put( "prop2", 0.1f );
entity.getCustomFields().put( "prop3", new SimpleEntity( 1L, "Very simple entity" ) );
entity.getCustomFields().put( "prop4", true );
AuditedDynamicComponentEntity ver2 = getAuditReader().find(
AuditedDynamicComponentEntity.class,
entity.getId(),
2
);
Assert.assertEquals( entity, ver2 );
// Revision 3
SimpleEntity simpleEntity2 = new SimpleEntity( 2L, "Not so simple entity" );
entity.getCustomFields().put( "prop3", simpleEntity2 );
AuditedDynamicComponentEntity ver3 = getAuditReader().find(
AuditedDynamicComponentEntity.class,
entity.getId(),
3
);
Assert.assertEquals( entity, ver3 );
// Revision 4
entity.getCustomFields().put( "prop1", 2 );
entity.getCustomFields().put( "prop4", false );
AuditedDynamicComponentEntity ver4 = getAuditReader().find(
AuditedDynamicComponentEntity.class,
entity.getId(),
4
);
Assert.assertEquals( entity, ver4 );
// Revision 5
entity.getCustomFields().put( "prop2", null );
AuditedDynamicComponentEntity ver5 = getAuditReader().find(
AuditedDynamicComponentEntity.class,
entity.getId(),
5
);
Assert.assertEquals( entity, ver5 );
// Revision 5
entity.getCustomFields().put( "prop1", null );
entity.getCustomFields().put( "prop2", null );
entity.getCustomFields().put( "prop3", null );
entity.getCustomFields().put( "prop4", null );
AuditedDynamicComponentEntity ver6 = getAuditReader().find(
AuditedDynamicComponentEntity.class,
entity.getId(),
6
);
Assert.assertEquals( entity, ver6 );
}
@Test
public void testOfQueryOnDynamicComponent() {
//given (and result of initData()
AuditedDynamicComponentEntity entity = new AuditedDynamicComponentEntity( 1L, "static field value" );
entity.getCustomFields().put( "prop1", 13 );
entity.getCustomFields().put( "prop2", 0.1f );
entity.getCustomFields().put( "prop3", new SimpleEntity( 1L, "Very simple entity" ) );
entity.getCustomFields().put( "prop4", true );
//when
List resultList = getAuditReader().createQuery()
.forEntitiesAtRevision( AuditedDynamicComponentEntity.class, 2 )
.add( AuditEntity.property( "customFields_prop1" ).le( 20 ) )
.getResultList();
//then
Assert.assertEquals( entity, resultList.get( 0 ) );
//when
resultList = getAuditReader().createQuery()
.forEntitiesAtRevision( AuditedDynamicComponentEntity.class, 2 )
.add( AuditEntity.property( "customFields_prop3" ).eq( new SimpleEntity( 1L, "Very simple entity" ) ) )
.getResultList();
//then
entity = (AuditedDynamicComponentEntity) getAuditReader().createQuery()
.forEntitiesAtRevision( AuditedDynamicComponentEntity.class, 4 )
.getResultList().get( 0 );
entity.getCustomFields().put( "prop2", null );
resultList = getAuditReader().createQuery()
.forEntitiesAtRevision( AuditedDynamicComponentEntity.class, 5 )
.add( AuditEntity.property( "customFields_prop2" ).isNull() )
.getResultList();
//then
Assert.assertEquals( entity, resultList.get( 0 ) );
}
}