/*
* Copyright 2010 The Ganshane Team.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package corner.orm.hibernate;
import java.io.IOException;
import org.apache.tapestry5.hibernate.HibernateSessionManager;
import org.apache.tapestry5.hibernate.HibernateSessionSource;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.ObjectLocator;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.Scope;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.services.PerthreadManager;
import org.apache.tapestry5.services.AliasContribution;
import org.apache.tapestry5.services.PersistentFieldStrategy;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.RequestFilter;
import org.apache.tapestry5.services.RequestHandler;
import org.apache.tapestry5.services.Response;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import corner.cache.CacheSymbols;
import corner.orm.hibernate.impl.CacheHibernateEntityServiceImpl;
import corner.orm.hibernate.impl.EntityServiceImpl;
import corner.orm.hibernate.impl.HibernateEntityServiceImpl;
import corner.orm.hibernate.impl.SpringSessionManagerImpl;
import corner.orm.services.EntityService;
import corner.orm.services.impl.CornerEntityPersistentFieldStrategy;
/**
* hibernate 操作的模块
* @author <a href="mailto:jun.tsai@gmail.com">Jun Tsai</a>
* @version $Revision$
* @since 3.1
*/
public class HibernateModule {
public static void bind(ServiceBinder binder){
binder.bind(HibernateEntityService.class,HibernateEntityServiceImpl.class);
}
public static EntityService buildEntityService(@Symbol(CacheSymbols.ENABLE_CACHE) boolean enableCache,ObjectLocator locator){
if(enableCache){
return locator.autobuild(CacheHibernateEntityServiceImpl.class);
}else{
return locator.autobuild(EntityServiceImpl.class);
}
}
public static HibernateTemplate buildHibernateTemplate(
SessionFactory sessionFactory) {
HibernateTemplate template = new HibernateTemplate(sessionFactory);
return template;
}
/**
* Contributes the following: <dl> <dt>entity</dt> <dd>Stores the id of the entity and reloads from the {@link
* Session}</dd> </dl>
*/
public static void contributePersistentFieldManager(
MappedConfiguration<String, PersistentFieldStrategy> configuration)
{
configuration.overrideInstance("entity", CornerEntityPersistentFieldStrategy.class);
}
/**
* 替换由HibernateModule提供的HibernateSessionManager
*
* @param sessionSource
* @param perthreadManager
* @return
*/
@Scope(org.apache.tapestry5.ioc.ScopeConstants.PERTHREAD)
public static HibernateSessionManager buildSpringSessionManager(
HibernateSessionSource sessionSource,
PerthreadManager perthreadManager) {
SpringSessionManagerImpl service = new SpringSessionManagerImpl(
sessionSource);
perthreadManager.addThreadCleanupListener(service);
return service;
}
/**
* 覆盖由Hibernate Module提供的HibernateSessionManager
*
* @param manager
* @param configuration
*/
public static void contributeAliasOverrides(
@Local HibernateSessionManager manager,
Configuration<AliasContribution<HibernateSessionManager>> configuration){
configuration.add(AliasContribution.create(
HibernateSessionManager.class, manager));
}
/**
* build spring platform transaction manager
* @param sessionSource session source
* @param session
* @return
* @since 0.0.2
*/
public static PlatformTransactionManager buildPlatformTransactionManager(HibernateSessionSource sessionSource){
HibernateTransactionManager platformTransactionManager = new HibernateTransactionManager();
platformTransactionManager.setSessionFactory(sessionSource.getSessionFactory());
platformTransactionManager.afterPropertiesSet();
return platformTransactionManager;
}
public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,@Local final HibernateSessionManager hibernateSessionManager)
{
RequestFilter openSessionInView = new RequestFilter()
{
public boolean service(Request request, Response response, RequestHandler handler)
throws IOException
{
//get session
hibernateSessionManager.getSession();
return handler.service(request, response);
}
};
configuration.add("OpenSessionInView",openSessionInView,
"after:StoreIntoGlobals","before:EndOfRequest");
}
}