/* * $Id$ * * Copyright 2006, The jCoderZ.org Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the jCoderZ.org Project nor the names of * its contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.jcoderz.commons.connector.file; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.NamingException; import javax.naming.Reference; import javax.resource.ResourceException; import javax.resource.spi.ConnectionManager; import org.jcoderz.commons.connector.ManagedConnectionFactoryBase; /** * Implements the {@link FsConnectionFactory} interface. * */ public class FsConnectionFactoryImpl implements FsConnectionFactory { private static final String METHOD_GET_CONNECTION = "getConnection"; /** The full qualified name of this class. */ private static final transient String CLASSNAME = FsConnectionFactoryImpl.class.getName(); /** The logger to use. */ private static final transient Logger logger = Logger.getLogger(CLASSNAME); /** The <code>serialVersionUID</code>. */ private static final long serialVersionUID = 1L; /** Properties from the deployment descriptor, or default. */ private final Properties mDdProps; /** Reference to this ConnectionFactory. */ private Reference mReference; /** * The ConnectionManager to use. * In case of <b>two tier scenario</b> the ConnectionManager is an instance * of the DefaultConnectionManager. * In case of <b>three tier scenario</b> this Manager is provided by * the Application Server. */ private final ConnectionManager mConnectionManager; /** The underlying ManagedConnectionFactory. */ private final ManagedConnectionFactoryBase mMcf; /** * Constructs a new FsConnectionFactoryImpl. * * @param cm The ConnectionManager to use. * @param mcf The underlying ManagedConnectionFactory. * @param props The properties to use. These properties come from the * deployment descriptor if ones defined; otherwise these the default * properties. */ public FsConnectionFactoryImpl (final ConnectionManager cm, final ManagedConnectionFactoryBase mcf, Properties props) { final boolean finer = logger.isLoggable(Level.FINER); if (finer) { logger.entering(CLASSNAME, "FsConnectionFactoryImpl", new Object [] {cm, mcf, props}); } mConnectionManager = cm; mMcf = mcf; mDdProps = props; if (finer) { logger.exiting(CLASSNAME, "FsConnectionFactoryImpl"); } } /** {@inheritDoc} */ public FsConnection getConnection () throws ResourceException { logger.entering(CLASSNAME, METHOD_GET_CONNECTION); final FsConnectionRequestInfo fsCri = new FsConnectionRequestInfo( mDdProps); final FsConnection result = allocateConnection(fsCri); logger.exiting(CLASSNAME, METHOD_GET_CONNECTION, result); return result; } /** {@inheritDoc} */ public FsConnection getConnection (Properties props) throws ResourceException { logger.entering(CLASSNAME, METHOD_GET_CONNECTION, props); // Merge the properties: // DdProps --> Client Props final Properties p = new Properties(); p.putAll(mDdProps); if (props != null) { p.putAll(props); } if (logger.isLoggable(Level.FINER)) { logger.finer("Using properties " + p.toString()); } final FsConnectionRequestInfo fsCri = new FsConnectionRequestInfo(p); final FsConnection result = allocateConnection(fsCri); logger.exiting(CLASSNAME, METHOD_GET_CONNECTION, result); return result; } /** * @param fsCri * @return * @throws ResourceException */ private FsConnection allocateConnection (final FsConnectionRequestInfo fsCri) throws ResourceException { fsCri.setUserPassword(mMcf.getUserPassword()); final FsConnection result = (FsConnection) mConnectionManager .allocateConnection(mMcf, fsCri); return result; } /** {@inheritDoc} */ public void setReference (Reference reference) { mReference = reference; } /** {@inheritDoc} */ public Reference getReference () throws NamingException { return mReference; } /** * @return ConnectionManager. */ public ConnectionManager getConnectionManager () { return mConnectionManager; } }