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 rh...@apache.org on 2018/01/17 23:36:32 UTC

svn commit: r1821435 [1/3] - in /db/derby/code/trunk/java: build/org/apache/derbyBuild/lastgoodjarcontents/ client/org/apache/derby/client/ client/org/apache/derby/client/am/ client/org/apache/derby/client/net/ client/org/apache/derby/jdbc/ testing/org...

Author: rhillegas
Date: Wed Jan 17 23:36:31 2018
New Revision: 1821435

URL: http://svn.apache.org/viewvc?rev=1821435&view=rev
Log:
DERBY-6945: Move ClientDataSourceInterface and the guts of BasicClientDataSource40 out of the public api package and into the client-internal api package; commit derby-6945-12-ab-moveClientDataSourceInterface.diff.

Added:
    db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java   (with props)
    db/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceInterface.java
      - copied, changed from r1821159, db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSourceInterface.java
Removed:
    db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSourceInterface.java
Modified:
    db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents
    db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents
    db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents
    db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents
    db/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java
    db/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java
    db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientConnection.java
    db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientJDBCObjectFactory.java
    db/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/ClientJDBCObjectFactoryImpl.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/NetXAConnection.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/OpenSocketAction.java
    db/derby/code/trunk/java/client/org/apache/derby/jdbc/BasicClientDataSource40.java
    db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientConnectionPoolDataSourceInterface.java
    db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java
    db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSourceInterface.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/DataSourceTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_1Indexing.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_3.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_3_p3.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_3_p4.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_3_p6.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/ReplicationRun_Local_Encrypted_1.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/SimplePerfTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/replicationTests/SimplePerfTest_Verify.java

Modified: db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents (original)
+++ db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derby.jar.lastcontents Wed Jan 17 23:36:31 2018
@@ -51,6 +51,7 @@ org.apache.derby.iapi.db.OptimizerTrace.
 org.apache.derby.iapi.db.PropertyInfo.class
 org.apache.derby.iapi.db.TriggerExecutionContext.class
 org.apache.derby.iapi.jdbc.AuthenticationService.class
+org.apache.derby.iapi.jdbc.AutoloadedDriver.class
 org.apache.derby.iapi.jdbc.BrokeredCallableStatement.class
 org.apache.derby.iapi.jdbc.BrokeredCallableStatement42.class
 org.apache.derby.iapi.jdbc.BrokeredConnection.class
@@ -1346,7 +1347,6 @@ org.apache.derby.io.StorageFactory.class
 org.apache.derby.io.StorageFile.class
 org.apache.derby.io.StorageRandomAccessFile.class
 org.apache.derby.io.WritableStorageFactory.class
-org.apache.derby.iapi.jdbc.AutoloadedDriver.class
 org.apache.derby.jdbc.BasicEmbeddedConnectionPoolDataSource40.class
 org.apache.derby.jdbc.BasicEmbeddedDataSource40.class
 org.apache.derby.jdbc.BasicEmbeddedXADataSource40.class

Modified: db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents (original)
+++ db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/insane.derbyclient.jar.lastcontents Wed Jan 17 23:36:31 2018
@@ -1,4 +1,6 @@
+org.apache.derby.client.BasicClientDataSource.class
 org.apache.derby.client.ClientDataSourceFactory.class
+org.apache.derby.client.ClientDataSourceInterface.class
 org.apache.derby.client.ClientPooledConnection.class
 org.apache.derby.client.ClientXAConnection.class
 org.apache.derby.client.ClientXid.class
@@ -144,7 +146,6 @@ org.apache.derby.jdbc.ClientConnectionPo
 org.apache.derby.jdbc.ClientConnectionPoolDataSourceInterface.class
 org.apache.derby.jdbc.ClientDataSource.class
 org.apache.derby.jdbc.ClientDataSource40.class
-org.apache.derby.jdbc.ClientDataSourceInterface.class
 org.apache.derby.jdbc.ClientDriver.class
 org.apache.derby.jdbc.ClientDriver40.class
 org.apache.derby.jdbc.ClientXADataSource.class

Modified: db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents (original)
+++ db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derby.jar.lastcontents Wed Jan 17 23:36:31 2018
@@ -51,6 +51,7 @@ org.apache.derby.iapi.db.OptimizerTrace.
 org.apache.derby.iapi.db.PropertyInfo.class
 org.apache.derby.iapi.db.TriggerExecutionContext.class
 org.apache.derby.iapi.jdbc.AuthenticationService.class
+org.apache.derby.iapi.jdbc.AutoloadedDriver.class
 org.apache.derby.iapi.jdbc.BrokeredCallableStatement.class
 org.apache.derby.iapi.jdbc.BrokeredCallableStatement42.class
 org.apache.derby.iapi.jdbc.BrokeredConnection.class
@@ -1349,7 +1350,6 @@ org.apache.derby.io.StorageFactory.class
 org.apache.derby.io.StorageFile.class
 org.apache.derby.io.StorageRandomAccessFile.class
 org.apache.derby.io.WritableStorageFactory.class
-org.apache.derby.iapi.jdbc.AutoloadedDriver.class
 org.apache.derby.jdbc.BasicEmbeddedConnectionPoolDataSource40.class
 org.apache.derby.jdbc.BasicEmbeddedDataSource40.class
 org.apache.derby.jdbc.BasicEmbeddedXADataSource40.class

Modified: db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents (original)
+++ db/derby/code/trunk/java/build/org/apache/derbyBuild/lastgoodjarcontents/sane.derbyclient.jar.lastcontents Wed Jan 17 23:36:31 2018
@@ -1,4 +1,6 @@
+org.apache.derby.client.BasicClientDataSource.class
 org.apache.derby.client.ClientDataSourceFactory.class
+org.apache.derby.client.ClientDataSourceInterface.class
 org.apache.derby.client.ClientPooledConnection.class
 org.apache.derby.client.ClientXAConnection.class
 org.apache.derby.client.ClientXid.class
@@ -144,7 +146,6 @@ org.apache.derby.jdbc.ClientConnectionPo
 org.apache.derby.jdbc.ClientConnectionPoolDataSourceInterface.class
 org.apache.derby.jdbc.ClientDataSource.class
 org.apache.derby.jdbc.ClientDataSource40.class
-org.apache.derby.jdbc.ClientDataSourceInterface.class
 org.apache.derby.jdbc.ClientDriver.class
 org.apache.derby.jdbc.ClientDriver40.class
 org.apache.derby.jdbc.ClientXADataSource.class

