package org.tynamo.hibernate.modules;
import org.apache.tapestry5.hibernate.HibernateSessionManager;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.SubModule;
import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
import org.apache.tapestry5.ioc.services.ServiceOverride;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.tynamo.descriptor.decorators.DescriptorDecorator;
import org.tynamo.descriptor.factories.DescriptorFactory;
import org.tynamo.hibernate.services.internal.SearchableHibernateGridDataSourceProvider;
import org.tynamo.hibernate.decorators.HibernateSearchDescriptorDecorator;
import org.tynamo.services.SearchableGridDataSourceProvider;
public final class TynamoHibernate4SearchModule
{
public static void bind(ServiceBinder binder)
{
binder.bind(SearchableGridDataSourceProvider.class, SearchableHibernateGridDataSourceProvider.class).withId("SearchableHibernateGridDataSourceProvider");
}
@Contribute(ServiceOverride.class)
public static void setupApplicationServiceOverrides(MappedConfiguration<Class, Object> configuration,
@Local SearchableGridDataSourceProvider dataSourceProvider)
{
configuration.add(SearchableGridDataSourceProvider.class, dataSourceProvider);
}
@Contribute(DescriptorFactory.class)
public static void setupDescriptorFactory(OrderedConfiguration<DescriptorDecorator> configuration)
{
configuration.add("SearchDecorator", new HibernateSearchDescriptorDecorator(), "after:TynamoDecorator");
}
public static FullTextSession buildFullTextSession(HibernateSessionManager sessionManager,
PropertyShadowBuilder propertyShadowBuilder)
{
LazyFullTextSession lazy = new LazyFullTextSession(sessionManager);
return propertyShadowBuilder.build(lazy, "fullTextSession", FullTextSession.class);
}
public static class LazyFullTextSession
{
private HibernateSessionManager sessionManager;
public LazyFullTextSession(HibernateSessionManager sessionManager)
{
this.sessionManager = sessionManager;
}
public FullTextSession getFullTextSession()
{
return Search.getFullTextSession(sessionManager.getSession());
}
}
}