Package org.apache.wookie.tests.beans

Source Code of org.apache.wookie.tests.beans.JPAPersistenceTest

/*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*/

package org.apache.wookie.tests.beans;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.wookie.beans.jpa.JPAPersistenceManager;
import org.apache.wookie.beans.util.PersistenceManagerFactory;

import org.junit.After;
import org.junit.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* JPAPersistenceTest - JPA persistence implementation tests.
*
* @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
* @version $Id$
*/
public class JPAPersistenceTest extends AbstractPersistenceTest
{
    private static final Logger logger = LoggerFactory.getLogger(JPAPersistenceTest.class);
   
    public static final String DB_USER_PROPERTY_NAME = "wookie.test.db.user";
    public static final String DB_PASSWORD_PROPERTY_NAME = "wookie.test.db.password";
    public static final String DB_DRIVER_CLASS_PROPERTY_NAME = "wookie.test.db.driver";
    public static final String DB_URI_PROPERTY_NAME = "wookie.test.db.uri";
    public static final String DB_TYPE_PROPERTY_NAME = "wookie.test.db.type";
   
    private String dbUser;
    private String dbPassword;
    private String dbDriver;
    private String dbUri;
    private String dbType;
    private ObjectPool connectionPool;
    private Context rootContext;
   
    /**
     * Set up JPA persistence runtime test environment.
     *
     * @throws Exception
     */
    @Before
    public void setUpPerTest() throws Exception
    {
        logger.info("JPA set up test");

        //
        // load database configuration from environment
        //
        String testDatabaseDir = (System.getProperty("user.dir")+"/build/test-database").replace(File.separatorChar, '/');
        dbUser = getSystemProperty(DB_USER_PROPERTY_NAME, "java");
        dbPassword = getSystemProperty(DB_PASSWORD_PROPERTY_NAME, "java");
        dbDriver = getSystemProperty(DB_DRIVER_CLASS_PROPERTY_NAME, "org.apache.derby.jdbc.EmbeddedDriver");
        dbUri = getSystemProperty(DB_URI_PROPERTY_NAME, "jdbc:derby:"+testDatabaseDir+"/widgetdb;create=true");
        dbType = getSystemProperty(DB_TYPE_PROPERTY_NAME, "derby");
       
        //
        // load driver
        //
        Class.forName(dbDriver);
       
        //
        // test connection
        //
        Connection conn = DriverManager.getConnection(dbUri, dbUser, dbPassword);
        conn.close();
       
        //
        // construct pooling datasource
        //
        connectionPool = new GenericObjectPool(null, 0, GenericObjectPool.WHEN_EXHAUSTED_GROW, 0, 5);
        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(dbUri, dbUser, dbPassword);
        new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);
        DataSource dataSource = new PoolingDataSource(connectionPool);           
       
        //
        // create JNDI context
        //
        rootContext = new InitialContext();
        Context namingContext = lookupOrCreateNamingContext(rootContext, "java:comp");
        namingContext = lookupOrCreateNamingContext(namingContext, "env");
        lookupOrCreateNamingContext(namingContext, "jdbc");
       
        //
        // bind datasource to JNDI context
        //
        rootContext.rebind(JPAPersistenceManager.WIDGET_DATABASE_JNDI_DATASOURCE_FULL_NAME, dataSource);

        //
        // initialize persistence manager factory and persistence manager;
        // truncate and initialize persistent store
        //
        Configuration configuration = new PropertiesConfiguration();
        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_CLASS_NAME_PROPERTY_NAME, JPAPersistenceManager.class.getName());
        configuration.setProperty(PersistenceManagerFactory.PERSISTENCE_MANAGER_INITIALIZE_STORE_PROPERTY_NAME, "true");
        configuration.setProperty(JPAPersistenceManager.PERSISTENCE_MANAGER_CACHE_SIZE_PROPERTY_NAME, "1000");
        configuration.setProperty(JPAPersistenceManager.PERSISTENCE_MANAGER_DB_TYPE_PROPERTY_NAME, dbType);
        PersistenceManagerFactory.initialize(configuration);

        logger.info("JPA test set up");
       
        //
        // This tells the abstract persistence test case we are ready to run
        //
        configured = true;
    }

    /**
     * Tear down JPA persistence runtime test environment.
     *
     * @throws Exception
     */
    @After
    public void tearDownPerTest() throws Exception
    {
        //
        // This tells the abstract persistence test case not to run the JPA tests
        //
        configured = false;
        logger.info("JPA tear down test");

        //
        // terminate persistence manager factory
        //
        PersistenceManagerFactory.terminate();

        //
        // unbind datasource from JNDI context
        //
        rootContext.unbind(JPAPersistenceManager.WIDGET_DATABASE_JNDI_DATASOURCE_FULL_NAME);
       
        //
        // shutdown datasource pool
        //
        connectionPool.close();
       
        //
        // special shutdown handling for derby
        //
        if (dbDriver.equals("org.apache.derby.jdbc.EmbeddedDriver") && dbUri.startsWith("jdbc:derby:") && dbType.equals("derby"))
        {
            //
            // derby shutdown connection
            //
            String shutdownDBUri = dbUri;
            int parametersIndex = shutdownDBUri.indexOf(";");
            if (parametersIndex != -1) {
                shutdownDBUri = shutdownDBUri.substring(0, parametersIndex);
            }
            shutdownDBUri += ";shutdown=true";
            //
            // Try to connect to the database - if we can, throw an exception that
            // the shutdown hasn't worked.
            //
            try {
                DriverManager.getConnection(shutdownDBUri, dbUser, dbPassword);
                throw new SQLException("Derby database not shutdown");
            } catch (SQLException sqle) {
                //
                // Check that we have the correct shutdown code - either 08006 which
                // is the code for a single database shutdown, or XJ015 which means
                // the whole Derby instance has shutdown successfully. If not, we
                // throw the exception.
                //
                if (!sqle.getSQLState().equals("08006") && !sqle.getSQLState().equals("XJ015")) {
                    throw sqle;
                }
            }
        }

        logger.info("JPA test torn down");
    }
}
TOP

Related Classes of org.apache.wookie.tests.beans.JPAPersistenceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.