Added: db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java?rev=1821435&view=auto
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java (added)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java Wed Jan 17 23:36:31 2018
@@ -0,0 +1,1712 @@
+/*
+
+   Derby - Class org.apache.derby.client.BasicClientDataSource
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derby.client;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.security.PrivilegedAction;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.Locale;
+import java.util.NoSuchElementException;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+import javax.sql.DataSource;
+import javax.sql.PooledConnection;
+import javax.sql.XAConnection;
+import org.apache.derby.client.am.ClientMessageId;
+import org.apache.derby.client.am.EncryptionManager;
+import org.apache.derby.client.am.LogWriter;
+import org.apache.derby.client.am.SQLExceptionFactory;
+import org.apache.derby.client.am.SqlException;
+import org.apache.derby.client.net.NetConfiguration;
+import org.apache.derby.client.net.NetLogWriter;
+import org.apache.derby.shared.common.error.ExceptionUtil;
+import org.apache.derby.shared.common.reference.Attribute;
+import org.apache.derby.shared.common.reference.SQLState;
+import org.apache.derby.jdbc.ClientDriver;
+
+/**
+ * This data source is suitable for client/server use of Derby,
+ * running on Java 8 Compact Profile 2 or higher.
+ * <p/>
+ * BasicClientDataSource is similar to ClientDataSource except it
+ * can not be used with JNDI, i.e. it does not implement
+ * {@code javax.naming.Referenceable}.
+ * <p/>
+ *  * The standard attributes provided are, cf. e.g. table
+ * 9.1 in the JDBC 4.2 specification.
+ * <ul>
+ *   <li>databaseName</li>
+ *   <li>dataSourceName</li>
+ *   <li>description</li>
+ *   <li>password</li>
+ *   <li>user</li>
+ * </ul>
+ * These standard attributes are not supported:
+ * <ul>
+ *   <li>networkProtocol</li>
+ *   <li>roleName</li>
+ * </ul>
+ * The Derby client driver also supports these attributes:
+ * <ul>
+ *   <li>loginTimeout</li> @see javax.sql.CommonDataSource set/get
+ *   <li>logWriter</li> @see javax.sql.CommonDataSource set/get
+ *   <li>createDatabase</li>
+ *   <li>connectionAttributes</li>
+ *   <li>shutdownDatabase</li>
+ *   <li>attributesAsPassword</li>
+ *   <li>retrieveMessageText</li>
+ *   <li>securityMechanism</li>
+ *   <li>traceDirectory</li>
+ *   <li>traceFile</li>
+ *   <li>traceFileAppend</li>
+ *   <li>traceLevel<li>
+ * </ul>
+ *
+ * <p>
+ * Cloned from BasicClientDataSource40, which is now just an empty shell.
+ * </p>
+ */
+@SuppressWarnings("ResultOfObjectAllocationIgnored")
+public class BasicClientDataSource 
+    implements DataSource, ClientDataSourceInterface, Serializable {
+
+    private final static long serialVersionUID = 1894299584216955554L;
+    public final static String className__ =
+            "org.apache.derby.jdbc.BasicClientDataSource";
+
+    // ---------------------------- traceLevel -------------------------------
+    //
+
+    /**
+     * The client server protocol can be traced. The constants below define the
+     * tracing level, cf. the documentation section "Network Client Tracing" in
+     * the "Derby Server and Administration Guide". Cf. the connection
+     * attribute (or data source bean property) {@code traceLevel}.
+     *
+     * <pre>
+     * TRACE_NONE	
+     * TRACE_CONNECTION_CALLS	
+     * TRACE_STATEMENT_CALLS	
+     * TRACE_RESULT_SET_CALLS	
+     * TRACE _DRIVER_CONFIGURATION	
+     * TRACE_CONNECTS	
+     * TRACE_PROTOCOL_FLOWS	
+     * TRACE _RESULT_SET_META_DATA	
+     * TRACE _PARAMETER_META_DATA	
+     * TRACE_DIAGNOSTICS	
+     * TRACE_XA_CALLS	
+     * TRACE_ALL	
+     * </pre>
+     */
+    public final static int TRACE_NONE = 0x0;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_CONNECTION_CALLS = 0x1;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_STATEMENT_CALLS = 0x2;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_RESULT_SET_CALLS = 0x4;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_DRIVER_CONFIGURATION = 0x10;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_CONNECTS = 0x20;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_PROTOCOL_FLOWS = 0x40;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_RESULT_SET_META_DATA = 0x80;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_PARAMETER_META_DATA = 0x100;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_DIAGNOSTICS = 0x200;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_XA_CALLS = 0x800;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int TRACE_ALL = 0xFFFFFFFF;
+    /**
+     * See documentation at {@link #TRACE_NONE}.
+     */
+    public final static int propertyDefault_traceLevel = TRACE_ALL;
+
+    static
+    {
+        try {
+            // The EncryptionManager class will instantiate objects of the
+            // required security algorithms that are needed for EUSRIDPWD An
+            // exception will be thrown if support is not available in the JCE
+            // implementation in the JVM in which the client is loaded.
+            new EncryptionManager(null);
+        } catch(Exception e) {
+            // if an exception is thrown, ignore exception.
+        }
+
+    }
+
+    /**
+     * Creates a simple DERBY data source with default property values
+     * for a non-pooling, non-distributed environment.  No particular
+     * DatabaseName or other properties are associated with the data
+     * source.
+     * <p/>
+     * Every Java Bean should provide a constructor with no arguments
+     * since many beanboxes attempt to instantiate a bean by invoking
+     * its no-argument constructor.
+     */
+    public BasicClientDataSource() {
+        super();
+    }
+
+    /**
+     * The source security mechanism to use when connecting to a client data
+     * source.
+     * <p/>
+     * Security mechanism options are:
+     * <ul>
+     *   <li> USER_ONLY_SECURITY
+     *   <li> CLEAR_TEXT_PASSWORD_SECURITY
+     *   <li> ENCRYPTED_PASSWORD_SECURITY
+     *   <li> ENCRYPTED_USER_AND_PASSWORD_SECURITY - both password and
+     *        user are encrypted
+     *   <li> STRONG_PASSWORD_SUBSTITUTE_SECURITY
+     * </ul> The default security mechanism is USER_ONLY SECURITY
+     * <p/>
+     * If the application specifies a security mechanism then it will be the
+     * only one attempted. If the specified security mechanism is not
+     * supported by the conversation then an exception will be thrown and
+     * there will be no additional retries.
+     * <p/>
+     * Both user and password need to be set for all security mechanism except
+     * USER_ONLY_SECURITY.
+     */
+    public final static short USER_ONLY_SECURITY =
+        ClientDataSourceInterface.USER_ONLY_SECURITY;
+
+    /**
+     * See documentation at {@link #USER_ONLY_SECURITY}
+     */
+    public final static short CLEAR_TEXT_PASSWORD_SECURITY =
+        ClientDataSourceInterface.CLEAR_TEXT_PASSWORD_SECURITY;
+
+    /**
+     * See documentation at {@link #USER_ONLY_SECURITY}
+     */
+    public final static short ENCRYPTED_PASSWORD_SECURITY =
+        ClientDataSourceInterface.ENCRYPTED_PASSWORD_SECURITY;
+
+    /**
+     * See documentation at {@link #USER_ONLY_SECURITY}
+     */
+    public final static short ENCRYPTED_USER_AND_PASSWORD_SECURITY =
+        ClientDataSourceInterface.ENCRYPTED_USER_AND_PASSWORD_SECURITY;
+
+    /**
+     * See documentation at {@link #USER_ONLY_SECURITY}
+     */
+    public final static short STRONG_PASSWORD_SUBSTITUTE_SECURITY =
+        ClientDataSourceInterface.STRONG_PASSWORD_SUBSTITUTE_SECURITY;
+
+    // The loginTimeout jdbc 2 data source property is not supported as a jdbc
+    // 1 connection property, because loginTimeout is set by the jdbc 1 api
+    // via java.sql.DriverManager.setLoginTimeout().  The databaseName,
+    // serverName, and portNumber data source properties are also not
+    // supported as connection properties because they are extracted from the
+    // jdbc 1 database url passed on the connection request.  However, all
+    // other data source properties should probably also be supported as
+    // connection properties.
+
+    // ---------------------------- loginTimeout ------------------------------
+    //
+    // was serialized in 1.0 release
+    /**
+     * The time in seconds to wait for a connection request on this data
+     * source. The default value of zero indicates that either the system time
+     * out be used or no timeout limit.
+     *
+     * @serial
+     */
+    private int loginTimeout;
+
+    public synchronized void setLoginTimeout(int seconds) {
+        this.loginTimeout = seconds;
+    }
+
+    public int getLoginTimeout() {
+        return this.loginTimeout;
+    }
+
+    // ---------------------------- logWriter --------------------------------
+    //
+    /**
+     * The log writer is declared transient, and is not serialized or stored
+     * under JNDI.
+     *
+     * @see #traceLevel
+     */
+    private transient PrintWriter logWriter;
+
+    public synchronized void setLogWriter(PrintWriter logWriter) {
+        this.logWriter = logWriter;
+    }
+
+    public PrintWriter getLogWriter() {
+        return this.logWriter;
+    }
+
+    // ---------------------------- databaseName ------------------------------
+    //
+    
+    /**
+     * Stores the relational database name, RDBNAME.
+     * The length of the database name may be limited to 18 bytes
+     * and therefore may throw an SQLException.
+     * @serial
+     */
+    private String databaseName;
+
+    // databaseName is not permitted in a properties object
+
+
+    // ---------------------------- description ------------------------------
+    
+    /**
+     * A description of this data source.
+     * @serial
+     */
+    private String description;
+
+    // ---------------------------- dataSourceName ----------------------------
+    //
+    
+    /**
+     * A data source name;
+     * used to name an underlying XADataSource,
+     * or ConnectionPoolDataSource when pooling of connections is done.
+     * @serial
+     */
+    private String dataSourceName;
+
+    // ---------------------------- portNumber --------------------------------
+
+    /**
+     * @serial
+     */
+    private int portNumber = propertyDefault_portNumber;
+
+    // ---------------------------- serverName --------------------------------
+    
+    /**
+     * @serial 
+     */
+    private String serverName = propertyDefault_serverName; // Derby-410 fix.
+
+    // serverName is not permitted in a properties object
+
+    //---------------------- client SSL ----------------
+
+    /** The constant indicating that SSL encryption won't be used. */
+    public final static int SSL_OFF = 0;
+    private final static String SSL_OFF_STR = "off";
+    /** The constant indicating that SSL encryption will be used. */
+    public final static int SSL_BASIC = 1;
+    private final static String SSL_BASIC_STR = "basic";
+    /**
+     * The constant indicating that SSL encryption with peer authentication
+     * will be used.
+     */
+    public final static int SSL_PEER_AUTHENTICATION = 2;
+    private final static String SSL_PEER_AUTHENTICATION_STR =
+            "peerAuthentication";
+
+    /**
+     * Parses the string and returns the corresponding constant for the SSL
+     * mode denoted.
+     * <p>
+     * Valid values are <tt>off</tt>, <tt>basic</tt> and
+     * <tt>peerAuthentication</tt>.
+     *
+     * @param s string denoting the SSL mode
+     * @return A constant indicating the SSL mode denoted by the string. If the
+     *      string is {@code null}, {@link #SSL_OFF} is returned.
+     * @throws SqlException if the string has an invalid value
+     */
+    public static int getSSLModeFromString(String s)
+        throws SqlException
+    {
+
+        if (s != null){
+            if (s.equalsIgnoreCase(SSL_OFF_STR)) {
+                return SSL_OFF;
+            } else if (s.equalsIgnoreCase(SSL_BASIC_STR)) {
+                return SSL_BASIC;
+            } else if (s.equalsIgnoreCase(SSL_PEER_AUTHENTICATION_STR)) {
+                return SSL_PEER_AUTHENTICATION;
+            } else {
+                throw new SqlException(null,
+                        new ClientMessageId(SQLState.INVALID_ATTRIBUTE),
+                        Attribute.SSL_ATTR, s, SSL_OFF_STR + ", " +
+                        SSL_BASIC_STR + ", " + SSL_PEER_AUTHENTICATION_STR);
+            }
+        } else {
+            // Default
+            return SSL_OFF;
+        }
+    }
+
+    /**
+     * Returns the SSL mode specified by the property object.
+     *
+     * @param properties data source properties
+     * @return A constant indicating the SSL mode to use. Defaults to
+     *      {@link #SSL_OFF} if the SSL attribute isn't specified.
+     * @throws SqlException if an invalid value for the SSL mode is specified
+     *      in the property object
+     */
+    public static int getClientSSLMode(Properties properties)
+        throws SqlException
+    {
+        return
+            getSSLModeFromString(properties.getProperty(Attribute.SSL_ATTR));
+    }
+
+    // ---------------------------- user -----------------------------------
+    //
+    
+    /**
+     * This property can be overwritten by specifing the
+     * username parameter on the DataSource.getConnection() method
+     * call.  If user is specified, then password must also be
+     * specified, either in the data source object or provided on
+     * the DataSource.getConnection() call.
+     *
+     * Each data source implementation subclass will maintain it's own
+     * <code>password</code> property.  This password property may or may not
+     * be declared transient, and therefore may be serialized to a file in
+     * clear-text, care must taken by the user to prevent security breaches.
+     * Derby-406 fix
+     * 
+     * @serial
+     */
+    private String user = propertyDefault_user;
+
+    public static String getUser(Properties properties) {
+        String userString = properties.getProperty(Attribute.USERNAME_ATTR);
+        return parseString(userString, propertyDefault_user);
+    }
+
+    // ---------------------------- securityMechanism -------------------------
+    //
+    // The source security mechanism to use when connecting to this data
+    // source.
+    // <p>
+    // Security mechanism options are:
+    // <ul>
+    // <li> USER_ONLY_SECURITY
+    // <li> CLEAR_TEXT_PASSWORD_SECURITY
+    // <li> ENCRYPTED_PASSWORD_SECURITY
+    // <li> ENCRYPTED_USER_AND_PASSWORD_SECURITY - both password and
+    //      user are encrypted
+    // <li> STRONG_PASSWORD_SUBSTITUTE_SECURITY
+    // </ul>
+    // The default security mechanism is USER_ONLY_SECURITY.
+    // <p>
+    // If the application specifies a security
+    // mechanism then it will be the only one attempted.
+    // If the specified security mechanism is not supported by the
+    // conversation then an exception will be thrown and there will be no
+    // additional retries.
+    // <p>
+    // This property is currently only available for the DNC driver.
+    // <p>
+    // Both user and password need to be set for all security mechanism except
+    // USER_ONLY_SECURITY When using USER_ONLY_SECURITY, only the user
+    // property needs to be specified.
+    //
+
+    // constant to indicate that the security mechanism has not been
+    // explicitly set, either on connection request when using DriverManager
+    // or on the Client DataSource object
+    private final static short SECMEC_HAS_NOT_EXPLICITLY_SET = 0;
+
+    /**
+     * Security Mechanism can be specified explicitly either when obtaining a
+     * connection via a DriverManager or via Datasource.
+     * Via DriverManager, securityMechanism can be set on the connection
+     * request using the 'securityMechanism' attribute.
+     * Via DataSource, securityMechanism can be set by calling
+     * setSecurityMechanism() on the ClientDataSource
+     * If the security mechanism is not explicitly set as mentioned above, in
+     * that case the Client will try to upgrade the security mechanism to a
+     * more secure one, if possible.
+     * See {@link #getUpgradedSecurityMechanism}.
+     * Therefore, need to keep track if the securityMechanism has been
+     * explicitly set.
+     *
+     * @serial
+     */
+    private short securityMechanism = SECMEC_HAS_NOT_EXPLICITLY_SET;
+
+
+
+    // We use the NET layer constants to avoid a mapping for the NET driver.
+    
+    /**
+     * Return security mechanism if it is set, else upgrade the security
+     * mechanism if possible and return the upgraded security mechanism
+     * @param properties Look in the properties if securityMechanism is set
+     *        or not
+     * if set, return this security mechanism
+     * @return security mechanism
+     */
+    public static short getSecurityMechanism(Properties properties) {
+        short secmec;
+        String securityMechanismString =
+            properties.getProperty(Attribute.CLIENT_SECURITY_MECHANISM);
+
+        if ( securityMechanismString != null )
+        {
+            // security mechanism has been set, do not override, but instead
+            // return the security mechanism that has been set (DERBY-962)
+            secmec = Short.parseShort(securityMechanismString);
+        }
+        else
+        {
+            // if securityMechanismString is null, this means that security
+            // mechanism has not been set explicitly and not available in
+            // properties. Hence, do an upgrade of security mechanism if
+            // possible The logic for upgrade of security mechanism uses
+            // information about if password is available or not, so pass this
+            // information also.
+            String passwordString =
+                properties.getProperty(Attribute.PASSWORD_ATTR);
+            secmec = getUpgradedSecurityMechanism(passwordString);
+        }
+        return secmec;
+    }
+
+    /**
+     * This method has logic to upgrade security mechanism to a better (more
+     * secure) one if it is possible. Currently derby server only has support
+     * for USRIDPWD, USRIDONL, EUSRIDPWD and USRSSBPWD (10.2+) - this method
+     * only considers these possibilities. USRIDPWD, EUSRIDPWD and USRSSBPWD
+     * require a password, USRIDONL is the only security mechanism which does
+     * not require password.
+     * 1. if password is not available, then security mechanism possible is
+     * USRIDONL
+     * 2. if password is available,then USRIDPWD is returned.
+     *
+     * @param password password argument
+     * @return upgraded security mechanism if possible
+     */
+    private static short getUpgradedSecurityMechanism(String password) {
+        // if password is null, in that case the only acceptable security
+        // mechanism is USRIDONL, which is the default security mechanism.
+        if ( password == null ) {
+            return propertyDefault_securityMechanism;
+        }
+
+        // when we have support for more security mechanisms on server
+        // and client, we should update this upgrade logic to pick
+        // secure security mechanisms before trying out the USRIDPWD
+
+        /*
+        // -----------------------
+        // PLEASE NOTE:
+        // When DERBY-1517, DERBY-1755 is fixed, there might be a way to use
+        // EUSRIDPWD when both client and server vm's have support for
+        // it. Hence the below if statement is commented out.
+      if (SUPPORTS_EUSRIDPWD)
+            return (short)NetConfiguration.SECMEC_EUSRIDPWD;
+        else
+            // IMPORTANT NOTE:
+            // --------------
+            // If DERBY-1517 can be fixed, we should default to
+            // SECMEC_USRSSBPWD (strong password substitute).
+            // Until then, connecting with a 10.2+ client to
+            // a derby server < 10.2, and hence does not support
+            // SECMEC_USRSSBPWD as a SECMEC, will cause a DRDA protocol
+            // exception, as described in DERBY-926).
+            //
+            // return (short)NetConfiguration.SECMEC_USRSSBPWD;
+         // ----------------------
+         */
+         return (short)NetConfiguration.SECMEC_USRIDPWD;
+
+    }
+
+    // ---------------------------- getServerMessageTextOnGetMessage ---------
+
+    /**
+     * @serial
+     */
+    private boolean retrieveMessageText = propertyDefault_retrieveMessageText;
+
+    public static boolean getRetrieveMessageText(Properties properties) {
+        String retrieveMessageTextString =
+            properties.getProperty(Attribute.CLIENT_RETIEVE_MESSAGE_TEXT);
+        return parseBoolean(
+            retrieveMessageTextString, propertyDefault_retrieveMessageText);
+    }
+
+    // ---------------------------- traceFile ---------------------------------
+
+    /**
+     * @serial
+     */
+    private String traceFile;
+
+    public static String getTraceFile(Properties properties) {
+        return properties.getProperty(Attribute.CLIENT_TRACE_FILE);
+    }
+
+    // ---------------------------- traceDirectory ----------------------------
+    // For the suffix of the trace file when traceDirectory is enabled.
+    private transient int traceFileSuffixIndex_ = 0;
+
+    /**
+     * @serial
+     */
+    private String traceDirectory;
+
+    /**
+     * Check if derby.client.traceDirectory is provided as a JVM property.
+     * If yes, then we use that value. If not, then we look for traceDirectory
+     * in the the properties parameter.
+     *
+     * @param properties jdbc url properties
+     * @return value of traceDirectory property
+     */
+    public static String getTraceDirectory(Properties properties) {
+        String traceDirectoryString;
+
+        traceDirectoryString  =
+            readSystemProperty(
+                Attribute.CLIENT_JVM_PROPERTY_PREFIX +
+                Attribute.CLIENT_TRACE_DIRECTORY);
+
+        if (traceDirectoryString == null  && properties != null) {
+            return properties.getProperty(Attribute.CLIENT_TRACE_DIRECTORY);
+        } else {
+            return traceDirectoryString;
+        }
+    }
+
+
+    /**
+     * Read the value of the passed system property. If we are running under
+     * the Java security manager and permission to read the property is 
+     * missing,a null is returned, and no diagnostic is given (DERBY-6620).
+     * 
+     * @param key name of the system property
+     * @return value of the system property, null if there is no
+     *         permission to read the property
+     */
+    private static String readSystemProperty(final String key) {
+        return AccessController.doPrivileged(new PrivilegedAction<String>() {
+                public String run() {
+                    try {
+                        return System.getProperty(key);
+                    } catch (SecurityException se) {
+                        // We do not want the connection to fail if the user
+                        // does not have permission to read the property, so
+                        // if a security exception occurs, just return null
+                        // and continue with the connection.
+                        // See also the discussion in DERBY-6620 on why we do
+                        // not write a warning message on the console here.
+                        return null;
+                    }
+                }
+            }
+            );
+    }
+
+    // ---------------------------- traceFileAppend ---------------------------
+
+    /**
+     * @serial
+     */
+    private boolean traceFileAppend = propertyDefault_traceFileAppend;
+
+    public static boolean getTraceFileAppend(Properties properties) {
+        String traceFileAppendString =
+            properties.getProperty(Attribute.CLIENT_TRACE_APPEND);
+        return parseBoolean(
+            traceFileAppendString, propertyDefault_traceFileAppend);
+    }
+
+    // ---------------------------- password ----------------------------------
+    //
+    // The password property is defined in subclasses, but the method
+    // getPassword (java.util.Properties properties) is in this class to
+    // eliminate dependencies on j2ee for connections that go thru the driver
+    // manager.
+
+    public static String getPassword(Properties properties) {
+        return properties.getProperty("password");
+    }
+
+    /**
+     * @serial
+     */
+    private String password;
+
+    synchronized public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+
+    // ----------------------supplemental methods------------------------------
+
+
+    //---------------------- helper methods -----------------------------------
+
+    // The java.io.PrintWriter overrides the traceFile setting.
+    // If neither traceFile nor jdbc logWriter are set, then null is returned.
+    // logWriterInUseSuffix used only for trace directories to indicate whether
+    // log writer is use is from xads, cpds, sds, ds, driver, config, reset.
+    private LogWriter computeDncLogWriterForNewConnection(
+        String logWriterInUseSuffix) throws SqlException {
+
+        return computeDncLogWriterForNewConnection(
+            logWriter,
+            traceDirectory,
+            traceFile,
+            traceFileAppend,
+            traceLevel,
+            logWriterInUseSuffix,
+            traceFileSuffixIndex_++);
+    }
+
+    // Called on for connection requests.  The java.io.PrintWriter overrides
+    // the traceFile setting.  If neither traceFile, nor logWriter, nor
+    // traceDirectory are set, then null is returned.
+    public static LogWriter computeDncLogWriterForNewConnection(
+        PrintWriter logWriter,
+        String traceDirectory,
+        String traceFile,
+        boolean traceFileAppend,
+        int traceLevel,
+        String logWriterInUseSuffix,
+        int traceFileSuffixIndex) throws SqlException {
+
+        // compute regular dnc log writer if there is any
+        LogWriter dncLogWriter = computeDncLogWriter(
+            logWriter,
+            traceDirectory,
+            traceFile,
+            traceFileAppend,
+            logWriterInUseSuffix,
+            traceFileSuffixIndex,
+            traceLevel);
+
+        return dncLogWriter;
+    }
+
+    // Compute a DNC log writer before a connection is created.
+    private static LogWriter computeDncLogWriter(
+        PrintWriter logWriter,
+        String traceDirectory,
+        String traceFile,
+        boolean traceFileAppend,
+        String logWriterInUseSuffix,
+        int traceFileSuffixIndex,
+        int traceLevel) throws SqlException {
+
+        // Otherwise, the trace file will still be created even TRACE_NONE.
+        if (traceLevel == TRACE_NONE) {
+            return null;
+        }
+
+        PrintWriter printWriter = computePrintWriter(
+            logWriter,
+            traceDirectory,
+            traceFile,
+            traceFileAppend,
+            logWriterInUseSuffix,
+            traceFileSuffixIndex);
+
+        if (printWriter == null) {
+            return null;
+        }
+
+        LogWriter dncLogWriter = new NetLogWriter(printWriter, traceLevel);
+        if (printWriter != logWriter &&
+                (traceDirectory != null || traceFile != null))
+        // When printWriter is an internal trace file and
+        // traceDirectory is not null, each connection has
+        // its own trace file and the trace file is not cached,
+        // so we can close it when DNC log writer is closed.
+        {
+            dncLogWriter.printWriterNeedsToBeClosed_ = true;
+        }
+        return dncLogWriter;
+    }
+
+    // This method handles all the override semantics.  The logWriter
+    // overrides the traceFile, and traceDirectory settings.  If neither
+    // traceFile, nor logWriter, nor traceDirectory are set, then null is
+    // returned.
+    private static PrintWriter computePrintWriter(
+        PrintWriter logWriter,
+        String traceDirectory,
+        String traceFile,
+        boolean traceFileAppend,
+        String logWriterInUseSuffix,
+        int traceFileSuffixIndex) throws SqlException {
+
+        if (logWriter != null)  // java.io.PrintWriter is specified
+        {
+            return logWriter;
+        } else { // check trace file setting.
+            if (traceDirectory != null) {
+                String fileName;
+                if (traceFile == null) {
+                    fileName = traceDirectory + File.separator +
+                        logWriterInUseSuffix + "_" + traceFileSuffixIndex;
+                } else {
+                    fileName = traceDirectory + File.separator +
+                        traceFile + logWriterInUseSuffix + "_" +
+                        traceFileSuffixIndex;
+                }
+                return getPrintWriter(
+                    fileName, true); // no file append and not enable caching.
+            } else if (traceFile != null) {
+                return getPrintWriter(traceFile, traceFileAppend);
+            }
+        }
+        return null;
+    }
+
+    private static PrintWriter getPrintWriter(
+            final String fileName,
+            final boolean fileAppend) throws SqlException {
+
+        PrintWriter printWriter = null;
+        //Using an anonymous class to deal with the PrintWriter because the  
+        //method java.security.AccessController.doPrivileged requires an 
+        //instance of a class(which implements 
+        //java.security.PrivilegedExceptionAction). Since getPrintWriter method
+        //is static, we can't simply pass "this" to doPrivileged method and 
+        //have LogWriter implement PrivilegedExceptionAction.
+        //To get around the static nature of method getPrintWriter, have an
+        //anonymous class implement PrivilegedExceptionAction. That class will 
+        //do the work related to PrintWriter in it's run method and return 
+        //PrintWriter object.
+        try {
+            printWriter = AccessController.doPrivileged(
+                new PrivilegedExceptionAction<PrintWriter>(){
+                    public PrintWriter run() throws IOException {
+                        String fileCanonicalPath =
+                            new File(fileName).getCanonicalPath();
+                        return new PrintWriter(
+                                new BufferedOutputStream(
+                                        new FileOutputStream(
+                                                fileCanonicalPath, fileAppend), 4096), true);
+                        }
+                    });
+        } catch (PrivilegedActionException pae) {
+            throw new SqlException(null, 
+                new ClientMessageId(SQLState.UNABLE_TO_OPEN_FILE),
+                new Object[] { fileName, pae.getMessage() },
+                pae);
+        }
+        return printWriter;
+    }
+    
+    private static boolean parseBoolean(
+        String boolString, boolean defaultBool) {
+
+        if (boolString != null) {
+            return (boolString.equalsIgnoreCase("true") ||
+                    boolString.equalsIgnoreCase("yes"));
+        }
+        return defaultBool;
+    }
+
+    private static String parseString(String string, String defaultString) {
+        if (string != null) {
+            return string;
+        }
+        return defaultString;
+    }
+
+    private static int parseInt(String intString, int defaultInt) {
+        if (intString != null) {
+            return Integer.parseInt(intString);
+        }
+        return defaultInt;
+    }
+
+    // tokenize "property=value;property=value..." and returns new properties
+    //object This method is used both by ClientDriver to parse the url and
+    //ClientDataSource.setConnectionAttributes
+    public static Properties tokenizeAttributes(
+        String attributeString, Properties properties) throws SqlException {
+
+        Properties augmentedProperties;
+
+        if (attributeString == null) {
+            return properties;
+        }
+
+        if (properties != null) {
+            augmentedProperties = (Properties) properties.clone();
+        } else {
+            augmentedProperties = new Properties();
+        }
+        try {
+            StringTokenizer attrTokenizer =
+                new StringTokenizer(attributeString, ";");
+
+            while (attrTokenizer.hasMoreTokens()) {
+                String v = attrTokenizer.nextToken();
+
+                int eqPos = v.indexOf('=');
+                if (eqPos == -1) {
+                    throw new SqlException(null,
+                        new ClientMessageId(SQLState.INVALID_ATTRIBUTE_SYNTAX),
+                        attributeString);
+                }
+
+                augmentedProperties.setProperty(
+                    (v.substring(0, eqPos)).trim(),
+                    (v.substring(eqPos + 1)).trim());
+            }
+        } catch (NoSuchElementException e) {
+            // A null log writer is passed, because jdbc 1 sqlexceptions are
+            // automatically traced
+            throw new SqlException(null,
+                new ClientMessageId(SQLState.INVALID_ATTRIBUTE_SYNTAX),
+                e, attributeString);
+        }
+        checkBoolean(augmentedProperties,
+                     Attribute.CLIENT_RETIEVE_MESSAGE_TEXT);
+        return augmentedProperties;
+
+    }
+
+    private static void checkBoolean(Properties set, String attribute)
+            throws SqlException {
+
+        final String[] booleanChoices = {"true", "false"};
+        checkEnumeration(set, attribute, booleanChoices);
+    }
+
+
+    private static void checkEnumeration(
+        Properties set,
+        String attribute,
+        String[] choices) throws SqlException {
+
+        String value = set.getProperty(attribute);
+        if (value == null) {
+            return;
+        }
+
+        for (int i = 0; i < choices.length; i++) {
+            if (value.toUpperCase(Locale.ENGLISH).equals(
+                        choices[i].toUpperCase(Locale.ENGLISH))) {
+                return;
+            }
+        }
+
+// The attribute value is invalid. Construct a string giving the choices for
+// display in the error message.
+        String choicesStr = "{";
+        for (int i = 0; i < choices.length; i++) {
+            if (i > 0) {
+                choicesStr += "|";
+            }
+            choicesStr += choices[i];
+        }
+
+        throw new SqlException(null,
+            new ClientMessageId(SQLState.INVALID_ATTRIBUTE),
+            attribute, value, choicesStr);
+    }
+
+    /*
+     * Properties to be seen by Bean - access thru reflection.
+     */
+
+    // -- Standard JDBC DataSource Properties
+
+    public synchronized void setDatabaseName(String databaseName) {
+        this.databaseName = databaseName;
+    }
+
+    public String getDatabaseName() {
+        return this.databaseName;
+    }
+
+
+    public synchronized void setDataSourceName(String dataSourceName) {
+        this.dataSourceName = dataSourceName;
+    }
+
+    public String getDataSourceName() {
+        return this.dataSourceName;
+    }
+
+    public synchronized void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+
+    public synchronized void setPortNumber(int portNumber) {
+        this.portNumber = portNumber;
+    }
+
+    public int getPortNumber() {
+        return this.portNumber;
+    }
+
+    public synchronized void setServerName(String serverName) {
+        this.serverName = serverName;
+    }
+
+    public String getServerName() {
+        return this.serverName;
+    }
+
+
+    public synchronized void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getUser() {
+        return this.user;
+    }
+
+    synchronized public void setRetrieveMessageText(
+        boolean retrieveMessageText) {
+
+        this.retrieveMessageText = retrieveMessageText;
+    }
+
+    public boolean getRetrieveMessageText() {
+        return this.retrieveMessageText;
+    }
+
+
+    /**
+     * Sets the security mechanism.
+     * @param securityMechanism to set
+     */
+    synchronized public void setSecurityMechanism(short securityMechanism) {
+        this.securityMechanism = securityMechanism;
+    }
+
+    /**
+     * Return the security mechanism.
+     * If security mechanism has not been set explicitly on datasource,
+     * then upgrade the security mechanism to a more secure one if possible.
+     * @see #getUpgradedSecurityMechanism(String)
+     * @return the security mechanism
+     */
+    public short getSecurityMechanism() {
+        return getSecurityMechanism(getPassword());
+    }
+
+    /**
+     * Return the security mechanism for this datasource object.
+     * If security mechanism has not been set explicitly on datasource,
+     * then upgrade the security mechanism to a more secure one if possible.
+     * @param password  password of user
+     * @see #getUpgradedSecurityMechanism(String)
+     * @return the security mechanism
+     */
+    public short getSecurityMechanism(String password) {
+
+        // if security mechanism has not been set explicitly on
+        // datasource, then upgrade the security mechanism if possible
+        // DERBY-962
+        if ( securityMechanism == SECMEC_HAS_NOT_EXPLICITLY_SET ) {
+            return getUpgradedSecurityMechanism(password);
+        }
+
+        return securityMechanism;
+    }
+
+    // ----------------------- ssl
+
+    /**
+     * @serial
+     */
+    private int sslMode;
+
+    /**
+     * Specifies the SSL encryption mode to use.
+     * <p>
+     * Valid values are <tt>off</tt>, <tt>basic</tt> and
+     * <tt>peerAuthentication</tt>.
+     *
+     * @param mode the SSL mode to use (<tt>off</tt>, <tt>basic</tt> or
+     *      <tt>peerAuthentication</tt>)
+     * @throws SqlException if the specified mode is invalid
+     */
+    public void setSsl(String mode)
+        throws SqlException
+    {
+        sslMode = getSSLModeFromString(mode);
+    }
+
+    /**
+     * Returns the SSL encryption mode specified for the data source.
+     *
+     * @return <tt>off</tt>, <tt>basic</tt> or <tt>peerAuthentication</tt>.
+     */
+    public String getSsl() {
+        switch(sslMode) {
+        case SSL_OFF:
+        default:
+            return SSL_OFF_STR;
+        case SSL_BASIC:
+            return SSL_BASIC_STR;
+        case SSL_PEER_AUTHENTICATION:
+            return SSL_PEER_AUTHENTICATION_STR;
+        }
+    }
+
+    // ----------------------- set/getCreate/ShutdownDatabase -----------------
+    /**
+     * Set to true if the database should be created.
+     * @serial
+     */
+    private boolean createDatabase;
+
+    /**
+     * Set to true if the database should be shutdown.
+     * @serial
+     */
+    private boolean shutdownDatabase;
+
+    /**
+     * Set this property to create a new database.  If this property is not
+     * set, the database (identified by databaseName) is assumed to be already
+     * existing.
+     * @param create if set to the string "create", this data source will try
+     *               to create a new database of databaseName, or boot the
+     *               database if one by that name already exists.
+     *
+     */
+    public void setCreateDatabase(String create) {
+        if (create != null && create.equalsIgnoreCase("create")) {
+            this.createDatabase = true;
+        } else { // reset
+            this.createDatabase = false;
+        }
+    }
+
+    /** @return "create" if create is set, or null if not
+     */
+    public String getCreateDatabase() {
+        String createstr=null;
+        if (createDatabase) {
+            createstr="create";
+        }
+        return createstr;
+    }
+
+    /**
+     * Set this property if one wishes to shutdown the database identified by
+     * databaseName.
+     * @param shutdown if set to the string "shutdown", this data source will
+     *                 shutdown the database if it is running.
+     *
+     */
+    public void setShutdownDatabase(String shutdown) {
+        if (shutdown != null && shutdown.equalsIgnoreCase("shutdown")) {
+            this.shutdownDatabase = true;
+        } else { // reset
+            this.shutdownDatabase = false;
+        }
+    }
+
+    /** @return "shutdown" if shutdown is set, or null if not
+     */
+    public String getShutdownDatabase() {
+        String shutdownstr=null;
+        if (shutdownDatabase)
+        {
+            shutdownstr = "shutdown";
+        }
+        return shutdownstr;
+    }
+
+    /**
+     * @serial
+     */
+    private String connectionAttributes = null;
+
+    /**
+     * Set this property to pass in more Derby specific connection URL
+     * attributes.
+     * <BR>
+     * Any attributes that can be set using a property of this DataSource
+     * implementation (e.g user, password) should not be set in
+     * connectionAttributes. Conflicting settings in connectionAttributes and
+     * properties of the DataSource will lead to unexpected behaviour.
+     *
+     * @param prop set to the list of Derby connection attributes separated by
+     *    semi-colons.  E.g., to specify an encryption bootPassword
+     *    of "x8hhk2adf", and set upgrade to true, do the following:
+     * <br>
+     * {@code
+     *  ds.setConnectionAttributes("bootPassword=x8hhk2adf;upgrade=true");}
+     *
+     * See Derby documentation for complete list.
+     */
+    public void setConnectionAttributes(String prop) {
+        connectionAttributes = prop;
+    }
+
+    /**
+     * @return Derby specific connection URL attributes
+     */
+    public String getConnectionAttributes() {
+        return connectionAttributes;
+    }
+
+
+    /**
+     * @serial
+     */
+    private int traceLevel = propertyDefault_traceLevel;
+
+    /**
+     * Check if derby.client.traceLevel is provided as a JVM property.
+     * If yes, then we use that value. If not, then we look for traceLevel
+     * in the the properties parameter.
+     *
+     * @param properties jdbc url properties
+     * @return value of traceLevel property
+     */
+    public static int getTraceLevel(Properties properties) {
+        String traceLevelString;
+        traceLevelString  =
+            readSystemProperty(Attribute.CLIENT_JVM_PROPERTY_PREFIX +
+                               Attribute.CLIENT_TRACE_LEVEL);
+        if (traceLevelString == null  && properties != null) {
+            traceLevelString =
+                properties.getProperty(Attribute.CLIENT_TRACE_LEVEL);
+        }
+        if (traceLevelString != null ) {
+            return parseInt(traceLevelString, propertyDefault_traceLevel);
+        } else {
+            return propertyDefault_traceLevel;
+        }
+    }
+
+    synchronized public void setTraceLevel(int traceLevel) {
+        this.traceLevel = traceLevel;
+    }
+
+    public int getTraceLevel() {
+        return this.traceLevel;
+    }
+
+    public synchronized void setTraceFile(String traceFile) {
+        this.traceFile = traceFile;
+    }
+
+    public String getTraceFile() {
+        return this.traceFile;
+    }
+
+
+    public synchronized void setTraceDirectory(String traceDirectory) {
+        this.traceDirectory = traceDirectory;
+    }
+
+    public String getTraceDirectory() {
+        return this.traceDirectory;
+    }
+
+    synchronized public void setTraceFileAppend(boolean traceFileAppend) {
+        this.traceFileAppend = traceFileAppend;
+    }
+
+    public boolean getTraceFileAppend() {
+        return this.traceFileAppend;
+    }
+
+    /**
+     * Returns the maximum number of JDBC prepared statements a connection is
+     * allowed to cache.
+     * <p>
+     * A basic data source will always return zero. If statement caching is
+     * required, use a {@link javax.sql.ConnectionPoolDataSource}.
+     * <p>
+     * This method is used internally by Derby to determine if statement
+     * pooling is to be enabled or not.
+     * Not part of public API, so not present in
+     * {@link org.apache.derby.client.ClientDataSourceInterface}.
+     *
+     * @return Maximum number of statements to cache, or <code>0</code> if
+     *      caching is disabled (default).
+     */
+    public int maxStatementsToPool() {
+        return 0;
+    }
+
+    // --- private helper methods
+
+
+    /**
+     * The dataSource keeps individual fields for the values that are relevant
+     * to the client. These need to be updated when set connection attributes
+     * is called.
+     */
+    private void updateDataSourceValues(Properties prop)
+        throws SqlException
+    {
+        // DERBY-5553. System properties derby.client.traceDirectory
+        // and derby.client.traceLevel do not work for ClientXADataSource
+        // or ClientConnectionPoolDataSource
+        // Trace level and trace directory will be read from system
+        // properties if they are not specified in the Properties
+        // argument, so we check for them first to avoid getting cut
+        // off by the (prop == null) check below.
+        String traceDir = getTraceDirectory(prop);
+        if (traceDir != null) {
+            setTraceDirectory(traceDir);
+        }
+        
+        int traceLevel = getTraceLevel(prop);
+        if (traceLevel != propertyDefault_traceLevel) {
+            setTraceLevel(traceLevel);
+        }
+        if (prop == null) {
+            return;
+        }
+
+        if (prop.containsKey(Attribute.USERNAME_ATTR)) {
+            setUser(getUser(prop));
+        }
+        if (prop.containsKey(Attribute.CLIENT_SECURITY_MECHANISM)) {
+            setSecurityMechanism(getSecurityMechanism(prop));
+        }
+        if (prop.containsKey(Attribute.CLIENT_TRACE_FILE)) {
+            setTraceFile(getTraceFile(prop));
+        }
+        if (prop.containsKey(Attribute.CLIENT_TRACE_APPEND)) {
+            setTraceFileAppend(getTraceFileAppend(prop));
+        }
+        if (prop.containsKey(Attribute.CLIENT_RETIEVE_MESSAGE_TEXT)) {
+            setRetrieveMessageText(getRetrieveMessageText(prop));
+        }
+        if (prop.containsKey(Attribute.SSL_ATTR)) {
+            sslMode = getClientSSLMode(prop);
+        }
+    }
+
+    /**
+     * Handles common error situations that can happen when trying to
+     * obtain a physical connection to the server, and which require special
+     * handling.
+     * <p>
+     * If this method returns normally, the exception wasn't handled and should
+     * be handled elsewhere or be re-thrown.
+     *
+     * @param logWriter log writer, may be {@code null}
+     * @param sqle exception to handle
+     * @throws SQLException handled exception (if any)
+     */
+    private void handleConnectionException(LogWriter logWriter,
+                                                   SqlException sqle)
+            throws SQLException {
+        // See DERBY-4070
+        if (sqle.getSQLState().equals(
+                ExceptionUtil.getSQLStateFromIdentifier(
+                    SQLState.INVALID_ATTRIBUTE_SYNTAX))) {
+            // Wrap this in SQLState.MALFORMED_URL exception to be
+            // consistent with the embedded driver.
+            throw new SqlException(logWriter,
+                    new ClientMessageId(SQLState.MALFORMED_URL),
+                    sqle, constructUrl()).getSQLException();
+
+        }
+    }
+
+    /**
+     * Constructs the JDBC connection URL from the state of the data source.
+     *
+     * @return The JDBC connection URL.
+     */
+    private String constructUrl() {
+        StringBuilder sb = new StringBuilder(64);
+        // To support subSubProtocols, the protocol addition below must be
+        // changed.
+        sb.append(Attribute.DNC_PROTOCOL);
+        sb.append(serverName);
+        sb.append(':');
+        sb.append(portNumber);
+        sb.append('/');
+        sb.append(databaseName);
+        if (connectionAttributes != null) {
+            sb.append(';');
+            sb.append(connectionAttributes);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Attempt to establish a database connection in a non-pooling,
+     * non-distributed environment.
+     *
+     * @return a Connection to the database
+     *
+     * @throws java.sql.SQLException if a database-access error occurs.
+     */
+    public Connection getConnection() throws SQLException {
+        LogWriter dncLogWriter = null;
+        try {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_sds");
+            return getConnectionX(dncLogWriter, getUser(), getPassword());
+        } catch (SqlException se) {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+    }
+
+    /**
+     * Attempt to establish a database connection in a non-pooling,
+     * non-distributed environment.
+     *
+     * @param user the database user on whose behalf the Connection is being
+     *        made
+     * @param password the user's password
+     *
+     * @return a Connection to the database
+     *
+     * @throws java.sql.SQLException if a database-access error occurs.
+     */
+    public Connection getConnection(String user, String password)
+            throws SQLException {
+        // Jdbc 2 connections will write driver trace info on a
+        // datasource-wide basis using the jdbc 2 data source log writer.
+        // This log writer may be narrowed to the connection-level
+        // This log writer will be passed to the agent constructor.
+
+        LogWriter dncLogWriter = null;
+        try
+        {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_sds");
+            return getConnectionX(dncLogWriter, user, password);
+        }
+        catch(SqlException se)
+        {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+
+    }
+
+    private Connection getConnectionX(LogWriter dncLogWriter,
+                                      String user, String password)
+            throws SqlException {
+        return ClientDriver.getFactory().newNetConnection(
+                dncLogWriter, user, password, this, -1, false);
+
+    }
+
+    // JDBC 4.0 java.sql.Wrapper interface methods
+
+    /**
+     * Check whether this instance wraps an object that implements the
+     * interface specified by {@code iface}.
+     *
+     * @param iface a class defining an interface
+     * @return {@code true} if this instance implements {@code iface}, or
+     * {@code false} otherwise
+     * @throws SQLException if an error occurs while determining if this
+     * instance implements {@code iface}
+     */
+    public boolean isWrapperFor(Class<?> iface) throws SQLException {
+        return iface.isInstance(this);
+    }
+
+    /**
+     * Returns {@code this} if this class implements the specified interface.
+     *
+     * @param  iface a class defining an interface
+     * @return an object that implements the interface
+     * @throws SQLException if no object is found that implements the
+     * interface
+     */
+    public <T> T unwrap(Class<T> iface) throws SQLException {
+        try {
+            return iface.cast(this);
+        } catch (ClassCastException cce) {
+            throw new SqlException(null,
+                    new ClientMessageId(SQLState.UNABLE_TO_UNWRAP),
+                    iface).getSQLException();
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////
+    //
+    // INTRODUCED BY JDBC 4.1 IN JAVA 7
+    //
+    ////////////////////////////////////////////////////////////////////
+
+    public Logger getParentLogger()
+            throws SQLFeatureNotSupportedException {
+        throw SQLExceptionFactory.notImplemented("getParentLogger");
+    }
+
+    // Helper methods
+
+    protected final PooledConnection getPooledConnectionMinion()
+            throws SQLException {
+        LogWriter dncLogWriter = null;
+
+        try {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_cpds");
+
+            if (dncLogWriter != null) {
+                dncLogWriter.traceEntry(this, "getPooledConnection");
+            }
+
+            PooledConnection pooledConnection = getPooledConnectionX(
+                    dncLogWriter, this, getUser(), getPassword());
+
+            if (dncLogWriter != null) {
+                dncLogWriter.traceExit(
+                        this, "getPooledConnection", pooledConnection);
+            }
+
+            return pooledConnection;
+        }
+        catch (SqlException se) {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+    }
+
+    protected final PooledConnection getPooledConnectionMinion(
+            String user, String password) throws SQLException {
+
+        LogWriter dncLogWriter = null;
+
+        try {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_cpds");
+
+            if (dncLogWriter != null) {
+                dncLogWriter.traceEntry(
+                        this, "getPooledConnection", user, "<escaped>");
+            }
+
+            PooledConnection pooledConnection = getPooledConnectionX(
+                    dncLogWriter, this, user, password);
+
+            if (dncLogWriter != null) {
+                dncLogWriter.traceExit(
+                        this, "getPooledConnection", pooledConnection);
+            }
+
+            return pooledConnection;
+
+        } catch (SqlException se) {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+    }
+
+    // Minion method that establishes the initial physical connection
+    // using DS properties instead of CPDS properties.
+    private static PooledConnection getPooledConnectionX(
+            LogWriter dncLogWriter,
+            BasicClientDataSource ds,
+            String user,
+            String password) throws SQLException {
+
+            return ClientDriver.getFactory().newClientPooledConnection(ds,
+                    dncLogWriter, user, password);
+    }
+
+    protected final XAConnection getXAConnectionMinion() throws SQLException {
+        LogWriter dncLogWriter = null;
+        try {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_xads");
+            return getXAConnectionX(
+                    dncLogWriter, this, getUser(), getPassword());
+        } catch (SqlException se) {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+    }
+
+    protected final XAConnection getXAConnectionMinion(
+            String user, String password) throws SQLException {
+
+        LogWriter dncLogWriter = null;
+        try
+        {
+            updateDataSourceValues(
+                    tokenizeAttributes(getConnectionAttributes(), null));
+            dncLogWriter = computeDncLogWriterForNewConnection("_xads");
+            return getXAConnectionX(dncLogWriter, this, user, password);
+        }
+        catch ( SqlException se )
+        {
+            // The method below may throw an exception.
+            handleConnectionException(dncLogWriter, se);
+            // If the exception wasn't handled so far, re-throw it.
+            throw se.getSQLException();
+        }
+    }
+
+    /**
+     * Method that establishes the initial physical connection
+     * using DS properties instead of CPDS properties.
+     */
+    private static XAConnection getXAConnectionX(LogWriter dncLogWriter,
+        BasicClientDataSource ds, String user, String password)
+        throws SQLException
+    {
+        return ClientDriver.getFactory().newClientXAConnection(ds,
+                dncLogWriter, user, password);
+    }
+
+    public static Properties getProperties(BasicClientDataSource ths) {
+        Properties properties = new Properties();
+
+        // Look for all the getXXX methods in the class that take no arguments.
+        Method[] methods = ths.getClass().getMethods();
+
+        for (int i = 0; i < methods.length; i++) {
+
+            Method m = methods[i];
+
+            // only look for simple getter methods.
+            if (m.getParameterTypes().length != 0) {
+                continue;
+            }
+
+            // only non-static methods
+            if (Modifier.isStatic(m.getModifiers())) {
+                continue;
+            }
+
+            // Only getXXX methods
+            String methodName = m.getName();
+            if ((methodName.length() < 5) || !methodName.startsWith("get")) {
+                continue;
+            }
+
+            Class returnType = m.getReturnType();
+
+            if (Integer.TYPE.equals(returnType)
+                    || Short.TYPE.equals(returnType)
+                    || String.class.equals(returnType)
+                    || Boolean.TYPE.equals(returnType)) {
+
+                // E.g. "getSomeProperty"
+                //          s                 to lower case (3,4)
+                //           omeProperty      use as is (4->)
+                String propertyName = methodName.substring(3, 4).toLowerCase(
+                        Locale.ENGLISH).concat(
+                        methodName.substring(4));
+
+                try {
+                    Object ov = m.invoke(ths, (Object[])null);
+                    // Need to check if property value is null, otherwise
+                    // "null" string gets stored.
+                    if (ov != null) {
+                        properties.setProperty(propertyName, ov.toString());
+                    }
+                } catch (IllegalAccessException iae) {
+                } catch (InvocationTargetException ite) {
+                }
+
+            }
+        }
+
+        return properties;
+    }
+}

Propchange: db/derby/code/trunk/java/client/org/apache/derby/client/BasicClientDataSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: db/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceInterface.java (from r1821159, db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSourceInterface.java)
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceInterface.java?p2=db/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceInterface.java&p1=db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSourceInterface.java&r1=1821159&r2=1821435&rev=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSourceInterface.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceInterface.java Wed Jan 17 23:36:31 2018
@@ -1,6 +1,6 @@
 /*
 
-   Derby - Class org.apache.derby.jdbc.ClientDataSourceInterface
+   Derby - Class org.apache.derby.client.ClientDataSourceInterface
 
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -19,7 +19,7 @@
 
 */
 
-package org.apache.derby.jdbc;
+package org.apache.derby.client;
 
 import javax.sql.DataSource;
 import org.apache.derby.client.am.SqlException;

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java Wed Jan 17 23:36:31 2018
@@ -39,7 +39,6 @@ import org.apache.derby.client.am.SqlExc
 import org.apache.derby.client.am.stmtcache.JDBCStatementCache;
 import org.apache.derby.client.net.NetXAConnection;
 import org.apache.derby.shared.common.error.ExceptionSeverity;
-import org.apache.derby.jdbc.BasicClientDataSource40;
 import org.apache.derby.jdbc.ClientDriver;
 import org.apache.derby.shared.common.reference.SQLState;
 
@@ -107,7 +106,7 @@ public class ClientPooledConnection impl
      * @throws SQLException if creating the pooled connection fails due problems
      *      in the database, or problems communicating with the database
      */
-    public ClientPooledConnection(BasicClientDataSource40 ds,
+    public ClientPooledConnection(BasicClientDataSource ds,
                                   LogWriter logWriter,
                                   String user,
                                   String password) throws SQLException {
@@ -156,7 +155,7 @@ public class ClientPooledConnection impl
      * @throws SQLException if creating the pooled connection fails due problems
      *      in the database, or problems communicating with the database
      */
-    public ClientPooledConnection(BasicClientDataSource40 ds,
+    public ClientPooledConnection(BasicClientDataSource ds,
                                   LogWriter logWriter,
                                   String user,
                                   String password,

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java Wed Jan 17 23:36:31 2018
@@ -30,7 +30,6 @@ import org.apache.derby.client.am.LogWri
 import org.apache.derby.client.am.SqlException;
 import org.apache.derby.client.net.NetXAConnection;
 import org.apache.derby.client.net.NetXAResource;
-import org.apache.derby.jdbc.BasicClientDataSource40;
 import org.apache.derby.shared.common.reference.SQLState;
 
 public class ClientXAConnection extends ClientPooledConnection implements XAConnection {
@@ -46,7 +45,7 @@ public class ClientXAConnection extends
     // This connection is used to access the indoubt table
     private NetXAConnection controlCon_ = null;
 
-    public ClientXAConnection(BasicClientDataSource40 ds,
+    public ClientXAConnection(BasicClientDataSource ds,
                               LogWriter logWtr,
                               String userId,
                               String password) throws SQLException {

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientConnection.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientConnection.java?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientConnection.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientConnection.java Wed Jan 17 23:36:31 2018
@@ -43,8 +43,8 @@ import java.util.Set;
 import java.util.WeakHashMap;
 import java.util.concurrent.Executor;
 import org.apache.derby.client.net.NetXAResource;
-import org.apache.derby.jdbc.BasicClientDataSource40;
-import org.apache.derby.jdbc.ClientDataSourceInterface;
+import org.apache.derby.client.BasicClientDataSource;
+import org.apache.derby.client.ClientDataSourceInterface;
 import org.apache.derby.shared.common.reference.SQLState;
 import org.apache.derby.shared.common.sanity.SanityManager;
 
@@ -187,10 +187,10 @@ public abstract class ClientConnection
     public int xaHostVersion_ = 0;
 
     private int loginTimeout_;
-    public BasicClientDataSource40 dataSource_;
+    public BasicClientDataSource dataSource_;
     public String serverNameIP_;
     public int portNumber_;
-    private int clientSSLMode_ = BasicClientDataSource40.SSL_OFF;
+    private int clientSSLMode_ = BasicClientDataSource.SSL_OFF;
 
     Hashtable<String, String> clientCursorNameCache_ =
             new Hashtable<String, String>();
@@ -207,7 +207,7 @@ public abstract class ClientConnection
             LogWriter logWriter,
             String user,
             String password,
-            BasicClientDataSource40 dataSource)
+            BasicClientDataSource dataSource)
             throws SqlException {
 
         this.user_ = user;
@@ -219,7 +219,7 @@ public abstract class ClientConnection
             String user,
             String password,
             boolean isXAConn,
-            BasicClientDataSource40 dataSource)
+            BasicClientDataSource dataSource)
             throws SqlException {
 
         this.user_ = user;
@@ -230,7 +230,7 @@ public abstract class ClientConnection
     // For jdbc 2 connections
     private void initConnection(
             LogWriter logWriter,
-            BasicClientDataSource40 dataSource)
+            BasicClientDataSource dataSource)
             throws SqlException {
 
         if (logWriter != null) {
@@ -270,7 +270,7 @@ public abstract class ClientConnection
         portNumber_ = dataSource.getPortNumber();
 
         clientSSLMode_ = 
-            BasicClientDataSource40.getSSLModeFromString(dataSource.getSsl());
+            BasicClientDataSource.getSSLModeFromString(dataSource.getSsl());
 
         agent_ = newAgent_(logWriter,
                 loginTimeout_,
@@ -283,7 +283,7 @@ public abstract class ClientConnection
     protected ClientConnection(
             LogWriter logWriter,
             boolean isXAConn,
-            BasicClientDataSource40 dataSource)
+            BasicClientDataSource dataSource)
             throws SqlException {
 
         if (logWriter != null) {
@@ -305,7 +305,7 @@ public abstract class ClientConnection
         portNumber_ = dataSource.getPortNumber();
 
         clientSSLMode_ = 
-            BasicClientDataSource40.getSSLModeFromString(dataSource.getSsl());
+            BasicClientDataSource.getSSLModeFromString(dataSource.getSsl());
 
         agent_ = newAgent_(logWriter,
                 loginTimeout_,
@@ -349,14 +349,14 @@ public abstract class ClientConnection
         databaseName_ = databaseName;
 
         // Extract common properties.
-        user_ = BasicClientDataSource40.getUser(properties);
+        user_ = BasicClientDataSource.getUser(properties);
         retrieveMessageText_ =
-            BasicClientDataSource40.getRetrieveMessageText(properties);
+            BasicClientDataSource.getRetrieveMessageText(properties);
 
         loginTimeout_ = driverManagerLoginTimeout;
         serverNameIP_ = serverName;
         portNumber_ = portNumber;
-        clientSSLMode_ = BasicClientDataSource40.getClientSSLMode(properties);
+        clientSSLMode_ = BasicClientDataSource.getClientSSLMode(properties);
 
         agent_ = newAgent_(logWriter,
                 loginTimeout_,

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientJDBCObjectFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientJDBCObjectFactory.java?rev=1821435&r1=1821434&r2=1821435&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientJDBCObjectFactory.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/ClientJDBCObjectFactory.java Wed Jan 17 23:36:31 2018
@@ -30,7 +30,7 @@ import org.apache.derby.client.ClientXAC
 import java.util.Properties;
 import org.apache.derby.client.am.stmtcache.JDBCStatementCache;
 import org.apache.derby.client.am.stmtcache.StatementKey;
-import org.apache.derby.jdbc.BasicClientDataSource40;
+import org.apache.derby.client.BasicClientDataSource;
 
 /**
  *
@@ -48,7 +48,7 @@ public interface ClientJDBCObjectFactory
      * implements {@code javax.sql.PooledConnection}.
      */
     ClientPooledConnection newClientPooledConnection(
-            BasicClientDataSource40 ds,
+            BasicClientDataSource ds,
             LogWriter logWriter,
             String user,
             String password) throws SQLException;
@@ -58,7 +58,7 @@ public interface ClientJDBCObjectFactory
      * ClientXAConnection (or ClientXAConnection40) class which
      * implements {@code javax.sql.XAConnection}.
      */
-    ClientXAConnection newClientXAConnection(BasicClientDataSource40 ds,
+    ClientXAConnection newClientXAConnection(BasicClientDataSource ds,
             LogWriter logWriter,String user,String password)
             throws SQLException;
     
@@ -226,7 +226,7 @@ public interface ClientJDBCObjectFactory
             LogWriter logWriter,
             String user,
             String password,
-            BasicClientDataSource40 dataSource,
+            BasicClientDataSource dataSource,
             int rmId,
             boolean isXAConn) throws SqlException;
     
@@ -254,7 +254,7 @@ public interface ClientJDBCObjectFactory
     ClientConnection newNetConnection(
             LogWriter logWriter,
             String user,String password,
-            BasicClientDataSource40 dataSource,int rmId,
+            BasicClientDataSource dataSource,int rmId,
             boolean isXAConn,ClientPooledConnection cpc) throws SqlException;
     
     /**