package org.tynamo.examples.simple.services;
import org.apache.tapestry5.hibernate.HibernateEntityPackageManager;
import org.apache.tapestry5.hibernate.HibernateSessionManager;
import org.apache.tapestry5.hibernate.modules.HibernateCoreModule;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.Primary;
import org.apache.tapestry5.ioc.annotations.SubModule;
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.MethodInvocation;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.tynamo.hibernate.TynamoHibernateSymbols;
import org.tynamo.hibernate.modules.TynamoHibernate4SearchModule;
import org.tynamo.hibernate.services.TynamoHibernateModule;
@SubModule(value = {
TynamoHibernateModule.class,
TynamoHibernate4SearchModule.class,
org.apache.tapestry5.hibernate.modules.HibernateModule.class,
HibernateCoreModule.class
})
public class HibernateModule
{
@Contribute(SymbolProvider.class)
@ApplicationDefaults
public static void provideSymbols(MappedConfiguration<String, Object> configuration)
{
configuration.add(TynamoHibernateSymbols.IGNORE_NON_HIBERNATE_TYPES, true);
}
/**
* By default tapestry-hibernate will scan
* InternalConstants.TAPESTRY_APP_PACKAGE_PARAM + ".entities" (witch is equal to "org.tynamo.examples.simple.simple.entities")
* for annotated entity classes.
* <p/>
* Contributes the package "org.tynamo.examples.simple.simple.model" to the configuration, so that it will be
* scanned for annotated entity classes.
*/
@Contribute(HibernateEntityPackageManager.class)
public static void addPackagesToScan(Configuration<String> configuration)
{
// If you want to scan other packages add them here:
// configuration.add("org.tynamo.examples.simple.simple.model");
}
/**
* Adds the CommitAfter annotation work, to process the
* {@link org.apache.tapestry5.hibernate.annotations.CommitAfter} annotation.
*/
@Contribute(ComponentClassTransformWorker2.class)
@Primary
public static void provideCommitAfterAnnotationSupport(OrderedConfiguration<ComponentClassTransformWorker2> configuration,
final HibernateSessionManager manager)
{
MethodAdvice advice = new MethodAdvice()
{
public void advise(MethodInvocation invocation)
{
try
{
invocation.proceed();
manager.commit();
} catch (RuntimeException ex)
{
try
{
manager.abort();
} catch (Exception e)
{
}
throw ex;
}
}
};
configuration.add("TynamoExampleCommitAfter", new CommitAfterWorker(advice), "after:Log");
}
}