You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2021/12/23 16:25:13 UTC

[logging-log4j1] annotated tag CHAINSAW_2_SANDBOX_MERGE created (now 5e22bdb)

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a change to annotated tag CHAINSAW_2_SANDBOX_MERGE
in repository https://gitbox.apache.org/repos/asf/logging-log4j1.git.


      at 5e22bdb  (tag)
 tagging 0e0d16540cc263a22fd137a6ea93e75ae5767a3b (commit)
      by No Author
      on Tue Jun 24 21:05:11 2003 +0000

- Log -----------------------------------------------------------------
CHAINSAW_2_SANDBOX_MERGE
-----------------------------------------------------------------------

This annotated tag includes the following new commits:

     new 0e0d165  This commit was manufactured by cvs2svn to create tag 'CHAINSAW_2_SANDBOX_MERGE'.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[logging-log4j1] 01/01: This commit was manufactured by cvs2svn to create tag 'CHAINSAW_2_SANDBOX_MERGE'.

Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to annotated tag CHAINSAW_2_SANDBOX_MERGE
in repository https://gitbox.apache.org/repos/asf/logging-log4j1.git

commit 0e0d16540cc263a22fd137a6ea93e75ae5767a3b
Author: No Author <de...@apache.org>
AuthorDate: Tue Jun 24 21:05:11 2003 +0000

    This commit was manufactured by cvs2svn to create tag
    'CHAINSAW_2_SANDBOX_MERGE'.
    
    git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/tags/CHAINSAW_2_SANDBOX_MERGE@309861 13f79535-47bb-0310-9956-ffa450edef68
---
 .../org/apache/log4j/jdbc/ConnectionSource.java    |  83 ---
 src/java/org/apache/log4j/jdbc/JDBCReceiver.java   | 357 -----------
 .../apache/log4j/jdbc/JNDIConnectionSource.java    | 216 -------
 .../log4j/jdbc/PreparedStatementAppender.java      | 705 ---------------------
 .../log4j/jdbc/PreparedStatementParameter.java     | 276 --------
 .../apache/log4j/jdbc/PreparedStatementSource.java |  87 ---
 .../org/apache/log4j/jdbc/UrlConnectionSource.java | 188 ------
 7 files changed, 1912 deletions(-)

