You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by jb...@apache.org on 2005/05/02 08:26:03 UTC

svn commit: r165585 [15/42] - in /incubator/derby/code/trunk/java/client/org/apache/derby: client/ client/am/ client/net/ client/resources/ jdbc/

Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java?rev=165585&r1=165584&r2=165585&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java (original)
+++ incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java Sun May  1 23:25:59 2005
@@ -22,1074 +22,1177 @@
 
 import org.apache.derby.jdbc.ClientDataSource;
 
-public class LogWriter
-{
-  protected java.io.PrintWriter printWriter_;
-  protected int traceLevel_;
-  private boolean driverConfigurationHasBeenWrittenToJdbc1Stream_ = false;
-  private boolean driverConfigurationHasBeenWrittenToJdbc2Stream_ = false;
-
-  // It is assumed that this constructor is never called when logWriter is null.
-  public LogWriter (java.io.PrintWriter printWriter, int traceLevel)
-  {
-    printWriter_ = printWriter;
-    traceLevel_ = traceLevel;
-  }
-
-  final protected boolean loggingEnabled (int traceLevel)
-  {
-    // It is an invariant that the printWriter is never null, so remove the
-    return printWriter_ != null && (traceLevel & traceLevel_) != 0;
-  }
-
-  final protected boolean traceSuspended () { return org.apache.derby.client.am.Configuration.traceSuspended__; }
-
-  // When garbage collector doesn't kick in in time
-  // to close file descriptors, "Too many open files"
-  // exception may occur (currently found on Linux).
-  // To minimize the chance of this problem happening,
-  // the print writer needs to be closed (after this
-  // DNC log writer is closed) when each connection has
-  // its own trace file (i.e. traceDirectory is specified).
-  public boolean printWriterNeedsToBeClosed_;
-
-  void close()
-  {
-    if (printWriterNeedsToBeClosed_) {
-      printWriter_.close();
-      printWriterNeedsToBeClosed_ = false;
-    }
-    // printWriter_ = null; // help GC.
-  }
-
-  // ---------------------------------------------------------------------------
-
-  public void dncprintln (String s)
-  {
-    synchronized (printWriter_) {
-      printWriter_.println ("[derby] " + s);
-      printWriter_.flush();
-    }
-  }
-
-  private void dncprint (String s)
-  {
-    synchronized (printWriter_) {
-      printWriter_.print ("[derby] " + s);
-      printWriter_.flush();
-    }
-  }
-
-  private void dncprintln (String header, String s)
-  {
-    synchronized (printWriter_) {
-      printWriter_.println ("[derby]" + header + " " + s);
-      printWriter_.flush();
-    }
-  }
-
-  private void dncprint (String header, String s)
-  {
-    synchronized (printWriter_) {
-      printWriter_.print ("[derby]" + header + " " + s);
-      printWriter_.flush();
-    }
-  }
-
-  // ------------------------ tracepoint api -----------------------------------
-
-  public void tracepoint (String component, int tracepoint, String message)
-  {
-    if (traceSuspended()) return;
-    dncprintln (component,
-      "[time:" + System.currentTimeMillis() + "]" +
-      "[thread:" + Thread.currentThread().getName() + "]" +
-      "[tracepoint:" + tracepoint + "]" +
-      message);
-  }
-
-  public void tracepoint (String component, int tracepoint,
-                          String classContext, String methodContext)
-  {
-    if (traceSuspended()) return;
-    String staticContextTracepointRecord =
-      component +
-      "[time:" + System.currentTimeMillis() + "]" +
-      "[thread:" + Thread.currentThread().getName() + "]" +
-      "[tracepoint:" + tracepoint + "]" +
-      "[" + classContext + "." + methodContext + "]";
-    dncprintln (staticContextTracepointRecord);
-  }
-
-  public void tracepoint (String component, int tracepoint,
-                          Object instance, String classContext, String methodContext)
-  {
-    if (traceSuspended()) return;
-    String instanceContextTracepointRecord =
-      component +
-      "[time:" + System.currentTimeMillis() + "]" +
-      "[thread:" + Thread.currentThread().getName() + "]" +
-      "[tracepoint:" + tracepoint + "]" +
-      "[" + classContext + "@" + Integer.toHexString (instance.hashCode()) + "." + methodContext + "]";
-    dncprintln (instanceContextTracepointRecord);
-  }
-
-  public void tracepoint (String component, int tracepoint,
-                          String classContext, String methodContext,
-                          java.util.Map memory)
-  {
-    if (traceSuspended()) return;
-    String staticContextTracepointRecord =
-      component +
-      "[time:" + System.currentTimeMillis() + "]" +
-      "[thread:" + Thread.currentThread().getName() + "]" +
-      "[tracepoint:" + tracepoint + "]" +
-      "[" + classContext + "." + methodContext + "]";
-    dncprintln (staticContextTracepointRecord + getMemoryMapDisplay (memory));
-  }
-
-  public void tracepoint (String component, int tracepoint,
-                          Object instance, String classContext, String methodContext,
-                          java.util.Map memory)
-  {
-    if (traceSuspended()) return;
-    String instanceContextTracepointRecord =
-      component +
-      "[time:" + System.currentTimeMillis() + "]" +
-      "[thread:" + Thread.currentThread().getName() + "]" +
-      "[tracepoint:" + tracepoint + "]" +
-      "[" + classContext + "@" + Integer.toHexString (instance.hashCode()) + "." + methodContext + "]";
-    dncprintln (instanceContextTracepointRecord + getMemoryMapDisplay (memory));
-  }
-
-  private String getMemoryMapDisplay (java.util.Map memory)
-  {
-    return memory.toString(); // need to loop thru all keys in the map and print values
-  }
-
-  // ------------- API entry and exit trace methods ----------------------------
-  // Entry and exit are be traced separately because input arguments need
-  // to be traced before any potential exception can occur.
-  // Exit tracing is only performed on methods that return values.
-  // Entry tracing is only performed on methods that update state,
-  // so entry tracing is not performed on simple getter methods.
-  // We could decide in the future to restrict entry tracing only to methods with input arguments.
-
-  private void traceExternalMethod (Object instance, String className, String methodName)
-  {
-    if (traceSuspended()) return;
-    dncprint (buildExternalMethodHeader (instance, className), methodName);
-  }
-
-  private void traceExternalDeprecatedMethod (Object instance, String className, String methodName)
-  {
-    if (traceSuspended()) return;
-    dncprint (buildExternalMethodHeader (instance, className), "Deprecated " + methodName);
-  }
-
-  private String buildExternalMethodHeader (Object instance, String className)
-  {
-    return
-      "[Time:" + System.currentTimeMillis() + "]" +
-      "[Thread:" + Thread.currentThread().getName() + "]" +
-      "[" + className + "@" + Integer.toHexString (instance.hashCode()) + "]";
-  }
-
-  private String getClassNameOfInstanceIfTraced (Object instance)
-  {
-    if (instance == null) // this prevents NPE from instance.getClass() used below
-      return null;
-    else if (instance instanceof Connection && loggingEnabled (ClientDataSource.TRACE_CONNECTION_CALLS))
-      return "Connection";
-    else if (instance instanceof ResultSet && loggingEnabled (ClientDataSource.TRACE_RESULT_SET_CALLS))
-      return "ResultSet";
-    else if (instance instanceof CallableStatement && loggingEnabled (ClientDataSource.TRACE_STATEMENT_CALLS))
-      return "CallableStatement";
-    else if (instance instanceof PreparedStatement && loggingEnabled (ClientDataSource.TRACE_STATEMENT_CALLS))
-      return "PreparedStatement";
-    else if (instance instanceof Statement && loggingEnabled (ClientDataSource.TRACE_STATEMENT_CALLS))
-      return "Statement";
-    // Not yet externalizing Blob tracing, except for trace_all
-    else if (instance instanceof Blob && loggingEnabled (ClientDataSource.TRACE_ALL)) // add a trace level for lobs !!
-      return "Blob";
-    // Not yet externalizing Clob tracing, except for trace_all
-    else if (instance instanceof Clob && loggingEnabled (ClientDataSource.TRACE_ALL)) // add a trace level for bobs !!
-      return "Clob";
-    // Not yet externalizing dbmd catalog call tracing, except for trace_all
-    else if (instance instanceof DatabaseMetaData && loggingEnabled (ClientDataSource.TRACE_ALL)) // add a trace level for dbmd ??
-      return "DatabaseMetaData";
-    // we don't use instanceof javax.transaction.XAResource to avoid dependency on j2ee.jar
-    else if (loggingEnabled (ClientDataSource.TRACE_XA_CALLS) &&
-             instance.getClass().getName().startsWith ("org.apache.derby.client.net.NetXAResource"))
-      return "NetXAResource";
-    else if (loggingEnabled (ClientDataSource.TRACE_ALL) &&
-      instance.getClass().getName().equals("org.apache.derby.client.ClientPooledConnection"))
-      return "ClientPooledConnection";
-    else if (loggingEnabled (ClientDataSource.TRACE_ALL) &&
-      instance.getClass().getName().equals("org.apache.derby.jdbc.ClientConnectionPoolDataSource"))
-      return "ClientConnectionPoolDataSource";
-    else if (loggingEnabled (ClientDataSource.TRACE_ALL) &&
-      instance.getClass().getName().equals("org.apache.derby.client.ClientXAConnection"))
-      return "ClientXAConnection";
-    else if (loggingEnabled (ClientDataSource.TRACE_ALL) &&
-      instance.getClass().getName().equals("org.apache.derby.jdbc.ClientDataSource"))
-      return "ClientDataSource";
-    else if (loggingEnabled (ClientDataSource.TRACE_ALL) &&
-      instance.getClass().getName().equals("org.apache.derby.jdbc.ClientXADataSource"))
-      return "ClientXADataSource";
-    else
-      return instance.getClass().getName();
-  }
-
-  // --------------------------- method exit tracing --------------------------
-
-  public void traceExit (Object instance, String methodName, Object returnValue)
-  {
-    if (traceSuspended()) return;
-    String className = getClassNameOfInstanceIfTraced (instance);
-    if (className == null) return;
-    synchronized (printWriter_) {
-      traceExternalMethod (instance, className, methodName);
-      printWriter_.println (" () returned " + returnValue);
-      printWriter_.flush();
-    }
-  }
-
-  public void traceDeprecatedExit (Object instance, String methodName, Object returnValue)
-  {
-    if (traceSuspended()) return;
-    String className = getClassNameOfInstanceIfTraced (instance);
-    if (className == null) return;
-    synchronized (printWriter_) {
-      traceExternalDeprecatedMethod (instance, className, methodName);
-      printWriter_.println (" () returned " + returnValue);
-      printWriter_.flush();
-    }
-  }
-
-  public void traceExit (Object instance, String methodName, ResultSet resultSet)
-  {
-    if (traceSuspended()) return;
-    String returnValue = (resultSet == null) ? "ResultSet@null" : "ResultSet@" + Integer.toHexString (resultSet.hashCode());
-    traceExit (instance, methodName, returnValue);
-  }
-
-  public void traceExit (Object instance, String methodName, CallableStatement returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "CallableStatement@" + Integer.toHexString (returnValue.hashCode()));
-  }
-
-  public void traceExit (Object instance, String methodName, PreparedStatement returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "PreparedStatement@" + Integer.toHexString (returnValue.hashCode()));
-  }
-
-  public void traceExit (Object instance, String methodName, Statement returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "Statement@" + Integer.toHexString (returnValue.hashCode()));
-  }
-
-  public void traceExit (Object instance, String methodName, Blob blob)
-  {
-    if (traceSuspended()) return;
-    String returnValue = (blob == null) ? "Blob@null" : "Blob@" + Integer.toHexString (blob.hashCode());
-    traceExit (instance, methodName, returnValue);
-  }
-
-  public void traceExit (Object instance, String methodName, Clob clob)
-  {
-    if (traceSuspended()) return;
-    String returnValue = (clob == null) ? "Clob@null" : "Clob@" + Integer.toHexString (clob.hashCode());
-    traceExit (instance, methodName, returnValue);
-  }
-
-  public void traceExit (Object instance, String methodName, DatabaseMetaData returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "DatabaseMetaData@" + Integer.toHexString (returnValue.hashCode()));
-  }
-
-  public void traceExit (Object instance, String methodName, Connection returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "Connection@" + Integer.toHexString (returnValue.hashCode()));
-  }
-
-  public void traceExit (Object instance, String methodName, ColumnMetaData returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "MetaData@" + (returnValue != null ? Integer.toHexString (returnValue.hashCode()) : null));
-  }
-
-  public void traceExit (Object instance, String methodName, byte[] returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, Utils.getStringFromBytes (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, int[] returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, Utils.getStringFromInts (returnValue));
-  }
-
-  public void traceDeprecatedExit (Object instance, String methodName, byte[] returnValue)
-  {
-    if (traceSuspended()) return;
-    traceDeprecatedExit (instance, methodName, Utils.getStringFromBytes (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, byte returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, "0x" + Integer.toHexString (returnValue&0xff));
-  }
-
-  public void traceExit (Object instance, String methodName, int returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, String.valueOf (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, boolean returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, String.valueOf (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, long returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, String.valueOf (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, float returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, String.valueOf (returnValue));
-  }
-
-  public void traceExit (Object instance, String methodName, double returnValue)
-  {
-    if (traceSuspended()) return;
-    traceExit (instance, methodName, String.valueOf (returnValue));
-  }
-
-  // --------------------------- method entry tracing --------------------------
-
-  private void traceEntryAllArgs (Object instance, String methodName, String argList)
-  {
-    if (traceSuspended()) return;
-    String className = getClassNameOfInstanceIfTraced (instance);
-    if (className == null) return;
-    synchronized (printWriter_) {
-      traceExternalMethod (instance, className, methodName);
-      printWriter_.println (" " + argList + " called");
-      printWriter_.flush();
-    }
-  }
-
-  private void traceDeprecatedEntryAllArgs (Object instance, String methodName, String argList)
-  {
-    if (traceSuspended()) return;
-    String className = getClassNameOfInstanceIfTraced (instance);
-    if (className == null) return;
-    synchronized (printWriter_) {
-      traceExternalDeprecatedMethod (instance, className, methodName);
-      printWriter_.println (" " + argList + " called");
-      printWriter_.flush();
-    }
-  }
-
-  // ---------------------- trace entry of methods w/ no args ------------------
-
-  public void traceEntry (Object instance, String methodName)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName, "()");
-  }
-
-  // ---------------------- trace entry of methods w/ 1 arg --------------------
-
-  public void traceEntry (Object instance, String methodName, Object argument)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + argument + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, boolean argument)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + argument + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int argument)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + argument + ")");
-  }
-
-  public void traceDeprecatedEntry (Object instance, String methodName, int argument)
-  {
-    if (traceSuspended()) return;
-    traceDeprecatedEntryAllArgs (instance, methodName,
-      "(" + argument + ")");
-  }
-
-  public void traceDeprecatedEntry (Object instance, String methodName, Object argument)
-  {
-    if (traceSuspended()) return;
-    traceDeprecatedEntryAllArgs (instance, methodName,
-      "(" + argument + ")");
-  }
-
-  // ---------------------- trace entry of methods w/ 2 args -------------------
-
-  public void traceEntry (Object instance, String methodName, Object arg1, Object arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, Object arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, byte[] arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + Utils.getStringFromBytes (arg2) + ")");
-  }
-
-  public void traceDeprecatedEntry (Object instance, String methodName, int arg1, int arg2)
-  {
-    if (traceSuspended()) return;
-    traceDeprecatedEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceDeprecatedEntry (Object instance, String methodName, Object arg1, int arg2)
-  {
-    if (traceSuspended()) return;
-    traceDeprecatedEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, boolean arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, byte arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", 0x" + Integer.toHexString (arg2&0xff) + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, short arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, int arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, long arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, float arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, int arg1, double arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, boolean arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, byte arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", 0x" + Integer.toHexString (arg2&0xff) + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, short arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, int arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, long arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, float arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName, Object arg1, double arg2)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ")");
-  }
-
-  // ---------------------- trace entry of methods w/ 3 args -------------------
-
-  public void traceEntry (Object instance, String methodName,
-                          Object arg1, Object arg2, Object arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                          int arg1, Object arg2, Object arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     int arg1, Object arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceDeprecatedEntry (Object instance, String methodName,
-                     int arg1, Object arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     int arg1, int arg2, Object arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     int arg1, int arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, int arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, int arg2, Object arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, boolean arg2, boolean arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, boolean arg2, int arg3)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
-  }
-
-  // ---------------------- trace entry of methods w/ 4 args -------------------
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, Object arg3, Object arg4)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     int arg1, Object arg2, Object arg3, Object arg4)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     int arg1, Object arg2, int arg3, int arg4)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, int arg2, int arg3, int arg4)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, int arg3, int arg4)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
-  }
-
-  // ---------------------- trace entry of methods w/ 5 args -------------------
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, Object arg3, int arg4, boolean arg5)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ")");
-  }
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, Object arg3, boolean arg4, boolean arg5)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ")");
-  }
-
-  // ---------------------- trace entry of methods w/ 6 args -------------------
-
-  public void traceEntry (Object instance, String methodName,
-                     Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6)
-  {
-    if (traceSuspended()) return;
-    traceEntryAllArgs (instance, methodName,
-      "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ", " + arg6 + ")");
-  }
-
-  // ---------------------------tracing exceptions and warnings-----------------
-
-  public void traceDiagnosable (java.sql.SQLException e)
-  {
-    if (traceSuspended()) return;
-    if (!loggingEnabled (ClientDataSource.TRACE_DIAGNOSTICS)) return;
-    synchronized (printWriter_) {
-      dncprintln ("BEGIN TRACE_DIAGNOSTICS");
-      ExceptionFormatter.printTrace (e, printWriter_, "[derby]", true); // true means return tokens only
-      dncprintln ("END TRACE_DIAGNOSTICS");
-    }
-  }
-
-  public void traceDiagnosable (javax.transaction.xa.XAException e)
-  {
-    if (traceSuspended()) return;
-    if (!loggingEnabled (ClientDataSource.TRACE_DIAGNOSTICS)) return;
-    synchronized (printWriter_) {
-      dncprintln ("BEGIN TRACE_DIAGNOSTICS");
-      ExceptionFormatter.printTrace (e, printWriter_, "[derby]");
-      dncprintln ("END TRACE_DIAGNOSTICS");
-    }
-  }
-  // ------------------------ meta data tracing --------------------------------
-
-  public void traceParameterMetaData (Statement statement, ColumnMetaData columnMetaData)
-  {
-    if (traceSuspended()) return;
-    if (!loggingEnabled (ClientDataSource.TRACE_PARAMETER_META_DATA) || columnMetaData == null) return;
-    synchronized (printWriter_) {
-      String header = "[ParameterMetaData@" + Integer.toHexString (columnMetaData.hashCode()) + "]";
-      try {
-        dncprintln (header, "BEGIN TRACE_PARAMETER_META_DATA");
-        dncprintln (header, "Parameter meta data for statement Statement@" + Integer.toHexString (statement.hashCode()));
-        dncprintln (header, "Number of parameter columns: " + columnMetaData.getColumnCount());
-        traceColumnMetaData (header, columnMetaData);
-        dncprintln (header, "END TRACE_PARAMETER_META_DATA");
-      }
-      catch (SqlException e) {
-        dncprintln (header, "Encountered an SQL exception while trying to trace parameter meta data");
-        dncprintln (header, "END TRACE_PARAMETER_META_DATA");
-      }
-    }
-  }
-
-  public void traceResultSetMetaData (Statement statement, ColumnMetaData columnMetaData)
-  {
-    if (traceSuspended()) return;
-    if (!loggingEnabled (ClientDataSource.TRACE_RESULT_SET_META_DATA) || columnMetaData == null) return;
-    synchronized (printWriter_) {
-    String header = "[ResultSetMetaData@" + Integer.toHexString (columnMetaData.hashCode()) + "]";
-      try {
-        dncprintln (header, "BEGIN TRACE_RESULT_SET_META_DATA");
-        dncprintln (header, "Result set meta data for statement Statement@" + Integer.toHexString (statement.hashCode()));
-        dncprintln (header, "Number of result set columns: " + columnMetaData.getColumnCount());
-        traceColumnMetaData (header, columnMetaData);
-        dncprintln (header, "END TRACE_RESULT_SET_META_DATA");
-      }
-      catch (SqlException e) {
-        dncprintln (header, "Encountered an SQL exception while trying to trace result set meta data");
-        dncprintln (header, "END TRACE_RESULT_SET_META_DATA");
-      }
-    }
-  }
-
-  //-----------------------------transient state--------------------------------
-
-  private void traceColumnMetaData (String header, ColumnMetaData columnMetaData)
-  {
-    if (traceSuspended()) return;
-    try {
-      synchronized (printWriter_) {
-
-        for (int column = 1; column <= columnMetaData.getColumnCount(); column++) {
-          dncprint (header, "Column " + column + ": { ");
-          printWriter_.print ("label=" + columnMetaData.getColumnLabel (column) + ", ");
-          printWriter_.print ("name=" + columnMetaData.getColumnName (column) + ", ");
-          printWriter_.print ("type name=" + columnMetaData.getColumnTypeName (column) + ", ");
-          printWriter_.print ("type=" + columnMetaData.getColumnType (column) + ", ");
-          printWriter_.print ("nullable=" + columnMetaData.isNullable (column) + ", ");
-          printWriter_.print ("precision=" + columnMetaData.getPrecision (column) + ", ");
-          printWriter_.print ("scale=" + columnMetaData.getScale (column) + ", ");
-          printWriter_.print ("schema name=" + columnMetaData.getSchemaName (column) + ", ");
-          printWriter_.print ("table name=" + columnMetaData.getTableName (column) + ", ");
-          printWriter_.print ("writable=" + columnMetaData.isWritable (column) + ", ");
-          printWriter_.print ("sqlPrecision=" + (columnMetaData.sqlPrecision_ == null ? "<null>" : ""+columnMetaData.sqlPrecision_[column-1]) + ", ");
-          printWriter_.print ("sqlScale=" + (columnMetaData.sqlScale_ == null ? "<null>" : ""+columnMetaData.sqlScale_[column-1]) + ", ");
-          printWriter_.print ("sqlLength=" + (columnMetaData.sqlLength_ == null ? "<null>" : ""+columnMetaData.sqlLength_[column-1]) + ", ");
-          printWriter_.print ("sqlType=" + (columnMetaData.sqlType_ == null ? "<null>" : ""+columnMetaData.sqlType_[column-1]) + ", ");
-          printWriter_.print ("sqlCcsid=" + (columnMetaData.sqlCcsid_ == null ? "<null>" : ""+columnMetaData.sqlCcsid_[column-1]) + ", ");
-          printWriter_.print ("sqlName=" + (columnMetaData.sqlName_ == null ? "<null>" : columnMetaData.sqlName_[column-1]) + ", ");
-          printWriter_.print ("sqlLabel=" + (columnMetaData.sqlLabel_ == null ? "<null>" : columnMetaData.sqlLabel_[column-1]) + ", ");
-          printWriter_.print ("sqlUnnamed=" + (columnMetaData.sqlUnnamed_ == null ? "<null>" : ""+columnMetaData.sqlUnnamed_[column-1]) + ", ");
-          printWriter_.print ("sqlComment=" + (columnMetaData.sqlComment_ == null ? "<null>" : columnMetaData.sqlComment_[column-1]) + ", ");
-          printWriter_.print ("sqlxKeymem=" + (columnMetaData.sqlxKeymem_ == null ? "<null>" : ""+columnMetaData.sqlxKeymem_[column-1]) + ", ");
-          printWriter_.print ("sqlxGenerated=" + (columnMetaData.sqlxGenerated_ == null ? "<null>" : ""+columnMetaData.sqlxGenerated_[column-1]) + ", ");
-          printWriter_.print ("sqlxParmmode=" + (columnMetaData.sqlxParmmode_ == null ? "<null>" : ""+columnMetaData.sqlxParmmode_[column-1]) + ", ");
-          printWriter_.print ("sqlxCorname=" + (columnMetaData.sqlxCorname_ == null ? "<null>" : columnMetaData.sqlxCorname_[column-1]) + ", ");
-          printWriter_.print ("sqlxName=" + (columnMetaData.sqlxName_ == null ? "<null>" : columnMetaData.sqlxName_[column-1]) + ", ");
-          printWriter_.print ("sqlxBasename=" + (columnMetaData.sqlxBasename_ == null ? "<null>" : columnMetaData.sqlxBasename_[column-1]) + ", ");
-          printWriter_.print ("sqlxUpdatable=" + (columnMetaData.sqlxUpdatable_ == null ? "<null>" : ""+columnMetaData.sqlxUpdatable_[column-1]) + ", ");
-          printWriter_.print ("sqlxSchema=" + (columnMetaData.sqlxSchema_ == null ? "<null>" : columnMetaData.sqlxSchema_[column-1]) + ", ");
-          printWriter_.print ("sqlxRdbnam=" + (columnMetaData.sqlxRdbnam_ == null ? "<null>" : columnMetaData.sqlxRdbnam_[column-1]) + ", ");
-          printWriter_.print ("internal type=" + columnMetaData.types_[column-1] + ", ");
-          printWriter_.println (" }");
-        }
-        dncprint (header, "{ ");
-        printWriter_.print ("sqldHold=" + columnMetaData.sqldHold_ + ", ");
-        printWriter_.print ("sqldReturn=" + columnMetaData.sqldReturn_ + ", ");
-        printWriter_.print ("sqldScroll=" + columnMetaData.sqldScroll_ + ", ");
-        printWriter_.print ("sqldSensitive=" + columnMetaData.sqldSensitive_ + ", ");
-        printWriter_.print ("sqldFcode=" + columnMetaData.sqldFcode_ + ", ");
-        printWriter_.print ("sqldKeytype=" + columnMetaData.sqldKeytype_ + ", ");
-        printWriter_.print ("sqldRdbnam=" + columnMetaData.sqldRdbnam_ + ", ");
-        printWriter_.print ("sqldSchema=" + columnMetaData.sqldSchema_);
-        printWriter_.println (" }");
+public class LogWriter {
+    protected java.io.PrintWriter printWriter_;
+    protected int traceLevel_;
+    private boolean driverConfigurationHasBeenWrittenToJdbc1Stream_ = false;
+    private boolean driverConfigurationHasBeenWrittenToJdbc2Stream_ = false;
+
+    // It is assumed that this constructor is never called when logWriter is null.
+    public LogWriter(java.io.PrintWriter printWriter, int traceLevel) {
+        printWriter_ = printWriter;
+        traceLevel_ = traceLevel;
+    }
+
+    final protected boolean loggingEnabled(int traceLevel) {
+        // It is an invariant that the printWriter is never null, so remove the
+        return printWriter_ != null && (traceLevel & traceLevel_) != 0;
+    }
+
+    final protected boolean traceSuspended() {
+        return org.apache.derby.client.am.Configuration.traceSuspended__;
+    }
+
+    // When garbage collector doesn't kick in in time
+    // to close file descriptors, "Too many open files"
+    // exception may occur (currently found on Linux).
+    // To minimize the chance of this problem happening,
+    // the print writer needs to be closed (after this
+    // DNC log writer is closed) when each connection has
+    // its own trace file (i.e. traceDirectory is specified).
+    public boolean printWriterNeedsToBeClosed_;
+
+    void close() {
+        if (printWriterNeedsToBeClosed_) {
+            printWriter_.close();
+            printWriterNeedsToBeClosed_ = false;
+        }
+        // printWriter_ = null; // help GC.
+    }
+
+    // ---------------------------------------------------------------------------
+
+    public void dncprintln(String s) {
+        synchronized (printWriter_) {
+            printWriter_.println("[derby] " + s);
+            printWriter_.flush();
+        }
+    }
+
+    private void dncprint(String s) {
+        synchronized (printWriter_) {
+            printWriter_.print("[derby] " + s);
+            printWriter_.flush();
+        }
+    }
+
+    private void dncprintln(String header, String s) {
+        synchronized (printWriter_) {
+            printWriter_.println("[derby]" + header + " " + s);
+            printWriter_.flush();
+        }
+    }
+
+    private void dncprint(String header, String s) {
+        synchronized (printWriter_) {
+            printWriter_.print("[derby]" + header + " " + s);
+            printWriter_.flush();
+        }
+    }
+
+    // ------------------------ tracepoint api -----------------------------------
+
+    public void tracepoint(String component, int tracepoint, String message) {
+        if (traceSuspended()) {
+            return;
+        }
+        dncprintln(component,
+                "[time:" + System.currentTimeMillis() + "]" +
+                "[thread:" + Thread.currentThread().getName() + "]" +
+                "[tracepoint:" + tracepoint + "]" +
+                message);
+    }
+
+    public void tracepoint(String component, int tracepoint,
+                           String classContext, String methodContext) {
+        if (traceSuspended()) {
+            return;
+        }
+        String staticContextTracepointRecord =
+                component +
+                "[time:" + System.currentTimeMillis() + "]" +
+                "[thread:" + Thread.currentThread().getName() + "]" +
+                "[tracepoint:" + tracepoint + "]" +
+                "[" + classContext + "." + methodContext + "]";
+        dncprintln(staticContextTracepointRecord);
+    }
+
+    public void tracepoint(String component, int tracepoint,
+                           Object instance, String classContext, String methodContext) {
+        if (traceSuspended()) {
+            return;
+        }
+        String instanceContextTracepointRecord =
+                component +
+                "[time:" + System.currentTimeMillis() + "]" +
+                "[thread:" + Thread.currentThread().getName() + "]" +
+                "[tracepoint:" + tracepoint + "]" +
+                "[" + classContext + "@" + Integer.toHexString(instance.hashCode()) + "." + methodContext + "]";
+        dncprintln(instanceContextTracepointRecord);
+    }
+
+    public void tracepoint(String component, int tracepoint,
+                           String classContext, String methodContext,
+                           java.util.Map memory) {
+        if (traceSuspended()) {
+            return;
+        }
+        String staticContextTracepointRecord =
+                component +
+                "[time:" + System.currentTimeMillis() + "]" +
+                "[thread:" + Thread.currentThread().getName() + "]" +
+                "[tracepoint:" + tracepoint + "]" +
+                "[" + classContext + "." + methodContext + "]";
+        dncprintln(staticContextTracepointRecord + getMemoryMapDisplay(memory));
+    }
+
+    public void tracepoint(String component, int tracepoint,
+                           Object instance, String classContext, String methodContext,
+                           java.util.Map memory) {
+        if (traceSuspended()) {
+            return;
+        }
+        String instanceContextTracepointRecord =
+                component +
+                "[time:" + System.currentTimeMillis() + "]" +
+                "[thread:" + Thread.currentThread().getName() + "]" +
+                "[tracepoint:" + tracepoint + "]" +
+                "[" + classContext + "@" + Integer.toHexString(instance.hashCode()) + "." + methodContext + "]";
+        dncprintln(instanceContextTracepointRecord + getMemoryMapDisplay(memory));
+    }
+
+    private String getMemoryMapDisplay(java.util.Map memory) {
+        return memory.toString(); // need to loop thru all keys in the map and print values
+    }
+
+    // ------------- API entry and exit trace methods ----------------------------
+    // Entry and exit are be traced separately because input arguments need
+    // to be traced before any potential exception can occur.
+    // Exit tracing is only performed on methods that return values.
+    // Entry tracing is only performed on methods that update state,
+    // so entry tracing is not performed on simple getter methods.
+    // We could decide in the future to restrict entry tracing only to methods with input arguments.
+
+    private void traceExternalMethod(Object instance, String className, String methodName) {
+        if (traceSuspended()) {
+            return;
+        }
+        dncprint(buildExternalMethodHeader(instance, className), methodName);
+    }
+
+    private void traceExternalDeprecatedMethod(Object instance, String className, String methodName) {
+        if (traceSuspended()) {
+            return;
+        }
+        dncprint(buildExternalMethodHeader(instance, className), "Deprecated " + methodName);
+    }
+
+    private String buildExternalMethodHeader(Object instance, String className) {
+        return
+                "[Time:" + System.currentTimeMillis() + "]" +
+                "[Thread:" + Thread.currentThread().getName() + "]" +
+                "[" + className + "@" + Integer.toHexString(instance.hashCode()) + "]";
+    }
+
+    private String getClassNameOfInstanceIfTraced(Object instance) {
+        if (instance == null) // this prevents NPE from instance.getClass() used below
+        {
+            return null;
+        } else if (instance instanceof Connection && loggingEnabled(ClientDataSource.TRACE_CONNECTION_CALLS)) {
+            return "Connection";
+        } else if (instance instanceof ResultSet && loggingEnabled(ClientDataSource.TRACE_RESULT_SET_CALLS)) {
+            return "ResultSet";
+        } else if (instance instanceof CallableStatement && loggingEnabled(ClientDataSource.TRACE_STATEMENT_CALLS)) {
+            return "CallableStatement";
+        } else if (instance instanceof PreparedStatement && loggingEnabled(ClientDataSource.TRACE_STATEMENT_CALLS)) {
+            return "PreparedStatement";
+        } else if (instance instanceof Statement && loggingEnabled(ClientDataSource.TRACE_STATEMENT_CALLS)) {
+            return "Statement";
+        }
+        // Not yet externalizing Blob tracing, except for trace_all
+        else if (instance instanceof Blob && loggingEnabled(ClientDataSource.TRACE_ALL)) // add a trace level for lobs !!
+        {
+            return "Blob";
+        }
+        // Not yet externalizing Clob tracing, except for trace_all
+        else if (instance instanceof Clob && loggingEnabled(ClientDataSource.TRACE_ALL)) // add a trace level for bobs !!
+        {
+            return "Clob";
+        }
+        // Not yet externalizing dbmd catalog call tracing, except for trace_all
+        else if (instance instanceof DatabaseMetaData && loggingEnabled(ClientDataSource.TRACE_ALL)) // add a trace level for dbmd ??
+        {
+            return "DatabaseMetaData";
+        }
+        // we don't use instanceof javax.transaction.XAResource to avoid dependency on j2ee.jar
+        else if (loggingEnabled(ClientDataSource.TRACE_XA_CALLS) &&
+                instance.getClass().getName().startsWith("org.apache.derby.client.net.NetXAResource")) {
+            return "NetXAResource";
+        } else if (loggingEnabled(ClientDataSource.TRACE_ALL) &&
+                instance.getClass().getName().equals("org.apache.derby.client.ClientPooledConnection")) {
+            return "ClientPooledConnection";
+        } else if (loggingEnabled(ClientDataSource.TRACE_ALL) &&
+                instance.getClass().getName().equals("org.apache.derby.jdbc.ClientConnectionPoolDataSource")) {
+            return "ClientConnectionPoolDataSource";
+        } else if (loggingEnabled(ClientDataSource.TRACE_ALL) &&
+                instance.getClass().getName().equals("org.apache.derby.client.ClientXAConnection")) {
+            return "ClientXAConnection";
+        } else if (loggingEnabled(ClientDataSource.TRACE_ALL) &&
+                instance.getClass().getName().equals("org.apache.derby.jdbc.ClientDataSource")) {
+            return "ClientDataSource";
+        } else if (loggingEnabled(ClientDataSource.TRACE_ALL) &&
+                instance.getClass().getName().equals("org.apache.derby.jdbc.ClientXADataSource")) {
+            return "ClientXADataSource";
+        } else {
+            return instance.getClass().getName();
+        }
+    }
+
+    // --------------------------- method exit tracing --------------------------
+
+    public void traceExit(Object instance, String methodName, Object returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        String className = getClassNameOfInstanceIfTraced(instance);
+        if (className == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            traceExternalMethod(instance, className, methodName);
+            printWriter_.println(" () returned " + returnValue);
+            printWriter_.flush();
+        }
+    }
+
+    public void traceDeprecatedExit(Object instance, String methodName, Object returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        String className = getClassNameOfInstanceIfTraced(instance);
+        if (className == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            traceExternalDeprecatedMethod(instance, className, methodName);
+            printWriter_.println(" () returned " + returnValue);
+            printWriter_.flush();
+        }
+    }
+
+    public void traceExit(Object instance, String methodName, ResultSet resultSet) {
+        if (traceSuspended()) {
+            return;
+        }
+        String returnValue = (resultSet == null) ? "ResultSet@null" : "ResultSet@" + Integer.toHexString(resultSet.hashCode());
+        traceExit(instance, methodName, returnValue);
+    }
+
+    public void traceExit(Object instance, String methodName, CallableStatement returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "CallableStatement@" + Integer.toHexString(returnValue.hashCode()));
+    }
+
+    public void traceExit(Object instance, String methodName, PreparedStatement returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "PreparedStatement@" + Integer.toHexString(returnValue.hashCode()));
+    }
+
+    public void traceExit(Object instance, String methodName, Statement returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "Statement@" + Integer.toHexString(returnValue.hashCode()));
+    }
+
+    public void traceExit(Object instance, String methodName, Blob blob) {
+        if (traceSuspended()) {
+            return;
+        }
+        String returnValue = (blob == null) ? "Blob@null" : "Blob@" + Integer.toHexString(blob.hashCode());
+        traceExit(instance, methodName, returnValue);
+    }
+
+    public void traceExit(Object instance, String methodName, Clob clob) {
+        if (traceSuspended()) {
+            return;
+        }
+        String returnValue = (clob == null) ? "Clob@null" : "Clob@" + Integer.toHexString(clob.hashCode());
+        traceExit(instance, methodName, returnValue);
+    }
+
+    public void traceExit(Object instance, String methodName, DatabaseMetaData returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "DatabaseMetaData@" + Integer.toHexString(returnValue.hashCode()));
+    }
+
+    public void traceExit(Object instance, String methodName, Connection returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "Connection@" + Integer.toHexString(returnValue.hashCode()));
+    }
+
+    public void traceExit(Object instance, String methodName, ColumnMetaData returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "MetaData@" + (returnValue != null ? Integer.toHexString(returnValue.hashCode()) : null));
+    }
+
+    public void traceExit(Object instance, String methodName, byte[] returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, Utils.getStringFromBytes(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, int[] returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, Utils.getStringFromInts(returnValue));
+    }
+
+    public void traceDeprecatedExit(Object instance, String methodName, byte[] returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceDeprecatedExit(instance, methodName, Utils.getStringFromBytes(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, byte returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, "0x" + Integer.toHexString(returnValue & 0xff));
+    }
+
+    public void traceExit(Object instance, String methodName, int returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, String.valueOf(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, boolean returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, String.valueOf(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, long returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, String.valueOf(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, float returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, String.valueOf(returnValue));
+    }
+
+    public void traceExit(Object instance, String methodName, double returnValue) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceExit(instance, methodName, String.valueOf(returnValue));
+    }
+
+    // --------------------------- method entry tracing --------------------------
+
+    private void traceEntryAllArgs(Object instance, String methodName, String argList) {
+        if (traceSuspended()) {
+            return;
+        }
+        String className = getClassNameOfInstanceIfTraced(instance);
+        if (className == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            traceExternalMethod(instance, className, methodName);
+            printWriter_.println(" " + argList + " called");
+            printWriter_.flush();
+        }
+    }
+
+    private void traceDeprecatedEntryAllArgs(Object instance, String methodName, String argList) {
+        if (traceSuspended()) {
+            return;
+        }
+        String className = getClassNameOfInstanceIfTraced(instance);
+        if (className == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            traceExternalDeprecatedMethod(instance, className, methodName);
+            printWriter_.println(" " + argList + " called");
+            printWriter_.flush();
+        }
+    }
+
+    // ---------------------- trace entry of methods w/ no args ------------------
+
+    public void traceEntry(Object instance, String methodName) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName, "()");
+    }
+
+    // ---------------------- trace entry of methods w/ 1 arg --------------------
+
+    public void traceEntry(Object instance, String methodName, Object argument) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + argument + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, boolean argument) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + argument + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int argument) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + argument + ")");
+    }
+
+    public void traceDeprecatedEntry(Object instance, String methodName, int argument) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceDeprecatedEntryAllArgs(instance, methodName,
+                "(" + argument + ")");
+    }
+
+    public void traceDeprecatedEntry(Object instance, String methodName, Object argument) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceDeprecatedEntryAllArgs(instance, methodName,
+                "(" + argument + ")");
+    }
+
+    // ---------------------- trace entry of methods w/ 2 args -------------------
+
+    public void traceEntry(Object instance, String methodName, Object arg1, Object arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, Object arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, byte[] arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + Utils.getStringFromBytes(arg2) + ")");
+    }
+
+    public void traceDeprecatedEntry(Object instance, String methodName, int arg1, int arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceDeprecatedEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceDeprecatedEntry(Object instance, String methodName, Object arg1, int arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceDeprecatedEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, boolean arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, byte arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", 0x" + Integer.toHexString(arg2 & 0xff) + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, short arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, int arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, long arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, float arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, int arg1, double arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, boolean arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, byte arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", 0x" + Integer.toHexString(arg2 & 0xff) + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, short arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, int arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, long arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, float arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName, Object arg1, double arg2) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ")");
+    }
+
+    // ---------------------- trace entry of methods w/ 3 args -------------------
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, Object arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, Object arg2, Object arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, Object arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceDeprecatedEntry(Object instance, String methodName,
+                                     int arg1, Object arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, int arg2, Object arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, int arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, int arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, int arg2, Object arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, boolean arg2, boolean arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, boolean arg2, int arg3) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
+    }
+
+    // ---------------------- trace entry of methods w/ 4 args -------------------
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, Object arg3, Object arg4) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, Object arg2, Object arg3, Object arg4) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           int arg1, Object arg2, int arg3, int arg4) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, int arg2, int arg3, int arg4) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, int arg3, int arg4) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ")");
+    }
+
+    // ---------------------- trace entry of methods w/ 5 args -------------------
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, Object arg3, int arg4, boolean arg5) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ")");
+    }
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, Object arg3, boolean arg4, boolean arg5) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ")");
+    }
+
+    // ---------------------- trace entry of methods w/ 6 args -------------------
+
+    public void traceEntry(Object instance, String methodName,
+                           Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntryAllArgs(instance, methodName,
+                "(" + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ", " + arg6 + ")");
+    }
+
+    // ---------------------------tracing exceptions and warnings-----------------
+
+    public void traceDiagnosable(java.sql.SQLException e) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (!loggingEnabled(ClientDataSource.TRACE_DIAGNOSTICS)) {
+            return;
+        }
+        synchronized (printWriter_) {
+            dncprintln("BEGIN TRACE_DIAGNOSTICS");
+            ExceptionFormatter.printTrace(e, printWriter_, "[derby]", true); // true means return tokens only
+            dncprintln("END TRACE_DIAGNOSTICS");
+        }
+    }
+
+    public void traceDiagnosable(javax.transaction.xa.XAException e) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (!loggingEnabled(ClientDataSource.TRACE_DIAGNOSTICS)) {
+            return;
+        }
+        synchronized (printWriter_) {
+            dncprintln("BEGIN TRACE_DIAGNOSTICS");
+            ExceptionFormatter.printTrace(e, printWriter_, "[derby]");
+            dncprintln("END TRACE_DIAGNOSTICS");
+        }
+    }
+    // ------------------------ meta data tracing --------------------------------
+
+    public void traceParameterMetaData(Statement statement, ColumnMetaData columnMetaData) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (!loggingEnabled(ClientDataSource.TRACE_PARAMETER_META_DATA) || columnMetaData == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            String header = "[ParameterMetaData@" + Integer.toHexString(columnMetaData.hashCode()) + "]";
+            try {
+                dncprintln(header, "BEGIN TRACE_PARAMETER_META_DATA");
+                dncprintln(header, "Parameter meta data for statement Statement@" + Integer.toHexString(statement.hashCode()));
+                dncprintln(header, "Number of parameter columns: " + columnMetaData.getColumnCount());
+                traceColumnMetaData(header, columnMetaData);
+                dncprintln(header, "END TRACE_PARAMETER_META_DATA");
+            } catch (SqlException e) {
+                dncprintln(header, "Encountered an SQL exception while trying to trace parameter meta data");
+                dncprintln(header, "END TRACE_PARAMETER_META_DATA");
+            }
+        }
+    }
+
+    public void traceResultSetMetaData(Statement statement, ColumnMetaData columnMetaData) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (!loggingEnabled(ClientDataSource.TRACE_RESULT_SET_META_DATA) || columnMetaData == null) {
+            return;
+        }
+        synchronized (printWriter_) {
+            String header = "[ResultSetMetaData@" + Integer.toHexString(columnMetaData.hashCode()) + "]";
+            try {
+                dncprintln(header, "BEGIN TRACE_RESULT_SET_META_DATA");
+                dncprintln(header, "Result set meta data for statement Statement@" + Integer.toHexString(statement.hashCode()));
+                dncprintln(header, "Number of result set columns: " + columnMetaData.getColumnCount());
+                traceColumnMetaData(header, columnMetaData);
+                dncprintln(header, "END TRACE_RESULT_SET_META_DATA");
+            } catch (SqlException e) {
+                dncprintln(header, "Encountered an SQL exception while trying to trace result set meta data");
+                dncprintln(header, "END TRACE_RESULT_SET_META_DATA");
+            }
+        }
+    }
+
+    //-----------------------------transient state--------------------------------
+
+    private void traceColumnMetaData(String header, ColumnMetaData columnMetaData) {
+        if (traceSuspended()) {
+            return;
+        }
+        try {
+            synchronized (printWriter_) {
+
+                for (int column = 1; column <= columnMetaData.getColumnCount(); column++) {
+                    dncprint(header, "Column " + column + ": { ");
+                    printWriter_.print("label=" + columnMetaData.getColumnLabel(column) + ", ");
+                    printWriter_.print("name=" + columnMetaData.getColumnName(column) + ", ");
+                    printWriter_.print("type name=" + columnMetaData.getColumnTypeName(column) + ", ");
+                    printWriter_.print("type=" + columnMetaData.getColumnType(column) + ", ");
+                    printWriter_.print("nullable=" + columnMetaData.isNullable(column) + ", ");
+                    printWriter_.print("precision=" + columnMetaData.getPrecision(column) + ", ");
+                    printWriter_.print("scale=" + columnMetaData.getScale(column) + ", ");
+                    printWriter_.print("schema name=" + columnMetaData.getSchemaName(column) + ", ");
+                    printWriter_.print("table name=" + columnMetaData.getTableName(column) + ", ");
+                    printWriter_.print("writable=" + columnMetaData.isWritable(column) + ", ");
+                    printWriter_.print("sqlPrecision=" + (columnMetaData.sqlPrecision_ == null ? "<null>" : "" + columnMetaData.sqlPrecision_[column - 1]) + ", ");
+                    printWriter_.print("sqlScale=" + (columnMetaData.sqlScale_ == null ? "<null>" : "" + columnMetaData.sqlScale_[column - 1]) + ", ");
+                    printWriter_.print("sqlLength=" + (columnMetaData.sqlLength_ == null ? "<null>" : "" + columnMetaData.sqlLength_[column - 1]) + ", ");
+                    printWriter_.print("sqlType=" + (columnMetaData.sqlType_ == null ? "<null>" : "" + columnMetaData.sqlType_[column - 1]) + ", ");
+                    printWriter_.print("sqlCcsid=" + (columnMetaData.sqlCcsid_ == null ? "<null>" : "" + columnMetaData.sqlCcsid_[column - 1]) + ", ");
+                    printWriter_.print("sqlName=" + (columnMetaData.sqlName_ == null ? "<null>" : columnMetaData.sqlName_[column - 1]) + ", ");
+                    printWriter_.print("sqlLabel=" + (columnMetaData.sqlLabel_ == null ? "<null>" : columnMetaData.sqlLabel_[column - 1]) + ", ");
+                    printWriter_.print("sqlUnnamed=" + (columnMetaData.sqlUnnamed_ == null ? "<null>" : "" + columnMetaData.sqlUnnamed_[column - 1]) + ", ");
+                    printWriter_.print("sqlComment=" + (columnMetaData.sqlComment_ == null ? "<null>" : columnMetaData.sqlComment_[column - 1]) + ", ");
+                    printWriter_.print("sqlxKeymem=" + (columnMetaData.sqlxKeymem_ == null ? "<null>" : "" + columnMetaData.sqlxKeymem_[column - 1]) + ", ");
+                    printWriter_.print("sqlxGenerated=" + (columnMetaData.sqlxGenerated_ == null ? "<null>" : "" + columnMetaData.sqlxGenerated_[column - 1]) + ", ");
+                    printWriter_.print("sqlxParmmode=" + (columnMetaData.sqlxParmmode_ == null ? "<null>" : "" + columnMetaData.sqlxParmmode_[column - 1]) + ", ");
+                    printWriter_.print("sqlxCorname=" + (columnMetaData.sqlxCorname_ == null ? "<null>" : columnMetaData.sqlxCorname_[column - 1]) + ", ");
+                    printWriter_.print("sqlxName=" + (columnMetaData.sqlxName_ == null ? "<null>" : columnMetaData.sqlxName_[column - 1]) + ", ");
+                    printWriter_.print("sqlxBasename=" + (columnMetaData.sqlxBasename_ == null ? "<null>" : columnMetaData.sqlxBasename_[column - 1]) + ", ");
+                    printWriter_.print("sqlxUpdatable=" + (columnMetaData.sqlxUpdatable_ == null ? "<null>" : "" + columnMetaData.sqlxUpdatable_[column - 1]) + ", ");
+                    printWriter_.print("sqlxSchema=" + (columnMetaData.sqlxSchema_ == null ? "<null>" : columnMetaData.sqlxSchema_[column - 1]) + ", ");
+                    printWriter_.print("sqlxRdbnam=" + (columnMetaData.sqlxRdbnam_ == null ? "<null>" : columnMetaData.sqlxRdbnam_[column - 1]) + ", ");
+                    printWriter_.print("internal type=" + columnMetaData.types_[column - 1] + ", ");
+                    printWriter_.println(" }");
+                }
+                dncprint(header, "{ ");
+                printWriter_.print("sqldHold=" + columnMetaData.sqldHold_ + ", ");
+                printWriter_.print("sqldReturn=" + columnMetaData.sqldReturn_ + ", ");
+                printWriter_.print("sqldScroll=" + columnMetaData.sqldScroll_ + ", ");
+                printWriter_.print("sqldSensitive=" + columnMetaData.sqldSensitive_ + ", ");
+                printWriter_.print("sqldFcode=" + columnMetaData.sqldFcode_ + ", ");
+                printWriter_.print("sqldKeytype=" + columnMetaData.sqldKeytype_ + ", ");
+                printWriter_.print("sqldRdbnam=" + columnMetaData.sqldRdbnam_ + ", ");
+                printWriter_.print("sqldSchema=" + columnMetaData.sqldSchema_);
+                printWriter_.println(" }");
+                printWriter_.flush();
+            }
+        } catch (SqlException e) {
+            dncprintln(header, "Encountered an SQL exception while trying to trace column meta data");
+        }
+    }
+
+    // ---------------------- 3-way tracing connects -----------------------------
+    // Including protocol manager levels, and driver configuration
+
+    // Jdbc 2
+    public void traceConnectEntry(ClientDataSource dataSource) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_DRIVER_CONFIGURATION)) {
+            traceDriverConfigurationJdbc2();
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_CONNECTS)) {
+            traceConnectsEntry(dataSource);
+        }
+    }
+
+    // Jdbc 1
+    public void traceConnectEntry(String server,
+                                  int port,
+                                  String database,
+                                  java.util.Properties properties) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_DRIVER_CONFIGURATION)) {
+            traceDriverConfigurationJdbc1();
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_CONNECTS)) {
+            traceConnectsEntry(server, port, database, properties);
+        }
+    }
+
+    public void traceConnectResetEntry(Object instance, LogWriter logWriter, String user, ClientDataSource ds) {
+        if (traceSuspended()) {
+            return;
+        }
+        traceEntry(instance, "reset", logWriter, user, "<escaped>", ds);
+        if (loggingEnabled(ClientDataSource.TRACE_CONNECTS)) {
+            traceConnectsResetEntry(ds);
+        }
+    }
+
+    public void traceConnectExit(Connection connection) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_CONNECTS)) {
+            traceConnectsExit(connection);
+        }
+    }
+
+    public void traceConnectResetExit(Connection connection) {
+        if (traceSuspended()) {
+            return;
+        }
+        if (loggingEnabled(ClientDataSource.TRACE_CONNECTS)) {
+            traceConnectsResetExit(connection);
+        }
+    }
+
+
+    // ---------------------- tracing connects -----------------------------------
+
+    private void traceConnectsResetEntry(ClientDataSource dataSource) {
+        if (traceSuspended()) {
+            return;
+        }
+        try {
+            traceConnectsResetEntry(dataSource.getServerName(),
+                    dataSource.getPortNumber(),
+                    dataSource.getDatabaseName(),
+                    dataSource.getProperties());
+        } catch (java.sql.SQLException e) {
+            dncprintln("Encountered an SQL exception while trying to trace connection reset entry");
+        }
+    }
+
+    private void traceConnectsEntry(ClientDataSource dataSource) {
+        if (traceSuspended()) {
+            return;
+        }
+        try {
+            traceConnectsEntry(dataSource.getServerName(),
+                    dataSource.getPortNumber(),
+                    dataSource.getDatabaseName(),
+                    dataSource.getProperties());
+        } catch (java.sql.SQLException e) {
+            dncprintln("Encountered an SQL exception while trying to trace connection entry");
+        }
+    }
+
+    private void traceConnectsResetEntry(String server,
+                                         int port,
+                                         String database,
+                                         java.util.Properties properties) {
+        if (traceSuspended()) {
+            return;
+        }
+        dncprintln("BEGIN TRACE_CONNECT_RESET");
+        dncprintln("Connection reset requested for " + server + ":" + port + "/" + database);
+        dncprint("Using properties: ");
+        writeProperties(properties);
+        dncprintln("END TRACE_CONNECT_RESET");
+    }
+
+    private void traceConnectsEntry(String server,
+                                    int port,
+                                    String database,
+                                    java.util.Properties properties) {
+        if (traceSuspended()) {
+            return;
+        }
+        synchronized (printWriter_) {
+            dncprintln("BEGIN TRACE_CONNECTS");
+            dncprintln("Attempting connection to " + server + ":" + port + "/" + database);
+            dncprint("Using properties: ");
+            writeProperties(properties);
+            dncprintln("END TRACE_CONNECTS");
+        }
+    }
+
+    // Specialized by NetLogWriter.traceConnectsExit()
+    public void traceConnectsExit(Connection c) {
+        if (traceSuspended()) {
+            return;
+        }
+        synchronized (printWriter_) {
+            String header = "[Connection@" + Integer.toHexString(c.hashCode()) + "]";
+            try {
+                dncprintln(header, "BEGIN TRACE_CONNECTS");
+                dncprintln(header, "Successfully connected to server " + c.databaseMetaData_.getURL());
+                dncprintln(header, "User: " + c.databaseMetaData_.getUserName());
+                dncprintln(header, "Database product name: " + c.databaseMetaData_.getDatabaseProductName());
+                dncprintln(header, "Database product version: " + c.databaseMetaData_.getDatabaseProductVersion());
+                dncprintln(header, "Driver name: " + c.databaseMetaData_.getDriverName());
+                dncprintln(header, "Driver version: " + c.databaseMetaData_.getDriverVersion());
+                dncprintln(header, "END TRACE_CONNECTS");
+            } catch (java.sql.SQLException e) {
+                dncprintln(header, "Encountered an SQL exception while trying to trace connection exit");
+                dncprintln(header, "END TRACE_CONNECTS");
+            }
+        }
+    }
+
+    public void traceConnectsResetExit(org.apache.derby.client.am.Connection c) {
+        if (traceSuspended()) {
+            return;
+        }
+        synchronized (printWriter_) {
+            String header = "[Connection@" + Integer.toHexString(c.hashCode()) + "]";
+            try {
+                dncprintln(header, "BEGIN TRACE_CONNECT_RESET");
+                dncprintln(header, "Successfully reset connection to server " + c.databaseMetaData_.getURL());
+                dncprintln(header, "User: " + c.databaseMetaData_.getUserName());
+                dncprintln(header, "Database product name: " + c.databaseMetaData_.getDatabaseProductName());
+                dncprintln(header, "Database product version: " + c.databaseMetaData_.getDatabaseProductVersion());
+                dncprintln(header, "Driver name: " + c.databaseMetaData_.getDriverName());
+                dncprintln(header, "Driver version: " + c.databaseMetaData_.getDriverVersion());
+                dncprintln(header, "END TRACE_CONNECT_RESET");
+            } catch (java.sql.SQLException e) {
+                dncprintln(header, "Encountered an SQL exception while trying to trace connection reset exit");
+                dncprintln(header, "END TRACE_CONNECT_RESET");
+            }
+        }
+    }
+
+
+    // properties.toString() will print out passwords,
+    // so this method was written to escape the password property value.
+    // printWriter_ synchronized by caller.
+    private void writeProperties(java.util.Properties properties) {
+        printWriter_.print("{ ");
+        for (java.util.Iterator i = properties.entrySet().iterator(); i.hasNext();) {
+            java.util.Map.Entry e = (java.util.Map.Entry) (i.next());
+            if ("password".equals(e.getKey())) {
+                printWriter_.print("password=" + escapePassword((String) e.getValue()));
+            } else {
+                printWriter_.print(e.getKey() + "=" + e.getValue());
+            }
+            if (i.hasNext()) {
+                printWriter_.print(", ");
+            }
+        }
+        printWriter_.println(" }");
         printWriter_.flush();
-      }
     }
