/* Wotonomy: OpenStep design patterns for pure Java applications. Copyright (C) 2001 Michael Powers This library 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; either version 2.1 of the License, or (at your option) any later version. This library 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 for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see http://www.gnu.org */ package net.wotonomy.jdbcadaptor; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import net.wotonomy.access.EOAdaptor; import net.wotonomy.access.EOAdaptorChannel; import net.wotonomy.access.EOAdaptorContext; import net.wotonomy.foundation.NSDictionary; /** * Concrete implementation of EOAdaptorContext for use with JDBC. * * @author ezamudio@nasoft.com * @author $Author: cgruber $ * @version $Revision: 903 $ */ public class JDBCContext extends EOAdaptorContext { protected Connection _jdbcConnection; /** * Creates a new instance. * * @param adaptor The adaptor this context belongs to. */ public JDBCContext(EOAdaptor adaptor) { super(adaptor); } public void connect() throws JDBCAdaptorException { try { if (_jdbcConnection != null && !_jdbcConnection.isClosed()) throw new JDBCAdaptorException("Attempt to connect when already connected.", null); Class.forName(((JDBCAdaptor) adaptor()).driverName()); NSDictionary connectionDictionary = adaptor().connectionDictionary(); String url = (String) connectionDictionary.objectForKey("URL"); Driver driver = DriverManager.getDriver(url); java.util.Properties props = new java.util.Properties(); if (connectionDictionary.containsKey("username")) props.setProperty("user", (String) connectionDictionary.objectForKey("username")); if (connectionDictionary.containsKey("password")) props.setProperty("password", (String) connectionDictionary.objectForKey("password")); _jdbcConnection = driver.connect(url, props); _jdbcConnection.setAutoCommit(false); } catch (SQLException ex) { throw new JDBCAdaptorException("Cannot connect to database", ex); } catch (ClassNotFoundException ex) { throw new JDBCAdaptorException("Cannot find JDBC driver " + ex.getMessage(), null); } } public void disconnect() throws JDBCAdaptorException { if (_jdbcConnection != null) { try { _jdbcConnection.close(); _jdbcConnection = null; transactionDidRollback(); } catch (SQLException ex) { throw new JDBCAdaptorException("Trying to close connection.", ex); } } } public Connection connection() { return _jdbcConnection; } /* * Begins a transaction. Actually it does nothing because it's not necessary. * * @see net.wotonomy.access.EOAdaptorContext#beginTransaction() */ public void beginTransaction() { if (hasOpenTransaction()) throw new JDBCAdaptorException("Cannot nest transactions.", null); transactionDidBegin(); } /* * Commits a transaction. * * @see net.wotonomy.access.EOAdaptorContext#commitTransaction() */ public void commitTransaction() { try { _jdbcConnection.commit(); transactionDidCommit(); } catch (SQLException ex) { throw new JDBCAdaptorException("Cannot commit.", ex); } } /* * Rolls back a transacion. * * @see net.wotonomy.access.EOAdaptorContext#rollbackTransaction() */ public void rollbackTransaction() { try { _jdbcConnection.rollback(); transactionDidRollback(); } catch (SQLException ex) { throw new JDBCAdaptorException("Cannot commit.", ex); } } /* * Creates a JDBCChannel instance. * * @see net.wotonomy.access.EOAdaptorContext#createAdaptorChannel() */ public EOAdaptorChannel createAdaptorChannel() { JDBCChannel channel = new JDBCChannel(this); _channels.addObject(channel); return channel; } /* * I don't know what to do here. Throw something, maybe? * * @see net.wotonomy.access.EOAdaptorContext#handleDroppedConnection() */ public void handleDroppedConnection() { // TODO Auto-generated method stub } } /* * $Log$ Revision 1.2 2006/02/18 22:59:22 cgruber make it compile with maven * dependencies and add a cvsignore. * * Revision 1.1 2006/02/16 13:22:23 cgruber Check in all sources in * eclipse-friendly maven-enabled packages. * * Revision 1.1 2003/08/13 20:13:33 chochos concrete implementation of * EOAdaptorContext for use with JDBC. This is the class that holds the physical * connection to the database. * */