/**
 * Revenue Settlement and Sharing System GE
 * Copyright (C) 2011-2014, Javier Lucio - lucio@tid.es
 * Telefonica Investigacion y Desarrollo, S.A.
 * 
 * Copyright (C) 2015, CoNWeT Lab., Universidad Politécnica de Madrid
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package es.tid.fiware.rss.common.test;

import java.net.URL;

import javax.sql.DataSource;

import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.ext.mysql.MySqlDataTypeFactory;
import org.dbunit.ext.mysql.MySqlMetadataHandler;
import org.dbunit.operation.DatabaseOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.datasource.DataSourceUtils;

/**
 * The Class DatabaseLoader.
 */
public class DatabaseLoader {

    /**
     * Logging system.
     */
    private static Logger logger = LoggerFactory.getLogger(DatabaseLoader.class);

    // Get database schema from properties
    private @Value("${database.schema}") String schema;

    /**
     * For database access.
     */
    @Autowired
    private DataSource dataSource;

    /** The db conn. */
    private IDatabaseConnection dbConn;

    /** The loader. */
    private FlatXmlDataSetBuilder loader;

    /**
     * Clean insert.
     * 
     * @param resource
     *            the resource
     * @param commit
     *            the commit
     * @throws Exception
     *             the exception
     */
    public void cleanInsert(String resource, boolean commit) throws Exception {
        DatabaseLoader.logger.debug("cleanInsert: " + resource);
        URL url = this.getClass().getClassLoader().getResource(resource);
        DatabaseLoader.logger.debug("Resource url: " + url.getPath());
        IDataSet ds = loader.build(url);
        DatabaseOperation.CLEAN_INSERT.execute(dbConn, ds);

        if (commit) {
            dbConn.getConnection().commit();
        }

    }

    public void execute(String sql, boolean commit) throws Exception {
        dbConn.getConnection().createStatement().execute(sql);
        if (commit) {
            dbConn.getConnection().commit();
        }
    }

    /**
     * Delete all.
     * 
     * @param resource
     *            the resource
     * @param commit
     *            the commit
     * @throws Exception
     *             the exception
     */
    public void deleteAll(String resource, boolean commit) throws Exception {
        DatabaseLoader.logger.debug("deleteAll: " + resource);
        URL url = this.getClass().getClassLoader().getResource(resource);
        IDataSet ds = loader.build(url);
        DatabaseOperation.DELETE_ALL.execute(dbConn, ds);

        if (commit) {
            dbConn.getConnection().commit();
        }
    }

    /**
     * Method to insert data before test. throws Exception from DB.
     * 
     * @throws Exception
     *             the exception
     */
    public void init() throws Exception {
        DatabaseLoader.logger.debug("DatabaseLoader.init()");

        try {
            DatabaseLoader.logger.debug("starting init() in DatabaseLoader...");

            this.dbConn = new DatabaseConnection(DataSourceUtils.getConnection(dataSource), this.schema);

            DatabaseConfig config = dbConn.getConfig();
            config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
            config.setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
            config.setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
            DatabaseLoader.logger.debug("DATASOURCE." + dataSource.toString());
            this.loader = new FlatXmlDataSetBuilder();

            dbConn.getConnection().createStatement().execute("DELETE FROM dbe_transaction");
            deleteAll("dbunit/CREATE_DATATEST_III.xml", false);
            deleteAll("dbunit/CREATE_DATATEST_II.xml", false);
            deleteAll("dbunit/CREATE_DATATEST_I.xml", false);

            cleanInsert("dbunit/CREATE_DATATEST_I.xml", false);
            cleanInsert("dbunit/CREATE_DATATEST_II.xml", false);
            cleanInsert("dbunit/CREATE_DATATEST_III.xml", true);

            DatabaseLoader.logger.debug("ending init() in DatabaseLoader...");

        } catch (Exception e) {
            DatabaseLoader.logger.error("Error loading data init in DatabaseLoader");
            dbConn.getConnection().rollback();
            e.printStackTrace();
            throw e;
        }
    }

    /**
     * Method to remove data after test. throws Exception from DB.
     * 
     * @throws Exception
     *             the exception
     */
    public void cleanup() throws Exception {
        try {
            DatabaseLoader.logger.debug("starting cleanup of DatabaseLoader...");
            deleteAll("dbunit/CREATE_DATATEST_III.xml", false);
            deleteAll("dbunit/CREATE_DATATEST_II.xml", false);
            deleteAll("dbunit/CREATE_DATATEST_I.xml", true);

            DatabaseLoader.logger.debug("ending cleanup() of DatabaseLoader...");

            dbConn.close();

        } catch (Exception e) {
            DatabaseLoader.logger.error("Error loading data cleanup in DatabaseLoader");
            dbConn.getConnection().rollback();
            e.printStackTrace();
            throw e;
        }
    }

}
@@ -1863,16 +1863,21 @@
 atabase.
+test.
 schema%7D%22

Update DatabaseLoader to use testing properties