001: /*
002: * The DbUnit Database Testing Framework Copyright (C)2002-2004, DbUnit.org This
003: * library is free software; you can redistribute it and/or modify it under the
004: * terms of the GNU Lesser General Public License as published by the Free
005: * Software Foundation; either version 2.1 of the License, or (at your option)
006: * any later version. This library is distributed in the hope that it will be
007: * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
008: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
009: * General Public License for more details. You should have received a copy of
010: * the GNU Lesser General Public License along with this library; if not, write
011: * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
012: * 02111-1307 USA
013: */
014: package org.dbunit;
015:
016: import org.slf4j.Logger;
017: import org.slf4j.LoggerFactory;
018:
019: import java.util.Properties;
020:
021: import javax.naming.Context;
022: import javax.naming.InitialContext;
023: import javax.naming.NamingException;
024: import javax.sql.DataSource;
025:
026: import org.dbunit.database.DatabaseConnection;
027: import org.dbunit.database.IDatabaseConnection;
028:
029: /**
030: * DatabaseTester that pulls a DataSource from a JNDI location.
031: *
032: * @author Andres Almiray <aalmiray@users.sourceforge.net>
033: */
034: public class JndiDatabaseTester extends AbstractDatabaseTester {
035:
036: /**
037: * Logger for this class
038: */
039: private static final Logger logger = LoggerFactory
040: .getLogger(JndiDatabaseTester.class);
041:
042: private DataSource dataSource;
043: private Properties environment;
044: private boolean initialized = false;
045: private String lookupName;
046:
047: /**
048: * Creates a JndiDatabaseTester with specific JNDI properties.
049: *
050: * @param environment A Properties object with JNDI properties
051: * @param lookupName the name of the resource in the JNDI context
052: */
053: public JndiDatabaseTester(Properties environment, String lookupName) {
054: super ();
055: this .environment = environment;
056: this .lookupName = lookupName;
057: }
058:
059: /**
060: * Creates a JndiDatabaseTester with default JNDI properties.
061: *
062: * @param lookupName the name of the resource in the JNDI context
063: */
064: public JndiDatabaseTester(String lookupName) {
065: this (null, lookupName);
066: }
067:
068: public IDatabaseConnection getConnection() throws Exception {
069: logger.debug("getConnection() - start");
070:
071: if (!initialized) {
072: initialize();
073: }
074:
075: if (getSchema() != null) {
076: return new DatabaseConnection(dataSource.getConnection(),
077: getSchema());
078: } else {
079: return new DatabaseConnection(dataSource.getConnection());
080: }
081: }
082:
083: /**
084: * Verifies the configured properties and locates the Datasource through
085: * JNDI.<br>
086: * This method is called by {@link getConnection} if the tester has not been
087: * initialized yet.
088: */
089: private void initialize() throws NamingException {
090: logger.debug("initialize() - start");
091:
092: Context context = new InitialContext(environment);
093: assertNotNullNorEmpty("lookupName", lookupName);
094: Object obj = context.lookup(lookupName);
095: assertTrue("JNDI object with [" + lookupName + "] not found",
096: obj != null);
097: assertTrue("Object [" + obj + "] at JNDI location ["
098: + lookupName + "] is not of type ["
099: + DataSource.class.getName() + "]",
100: obj instanceof DataSource);
101: dataSource = (DataSource) obj;
102: assertTrue("DataSource is not set", dataSource != null);
103: initialized = true;
104: }
105: }
|