org.activityinfo.server.database.hibernate.HibernateModule.java Source code

Java tutorial

Introduction

Here is the source code for org.activityinfo.server.database.hibernate.HibernateModule.java

Source

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;
    }
}