-    catch (SqlException e) {
-      dncprintln (header, "Encountered an SQL exception while trying to trace column meta data");
+
+    private String escapePassword(String pw) {
+        StringBuffer sb = new StringBuffer(pw);
+        for (int j = 0; j < pw.length(); j++) {
+            sb.setCharAt(j, '*');
+        }
+        return sb.toString();
     }
-  }
+    //-------------------------tracing driver configuration-----------------------
 
-  // ---------------------- 3-way tracing connects -----------------------------
-  // Including protocol manager levels, and driver configuration
-
-  // Jdbc 2
-  public void traceConnectEntry (ClientDataSource dataSource)
-  {
-    if (traceSuspended()) return;
-    if (loggingEnabled (ClientDataSource.TRACE_DRIVER_CONFIGURATION))
-      traceDriverConfigurationJdbc2 ();
-    if (loggingEnabled (ClientDataSource.TRACE_CONNECTS))
-      traceConnectsEntry (dataSource);
-  }
-
-  // Jdbc 1
-  public void traceConnectEntry ( String server,
-                                   int port,
-                                   String database,
-                                   java.util.Properties properties)
-  {
-    if (traceSuspended()) return;
-    if (loggingEnabled (ClientDataSource.TRACE_DRIVER_CONFIGURATION))
-      traceDriverConfigurationJdbc1 ();
-    if (loggingEnabled (ClientDataSource.TRACE_CONNECTS))
-      traceConnectsEntry (server, port, database, properties);
-  }
-
-  public void traceConnectResetEntry (Object instance, LogWriter logWriter, String user, ClientDataSource ds)
-  {
-    if (traceSuspended()) return;
-    traceEntry (instance, "reset", logWriter, user, "<escaped>", ds);
-    if (loggingEnabled(ClientDataSource.TRACE_CONNECTS))
-      traceConnectsResetEntry(ds);
-  }
-
-  public void traceConnectExit (Connection connection)
-  {
-    if (traceSuspended()) return;
-    if (loggingEnabled (ClientDataSource.TRACE_CONNECTS))
-      traceConnectsExit (connection);
-  }
-
-  public void traceConnectResetExit (Connection connection)
-  {
-    if (traceSuspended()) return;
-    if (loggingEnabled (ClientDataSource.TRACE_CONNECTS))
-      traceConnectsResetExit (connection);
-  }
-
-
-  // ---------------------- tracing connects -----------------------------------
-
-  private void traceConnectsResetEntry (ClientDataSource dataSource)
-  {
-    if (traceSuspended()) return;
-    try {
-      traceConnectsResetEntry (dataSource.getServerName(),
-                               dataSource.getPortNumber(),
-                               dataSource.getDatabaseName(),
-                               dataSource.getProperties());
-    }
-    catch (java.sql.SQLException e) {
-      dncprintln ("Encountered an SQL exception while trying to trace connection reset entry");
-    }
-  }
-
-  private void traceConnectsEntry (ClientDataSource dataSource)
-  {
-    if (traceSuspended()) return;
-    try {
-      traceConnectsEntry (dataSource.getServerName(),
-                          dataSource.getPortNumber(),
-                          dataSource.getDatabaseName(),
-                          dataSource.getProperties());
-    }
-    catch (java.sql.SQLException e) {
-      dncprintln ("Encountered an SQL exception while trying to trace connection entry");
-    }
-  }
-
-  private void traceConnectsResetEntry (String server,
-                                        int port,
-                                        String database,
-                                        java.util.Properties properties)
-  {
-    if (traceSuspended()) return;
-    dncprintln ("BEGIN TRACE_CONNECT_RESET");
-    dncprintln ("Connection reset requested for " + server + ":" + port + "/" + database);
-    dncprint ("Using properties: ");
-    writeProperties (properties);
-    dncprintln ("END TRACE_CONNECT_RESET");
-  }
-
-  private void traceConnectsEntry (String server,
-                                   int port,
-                                   String database,
-                                   java.util.Properties properties)
-  {
-    if (traceSuspended()) return;
-    synchronized (printWriter_) {
-      dncprintln ("BEGIN TRACE_CONNECTS");
-      dncprintln ("Attempting connection to " + server + ":" + port + "/" + database);
-      dncprint ("Using properties: ");
-      writeProperties (properties);
-      dncprintln ("END TRACE_CONNECTS");
-    }
-  }
-
-  // Specialized by NetLogWriter.traceConnectsExit()
-  public void traceConnectsExit (Connection c)
-  {
-    if (traceSuspended()) return;
-    synchronized (printWriter_) {
-      String header = "[Connection@" + Integer.toHexString (c.hashCode()) + "]";
-      try {
-        dncprintln (header, "BEGIN TRACE_CONNECTS");
-        dncprintln (header, "Successfully connected to server " + c.databaseMetaData_.getURL());
-        dncprintln (header, "User: " + c.databaseMetaData_.getUserName());
-        dncprintln (header, "Database product name: " + c.databaseMetaData_.getDatabaseProductName());
-        dncprintln (header, "Database product version: " + c.databaseMetaData_.getDatabaseProductVersion());
-        dncprintln (header, "Driver name: " + c.databaseMetaData_.getDriverName());
-        dncprintln (header, "Driver version: " + c.databaseMetaData_.getDriverVersion());
-        dncprintln (header, "END TRACE_CONNECTS");
-      }
-      catch (java.sql.SQLException e) {
-        dncprintln (header, "Encountered an SQL exception while trying to trace connection exit");
-        dncprintln (header, "END TRACE_CONNECTS");
-      }
-    }
-  }
-
-  public void traceConnectsResetExit (org.apache.derby.client.am.Connection c)
-  {
-    if (traceSuspended()) return;
-    synchronized (printWriter_) {
-      String header = "[Connection@" + Integer.toHexString (c.hashCode()) + "]";
-      try {
-        dncprintln (header, "BEGIN TRACE_CONNECT_RESET");
-        dncprintln (header, "Successfully reset connection to server " + c.databaseMetaData_.getURL());
-        dncprintln (header, "User: " + c.databaseMetaData_.getUserName());
-        dncprintln (header, "Database product name: " + c.databaseMetaData_.getDatabaseProductName());
-        dncprintln (header, "Database product version: " + c.databaseMetaData_.getDatabaseProductVersion());
-        dncprintln (header, "Driver name: " + c.databaseMetaData_.getDriverName());
-        dncprintln (header, "Driver version: " + c.databaseMetaData_.getDriverVersion());
-        dncprintln (header, "END TRACE_CONNECT_RESET");
-      }
-      catch (java.sql.SQLException e) {
-        dncprintln (header, "Encountered an SQL exception while trying to trace connection reset exit");
-        dncprintln (header, "END TRACE_CONNECT_RESET");
-      }
-    }
-  }
-
-
-  // properties.toString() will print out passwords,
-  // so this method was written to escape the password property value.
-  // printWriter_ synchronized by caller.
-  private void writeProperties (java.util.Properties properties)
-  {
-    printWriter_.print ("{ ");
-    for (java.util.Iterator i = properties.entrySet().iterator(); i.hasNext(); ) {
-      java.util.Map.Entry e = (java.util.Map.Entry) (i.next());

[... 102 lines stripped ...]