FileDocCategorySizeDatePackage
LocalManagedConnectionFactory.javaAPI DocJBoss 4.2.19936Fri Jul 13 21:01:12 BST 2007org.jboss.resource.adapter.jdbc.local

LocalManagedConnectionFactory

public class LocalManagedConnectionFactory extends org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnectionFactory
LocalManagedConnectionFactory
author
David Jencks
author
Adrian Brock
author
Weston Price
version
$Revision: 57189 $

Fields Summary
static final long
serialVersionUID
private String
driverClass
private transient Driver
driver
private String
connectionURL
protected String
connectionProperties
Constructors Summary
public LocalManagedConnectionFactory()


    
   

   
Methods Summary
public javax.resource.spi.ManagedConnectioncreateManagedConnection(javax.security.auth.Subject subject, javax.resource.spi.ConnectionRequestInfo cri)

      Properties props = getConnectionProperties(subject, cri);
      // Some friendly drivers (Oracle, you guessed right) modify the props you supply.
      // Since we use our copy to identify compatibility in matchManagedConnection, we need
      // a pristine copy for our own use.  So give the friendly driver a copy.
      Properties copy = (Properties) props.clone();
      boolean trace = log.isTraceEnabled();
      if (trace)
      {
         // Make yet another copy to mask the password
         Properties logCopy = copy;
         if (copy.getProperty("password") != null)
         {
            logCopy = (Properties) props.clone();
            logCopy.setProperty("password", "--hidden--");
         }
         log.trace("Using properties: " + logCopy);
      }

      try
      {
         String url = getConnectionURL();
         Driver d = getDriver(url);
         Connection con = d.connect(url, copy);
         if (con == null)
            throw new JBossResourceException("Wrong driver class for this connection URL");

         return new LocalManagedConnection(this, con, props, transactionIsolation, preparedStatementCacheSize);
      }
      catch (Exception e)
      {
         throw new JBossResourceException("Could not create connection", e);
      }
   
public booleanequals(java.lang.Object other)

      if (this == other)
         return true;
      if (getClass() != other.getClass())
         return false;
      LocalManagedConnectionFactory otherMcf = (LocalManagedConnectionFactory) other;
      return this.connectionURL.equals(otherMcf.connectionURL) && this.driverClass.equals(otherMcf.driverClass)
            && ((this.userName == null) ? otherMcf.userName == null : this.userName.equals(otherMcf.userName))
            && ((this.password == null) ? otherMcf.password == null : this.password.equals(otherMcf.password))
            && this.transactionIsolation == otherMcf.transactionIsolation;

   
public java.lang.StringgetConnectionProperties()
Get the value of connectionProperties.

return
value of connectionProperties.

      return connectionProperties;
   
public java.lang.StringgetConnectionURL()
Get the value of ConnectionURL.

return
value of ConnectionURL.

      return connectionURL;
   
protected synchronized java.sql.DrivergetDriver(java.lang.String url)
Check the driver for the given URL. If it is not registered already then register it.

param
url The JDBC URL which we need a driver for.

      boolean trace = log.isTraceEnabled();
      
      // don't bother if it is loaded already
      if (driver != null)
      {
         return driver;
      }
      if (trace)
         log.trace("Checking driver for URL: " + url);

      if (driverClass == null)
      {
         throw new JBossResourceException("No Driver class specified!");
      }

      // Check if the driver is already loaded, if not then try to load it

      if (isDriverLoadedForURL(url))
      {
         return driver;
      } // end of if ()

      try
      {
         //try to load the class... this should register with DriverManager.
         Class clazz = Class.forName(driverClass, true, Thread.currentThread().getContextClassLoader());
         if (isDriverLoadedForURL(url))
            //return immediately, some drivers (Cloudscape) do not let you create an instance.
            return driver;

         //We loaded the class, but either it didn't register
         //and is not spec compliant, or is the wrong class.
         driver = (Driver) clazz.newInstance();
         DriverManager.registerDriver(driver);
         if (isDriverLoadedForURL(url))
            return driver;
         //We can even instantiate one, it must be the wrong class for the URL.
      }
      catch (Exception e)
      {
         throw new JBossResourceException("Failed to register driver for: " + driverClass, e);
      }

      throw new JBossResourceException("Apparently wrong driver class specified for URL: class: " + driverClass
            + ", url: " + url);
   
public java.lang.StringgetDriverClass()
Get the DriverClass value.

return
the DriverClass value.

      return driverClass;
   
public inthashCode()

      int result = 17;
      result = result * 37 + ((connectionURL == null) ? 0 : connectionURL.hashCode());
      result = result * 37 + ((driverClass == null) ? 0 : driverClass.hashCode());
      result = result * 37 + ((userName == null) ? 0 : userName.hashCode());
      result = result * 37 + ((password == null) ? 0 : password.hashCode());
      result = result * 37 + transactionIsolation;
      return result;
   
protected java.lang.StringinternalGetConnectionURL()

      return connectionURL;
   
private booleanisDriverLoadedForURL(java.lang.String url)

      boolean trace = log.isTraceEnabled();
      
      try
      {
         driver = DriverManager.getDriver(url);
         if (trace)
            log.trace("Driver already registered for url: " + url);
         return true;
      }
      catch (Exception e)
      {
         if (trace)
            log.trace("Driver not yet registered for url: " + url);
         return false;
      }
   
public javax.resource.spi.ManagedConnectionmatchManagedConnections(java.util.Set mcs, javax.security.auth.Subject subject, javax.resource.spi.ConnectionRequestInfo cri)

      Properties newProps = getConnectionProperties(subject, cri);
      
      for (Iterator i = mcs.iterator(); i.hasNext();)
      {
         Object o = i.next();
      
         if (o instanceof LocalManagedConnection)
         {
            LocalManagedConnection mc = (LocalManagedConnection) o;
            
            //First check the properties
            if (mc.getProps().equals(newProps))
            {
               //Next check to see if we are validating on matchManagedConnections
               if((getValidateOnMatch() && mc.checkValid()) || !getValidateOnMatch())
               {
                
                  return mc;

               }            
               
            }
         }
      }
      
      return null;
   
public voidsetConnectionProperties(java.lang.String connectionProperties)
Set the value of connectionProperties.

param
connectionProperties Value to assign to connectionProperties.

      this.connectionProperties = connectionProperties;
      connectionProps.clear();
      if (connectionProperties != null)
      {
         // Map any \ to \\
         connectionProperties = connectionProperties.replaceAll("\\\\", "\\\\\\\\");

         InputStream is = new ByteArrayInputStream(connectionProperties.getBytes());
         try
         {
            connectionProps.load(is);
         }
         catch (IOException ioe)
         {
            throw new NestedRuntimeException("Could not load connection properties", ioe);
         }
      }
   
public voidsetConnectionURL(java.lang.String connectionURL)
Set the value of ConnectionURL.

param
connectionURL Value to assign to ConnectionURL.

      this.connectionURL = connectionURL;
   
public synchronized voidsetDriverClass(java.lang.String driverClass)
Set the DriverClass value.

param
driverClass The new DriverClass value.

      this.driverClass = driverClass;
      driver = null;