com.abiquo.abiserver.persistence.DataAccessTestBase.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.abiserver.persistence.DataAccessTestBase.java

Source

/**
 * Abiquo community edition
 * cloud management application for hybrid clouds
 * Copyright (C) 2008-2010 - Abiquo Holdings S.L.
 *
 * This application 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 under
 * version 3 of the License
 *
 * This software 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
 * LESSER GENERAL PUBLIC LICENSE v.3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

package com.abiquo.abiserver.persistence;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

public class DataAccessTestBase {

    private static SessionFactory factory;

    private List<Session> allocatedSessions = new ArrayList<Session>();

    private List<Transaction> ongoingTransactions = new ArrayList<Transaction>();

    /**
     * Removes all data from the database. WARNING: Unfortunately, this is an ongoing task: we have
     * no time to implement this fully, just what is needed for a handful of tests.
     * 
     * @throws SQLException
     */
    @SuppressWarnings("deprecation")
    protected void cleanDatabase() throws SQLException {
        String[] tablesInDeletionOrder = new String[] { "physicalmachine", "rack", "datacenter", "user",
                "enterprise", "workload_enterprise_exclusion_rule", "workload_machine_load_rule" };

        Session session = factory.openSession();
        try {
            Connection connection = session.connection();
            for (String table : tablesInDeletionOrder) {
                Statement delete = connection.createStatement();
                try {
                    delete.execute("DELETE FROM " + table);
                } finally {
                    delete.close();
                }
            }
        } finally {
            session.close();
        }
    }

    private static void ensureFactoryInitialized() {
        if (factory == null) {
            factory = new Configuration().configure("/conf/db/hibernate/hibernate.cfg.xml").buildSessionFactory();
        }
    }

    private static SessionFactory getFactory() {
        ensureFactoryInitialized();
        return factory;
    }

    protected Session createSession() {
        Session session = getFactory().openSession();
        allocatedSessions.add(session);
        return session;
    }

    protected Session createSessionInTransaction() {
        Session session = createSession();
        allocatedSessions.add(session);
        Transaction transaction = session.beginTransaction();
        ongoingTransactions.add(transaction);
        return session;
    }

    @BeforeMethod
    public void methodSetUp() throws Exception {
        ensureFactoryInitialized();
        cleanDatabase();
    }

    @AfterMethod
    public void methodTearDown() {
        ensureOngoingTransactionsCleanup();
        ensureOpenSessionsCleanup();
    }

    private void ensureOngoingTransactionsCleanup() {
        for (Transaction t : ongoingTransactions) {
            if (t.isActive()) {
                t.rollback();
            }
        }
    }

    private void ensureOpenSessionsCleanup() {
        for (Session s : allocatedSessions) {
            if (s.isOpen()) {
                s.close();
            }
        }
    }

}