package org.activityinfo.server.database.hibernate;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import com.google.common.io.Resources;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.servlet.ServletModule;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import org.activityinfo.server.DeploymentEnvironment;
import org.activityinfo.server.database.hibernate.dao.FixGeometryTask;
import org.activityinfo.server.database.hibernate.dao.HibernateDAOModule;
import org.activityinfo.server.database.hibernate.dao.TransactionModule;
import org.activityinfo.service.DeploymentConfiguration;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Environment;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.ejb.HibernateEntityManager;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.hibernate.validator.HibernateValidator;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
/**
* Guice module that provides Hibernate-based implementations for the DAO-layer
* interfaces.
*
* @author Alex Bertram
*/
public class HibernateModule extends ServletModule {
@Override
protected void configureServlets() {
HibernateSessionScope sessionScope = new HibernateSessionScope();
bindScope(HibernateSessionScoped.class, sessionScope);
bind(HibernateSessionScope.class).toInstance(sessionScope);
filter("/*").through(HibernateSessionFilter.class);
serve(SchemaServlet.ENDPOINT).with(SchemaServlet.class);
configureEmf();
configureEm();
install(new HibernateDAOModule());
install(new TransactionModule());
// temporary fix for geometry types
bind(FixGeometryTask.class);
filter("/tasks/fixGeometry").through(GuiceContainer.class);
}
protected void configureEmf() {
bind(EntityManagerFactory.class).toProvider(EntityManagerFactoryProvider.class).in(Singleton.class);
}
protected void configureEm() {
bind(EntityManager.class).toProvider(EntityManagerProvider.class).in(HibernateSessionScoped.class);
}
@Provides
public Session provideSession(EntityManager em) {
HibernateEntityManager hem = (HibernateEntityManager) em;
return hem.getSession();
}
@Provides @Singleton
public Validator provideValidator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.buildValidatorFactory();
return validatorFactory.getValidator();
}
protected static class EntityManagerFactoryProvider implements Provider<EntityManagerFactory> {
private org.activityinfo.service.DeploymentConfiguration deploymentConfig;
@Inject
public EntityManagerFactoryProvider(DeploymentConfiguration deploymentConfig) {
this.deploymentConfig = deploymentConfig;
}
@Override
public EntityManagerFactory get() {
Ejb3Configuration config = new Ejb3Configuration();
config.addProperties(deploymentConfig.asProperties());
for (Class clazz : getPersistentClasses()) {
config.addAnnotatedClass(clazz);
}
// ensure that hibernate does NOT do schema updating--liquibase is
// in charge
config.setProperty(Environment.HBM2DDL_AUTO, "");
config.setNamingStrategy(new AINamingStrategy());
EntityManagerFactory emf = config.buildEntityManagerFactory();
if (DeploymentEnvironment.isAppEngineDevelopment()) {
SchemaServlet.performMigration((HibernateEntityManager) emf.createEntityManager());
}
return emf;
}
}
@Provides
public static SessionFactory getSessionFactory(EntityManagerFactory emf) {
HibernateEntityManagerFactory hemf = (HibernateEntityManagerFactory) emf;
return hemf.getSessionFactory();
}
public static List<Class> getPersistentClasses() {
try {
List<Class> list = Lists.newArrayList();
List<String> lines = Resources.readLines(HibernateModule.class.getResource("/persistent.classes"),
Charsets.UTF_8);
for (String line : lines) {
list.add(Class.forName(line));
}
return list;
} catch (Exception e) {
throw new RuntimeException("Exception loading list of persistent classes", e);
}
}
@Provides
protected HibernateEntityManager provideHibernateEntityManager(EntityManager entityManager) {
return (HibernateEntityManager) entityManager;
}
}