Check out this SlideShare Presentation:
View more presentations from Rafal Rusin.
@Test
public void savingAndUpdatingPersonShouldCreateTwoHistoricalVersions() {
//given
Person person = createAndSavePerson();
String oldFirstName = person.getFirstName();
String newFirstName = oldFirstName + "NEW";
//when
updatePersonWithNewName(person, newFirstName);
//then
verifyTwoHistoricalVersionsWereSaved(oldFirstName, newFirstName);
}
private Person createAndSavePerson() {
Transaction transaction = session.beginTransaction();
Person person = PersonFactory.createPerson();
session.save(person);
transaction.commit();
return person;
}
private void updatePersonWithNewName(Person person, String newName) {
Transaction transaction = session.beginTransaction();
person.setFirstName(newName);
session.update(person);
transaction.commit();
}
private void verifyTwoHistoricalVersionsWereSaved(String oldFirstName, String newFirstName) {
List<Object[]> personRevisions = getPersonRevisions();
assertEquals(2, personRevisions.size());
assertEquals(oldFirstName, ((Person)personRevisions.get(0)[0]).getFirstName());
assertEquals(newFirstName, ((Person)personRevisions.get(1)[0]).getFirstName());
}
private List<Object[]> getPersonRevisions() {
Transaction transaction = session.beginTransaction();
AuditReader auditReader = AuditReaderFactory.get(session);
List<Object[]> personRevisions = auditReader.createQuery()
.forRevisionsOfEntity(Person.class, false, true)
.getResultList();
transaction.commit();
return personRevisions;
}
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
...
<property name="eventListeners">
<map key-type="java.lang.String" value-type="org.hibernate.event.EventListeners">
<entry key="post-insert" value-ref="auditEventListener"/>
<entry key="post-update" value-ref="auditEventListener"/>
<entry key="post-delete" value-ref="auditEventListener"/>
<entry key="pre-collection-update" value-ref="auditEventListener"/>
<entry key="pre-collection-remove" value-ref="auditEventListener"/>
<entry key="post-collection-recreate" value-ref="auditEventListener"/>
</map>
</property>
</bean>
<bean id="auditEventListener" class="org.hibernate.envers.event.AuditEventListener" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
I've wrote a new Grails plugin - httplogger. It logs:
It is mostly useful for logging your REST traffic. Full HTTP web pages can be huge to log and generally waste your space. I suggest to map all of your REST controllers with the same path in UrlMappings, e.g. /rest/ and configure this plugin with this path.
Here is some simple output just to give you a taste of it.
17:16:00,331 INFO filters.LogRawRequestInfoFilter - 17:16:00,340 INFO filters.LogRawRequestInfoFilter - 17:16:00,342 INFO filters.LogGrailsUrlsInfoFilter - 17:16:00,731 INFO filters.LogOutputResponseFilter - >> #1 returned 200, took 405 ms.
17:16:00,745 INFO filters.LogOutputResponseFilter - >> #1 responded with '{count:0}' 17:18:55,799 INFO filters.LogRawRequestInfoFilter - 17:18:55,799 INFO filters.LogRawRequestInfoFilter - 17:18:55,800 INFO filters.LogRawRequestInfoFilter - 17:18:55,801 INFO filters.LogOutputResponseFilter - >> #2 returned 404, took 3 ms.
17:18:55,802 INFO filters.LogOutputResponseFilter - >> #2 responded with '' Official plugin information can be found on Grails plugins website here: http://grails.org/plugins/httplogger or you can browse code on github: TouK/grails-httplogger.