diff --git a/src/java/org/apache/log4j/jdbc/ConnectionSource.java b/src/java/org/apache/log4j/jdbc/ConnectionSource.java
deleted file mode 100644
index 72d7abd..0000000
--- a/src/java/org/apache/log4j/jdbc/ConnectionSource.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.OptionHandler;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-
-
-/**
- *  The <code>ConnectionSource</code> interface provides a pluggable means of
- *  transparently obtaining JDBC {@link java.sql.Connection}s for log4j classes
- *  that require the use of a {@link java.sql.Connection}.
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public interface ConnectionSource extends OptionHandler {
-  /**
-   *  Obtain a {@link java.sql.Connection} for use.  The client is
-   *  responsible for closing the {@link java.sql.Connection} when it is no
-   *  longer required.
-   *
-   *  @throws SQLException  if a {@link java.sql.Connection} could not be
-   *                        obtained
-   */
-  Connection getConnection() throws SQLException;
-
-  /**
-   *  Set the error handler.
-   *
-   *  @param errorHanlder  the new error handler
-   */
-  void setErrorHandler(ErrorHandler errorHandler);
-}
diff --git a/src/java/org/apache/log4j/jdbc/JDBCReceiver.java b/src/java/org/apache/log4j/jdbc/JDBCReceiver.java
deleted file mode 100644
index 566894f..0000000
--- a/src/java/org/apache/log4j/jdbc/JDBCReceiver.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-
-
-/**
- * Convert Log data stored in a database into LoggingEvents.
- *
- * This receiver executes the SQL statement defined in the plugin configuration once,
- * converting the rows it finds into LoggingEvents, and then ends.
- *
- * The configuration of this plugin is very similar to the JDBCAppender, however a
- * SELECT statement must be provided instead of an INSERT statement.
- *
- * The select statement must provide all fields which define a LoggingEvent, with
- * the column names matching this list: LOGGER, TIMESTAMP, LEVEL, THREAD, MESSAGE,
- * NDC, MDC, CLASS, METHOD, FILE, LINE, PROPERTIES, EXCEPTION
- *
- * If the source table doesn't provide a column for any of the fields, the field must
- * still be provided in the SELECT statement.  For example, if a JDBCAppender was used
- * to write only a timestamp, level and patternlayout combination of message and other
- * fields, here is a sample SQL statement you would provide as the plugin 'sql' param:
- *
- * EXAMPLE MYSQL SELECT STATEMENT WHICH CAN BE USED TO PROVIDE EVENTS TO CHAINSAW - 
- * (counter is an autoincrement int column and timestamp is a datetime column):
- * 
- * param name="sql" value='select logger as LOGGER, timestamp as TIMESTAMP, 
- * level as LEVEL, thread as THREAD, message as MESSAGE, ndc as NDC, mdc as MDC, 
- * class as CLASS, method as METHOD, file as FILE, line as LINE, 
- * concat("{{log4japp,databaselogs,log4jmachinename,mymachine,log4jid,", COUNTER, "}}") 
- * as PROPERTIES, "" as EXCEPTION from logtable' 
- *
- * In other words, if a number of LoggingEvent properties were combined into one field
- * in the database, the combined field should be set as the MESSAGE column in the
- * SELECT statement.  Missing columns should be set to "".
- *
- * Make sure to alias the column names if needed to match the list provided above.
- *
- * NOTE: Patternlayout doesn't support Properties and JDBCAppender doesn't support
- * exceptions, but the fields can be defined in the SQL statement and included in
- * the event.
- *
- * This means that log4japp and/or log4jmachinename properties can be provided and
- * the properties may be used to create a unique tab for the events.
- *
- * Both {{name, value, name2, value2}} formats and formats without the double braces
- * are supported for MDC and properties fields.
- * 
- * NOTE: If refreshMillis is not set, the receiver will run the SQL ONCE.  If it is set,
- * the SQL will be ran every refreshMillis milliseconds.
- * 
- * WARNING: Using refreshMillis with an event processing tool that doesn't know how 
- * to ignore duplicate events will result in duplicate events being processed.
- * 
- * CREATING EVENTS USABLE BY CHAINSAW: 
- * Chainsaw's event reception ignores duplicate event delivery, so refreshMillis can be 
- * set and JDBCReceiver can be used as a primary receiver with Chainsaw - allowing 
- * a timed re-retrieve of events from a database into the UI for analysis of events.
- * 
- * Include the properties as provided in the example SQL above to successfully get 
- * events to be delivered into Chainsaw.  The log4jid property must be provided by the 
- * database and the timestamp field must be a datetime.  The log4jmachinename and log4japp 
- * properties are specific to your application and define which unique tab the events are 
- * delivered to.
- * 
- * @author Scott Deboy <sd...@apache.org>
- *
- */
-public class JDBCReceiver extends Receiver {
-  private boolean isActive = false;
-
-  /**
-   * URL of the DB for default connection handling
-   */
-  protected String databaseURL = "jdbc:odbc:myDB";
-
-  /**
-   * User to connect as for default connection handling
-   */
-  protected String databaseUser = "me";
-
-  /**
-   * User to use for default connection handling
-   */
-  protected String databasePassword = "mypassword";
-  protected Connection connection = null;
-  protected String sqlStatement = "";
-  protected String refreshMillis = null;
-
-  public JDBCReceiver() {
-  }
-
-  /**
-   * Start a thread which will handle the retrieval.
-   */
-  public void activateOptions() {
-    new JDBCReceiverThread().start();
-  }
-
-  protected Connection getConnection() throws SQLException {
-    if (!DriverManager.getDrivers().hasMoreElements()) {
-      setDriver("sun.jdbc.odbc.JdbcOdbcDriver");
-    }
-
-    if (connection == null) {
-      connection =
-        DriverManager.getConnection(
-          databaseURL, databaseUser, databasePassword);
-    }
-
-    return connection;
-  }
-
-  public void close() {
-    try {
-      if ((connection != null) && !connection.isClosed()) {
-        connection.close();
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-    }
-  }
-
-  public void finalize() {
-    close();
-  }
-
-  public synchronized void shutdown() {
-  }
-
-  public void setRefreshMillis(String s) {
-    refreshMillis = s;
-  }
-
-  public String getRefreshMillis() {
-    return refreshMillis;
-  }
-
-  public void setSql(String s) {
-    sqlStatement = s;
-  }
-
-  public String getSql() {
-    return sqlStatement;
-  }
-
-  public void setUser(String user) {
-    databaseUser = user;
-  }
-
-  public String getUser() {
-    return databaseUser;
-  }
-
-  public void setURL(String url) {
-    databaseURL = url;
-  }
-
-  public String getURL() {
-    return databaseURL;
-  }
-
-  public void setPassword(String password) {
-    databasePassword = password;
-  }
-
-  public String getPassword() {
-    return databasePassword;
-  }
-
-  /**
-   * Ensures that the given driver class has been loaded for sql connection
-   * creation.
-   */
-  public void setDriver(String driverClass) {
-    try {
-      Class.forName(driverClass);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-  class JDBCReceiverThread extends Thread {
-    public JDBCReceiverThread() {
-      setDaemon(true);
-    }
-
-    public void run() {
-      active = true; 
-
-      do {
-        try {
-          Logger logger = null;
-          long timeStamp = 0L;
-          String level = null;
-          String threadName = null;
-          Object message = null;
-          String ndc = null;
-          Hashtable mdc = null;
-          String[] exception = null;
-          String className = null;
-          String methodName = null;
-          String fileName = null;
-          String lineNumber = null;
-          Hashtable properties = null;
-
-          Statement statement = getConnection().createStatement();
-          ResultSet rs = statement.executeQuery(sqlStatement);
-
-          while (rs.next()) {
-            logger = Logger.getLogger(rs.getString("LOGGER"));
-            timeStamp = rs.getTimestamp("TIMESTAMP").getTime();
-
-            level = rs.getString("LEVEL");
-            threadName = rs.getString("THREAD");
-            message = rs.getString("MESSAGE");
-            ndc = rs.getString("NDC");
-
-            String mdcString = rs.getString("MDC");
-            mdc = new Hashtable();
-
-            if (mdcString != null) {
-              //support MDC being wrapped in {{name, value}} or just name, value
-              if (
-                (mdcString.indexOf("{{") > -1)
-                  && (mdcString.indexOf("}}") > -1)) {
-                mdcString =
-                  mdcString.substring(
-                    mdcString.indexOf("{{") + 2, mdcString.indexOf("}}"));
-              }
-
-              StringTokenizer tok = new StringTokenizer(mdcString, ",");
-
-              while (tok.countTokens() > 1) {
-                mdc.put(tok.nextToken(), tok.nextToken());
-              }
-            }
-
-            //although exception is not supported by jdbcappender, it needs to be provided in the SQL string
-            exception = new String[] { rs.getString("EXCEPTION") };
-            className = rs.getString("CLASS");
-            methodName = rs.getString("METHOD");
-            fileName = rs.getString("FILE");
-            lineNumber = rs.getString("LINE");
-
-            //although properties are not supported by JDBCAppender, if they are provided in the 
-            //SQL they can be used here (for example, to route events to a unique tab if 
-            //the machinename and/or appname property are set)
-            String propertiesString = rs.getString("PROPERTIES");
-            properties = new Hashtable();
-
-            if (propertiesString != null) {
-              //support properties being wrapped in {{name, value}} or just name, value
-              if (
-                (propertiesString.indexOf("{{") > -1)
-                  && (propertiesString.indexOf("}}") > -1)) {
-                propertiesString =
-                  propertiesString.substring(
-                    propertiesString.indexOf("{{") + 2,
-                    propertiesString.indexOf("}}"));
-              }
-
-              StringTokenizer tok2 =
-                new StringTokenizer(propertiesString, ",");
-
-              while (tok2.countTokens() > 1) {
-                properties.put(tok2.nextToken(), tok2.nextToken());
-              }
-            }
-
-            Level levelImpl = Level.toLevel(level);
-
-            LoggingEvent event =
-              new LoggingEvent(
-                logger.getName(), logger, timeStamp, levelImpl, threadName,
-                message, ndc, mdc, exception,
-                new LocationInfo(fileName, className, methodName, lineNumber),
-                properties);
-
-            doPost(event);
-          }
-        } catch (SQLException se) {
-          se.printStackTrace();
-        }
-
-        if (refreshMillis != null) {
-          try {
-            Thread.sleep(Integer.parseInt(refreshMillis));
-          } catch (InterruptedException ie) {
-          }
-        }
-      } while (refreshMillis != null);
-    }
-  }
-}
diff --git a/src/java/org/apache/log4j/jdbc/JNDIConnectionSource.java b/src/java/org/apache/log4j/jdbc/JNDIConnectionSource.java
deleted file mode 100644
index 7d9de72..0000000
--- a/src/java/org/apache/log4j/jdbc/JNDIConnectionSource.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.spi.ErrorHandler;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import javax.rmi.PortableRemoteObject;
-
-import javax.sql.DataSource;
-
-
-/**
- *  The <code>JNDIConnectionSource</code> is an implementation of
- *  {@link ConnectionSource} that obtains a {@link javax.sql.DataSource} from a
- *  JNDI provider and uses it to obtain a {@link java.sql.Connection}.  It is
- *  primarily designed to be used inside of J2EE application servers or
- *  application server clients, assuming the application server supports remote
- *  access of {@link javax.sql.DataSource}s.  In this way one can take
- *  advantage of  connection pooling and whatever other goodies the application
- *  server provides.
- *  <p>
- *  Sample configuration:<br>
- *  <pre>
- *    &lt;connectionSource class="org.apache.log4j.jdbc.JNDIConnectionSource"&gt;
- *        &lt;param name="jndiLocation" value="jdbc/MySQLDS" /&gt;
- *    &lt;/connectionSource&gt;
- *  </pre>
- *  <p>
- *  Sample configuration (with username and password):<br>
- *  <pre>
- *    &lt;connectionSource class="org.apache.log4j.jdbc.JNDIConnectionSource"&gt;
- *        &lt;param name="jndiLocation" value="jdbc/MySQLDS" /&gt;
- *        &lt;param name="username" value="myUser" /&gt;
- *        &lt;param name="password" value="myPassword" /&gt;
- *    &lt;/connectionSource&gt;
- *  </pre>
- *  <p>
- *  Note that this class will obtain an {@link javax.naming.InitialContext}
- *  using the no-argument constructor.  This will usually work when executing
- *  within a J2EE environment.  When outside the J2EE environment, make sure
- *  that you provide a jndi.properties file as described by your JNDI
- *  provider's documentation.
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public class JNDIConnectionSource implements ConnectionSource {
-  private String jndiLocation = null;
-  private DataSource dataSource = null;
-  private ErrorHandler errorHandler = null;
-  private String username = null;
-  private String password = null;
-
-  /**
-   * @see org.apache.log4j.jdbc.ConnectionSource#getConnection()
-   */
-  public Connection getConnection() throws SQLException {
-    Connection conn = null;
-
-    try {
-      ensureDataSource();
-
-      if (username == null) {
-        conn = dataSource.getConnection();
-      } else {
-        conn = dataSource.getConnection(username, password);
-      }
-    } catch (final NamingException ne) {
-      if (errorHandler != null) {
-        errorHandler.error(ne.getMessage(), ne, 0);
-      }
-
-      throw new SQLException(
-        "NamingException while looking up " + "DataSource: " + ne.getMessage());
-    } catch (final ClassCastException cce) {
-      if (errorHandler != null) {
-        errorHandler.error(cce.getMessage(), cce, 0);
-      }
-
-      throw new SQLException(
-        "ClassCastException while looking up " + "DataSource: "
-        + cce.getMessage());
-    }
-
-    return conn;
-  }
-
-  /**
-   * @see org.apache.log4j.spi.OptionHandler#activateOptions()
-   */
-  public void activateOptions() {
-  }
-
-  /**
-   * Returns the jndiLocation.
-   * @return String
-   */
-  public String getJndiLocation() {
-    return jndiLocation;
-  }
-
-  /**
-   * Sets the jndiLocation.
-   * @param jndiLocation The jndiLocation to set
-   */
-  public void setJndiLocation(String jndiLocation) {
-    this.jndiLocation = jndiLocation;
-  }
-
-  /**
-   * Sets the error handler.
-   * @param errorHandler  the error handler to set
-   */
-  public void setErrorHandler(ErrorHandler errorHandler) {
-    this.errorHandler = errorHandler;
-  }
-
-  /**
-   * Returns the password.
-   * @return String
-   */
-  public String getPassword() {
-    return password;
-  }
-
-  /**
-   * Returns the username.
-   * @return String
-   */
-  public String getUsername() {
-    return username;
-  }
-
-  /**
-   * Sets the password.
-   * @param password The password to set
-   */
-  public void setPassword(String password) {
-    this.password = password;
-  }
-
-  /**
-   * Sets the username.
-   * @param username The username to set
-   */
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  private void ensureDataSource() throws NamingException, SQLException {
-    if (dataSource == null) {
-      Context ctx = new InitialContext();
-      Object obj = ctx.lookup(jndiLocation);
-      dataSource =
-        (DataSource) PortableRemoteObject.narrow(obj, DataSource.class);
-    }
-
-    if (dataSource == null) {
-      throw new SQLException(
-        "Failed to obtain data source from JNDI " + "location " + jndiLocation);
-    }
-  }
-}
diff --git a/src/java/org/apache/log4j/jdbc/PreparedStatementAppender.java b/src/java/org/apache/log4j/jdbc/PreparedStatementAppender.java
deleted file mode 100644
index 1ce85c5..0000000
--- a/src/java/org/apache/log4j/jdbc/PreparedStatementAppender.java
+++ /dev/null
@@ -1,705 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-import java.util.ArrayList;
-
-
-/**
- *  The <code>PreparedStatementAppender</code> class provides a JDBC-based
- *  appender that uses {@link java.sql.PreparedStatement}s for efficiency.
- *  Note that this appender takes advantage of the advanced capabilities of the
- *  {@link org.apache.log4j.xml.DOMConfigurator} and therefore must be
- *  configured with an XML configuration file.
- *  <p>
- *  This appender has a number of configurable options.  First and foremost is
- *  the <code>connectionSource</code>, an implementation of
- *  {@link ConnectionSource}.  For example, {@link UrlConnectionSource} and
- *  {@link JNDIConnectionSource} are provider by log4j.  It is recommended that
- *  you use {@link JNDIConnectionSource} whenever possible and create your own
- *  implementation of {@link ConnectionSource} otherwise.  Use
- *  {@link UrlConnectionSource} if you just want to get something working fast.
- *  <p>
- *  Second is the optional <code>preparedStatementSource</code>, an
- *  implementation of {@link PreparedStatementSource}.  Only specify this if
- *  the default statement
- *  provider by <code>PreparedStatementAppender</code> is not sufficient.
- *  By default a statement similar to &quot;<code>INSERT INTO LOG4J (message,
- *  logger, level) VALUES (?, ?, ?)</code>&quot; will be generated based on the
- *  other parameters (see the example below).
- *  <p>
- *  Next, there is a parameter for each part of the logging event you might
- *  want to include in database:<br>
- *  <table border="1" rules="all" cellpadding="3">
- *    <tr>
- *      <th>Parameter</th>
- *      <th>Description</th>
- *      <th>Default JDBC Setter</th>
- *    </tr>
- *    <tr>
- *      <td>messageParameter</td>
- *      <td>The raw log message</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>formattedMessageParameter</td>
- *      <td>The formatted log message</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>loggerParameter</td>
- *      <td>The logger</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>levelParameter</td>
- *      <td>The log message level</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>ndcParameter</td>
- *      <td>The NDC (nested diagnostic context) of the log message</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>exceptionParameter</td>
- *      <td>The message of the exception, i.e. the value of
- *          <code>Exception.getMessage()</code>, for the exception passed to the
- *          logger</td>
- *      <td>setString</td>
- *    </tr>
- *    <tr>
- *      <td>stackParameter</td>
- *      <td>The stack trace of the exception passed to the logger.  Beware that
- *          no effort is made to ensure that the stack trace will fit inside the
- *          database column provided.</td>
- *      <td>setCharacterStream</td>
- *    </tr>
- *    <tr>
- *      <td>timeStampParameter</td>
- *      <td>The time stamp of the log message</td>
- *      <td>setTimerStamp</td>
- *    </tr>
- *  </table><br>
- *  Define whichever subset of these you wish to include in your database table.
- *  If the JDBC setter referenced above is sufficient for the column in
- *  question, you may omit the setter value in the configuration.
- *  <p>
- *  Finally, the table parameter is used to indicate the table into which to
- *  insert the rows for the default prepared statement.
- *
- *  <h3>Example Configurations</h3>
- *  All of the example configurations assume that the database vendor is MySQL,
- *  the instance is test, the user is myUser and the password is myPassword.
- *  The database table is LOG4J and looks like:<br>
- *  <pre>
- *  mysql> desc LOG4J;
- *  +-----------+--------------+------+-----+---------+-------+
- *  | Field     | Type         | Null | Key | Default | Extra |
- *  +-----------+--------------+------+-----+---------+-------+
- *  | msg       | blob         | YES  |     | NULL    |       |
- *  | logger    | varchar(255) | YES  |     | NULL    |       |
- *  | level     | varchar(5)   | YES  |     | NULL    |       |
- *  | ndc       | varchar(255) | YES  |     | NULL    |       |
- *  | exception | blob         | YES  |     | NULL    |       |
- *  | stack     | blob         | YES  |     | NULL    |       |
- *  | formatted | blob         | YES  |     | NULL    |       |
- *  | stamp     | datetime     | YES  |     | NULL    |       |
- *  +-----------+--------------+------+-----+---------+-------+
- *  </pre>
- *
- *  <h4>Quick and dirty</h4>
- *  Include the following in your log4j.xml file:<br>
- *  <pre>
- *  &lt;appender name="X" class="org.apache.log4j.jdbc.PreparedStatementAppender">
- *    &lt;layout class="org.apache.log4j.PatternLayout">
- *      &lt;param name="ConversionPattern" value="%d %-5p %c - %m%n"/>
- *    &lt;/layout>
- *    &lt;connectionSource class="org.apache.log4j.jdbc.UrlConnectionSource">
- *        &lt;param name="driver" value="com.mysql.jdbc.Driver" />
- *        &lt;param name="url" value="jdbc:mysql://localhost:3306/test" />
- *        &lt;param name="username" value="myUser" />
- *        &lt;param name="password" value="myPassword" />
- *    &lt;/connectionSource>
- *    &lt;param name="table" value="LOG4J"/>
- *    &lt;messageParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="msg" />
- *    &lt;/messageParameter>
- *    &lt;loggerParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="logger" />
- *    &lt;/loggerParameter>
- *    &lt;levelParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="level" />
- *    &lt;/levelParameter>
- *    &lt;ndcParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="ndc" />
- *    &lt;/ndcParameter>
- *    &lt;exceptionParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="exception" />
- *    &lt;/exceptionParameter>
- *    &lt;stackParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stack" />
- *    &lt;/stackParameter>
- *    &lt;formattedMessageParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="formatted" />
- *    &lt;/formattedMessageParameter>
- *    &lt;timeStampParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stamp" />
- *    &lt;/timeStampParameter>
- *  &lt;/appender&gt;
- *  </pre>
- *  <p>
- *  This configuration will generate a prepared statement of the form
- *  <code>INSERT INTO LOG4J (msg, logger, level, ndc, exception, stack,
- *  formatted, stamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?)</code>.  If you do not
- *  need one of the columns, for example <code>msg</code>, simply do not include
- *  it in the configuration.
- *
- *  <h4>JNDI-based Configuration</h4>
- *  This example demonstrates the JNDIConnectionSource:<br>
- *  <pre>
- *  &lt;appender name="X" class="org.apache.log4j.jdbc.PreparedStatementAppender">
- *    &lt;layout class="org.apache.log4j.PatternLayout">
- *      &lt;param name="ConversionPattern" value="%d %-5p %c - %m%n"/>
- *    &lt;/layout>
- *  <b>
- *    &lt;connectionSource class="org.apache.log4j.jdbc.JNDIConnectionSource">
- *        &lt;param name="jndiLocation" value="jdbc/MySQLDS" />
- *    &lt;/connectionSource>
- *  </b>
- *    &lt;param name="table" value="LOG4J"/>
- *    &lt;loggerParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="logger" />
- *    &lt;/loggerParameter>
- *    &lt;levelParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="level" />
- *    &lt;/levelParameter>
- *    &lt;exceptionParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="exception" />
- *    &lt;/exceptionParameter>
- *    &lt;stackParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stack" />
- *    &lt;/stackParameter>
- *    &lt;formattedMessageParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="formatted" />
- *    &lt;/formattedMessageParameter>
- *    &lt;timeStampParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stamp" />
- *    &lt;/timeStampParameter>
- *  &lt;/appender&gt;
- *  </pre>
- *  Note that this configuration will produce a slightly different prepared
- *  statement: <code>INSERT INTO LOG4J (logger, level, exception, stack,
- *  formatted, stamp) VALUES (?, ?, ?, ?, ?)</code>.  This was done purely for
- *  demonstration purposes, there is no reason <code>messageParameter</code> and
- *  <code>ndcParameter</code> could not be included.
- *
- *  <h4>Custom PreparedStatementSopurce Configuration</h4>
- *  This example demonstrates a custom {@link PreparedStatementSource}:<br>
- *  <pre>
- *  &lt;appender name="X" class="org.apache.log4j.jdbc.PreparedStatementAppender">
- *    &lt;layout class="org.apache.log4j.PatternLayout">
- *      &lt;param name="ConversionPattern" value="%d %-5p %c - %m%n"/>
- *    &lt;/layout>
- *    &lt;connectionSource class="org.apache.log4j.jdbc.JNDIConnectionSource">
- *        &lt;param name="jndiLocation" value="jdbc/MySQLDS" />
- *    &lt;/connectionSource>
- *  <b>
- *    &lt;preparedStatementSource class="my.wonderful.implmentation.of.PreparedStatementSource">
- *        &lt;param name="myParam1" value="myValue1" />
- *        &lt;param name="myParam2" value="myValue2" />
- *    &lt;/preparedStatementSource>
- *  </b>
- *    &lt;loggerParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="logger" />
- *    &lt;/loggerParameter>
- *    &lt;levelParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="level" />
- *    &lt;/levelParameter>
- *    &lt;exceptionParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="exception" />
- *    &lt;/exceptionParameter>
- *    &lt;stackParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stack" />
- *    &lt;/stackParameter>
- *    &lt;formattedMessageParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="formatted" />
- *    &lt;/formattedMessageParameter>
- *    &lt;timeStampParameter class="org.apache.log4j.jdbc.PreparedStatementParameter">
- *        &lt;param name="columnName" value="stamp" />
- *    &lt;/timeStampParameter>
- *  &lt;/appender&gt;
- *  </pre>
- *  Use this configuration when you want to provide your own
- *  {@link PreparedStatementSource} becuase the default statements are
- *  insufficient.  For example, you want to call a stored procedure or the like.
- *  Note that you still must provide the <code>xxxParameter</code>
- *  configurations.
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public class PreparedStatementAppender extends AppenderSkeleton {
-  private String table = "LOG4J";
-  private PreparedStatementParameter messageParameter = null;
-  private PreparedStatementParameter loggerParameter = null;
-  private PreparedStatementParameter levelParameter = null;
-  private PreparedStatementParameter ndcParameter = null;
-  private PreparedStatementParameter exceptionParameter = null;
-  private PreparedStatementParameter stackParameter = null;
-  private PreparedStatementParameter timeStampParameter = null;
-  private PreparedStatementParameter formattedMessageParameter = null;
-  private ConnectionSource connectionSource = null;
-  private PreparedStatementSource preparedStatementSource = null;
-  private StringBuffer sql = new StringBuffer();
-  private final ArrayList params = new ArrayList();
-
-  /**
-   *  Default constructor.
-   */
-  public PreparedStatementAppender() {
-  }
-
-  public String getTable() {
-    return table;
-  }
-
-  public void setTable(String newTable) {
-    table = newTable;
-  }
-
-  public void activateOptions() {
-    super.activateOptions();
-
-    // Set up default setters and create the params list
-    if (messageParameter != null) {
-      params.add(messageParameter);
-      messageParameter.setErrorHandler(errorHandler);
-
-      if (messageParameter.getJdbcSetter() == null) {
-        messageParameter.setJdbcSetter("setString");
-      }
-    }
-
-    if (loggerParameter != null) {
-      params.add(loggerParameter);
-      loggerParameter.setErrorHandler(errorHandler);
-
-      if (loggerParameter.getJdbcSetter() == null) {
-        loggerParameter.setJdbcSetter("setString");
-      }
-    }
-
-    if (levelParameter != null) {
-      params.add(levelParameter);
-      levelParameter.setErrorHandler(errorHandler);
-
-      if (levelParameter.getJdbcSetter() == null) {
-        levelParameter.setJdbcSetter("setString");
-      }
-    }
-
-    if (ndcParameter != null) {
-      params.add(ndcParameter);
-      ndcParameter.setErrorHandler(errorHandler);
-
-      if (ndcParameter.getJdbcSetter() == null) {
-        ndcParameter.setJdbcSetter("setString");
-      }
-    }
-
-    if (exceptionParameter != null) {
-      params.add(exceptionParameter);
-      exceptionParameter.setErrorHandler(errorHandler);
-
-      if (exceptionParameter.getJdbcSetter() == null) {
-        exceptionParameter.setJdbcSetter("setString");
-      }
-    }
-
-    if (stackParameter != null) {
-      params.add(stackParameter);
-      stackParameter.setErrorHandler(errorHandler);
-
-      if (stackParameter.getJdbcSetter() == null) {
-        stackParameter.setJdbcSetter("setCharacterStream");
-      }
-    }
-
-    if (timeStampParameter != null) {
-      params.add(timeStampParameter);
-      timeStampParameter.setErrorHandler(errorHandler);
-
-      if (timeStampParameter.getJdbcSetter() == null) {
-        timeStampParameter.setJdbcSetter("setTimestamp");
-      }
-    }
-
-    if (formattedMessageParameter != null) {
-      params.add(formattedMessageParameter);
-      formattedMessageParameter.setErrorHandler(errorHandler);
-
-      if (formattedMessageParameter.getJdbcSetter() == null) {
-        formattedMessageParameter.setJdbcSetter("setString");
-      }
-    }
-
-    params.trimToSize();
-
-    connectionSource.setErrorHandler(errorHandler);
-    connectionSource.activateOptions();
-
-    if (preparedStatementSource == null) {
-      generateSql();
-    } else {
-      preparedStatementSource.activateOptions();
-    }
-  }
-
-  public void append(LoggingEvent event) {
-    Throwable throwable = null;
-
-    if (event.getThrowableInformation() != null) {
-      throwable = event.getThrowableInformation().getThrowable();
-    }
-
-    Connection conn = null;
-    PreparedStatement stmt = null;
-
-    try {
-      conn = connectionSource.getConnection();
-
-      if (preparedStatementSource != null) {
-        stmt = preparedStatementSource.generate(this, conn);
-      } else {
-        stmt = conn.prepareStatement(sql.toString());
-      }
-
-      // Set stmt parameters
-      if (messageParameter != null) {
-        messageParameter.setParameter(
-          stmt, String.valueOf(event.getMessage()));
-      }
-
-      if (loggerParameter != null) {
-        loggerParameter.setParameter(stmt, event.getLoggerName());
-      }
-
-      if (levelParameter != null) {
-        levelParameter.setParameter(stmt, event.getLevel());
-      }
-
-      if (ndcParameter != null) {
-        ndcParameter.setParameter(stmt, event.getNDC());
-      }
-
-      if (exceptionParameter != null) {
-        if (throwable != null) {
-          exceptionParameter.setParameter(stmt, throwable.getMessage());
-        } else {
-          exceptionParameter.setParameter(stmt, "");
-        }
-      }
-
-      if (stackParameter != null) {
-        stackParameter.setParameter(stmt, event.getThrowableInformation());
-      }
-
-      if (timeStampParameter != null) {
-        timeStampParameter.setParameter(stmt, event.timeStamp);
-      }
-
-      if (formattedMessageParameter != null) {
-        formattedMessageParameter.setParameter(
-          stmt, getLayout().format(event));
-      }
-
-      // OK, do the dirty deed
-      stmt.executeUpdate();
-    } catch (final SQLException sqle) {
-      errorHandler.error(
-        "Error executing SQL: " + sql, sqle, ErrorCode.GENERIC_FAILURE, event);
-    } finally {
-      closeJdbc(stmt, conn);
-    }
-  }
-
-  public boolean requiresLayout() {
-    return true;
-  }
-
-  public void close() {
-  }
-
-  private void generateSql() {
-    int colCount = 0;
-    sql.setLength(0);
-    sql.append("INSERT INTO ").append(table).append(" (");
-
-    for (int i = 0; i < params.size(); i++) {
-      colCount = appendColumn(getParameter(i), colCount);
-    }
-
-    sql.append(") VALUES (");
-
-    for (int i = 0; i < colCount; i++) {
-      sql.append((i == 0) ? "?" : ", ?");
-    }
-
-    sql.append(")");
-    System.out.println(sql);
-  }
-
-  private int appendColumn(PreparedStatementParameter psp, int colCount) {
-    if ((psp != null) && (psp.getColumnName() != null)) {
-      sql.append((colCount == 0) ? "" : ", ").append(psp.getColumnName());
-      psp.setOrder(++colCount);
-
-      System.out.println(
-        "JDBC setter for " + psp.getColumnName() + " is "
-        + psp.getJdbcSetter());
-    }
-
-    return colCount;
-  }
-
-  private void closeJdbc(PreparedStatement stmt, Connection conn) {
-    try {
-      if (stmt != null) {
-        stmt.close();
-      }
-    } catch (final SQLException sqle) {
-      errorHandler.error(
-        "Error closing prepared statement", sqle, ErrorCode.GENERIC_FAILURE);
-    }
-
-    try {
-      if (conn != null) {
-        conn.close();
-      }
-    } catch (final SQLException sqle) {
-      errorHandler.error(
-        "Error closing connection", sqle, ErrorCode.GENERIC_FAILURE);
-    }
-  }
-
-  private PreparedStatementParameter getParameter(int i) {
-    return (PreparedStatementParameter) params.get(i);
-  }
-
-  /**
-   * Returns the timeStampParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getTimeStampParameter() {
-    return timeStampParameter;
-  }
-
-  /**
-   * Returns the exceptionParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getExceptionParameter() {
-    return exceptionParameter;
-  }
-
-  /**
-   * Returns the formattedMessageParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getFormattedMessageParameter() {
-    return formattedMessageParameter;
-  }
-
-  /**
-   * Returns the levelParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getLevelParameter() {
-    return levelParameter;
-  }
-
-  /**
-   * Returns the loggerParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getLoggerParameter() {
-    return loggerParameter;
-  }
-
-  /**
-   * Returns the messageParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getMessageParameter() {
-    return messageParameter;
-  }
-
-  /**
-   * Returns the ndcParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getNdcParameter() {
-    return ndcParameter;
-  }
-
-  /**
-   * Returns the stackParameter.
-   * @return PreparedStatementParameter
-   */
-  public PreparedStatementParameter getStackParameter() {
-    return stackParameter;
-  }
-
-  /**
-   * Sets the timeStampParameter.
-   * @param timeStampParameter The timeStampParameter to set
-   */
-  public void setTimeStampParameter(PreparedStatementParameter date) {
-    this.timeStampParameter = date;
-  }
-
-  /**
-   * Sets the exceptionParameter.
-   * @param exceptionParameter The exceptionParameter to set
-   */
-  public void setExceptionParameter(PreparedStatementParameter exception) {
-    this.exceptionParameter = exception;
-  }
-
-  /**
-   * Sets the formattedMessageParameter.
-   * @param formattedMessageParameter The formattedMessageParameter to set
-   */
-  public void setFormattedMessageParameter(
-    PreparedStatementParameter formattedMsg) {
-    this.formattedMessageParameter = formattedMsg;
-  }
-
-  /**
-   * Sets the levelParameter.
-   * @param levelParameter The levelParameter to set
-   */
-  public void setLevelParameter(PreparedStatementParameter level) {
-    this.levelParameter = level;
-  }
-
-  /**
-   * Sets the loggerParameter.
-   * @param loggerParameter The loggerParameter to set
-   */
-  public void setLoggerParameter(PreparedStatementParameter logger) {
-    this.loggerParameter = logger;
-  }
-
-  /**
-   * Sets the messageParameter.
-   * @param messageParameter The messageParameter to set
-   */
-  public void setMessageParameter(PreparedStatementParameter msg) {
-    this.messageParameter = msg;
-  }
-
-  /**
-   * Sets the ndcParameter.
-   * @param ndcParameter The ndcParameter to set
-   */
-  public void setNdcParameter(PreparedStatementParameter ndc) {
-    this.ndcParameter = ndc;
-  }
-
-  /**
-   * Sets the stackParameter.
-   * @param stackParameter The stackParameter to set
-   */
-  public void setStackParameter(PreparedStatementParameter stack) {
-    this.stackParameter = stack;
-  }
-
-  /**
-   * Returns the connectionSource.
-   * @return ConnectionSource
-   */
-  public ConnectionSource getConnectionSource() {
-    return connectionSource;
-  }
-
-  /**
-   * Sets the connectionSource.
-   * @param connectionSource The connectionSource to set
-   */
-  public void setConnectionSource(ConnectionSource connectionSource) {
-    this.connectionSource = connectionSource;
-  }
-
-  /**
-   * Returns the preparedStatementSource.
-   * @return PreparedStatementSource
-   */
-  public PreparedStatementSource getPreparedStatementSource() {
-    return preparedStatementSource;
-  }
-
-  /**
-   * Sets the preparedStatementSource.
-   * @param preparedStatementSource The preparedStatementSource to set
-   */
-  public void setPreparedStatementSource(
-    PreparedStatementSource preparedStatementSource) {
-    this.preparedStatementSource = preparedStatementSource;
-  }
-}
diff --git a/src/java/org/apache/log4j/jdbc/PreparedStatementParameter.java b/src/java/org/apache/log4j/jdbc/PreparedStatementParameter.java
deleted file mode 100644
index c1dcc51..0000000
--- a/src/java/org/apache/log4j/jdbc/PreparedStatementParameter.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.ThrowableInformation;
-
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import java.math.BigDecimal;
-
-import java.sql.Date;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Time;
-import java.sql.Timestamp;
-
-
-/**
- *  The <code>PreparedStatementParameter</code> class encapsulates the
- *  information needed to set a parameter on a
- *  {@link java.sql.PreparedStatement}.
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public class PreparedStatementParameter implements Comparable {
-  private String columnName;
-  private int order;
-  private String jdbcSetter;
-  private ErrorHandler errorHandler;
-
-  /**
-   *  Default constructor.
-   */
-  public PreparedStatementParameter() {
-  }
-
-  /**
-   * Returns the columnName.
-   * @return String
-   */
-  public String getColumnName() {
-    return columnName;
-  }
-
-  /**
-   * Returns the jdbcSetter.
-   * @return String
-   */
-  public String getJdbcSetter() {
-    return jdbcSetter;
-  }
-
-  /**
-   * Returns the order.
-   * @return int
-   */
-  public int getOrder() {
-    return order;
-  }
-
-  /**
-   * Sets the columnName.
-   * @param columnName The columnName to set
-   */
-  public void setColumnName(String columnName) {
-    this.columnName = columnName;
-  }
-
-  /**
-   * Sets the jdbcSetter.
-   * @param jdbcSetter The jdbcSetter to set
-   */
-  public void setJdbcSetter(String jdbcSetter) {
-    this.jdbcSetter = jdbcSetter;
-  }
-
-  /**
-   * Sets the order.
-   * @param order The order to set
-   */
-  public void setOrder(int order) {
-    this.order = order;
-  }
-
-  /**
-   *  Compares based on the order.
-   */
-  public int compareTo(Object obj) {
-    PreparedStatementParameter that = (PreparedStatementParameter) obj;
-
-    if (this.order < that.order) {
-      return -1;
-    } else if (this.order == that.order) {
-      return 0;
-    } else {
-      return 1;
-    }
-  }
-
-  /**
-   *  Set this parameter on the given statement with the given value.
-   *
-   *  @param stmt   the statement
-   *  @param value  the value to set
-   *
-   *  @throws SQLException  if the parameter could not be set
-   */
-  public void setParameter(PreparedStatement stmt, String value)
-    throws SQLException {
-    if ("setString".equals(jdbcSetter)) {
-      stmt.setString(order, value);
-    } else if ("setCharacterStream".equals(jdbcSetter)) {
-      if (value == null) {
-        value = "";
-      }
-
-      stmt.setCharacterStream(order, new StringReader(value), value.length());
-    } else if ("setObject".equals(jdbcSetter)) {
-      stmt.setObject(order, value);
-    } else {
-      errorHandler.error("Unsupported setter for String: " + jdbcSetter);
-    }
-  }
-
-  /**
-   *  Set this parameter on the given statement with the given value.
-   *
-   *  @param stmt   the statement
-   *  @param value  the value to set
-   *
-   *  @throws SQLException  if the parameter could not be set
-   */
-  public void setParameter(PreparedStatement stmt, ThrowableInformation value)
-    throws SQLException {
-    final StringWriter buf = new StringWriter();
-
-    if ((value != null) && (value.getThrowable() != null)) {
-      value.getThrowable().printStackTrace(new PrintWriter(buf));
-    }
-
-    final String str = buf.getBuffer().toString();
-
-    if ("setString".equals(jdbcSetter)) {
-      stmt.setString(order, str);
-    } else if ("setCharacterStream".equals(jdbcSetter)) {
-      stmt.setCharacterStream(order, new StringReader(str), str.length());
-    } else if ("setObject".equals(jdbcSetter)) {
-      stmt.setObject(order, str);
-    } else {
-      errorHandler.error("Unsupported setter for Throwable: " + jdbcSetter);
-    }
-  }
-
-  /**
-   *  Set this parameter on the given statement with the given value.
-   *
-   *  @param stmt   the statement
-   *  @param value  the value to set
-   *
-   *  @throws SQLException  if the parameter could not be set
-   */
-  public void setParameter(PreparedStatement stmt, Level value)
-    throws SQLException {
-    if ("setString".equals(jdbcSetter)) {
-      stmt.setString(order, String.valueOf(value));
-    } else if ("setInt".equals(jdbcSetter)) {
-      stmt.setInt(order, value.toInt());
-    } else if ("setObject".equals(jdbcSetter)) {
-      stmt.setObject(order, String.valueOf(value));
-    } else if ("setLong".equals(jdbcSetter)) {
-      stmt.setLong(order, value.toInt());
-    } else if ("setDouble".equals(jdbcSetter)) {
-      stmt.setDouble(order, value.toInt());
-    } else if ("setBigDecimal".equals(jdbcSetter)) {
-      stmt.setBigDecimal(order, new BigDecimal(value.toInt()));
-    } else if ("setFloat".equals(jdbcSetter)) {
-      stmt.setFloat(order, value.toInt());
-    } else {
-      errorHandler.error("Unsupported setter for Level: " + jdbcSetter);
-    }
-  }
-
-  /**
-   *  Set this parameter on the given statement with the given value.
-   *
-   *  @param stmt   the statement
-   *  @param value  the value to set
-   *
-   *  @throws SQLException  if the parameter could not be set
-   */
-  public void setParameter(PreparedStatement stmt, long value)
-    throws SQLException {
-    if ("setTimestamp".equals(jdbcSetter)) {
-      stmt.setTimestamp(order, new Timestamp(value));
-    } else if ("setDate".equals(jdbcSetter)) {
-      stmt.setDate(order, new Date(value));
-    } else if ("setTime".equals(jdbcSetter)) {
-      stmt.setTime(order, new Time(value));
-    } else if ("setString".equals(jdbcSetter)) {
-      stmt.setString(order, String.valueOf(value));
-    } else if ("setObject".equals(jdbcSetter)) {
-      stmt.setObject(order, new Long(value));
-    } else if ("setLong".equals(jdbcSetter)) {
-      stmt.setLong(order, value);
-    } else if ("setDouble".equals(jdbcSetter)) {
-      stmt.setDouble(order, value);
-    } else if ("setBigDecimal".equals(jdbcSetter)) {
-      stmt.setBigDecimal(order, new BigDecimal(value));
-    } else if ("setInt".equals(jdbcSetter)) {
-      stmt.setInt(order, (int) value);
-    } else if ("setFloat".equals(jdbcSetter)) {
-      stmt.setFloat(order, (float) value);
-    } else {
-      errorHandler.error("Unsupported setter for long: " + jdbcSetter);
-    }
-  }
-
-  /**
-   * Sets the errorHandler.
-   * @param errorHandler The errorHandler to set
-   */
-  public void setErrorHandler(ErrorHandler errorHandler) {
-    this.errorHandler = errorHandler;
-  }
-}
diff --git a/src/java/org/apache/log4j/jdbc/PreparedStatementSource.java b/src/java/org/apache/log4j/jdbc/PreparedStatementSource.java
deleted file mode 100644
index b838ca5..0000000
--- a/src/java/org/apache/log4j/jdbc/PreparedStatementSource.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.OptionHandler;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-
-/**
- *  The <code>PreparedStatementSource</code> interface provides a pluggable
- *  means of creating {@link java.sql.PreparedStatement}s for use with the
- *  {@link PreparedStatementAppender}.  Create an implementation of this
- *  interface if the default {@link java.sql.PreparedStatement} created
- *  by the appender is not sufficient.
- *  <p>
- *  Note that since a {@link java.sql.CallableStatement} is a
- *  {@link java.sql.PreparedStatement} you can use this
- *  interface to set up calls to stored procedures if desired.
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public interface PreparedStatementSource extends OptionHandler {
-  /**
-   *  Generate a {@link java.sql.PreparedStatement} for use by the client.
-   *  The client is responsible for closing the statement.
-   */
-  public PreparedStatement generate(
-    PreparedStatementAppender psa, Connection conn) throws SQLException;
-
-  /**
-   *  Set the error handler.
-   *
-   *  @param errorHanlder  the new error handler
-   */
-  void setErrorHandler(ErrorHandler errorHandler);
-}
diff --git a/src/java/org/apache/log4j/jdbc/UrlConnectionSource.java b/src/java/org/apache/log4j/jdbc/UrlConnectionSource.java
deleted file mode 100644
index 1a85bb3..0000000
--- a/src/java/org/apache/log4j/jdbc/UrlConnectionSource.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * ============================================================================
- *                   The Apache Software License, Version 1.1
- * ============================================================================
- *
- *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modifica-
- * tion, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of  source code must  retain the above copyright  notice,
- *    this list of conditions and the following disclaimer.
- *
- * 2. 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.
- *
- * 3. The end-user documentation included with the redistribution, if any, must
- *    include  the following  acknowledgment:  "This product includes  software
- *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
- *    Alternately, this  acknowledgment may  appear in the software itself,  if
- *    and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
- *    endorse  or promote  products derived  from this  software without  prior
- *    written permission. For written permission, please contact
- *    apache@apache.org.
- *
- * 5. Products  derived from this software may not  be called "Apache", nor may
- *    "Apache" appear  in their name,  without prior written permission  of the
- *    Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
- * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
- * DING, 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.
- *
- * This software  consists of voluntary contributions made  by many individuals
- * on  behalf of the Apache Software  Foundation.  For more  information on the
- * Apache Software Foundation, please see <http://www.apache.org/>.
- *
- */
-
-package org.apache.log4j.jdbc;
-
-import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.ErrorHandler;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-
-
-/**
- *  The UrlConnectionSource is an implementation of {@link ConnectionSource}
- *  that obtains the Connection in the traditional JDBC manner based on the
- *  connection URL.
- *  <p>
- *  Note that this class will estanblish a new Connection for each call to
- *  {@link #getConnection()}.  It is recommended that you either use a JDBC
- *  driver that natively supported Connection pooling or that you create
- *  your own implementation of {@link ConnectionSource} that taps into whatever
- *  pooling mechanism you are already using.  (If you have access to a JNDI
- *  implementation that supports {@link javax.sql.DataSource}s, e.g. within
- *  a J2EE application server, see {@link JNDIConnectionSource}).
- *  <p>
- *  Sample configuration:<br>
- *  <pre>
- *     &lt;connectionSource class="org.apache.log4j.jdbc.UrlConnectionSource"&gt;
- *        &lt;param name="driver" value="com.mysql.jdbc.Driver" /&gt;
- *        &lt;param name="url" value="jdbc:mysql://localhost:3306/mydb" /&gt;
- *        &lt;param name="username" value="myUser" /&gt;
- *        &lt;param name="password" value="myPassword" /&gt;
- *     &lt;/connectionSource&gt;
- *  </pre>
- *
- *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
- */
-public class UrlConnectionSource implements ConnectionSource {
-  private String driver = null;
-  private String url = null;
-  private String username = null;
-  private String password = null;
-  private ErrorHandler errorHandler = null;
-
-  public void activateOptions() {
-    try {
-      Class.forName(driver);
-    } catch (final ClassNotFoundException cnfe) {
-      if (errorHandler != null) {
-        errorHandler.error(
-          "Could not load JDBC driver class: " + driver, cnfe,
-          ErrorCode.GENERIC_FAILURE);
-      } else {
-        cnfe.printStackTrace();
-      }
-    }
-  }
-
-  /**
-       * @see org.apache.log4j.jdbc.ConnectionSource#getConnection()
-       */
-  public Connection getConnection() throws SQLException {
-    if (username == null) {
-      return DriverManager.getConnection(url);
-    } else {
-      return DriverManager.getConnection(url, username, password);
-    }
-  }
-
-  /**
-   * Returns the password.
-   * @return String
-   */
-  public String getPassword() {
-    return password;
-  }
-
-  /**
-   * Returns the url.
-   * @return String
-   */
-  public String getUrl() {
-    return url;
-  }
-
-  /**
-   * Returns the username.
-   * @return String
-   */
-  public String getUsername() {
-    return username;
-  }
-
-  /**
-   * Sets the password.
-   * @param password The password to set
-   */
-  public void setPassword(String password) {
-    this.password = password;
-  }
-
-  /**
-   * Sets the url.
-   * @param url The url to set
-   */
-  public void setUrl(String url) {
-    this.url = url;
-  }
-
-  /**
-   * Sets the username.
-   * @param username The username to set
-   */
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  /**
-   * Returns the driver.
-   * @return String
-   */
-  public String getDriver() {
-    return driver;
-  }
-
-  /**
-   * Sets the driver.
-   * @param driver The driver to set
-   */
-  public void setDriver(String driver) {
-    this.driver = driver;
-  }
-
-  /**
-   * Sets the error handler.
-   * @param errorHandler  the error handler to set
-   */
-  public void setErrorHandler(ErrorHandler errorHandler) {
-    this.errorHandler = errorHandler;
-  }
-}