lt.emasina.resthub.factory.ConnectionManager.java Source code

Java tutorial

Introduction

Here is the source code for lt.emasina.resthub.factory.ConnectionManager.java

Source

/*
 * #%L
 * model
 * %%
 * Copyright (C) 2012 - 2015 valdasraps
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
 * #L%
 */
package lt.emasina.resthub.factory;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.Getter;
import lombok.extern.log4j.Log4j;
import lt.emasina.resthub.ConnectionFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

/**
 * ConnectionManager class
 * @author valdo
 */
@Log4j
@Singleton
public class ConnectionManager implements AutoCloseable {

    private static final String PROPERTY_URL = "hibernate.connection.url";
    private static final String PROPERTY_USERNAME = "hibernate.connection.username";
    private static final String PROPERTY_PASSWORD = "hibernate.connection.password";
    private static final String PROPERTY_SHOWSQL = "hibernate.show_sql";
    private static final String PROPERTY_FORMATSQL = "hibernate.format_sql";

    @Inject
    @Getter
    private ConnectionFactory cf;

    private final Map<String, SessionFactory> factories = new ConcurrentHashMap<>();

    public Session getSession(String name) {
        if (!factories.containsKey(name)) {

            Configuration cfg = new Configuration();
            cfg.configure();

            cfg.setProperty(PROPERTY_URL, cf.getUrl(name));
            cfg.setProperty(PROPERTY_USERNAME, cf.getUsername(name));
            cfg.setProperty(PROPERTY_PASSWORD, cf.getPassword(name));

            if (log.isDebugEnabled()) {
                cfg.setProperty(PROPERTY_SHOWSQL, "true");
                cfg.setProperty(PROPERTY_FORMATSQL, "true");
            }

            if (log.isDebugEnabled()) {
                for (Map.Entry<Object, Object> e : cfg.getProperties().entrySet()) {
                    log.debug(String.format("%s property: %s = %s", name, e.getKey(), e.getValue()));
                }
            }

            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(cfg.getProperties()).build();
            factories.put(name, cfg.buildSessionFactory(serviceRegistry));

        }
        return factories.get(name).openSession();
    }

    @Override
    public void close() throws Exception {
        for (String name : factories.keySet()) {
            factories.remove(name).close();
        }
    }

}