it.eng.qbe.datasource.hibernate.HibernateDataSource.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.qbe.datasource.hibernate.HibernateDataSource.java

Source

/* SpagoBI, the Open Source Business Intelligence suite
    
 * Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
 * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0, without the "Incompatible With Secondary Licenses" notice. 
 * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package it.eng.qbe.datasource.hibernate;

import it.eng.qbe.datasource.AbstractDataSource;
import it.eng.qbe.datasource.ConnectionDescriptor;
import it.eng.qbe.datasource.IPersistenceManager;
import it.eng.qbe.datasource.configuration.CompositeDataSourceConfiguration;
import it.eng.qbe.datasource.configuration.FileDataSourceConfiguration;
import it.eng.qbe.datasource.configuration.IDataSourceConfiguration;
import it.eng.qbe.datasource.transaction.ITransaction;
import it.eng.qbe.datasource.transaction.hibernate.HibernateTransaction;
import it.eng.qbe.model.accessmodality.AbstractModelAccessModality;
import it.eng.qbe.model.structure.IModelStructure;
import it.eng.qbe.model.structure.builder.IModelStructureBuilder;
import it.eng.qbe.model.structure.builder.hibernate.HibernateModelStructureBuilder;
import it.eng.spagobi.engines.qbe.registry.bo.RegistryConfiguration;
import it.eng.spagobi.engines.qbe.registry.bo.RegistryConfiguration.Column;
import it.eng.spagobi.utilities.engines.SpagoBIEngineServiceException;
import it.eng.spagobi.utilities.exceptions.SpagoBIRuntimeException;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Table;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.property.Setter;
import org.hibernate.type.ManyToOneType;
import org.hibernate.type.Type;
import org.json.JSONObject;

public class HibernateDataSource extends AbstractDataSource implements IHibernateDataSource {

    protected boolean classLoaderExtended = false;

    protected Configuration compositeHibernateConfiguration;
    protected SessionFactory compositeHibernateSessionFactory;

    protected Map<String, Configuration> configurationMap = new HashMap<String, Configuration>();
    protected Map<String, SessionFactory> sessionFactoryMap = new HashMap<String, SessionFactory>();

    private static transient Logger logger = Logger.getLogger(HibernateDataSource.class);

    protected HibernateDataSource(String dataSourceName, IDataSourceConfiguration configuration) {
        setName(dataSourceName);
        dataMartModelAccessModality = new AbstractModelAccessModality();

        // validate & set configuration
        if (configuration instanceof FileDataSourceConfiguration) {
            FileDataSourceConfiguration subConf = (FileDataSourceConfiguration) configuration;
            CompositeDataSourceConfiguration c = new CompositeDataSourceConfiguration(subConf.getModelName());
            c.addSubConfiguration(subConf);
            Iterator<String> it = subConf.loadDataSourceProperties().keySet().iterator();
            while (it.hasNext()) {
                String propertyName = it.next();
                c.loadDataSourceProperties().put(propertyName,
                        subConf.loadDataSourceProperties().get(propertyName));
            }
            this.configuration = c;
        } else if (configuration instanceof CompositeDataSourceConfiguration) {
            CompositeDataSourceConfiguration c = (CompositeDataSourceConfiguration) configuration;
            if (c.getSubConfigurations() == null || c.getSubConfigurations().size() < 1) {
                throw new SpagoBIRuntimeException(
                        "Impossible to create HibernateDataSource. Datasource sub-configurations not defined");
            }
            for (int i = 0; i < c.getSubConfigurations().size(); i++) {
                if (!(c.getSubConfigurations().get(i) instanceof FileDataSourceConfiguration)) {
                    throw new SpagoBIRuntimeException(
                            "Impossible to create HibernateDataSource. Unable to manage sub-configuration of type ["
                                    + c.getSubConfigurations().get(i).getClass().getName() + "]");
                }
            }
            this.configuration = configuration;
        } else {
            throw new SpagoBIRuntimeException(
                    "Impossible to create HibernateDataSource. Unable to manage configuration of type ["
                            + configuration.getClass().getName() + "]");
        }

    }

    public List<IDataSourceConfiguration> getSubConfigurations() {
        return ((CompositeDataSourceConfiguration) configuration).getSubConfigurations();
    }

    public boolean isCompositeDataSource() {
        boolean isComposite = false;
        if (configuration instanceof CompositeDataSourceConfiguration) {
            isComposite = (((CompositeDataSourceConfiguration) configuration).getSubConfigurations().size() > 1);
        }

        return isComposite;
    }

    public synchronized void open() {
        logger.debug("IN");

        try {
            if (!isOpen()) {
                compositeHibernateConfiguration = buildEmptyConfiguration();

                addDatamarts();

                if (isCompositeDataSource()) {
                    addDbLinks();
                    compositeHibernateSessionFactory = compositeHibernateConfiguration.buildSessionFactory();
                } else {
                    compositeHibernateSessionFactory = sessionFactoryMap
                            .get(getSubConfigurations().get(0).getModelName());
                }

                classLoaderExtended = true;
            }
        } catch (Throwable t) {
            throw new SpagoBIRuntimeException("Impossible to open connection", t);
        } finally {
            logger.debug("OUT");
        }
    }

    public boolean isOpen() {
        return compositeHibernateSessionFactory != null && compositeHibernateConfiguration != null;
    }

    public void close() {
        compositeHibernateSessionFactory = null;
        compositeHibernateConfiguration = null;
        configurationMap = new HashMap<String, Configuration>();
        sessionFactoryMap = new HashMap<String, SessionFactory>();
        //classLoaderExtended = false;
    }

    protected void addDatamarts() {

        for (int i = 0; i < getSubConfigurations().size(); i++) {
            addDatamart((FileDataSourceConfiguration) getSubConfigurations().get(i), !classLoaderExtended);
        }
        classLoaderExtended = true;
    }

    protected void addDatamart(FileDataSourceConfiguration configuration, boolean extendClassLoader) {
        Configuration cfg = null;
        SessionFactory sf = null;

        if (configuration.getFile() == null)
            return;

        cfg = buildEmptyConfiguration();
        configurationMap.put(configuration.getModelName(), cfg);

        if (extendClassLoader) {
            updateCurrentClassLoader(configuration.getFile());
        }

        cfg.addJar(configuration.getFile());

        try {
            compositeHibernateConfiguration.addJar(configuration.getFile());
        } catch (Throwable t) {
            throw new RuntimeException("Cannot add datamart", t);
        }

        sf = cfg.buildSessionFactory();
        sessionFactoryMap.put(configuration.getModelName(), sf);
    }

    public ConnectionDescriptor getConnection() {
        ConnectionDescriptor connection = (ConnectionDescriptor) configuration.loadDataSourceProperties()
                .get("connection");
        return connection;
    }

    private Map getDbLinkMap() {
        Map dbLinkMap = (Map) configuration.loadDataSourceProperties().get("dblinkMap");
        return dbLinkMap;
    }

    protected Configuration buildEmptyConfiguration() {
        Configuration cfg = null;

        cfg = new Configuration();

        ConnectionDescriptor connection = getConnection();

        if (connection.isJndiConncetion()) {
            cfg.setProperty("hibernate.connection.datasource", connection.getJndiName());
            cfg.setProperty("hibernate.validator.apply_to_ddl", "false");
            cfg.setProperty("hibernate.validator.autoregister_listeners", "false");
        } else {
            cfg.setProperty("hibernate.connection.url", connection.getUrl());
            cfg.setProperty("hibernate.connection.password", connection.getPassword());
            cfg.setProperty("hibernate.connection.username", connection.getUsername());
            cfg.setProperty("hibernate.connection.driver_class", connection.getDriverClass());
            cfg.setProperty("hibernate.validator.apply_to_ddl", "false");
            cfg.setProperty("hibernate.validator.autoregister_listeners", "false");
        }

        cfg.setProperty("hibernate.dialect", connection.getDialect());

        // Ingres does not support scrollable result set
        if ("org.hibernate.dialect.IngresDialect".equals(connection.getDialect())) {
            cfg.setProperty("hibernate.jdbc.use_scrollable_resultset", "false");
        }

        cfg.setProperty("hibernate.cglib.use_reflection_optimizer", "true");
        cfg.setProperty("hibernate.show_sql", "false");

        return cfg;
    }

    /* (non-Javadoc)
     * @see it.eng.qbe.datasource.IHibernateDataSource#getConfiguration()
     */
    public Configuration getHibernateConfiguration() {
        if (isOpen() == false) {
            open();
        }
        return compositeHibernateConfiguration;
    }

    /* (non-Javadoc)
     * @see it.eng.qbe.datasource.IHibernateDataSource#getSessionFactory()
     */
    public SessionFactory getHibernateSessionFactory() {
        if (isOpen() == false) {
            open();
        }
        return compositeHibernateSessionFactory;
    }

    /* (non-Javadoc)
     * @see it.eng.qbe.datasource.IHibernateDataSource#getSessionFactory(java.lang.String)
     */
    public SessionFactory getHibernateSessionFactory(String dmName) {
        if (compositeHibernateSessionFactory == null)
            open();
        return (SessionFactory) sessionFactoryMap.get(dmName);
    }

    public Configuration getConfiguration(String dmName) {
        if (compositeHibernateConfiguration == null)
            open();
        return (Configuration) configurationMap.get(dmName);
    }

    protected void addDbLink(String modelName, Configuration srcCfg, Configuration dstCfg) {

        String dbLink = null;
        PersistentClass srcPersistentClass = null;
        PersistentClass dstPersistentClass = null;
        String targetEntityName = null;
        Table targetTable = null;

        dbLink = (String) getDbLinkMap().get(modelName);
        if (dbLink != null) {
            Iterator it = srcCfg.getClassMappings();
            while (it.hasNext()) {
                srcPersistentClass = (PersistentClass) it.next();
                targetEntityName = srcPersistentClass.getEntityName();
                dstPersistentClass = dstCfg.getClassMapping(targetEntityName);
                targetTable = dstPersistentClass.getTable();
                targetTable.setName(targetTable.getName() + "@" + dbLink);
            }
        }

    }

    protected void addDbLinks() {
        Configuration cfg = null;

        for (int i = 0; i < getSubConfigurations().size(); i++) {
            String modelName = getSubConfigurations().get(i).getModelName();
            cfg = (Configuration) configurationMap.get(modelName);
            addDbLink(modelName, cfg, compositeHibernateConfiguration);
        }
    }

    public IModelStructure getModelStructure() {
        IModelStructureBuilder structureBuilder;
        if (dataMartModelStructure == null) {
            structureBuilder = new HibernateModelStructureBuilder(this);
            dataMartModelStructure = structureBuilder.build();
        }

        return dataMartModelStructure;
    }

    public ITransaction getTransaction() {
        return new HibernateTransaction(this);
    }

    public IPersistenceManager getPersistenceManager() {
        // TODO Auto-generated method stub
        return new HibernatePersistenceManager(this);
    }

}