package com.googlecode.tawus.hibernate.services; import java.util.List; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.OrderedConfiguration; import org.apache.tapestry5.ioc.ScopeConstants; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Primary; import org.apache.tapestry5.ioc.annotations.Scope; import org.apache.tapestry5.ioc.annotations.ServiceId; import org.apache.tapestry5.ioc.annotations.SubModule; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.ioc.services.ClassNameLocator; import org.apache.tapestry5.ioc.services.PerthreadManager; import org.apache.tapestry5.ioc.services.PropertyAccess; import org.apache.tapestry5.ioc.services.RegistryShutdownHub; import org.hibernate.Session; import com.googlecode.tawus.hibernate.TawusHibernateConstants; import com.googlecode.tawus.hibernate.internal.services.HibernateEntityDAOSource; import com.googlecode.tawus.hibernate.internal.services.HibernateSearchCriteriaConverter; import com.googlecode.tawus.hibernate.internal.services.HibernateSessionManagerImpl; import com.googlecode.tawus.hibernate.internal.services.SessionFactorySourceImpl; import com.googlecode.tawus.hibernate.internal.services.SessionShadowBuilderImpl; import com.googlecode.tawus.hibernate.internal.services.TransactionAdvisorImpl; import com.googlecode.tawus.services.EntityDAOSource; import com.googlecode.tawus.services.EntityValidator; import com.googlecode.tawus.services.TawusModule; @SubModule(TawusModule.class) public class TawusHibernateModule { public static void bind(ServiceBinder binder) { binder.bind(TransactionAdvisor.class, TransactionAdvisorImpl.class); binder.bind(SessionShadowBuilder.class, SessionShadowBuilderImpl.class); binder.bind(SearchCriteriaConverter.class, HibernateSearchCriteriaConverter.class); } public void contributeEntityDAOSource(OrderedConfiguration<EntityDAOSource> daoSources) { daoSources.addInstance("hibernateSource", HibernateEntityDAOSource.class); } public static void contributeFactoryDefaults(MappedConfiguration<String, String> defaults) { defaults.add(TawusHibernateConstants.DEFAULT_FACTORY_ID, "default"); } @Scope(value = ScopeConstants.PERTHREAD) public HibernateSessionManager buildHibernateSessionManager( @Symbol(TawusHibernateConstants.DEFAULT_FACTORY_ID) String defaultFactoryID, SessionFactorySource sessionFactorySource, PerthreadManager threadManager) { HibernateSessionManagerImpl sessionManager = new HibernateSessionManagerImpl( defaultFactoryID, sessionFactorySource); threadManager.addThreadCleanupListener(sessionManager); return sessionManager; } @ServiceId("default") @Primary public Session buildDefaultSession(SessionShadowBuilder sessionShadowBuilder, HibernateSessionManager sessionManager) { return sessionShadowBuilder.build(sessionManager, "default"); } public SessionFactorySource buildSessionFactorySource(ClassNameLocator classNameLocator, List<SessionFactoryConfiguration> configuration, RegistryShutdownHub hub) { SessionFactorySourceImpl sessionFactorySource = new SessionFactorySourceImpl( classNameLocator, configuration); hub.addRegistryShutdownListener(sessionFactorySource); return sessionFactorySource; } public void contributeEntityValidator(HibernateSessionManager sessionManager, PropertyAccess propertyAccess, OrderedConfiguration<EntityValidator> contribution) { contribution.add("unique", new UniqueEntityValidator(sessionManager, propertyAccess)); } }