Author: jboynes Date: Sun May 1 23:25:59 2005 New Revision: 165585 URL: http://svn.apache.org/viewcvs?rev=165585&view=rev Log: cosmetic - reformat code with a consistent style
Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientBaseDataSource.java incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientDataSourceFactory.java incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientPooledConnection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientXAConnection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientXid.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Agent.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/AsciiStream.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/BatchUpdateException.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Blob.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/BlobOutputStream.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CallableStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Clob.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ClobOutputStream.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ClobWriter.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ColumnMetaData.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Configuration.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Connection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ConnectionCallbackInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ConversionException.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Cursor.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/DatabaseMetaData.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/DateTime.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Decimal.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Diagnosable.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/DisconnectException.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/EncryptionManager.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ErrorKey.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ExceptionFormatter.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/FloatingPoint.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/GetFileInputStreamAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/GetResourceBundleAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/GetResourceInputStreamAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/GetSystemPropertiesAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Lob.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogWriter.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/LogicalConnection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/MaterialPreparedStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/MaterialStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ParameterMetaData.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatementCallbackInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ProductLevel.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/QueryTimerTask.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ResourceUtilities.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSetCallbackInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Savepoint.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Section.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SectionManager.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SetAccessibleAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SignedBinary.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SqlCode.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SqlState.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/SqlWarning.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Sqlca.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Statement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/StatementCallbackInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Types.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/UnitOfWorkListener.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Utils.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/Version.java incubator/derby/code/trunk/java/client/org/apache/derby/client/am/XaException.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/CcsidManager.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/CodePoint.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/CodePointNameTable.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ConnectionReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ConnectionReplyInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ConnectionRequestInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/DssConstants.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/EbcdicCcsidManager.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/FdocaConstants.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/FdocaSimpleDataArray.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetAgent.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetCallableStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConfiguration.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnectionRequest.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetIndoubtTransaction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetLogWriter.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPackageRequest.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetPreparedStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSetReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSetRequest.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetSqlca.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetSqldta.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatement.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetStatementRequest.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetXACallInfo.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetXAConnection.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetXAConnectionReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetXAConnectionRequest.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetXAResource.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/OpenSocketAction.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Reply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Request.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ResultSetReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ResultSetReplyInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/ResultSetRequestInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/StatementReply.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/StatementReplyInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/StatementRequestInterface.java incubator/derby/code/trunk/java/client/org/apache/derby/client/net/Typdef.java incubator/derby/code/trunk/java/client/org/apache/derby/client/resources/ResourceKeys.java incubator/derby/code/trunk/java/client/org/apache/derby/client/resources/Resources.java incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientConnectionPoolDataSource.java incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDataSource.java incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientDriver.java incubator/derby/code/trunk/java/client/org/apache/derby/jdbc/ClientXADataSource.java Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientBaseDataSource.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientBaseDataSource.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientBaseDataSource.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/ClientBaseDataSource.java Sun May 1 23:25:59 2005 @@ -20,760 +20,768 @@ package org.apache.derby.client; +import java.util.Properties; + import org.apache.derby.client.am.Configuration; -import org.apache.derby.client.am.SqlException; import org.apache.derby.client.am.LogWriter; +import org.apache.derby.client.am.SqlException; import org.apache.derby.client.net.NetConfiguration; -import java.util.Properties; +public abstract class ClientBaseDataSource implements java.io.Serializable { + private static final long serialVersionUID = -7660172643035173692L; -public abstract class ClientBaseDataSource implements java.io.Serializable -{ - private static final long serialVersionUID = -7660172643035173692L; - - // 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. - - //---------------------contructors/finalizers--------------------------------- - - // This class is abstract, hide the default constructor - protected ClientBaseDataSource () {} - - // ---------------------------- 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 - **/ - protected int loginTimeout = propertyDefault_loginTimeout; - public final static String propertyKey_loginTimeout = "loginTimeout"; - public static final int propertyDefault_loginTimeout = 0; - 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 - */ - protected transient java.io.PrintWriter logWriter = null; - public synchronized void setLogWriter (java.io.PrintWriter logWriter) { this.logWriter = logWriter; } - public java.io.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. - // - // - protected String databaseName = null; - public final static String propertyKey_databaseName = "databaseName"; - - // databaseName is not permitted in a properties object - - - // ---------------------------- description ------------------------------ - // A description of this data source. - protected String description = null; - public final static String propertyKey_description = "description"; - - // ---------------------------- dataSourceName ----------------------------------- - // - // A data source name; - // used to name an underlying XADataSource, - // or ConnectionPoolDataSource when pooling of connections is done. - // - protected String dataSourceName = null; - public final static String propertyKey_dataSourceName = "dataSourceName"; - - // ---------------------------- portNumber ----------------------------------- - // - protected int portNumber = propertyDefault_portNumber; - public final static int propertyDefault_portNumber = 1527; - public final static String propertyKey_portNumber = "portNumber"; - - // ---------------------------- serverName ----------------------------------- - // - // - protected String serverName = null; - public final static String propertyKey_serverName = "serverName"; - - // serverName is not permitted in a properties object - - // ---------------------------- 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. - protected String user = null; - public final static String propertyKey_user = "user"; - public final static String propertyDefault_user = "APP"; - - public static String getUser (java.util.Properties properties) { - String userString= properties.getProperty (propertyKey_user); - return parseString(userString,propertyDefault_user); - } - - /** - * To Derby, the default is HOLD_CURSORS_OVER_COMMIT - */ - protected int resultSetHoldability = propertyNotSet_resultSetHoldability; // 0 means not set. - public final static int HOLD_CURSORS_OVER_COMMIT = 1; // this matches jdbc 3 ResultSet.HOLD_CURSORS_OVER_COMMIT - public final static int CLOSE_CURSORS_AT_COMMIT = 2; // this matches jdbc 3 ResultSet.CLOSE_CURSORS_AT_COMMIT - public final static int propertyNotSet_resultSetHoldability = 0; - synchronized public void setResultSetHoldability (int resultSetHoldability) { this.resultSetHoldability = resultSetHoldability; } - public int getResultSetHoldability () { return this.resultSetHoldability; } - - public final static int NOT_SET = 0; // 0 means not set. - public final static int YES = 1; // ="yes" as property string - public final static int NO = 2; // ="no" as property string - - - // ---------------------------- 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 - // </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. - // - protected short securityMechanism = propertyDefault_securityMechanism; - // TODO default should be USER_ONLY_SECURITY. Change when working on - // Network Server - // public final static short propertyDefault_securityMechanism = (short) - // org.apache.derby.client.net.NetConfiguration.SECMEC_USRIDONL; - public final static short propertyDefault_securityMechanism = (short) - org.apache.derby.client.net.NetConfiguration.SECMEC_USRIDONL; - public final static String propertyKey_securityMechanism = "securityMechanism"; - - - // We use the NET layer constants to avoid a mapping for the NET driver. - public static short getSecurityMechanism (java.util.Properties properties) - { - String securityMechanismString = properties.getProperty (propertyKey_securityMechanism); - String passwordString = properties.getProperty (propertyKey_password); - short setSecurityMechanism = parseShort (securityMechanismString, propertyDefault_securityMechanism); - return getUpgradedSecurityMechanism(setSecurityMechanism,passwordString); - } - - - /** - * Upgrade the security mechansim to USRIDPWD if it is set to USRIDONL but - * we have a password. - */ - public static short getUpgradedSecurityMechanism(short securityMechanism, - String password) - { - // if securityMechanism is USER_ONLY (the default) we may need - // to change it to CLEAR_TEXT_PASSWORD in order to send the password. - if ((password != null) && - (securityMechanism == NetConfiguration.SECMEC_USRIDONL)) - - return (short) NetConfiguration.SECMEC_USRIDPWD; - else - return securityMechanism; - } - // ---------------------------- getServerMessageTextOnGetMessage ----------------------------------- - // - protected boolean retrieveMessageText = propertyDefault_retrieveMessageText; - public final static boolean propertyDefault_retrieveMessageText = true; - public final static String propertyKey_retrieveMessageText = "retrieveMessageText"; - - - public static boolean getRetrieveMessageText (java.util.Properties properties) - { - String retrieveMessageTextString = properties.getProperty (propertyKey_retrieveMessageText); - return parseBoolean (retrieveMessageTextString, propertyDefault_retrieveMessageText); - } - - // ---------------------------- traceLevel ----------------------------------- - // - - public final static int TRACE_NONE = 0x0; - public final static int TRACE_ALL = 0xFFFFFFFF; - public final static int propertyDefault_traceLevel = TRACE_ALL; - public final static String propertyKey_traceLevel = "traceLevel"; - - protected int traceLevel = propertyDefault_traceLevel; - public static int getTraceLevel (java.util.Properties properties) - { - String traceLevelString = properties.getProperty (propertyKey_traceLevel); - return parseInt (traceLevelString, propertyDefault_traceLevel); - } - - // ---------------------------- traceFile ----------------------------------- - // - protected String traceFile = null; - public final static String propertyKey_traceFile = "traceFile"; - public static String getTraceFile (java.util.Properties properties) - { return properties.getProperty (propertyKey_traceFile); } - - // ---------------------------- traceDirectory ----------------------------------- - // For the suffix of the trace file when traceDirectory is enabled. - private transient int traceFileSuffixIndex_ = 0; - // - protected String traceDirectory = null; - public final static String propertyKey_traceDirectory = "traceDirectory"; - - public static String getTraceDirectory (java.util.Properties properties) - { return properties.getProperty (propertyKey_traceDirectory); } - - // ---------------------------- traceFileAppend ----------------------------------- - // - protected boolean traceFileAppend = propertyDefault_traceFileAppend; - public final static boolean propertyDefault_traceFileAppend = false; - public final static String propertyKey_traceFileAppend = "traceFileAppend"; - public static boolean getTraceFileAppend (java.util.Properties properties) - { - String traceFileAppendString = properties.getProperty (propertyKey_traceFileAppend); - 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 final static String propertyKey_password = "password"; - - public static String getPassword (java.util.Properties properties) { return properties.getProperty ("password"); } - - //------------------------ interface methods --------------------------------- - - public javax.naming.Reference getReference () throws javax.naming.NamingException - { - // This method creates a new Reference object to represent this data source. - // The class name of the data source object is saved in the Reference, - // so that an object factory will know that it should create an instance - // of that class when a lookup operation is performed. The class - // name of the object factory, org.apache.derby.client.ClientBaseDataSourceFactory, - // is also stored in the reference. - // This is not required by JNDI, but is recommend in practice. - // JNDI will always use the object factory class specified in the reference when - // reconstructing an object, if a class name has been specified. - // See the JNDI SPI documentation - // for further details on this topic, and for a complete description of the Reference - // and StringRefAddr classes. - // - // This ClientBaseDataSource class provides several standard JDBC properties. - // The names and values of the data source properties are also stored - // in the reference using the StringRefAddr class. - // This is all the information needed to reconstruct a ClientBaseDataSource object. - - javax.naming.Reference ref = - new javax.naming.Reference (this.getClass().getName(), - ClientDataSourceFactory.className__, - null); - - Class clz = getClass(); - java.lang.reflect.Field[] fields = clz.getFields(); - for (int i=0; i<fields.length; i++) { - String name = fields[i].getName(); - if (name.startsWith ("propertyKey_")) { - if (java.lang.reflect.Modifier.isTransient (fields[i].getModifiers())) - continue; // if it is transient, then skip this propertyKey. - try { - String propertyKey = fields[i].get (this).toString(); - // search for property field. - java.lang.reflect.Field propertyField; - clz = getClass(); // start from current class. - while (true) { - try { - propertyField = clz.getDeclaredField (name.substring (12)); - break; // found the property field, so break the while loop. + // 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. + + //---------------------contructors/finalizers--------------------------------- + + // This class is abstract, hide the default constructor + protected ClientBaseDataSource() { + } + + // ---------------------------- 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 + */ + protected int loginTimeout = propertyDefault_loginTimeout; + public final static String propertyKey_loginTimeout = "loginTimeout"; + public static final int propertyDefault_loginTimeout = 0; + + 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 + */ + protected transient java.io.PrintWriter logWriter = null; + + public synchronized void setLogWriter(java.io.PrintWriter logWriter) { + this.logWriter = logWriter; + } + + public java.io.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. + // + // + protected String databaseName = null; + public final static String propertyKey_databaseName = "databaseName"; + + // databaseName is not permitted in a properties object + + + // ---------------------------- description ------------------------------ + // A description of this data source. + protected String description = null; + public final static String propertyKey_description = "description"; + + // ---------------------------- dataSourceName ----------------------------------- + // + // A data source name; + // used to name an underlying XADataSource, + // or ConnectionPoolDataSource when pooling of connections is done. + // + protected String dataSourceName = null; + public final static String propertyKey_dataSourceName = "dataSourceName"; + + // ---------------------------- portNumber ----------------------------------- + // + protected int portNumber = propertyDefault_portNumber; + public final static int propertyDefault_portNumber = 1527; + public final static String propertyKey_portNumber = "portNumber"; + + // ---------------------------- serverName ----------------------------------- + // + // + protected String serverName = null; + public final static String propertyKey_serverName = "serverName"; + + // serverName is not permitted in a properties object + + // ---------------------------- 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. + protected String user = null; + public final static String propertyKey_user = "user"; + public final static String propertyDefault_user = "APP"; + + public static String getUser(java.util.Properties properties) { + String userString = properties.getProperty(propertyKey_user); + return parseString(userString, propertyDefault_user); + } + + /** + * To Derby, the default is HOLD_CURSORS_OVER_COMMIT + */ + protected int resultSetHoldability = propertyNotSet_resultSetHoldability; // 0 means not set. + public final static int HOLD_CURSORS_OVER_COMMIT = 1; // this matches jdbc 3 ResultSet.HOLD_CURSORS_OVER_COMMIT + public final static int CLOSE_CURSORS_AT_COMMIT = 2; // this matches jdbc 3 ResultSet.CLOSE_CURSORS_AT_COMMIT + public final static int propertyNotSet_resultSetHoldability = 0; + + synchronized public void setResultSetHoldability(int resultSetHoldability) { + this.resultSetHoldability = resultSetHoldability; + } + + public int getResultSetHoldability() { + return this.resultSetHoldability; + } + + public final static int NOT_SET = 0; // 0 means not set. + public final static int YES = 1; // ="yes" as property string + public final static int NO = 2; // ="no" as property string + + + // ---------------------------- 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 + // </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. + // + protected short securityMechanism = propertyDefault_securityMechanism; + // TODO default should be USER_ONLY_SECURITY. Change when working on + // Network Server + // public final static short propertyDefault_securityMechanism = (short) + // org.apache.derby.client.net.NetConfiguration.SECMEC_USRIDONL; + public final static short propertyDefault_securityMechanism = (short) + org.apache.derby.client.net.NetConfiguration.SECMEC_USRIDONL; + public final static String propertyKey_securityMechanism = "securityMechanism"; + + + // We use the NET layer constants to avoid a mapping for the NET driver. + public static short getSecurityMechanism(java.util.Properties properties) { + String securityMechanismString = properties.getProperty(propertyKey_securityMechanism); + String passwordString = properties.getProperty(propertyKey_password); + short setSecurityMechanism = parseShort(securityMechanismString, propertyDefault_securityMechanism); + return getUpgradedSecurityMechanism(setSecurityMechanism, passwordString); + } + + + /** + * Upgrade the security mechansim to USRIDPWD if it is set to USRIDONL but we have a password. + */ + public static short getUpgradedSecurityMechanism(short securityMechanism, + String password) { + // if securityMechanism is USER_ONLY (the default) we may need + // to change it to CLEAR_TEXT_PASSWORD in order to send the password. + if ((password != null) && + (securityMechanism == NetConfiguration.SECMEC_USRIDONL)) { + return (short) NetConfiguration.SECMEC_USRIDPWD; + } else { + return securityMechanism; + } + } + + // ---------------------------- getServerMessageTextOnGetMessage ----------------------------------- + // + protected boolean retrieveMessageText = propertyDefault_retrieveMessageText; + public final static boolean propertyDefault_retrieveMessageText = true; + public final static String propertyKey_retrieveMessageText = "retrieveMessageText"; + + + public static boolean getRetrieveMessageText(java.util.Properties properties) { + String retrieveMessageTextString = properties.getProperty(propertyKey_retrieveMessageText); + return parseBoolean(retrieveMessageTextString, propertyDefault_retrieveMessageText); + } + + // ---------------------------- traceLevel ----------------------------------- + // + + public final static int TRACE_NONE = 0x0; + public final static int TRACE_ALL = 0xFFFFFFFF; + public final static int propertyDefault_traceLevel = TRACE_ALL; + public final static String propertyKey_traceLevel = "traceLevel"; + + protected int traceLevel = propertyDefault_traceLevel; + + public static int getTraceLevel(java.util.Properties properties) { + String traceLevelString = properties.getProperty(propertyKey_traceLevel); + return parseInt(traceLevelString, propertyDefault_traceLevel); + } + + // ---------------------------- traceFile ----------------------------------- + // + protected String traceFile = null; + public final static String propertyKey_traceFile = "traceFile"; + + public static String getTraceFile(java.util.Properties properties) { + return properties.getProperty(propertyKey_traceFile); + } + + // ---------------------------- traceDirectory ----------------------------------- + // For the suffix of the trace file when traceDirectory is enabled. + private transient int traceFileSuffixIndex_ = 0; + // + protected String traceDirectory = null; + public final static String propertyKey_traceDirectory = "traceDirectory"; + + public static String getTraceDirectory(java.util.Properties properties) { + return properties.getProperty(propertyKey_traceDirectory); + } + + // ---------------------------- traceFileAppend ----------------------------------- + // + protected boolean traceFileAppend = propertyDefault_traceFileAppend; + public final static boolean propertyDefault_traceFileAppend = false; + public final static String propertyKey_traceFileAppend = "traceFileAppend"; + + public static boolean getTraceFileAppend(java.util.Properties properties) { + String traceFileAppendString = properties.getProperty(propertyKey_traceFileAppend); + 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 final static String propertyKey_password = "password"; + + public static String getPassword(java.util.Properties properties) { + return properties.getProperty("password"); + } + + //------------------------ interface methods --------------------------------- + + public javax.naming.Reference getReference() throws javax.naming.NamingException { + // This method creates a new Reference object to represent this data source. + // The class name of the data source object is saved in the Reference, + // so that an object factory will know that it should create an instance + // of that class when a lookup operation is performed. The class + // name of the object factory, org.apache.derby.client.ClientBaseDataSourceFactory, + // is also stored in the reference. + // This is not required by JNDI, but is recommend in practice. + // JNDI will always use the object factory class specified in the reference when + // reconstructing an object, if a class name has been specified. + // See the JNDI SPI documentation + // for further details on this topic, and for a complete description of the Reference + // and StringRefAddr classes. + // + // This ClientBaseDataSource class provides several standard JDBC properties. + // The names and values of the data source properties are also stored + // in the reference using the StringRefAddr class. + // This is all the information needed to reconstruct a ClientBaseDataSource object. + + javax.naming.Reference ref = + new javax.naming.Reference(this.getClass().getName(), + ClientDataSourceFactory.className__, + null); + + Class clz = getClass(); + java.lang.reflect.Field[] fields = clz.getFields(); + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("propertyKey_")) { + if (java.lang.reflect.Modifier.isTransient(fields[i].getModifiers())) { + continue; // if it is transient, then skip this propertyKey. + } + try { + String propertyKey = fields[i].get(this).toString(); + // search for property field. + java.lang.reflect.Field propertyField; + clz = getClass(); // start from current class. + while (true) { + try { + propertyField = clz.getDeclaredField(name.substring(12)); + break; // found the property field, so break the while loop. + } catch (java.lang.NoSuchFieldException nsfe) { + // property field is not found at current level of class, so continue to super class. + clz = clz.getSuperclass(); + if (clz == Object.class) { + throw new javax.naming.NamingException("bug check: corresponding property field does not exist"); + } + continue; + } + } + + if (!java.lang.reflect.Modifier.isTransient(propertyField.getModifiers())) { + // if the property is not transient: + // get the property. + java.security.AccessController.doPrivileged(new org.apache.derby.client.am.SetAccessibleAction(propertyField, true)); + //propertyField.setAccessible (true); + Object propertyObj = propertyField.get(this); + String property = (propertyObj == null) ? null : String.valueOf(propertyObj); + // add into reference. + ref.add(new javax.naming.StringRefAddr(propertyKey, property)); + } + } catch (java.lang.IllegalAccessException e) { + throw new javax.naming.NamingException("bug check: property cannot be accessed"); + } catch (java.security.PrivilegedActionException e) { + throw new javax.naming.NamingException("Privileged action exception occurred."); + } } - catch (java.lang.NoSuchFieldException nsfe) { - // property field is not found at current level of class, so continue to super class. - clz = clz.getSuperclass(); - if (clz == Object.class) - throw new javax.naming.NamingException ("bug check: corresponding property field does not exist"); - continue; + } + return ref; + } + + /** + * Not an external. Do not document in pubs. Populates member data for this data source given a JNDI reference. + */ + public void hydrateFromReference(javax.naming.Reference ref) throws java.sql.SQLException { + javax.naming.RefAddr address; + + Class clz = getClass(); + java.lang.reflect.Field[] fields = clz.getFields(); + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("propertyKey_")) { + if (java.lang.reflect.Modifier.isTransient(fields[i].getModifiers())) { + continue; // if it is transient, then skip this propertyKey. + } + try { + String propertyKey = fields[i].get(this).toString(); + // search for property field. + java.lang.reflect.Field propertyField; + clz = getClass(); // start from current class. + while (true) { + try { + propertyField = clz.getDeclaredField(name.substring(12)); + break; // found the property field, so break the while loop. + } catch (java.lang.NoSuchFieldException nsfe) { + // property field is not found at current level of class, so continue to super class. + clz = clz.getSuperclass(); + if (clz == Object.class) { + throw new org.apache.derby.client.am.SqlException(new org.apache.derby.client.am.LogWriter(this.logWriter, this.traceLevel), + "bug check: corresponding property field does not exist"); + } + continue; + } + } + + if (!java.lang.reflect.Modifier.isTransient(propertyField.getModifiers())) { + // if the property is not transient: + // set the property. + address = ref.get(propertyKey); + if (address != null) { + propertyField.setAccessible(true); + String type = propertyField.getType().toString(); + if (type.equals("boolean")) { + boolean value = ((String) address.getContent()).equalsIgnoreCase("true"); + propertyField.setBoolean(this, value); + } else if (type.equals("byte")) { + byte value = Byte.parseByte((String) address.getContent()); + propertyField.setByte(this, value); + } else if (type.equals("short")) { + short value = Short.parseShort((String) address.getContent()); + propertyField.setShort(this, value); + } else if (type.equals("int")) { + int value = Integer.parseInt((String) address.getContent()); + propertyField.setInt(this, value); + } else if (type.equals("long")) { + long value = Long.parseLong((String) address.getContent()); + propertyField.setLong(this, value); + } else if (type.equals("float")) { + float value = Float.parseFloat((String) address.getContent()); + propertyField.setFloat(this, value); + } else if (type.equals("double")) { + double value = Double.parseDouble((String) address.getContent()); + propertyField.setDouble(this, value); + } else if (type.equals("char")) { + char value = ((String) address.getContent()).charAt(0); + propertyField.setChar(this, value); + } else { + propertyField.set(this, address.getContent()); + } + } + } + } catch (java.lang.IllegalAccessException e) { + throw new org.apache.derby.client.am.SqlException(new org.apache.derby.client.am.LogWriter(this.logWriter, this.traceLevel), + "bug check: property cannot be accessed"); + } } - } + } + } - if (!java.lang.reflect.Modifier.isTransient (propertyField.getModifiers())) { - // if the property is not transient: - // get the property. - java.security.AccessController.doPrivileged (new org.apache.derby.client.am.SetAccessibleAction ( - propertyField, true)); - //propertyField.setAccessible (true); - Object propertyObj = propertyField.get (this); - String property = (propertyObj == null) ? null : String.valueOf (propertyObj); - // add into reference. - ref.add (new javax.naming.StringRefAddr (propertyKey, property)); - } - } - catch (java.lang.IllegalAccessException e) { - throw new javax.naming.NamingException ("bug check: property cannot be accessed"); - } - catch (java.security.PrivilegedActionException e) { - throw new javax.naming.NamingException ("Privileged action exception occurred."); - } - } - } - return ref; - } - - /** - * Not an external. Do not document in pubs. - * Populates member data for this data source given a JNDI reference. - */ - public void hydrateFromReference (javax.naming.Reference ref) throws java.sql.SQLException - { - javax.naming.RefAddr address; - - Class clz = getClass(); - java.lang.reflect.Field[] fields = clz.getFields(); - for (int i=0; i<fields.length; i++) { - String name = fields[i].getName(); - if (name.startsWith ("propertyKey_")) { - if (java.lang.reflect.Modifier.isTransient (fields[i].getModifiers())) - continue; // if it is transient, then skip this propertyKey. - try { - String propertyKey = fields[i].get (this).toString(); - // search for property field. - java.lang.reflect.Field propertyField; - clz = getClass(); // start from current class. - while (true) { - try { - propertyField = clz.getDeclaredField (name.substring (12)); - break; // found the property field, so break the while loop. + // ----------------------supplemental methods--------------------------------- + /** + * Not an external. Do not document in pubs. Returns all non-transient properties of a ClientBaseDataSource. + */ + public java.util.Properties getProperties() throws java.sql.SQLException { + java.util.Properties properties = new java.util.Properties(); + + Class clz = getClass(); + java.lang.reflect.Field[] fields = clz.getFields(); + for (int i = 0; i < fields.length; i++) { + String name = fields[i].getName(); + if (name.startsWith("propertyKey_")) { + if (java.lang.reflect.Modifier.isTransient(fields[i].getModifiers())) { + continue; // if it is transient, then skip this propertyKey. + } + try { + String propertyKey = fields[i].get(this).toString(); + // search for property field. + java.lang.reflect.Field propertyField; + clz = getClass(); // start from current class. + while (true) { + try { + propertyField = clz.getDeclaredField(name.substring(12)); + break; // found the property field, so break the while loop. + } catch (java.lang.NoSuchFieldException nsfe) { + // property field is not found at current level of class, so continue to super class. + clz = clz.getSuperclass(); + if (clz == Object.class) { + throw new org.apache.derby.client.am.SqlException(new org.apache.derby.client.am.LogWriter(this.logWriter, this.traceLevel), + "bug check: corresponding property field does not exist"); + } + continue; + } + } + + if (!java.lang.reflect.Modifier.isTransient(propertyField.getModifiers())) { + // if the property is not transient: + // get the property. + propertyField.setAccessible(true); + Object propertyObj = propertyField.get(this); + String property = String.valueOf(propertyObj); // don't use toString becuase it may be null. + if ("password".equals(propertyKey)) { + StringBuffer sb = new StringBuffer(property); + for (int j = 0; j < property.length(); j++) { + sb.setCharAt(j, '*'); + } + property = sb.toString(); + } + // add into prperties. + properties.setProperty(propertyKey, property); + } + } catch (java.lang.IllegalAccessException e) { + throw new org.apache.derby.client.am.SqlException(new org.apache.derby.client.am.LogWriter(this.logWriter, this.traceLevel), + "bug check: property cannot be accessed"); + } } - catch (java.lang.NoSuchFieldException nsfe) { - // property field is not found at current level of class, so continue to super class. - clz = clz.getSuperclass(); - if (clz == Object.class) - throw new org.apache.derby.client.am.SqlException ( - new org.apache.derby.client.am.LogWriter (this.logWriter, this.traceLevel), - "bug check: corresponding property field does not exist" - ); - continue; + } + + return properties; + } + + //---------------------- helper methods -------------------------------------- + + // The java.io.PrintWriter overrides the traceFile setting. + // If neither traceFile nor jdbc logWriter are set, then null is returned. + public org.apache.derby.client.am.LogWriter computeDncLogWriterForNewConnection(String logWriterInUseSuffix) // used only for trace directories to indicate whether + // log writer is use is from xads, cpds, sds, ds, driver, config, reset. + throws org.apache.derby.client.am.SqlException { + return computeDncLogWriterForNewConnection(this.logWriter, + this.traceDirectory, + this.traceFile, + this.traceFileAppend, + this.traceLevel, + logWriterInUseSuffix, + this.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. + static public org.apache.derby.client.am.LogWriter computeDncLogWriterForNewConnection(java.io.PrintWriter logWriter, + String traceDirectory, + String traceFile, + boolean traceFileAppend, + int traceLevel, + String logWriterInUseSuffix, // used only for trace directories to indicate whether + // log writer is use is from xads, cpds, sds, ds, driver, config. + int traceFileSuffixIndex) throws org.apache.derby.client.am.SqlException { + int globaltraceFileSuffixIndex = Configuration.traceFileSuffixIndex__++; + + org.apache.derby.client.am.LogWriter dncLogWriter; + // compute regular dnc log writer if there is any + dncLogWriter = + computeDncLogWriter(logWriter, + traceDirectory, + traceFile, + traceFileAppend, + logWriterInUseSuffix, + traceFileSuffixIndex, + traceLevel); + if (dncLogWriter != null) { + return dncLogWriter; + } + // compute global default dnc log writer if there is any + dncLogWriter = + computeDncLogWriter(null, + Configuration.traceDirectory__, + Configuration.traceFile__, + Configuration.traceFileAppend__, + "_global", + globaltraceFileSuffixIndex, + Configuration.traceLevel__); + return dncLogWriter; + } + + // Compute a DNC log writer before a connection is created. + static org.apache.derby.client.am.LogWriter computeDncLogWriter(java.io.PrintWriter logWriter, + String traceDirectory, + String traceFile, + boolean traceFileAppend, + String logWriterInUseSuffix, + int traceFileSuffixIndex, + int traceLevel) throws org.apache.derby.client.am.SqlException { + // Otherwise, the trace file will still be created even TRACE_NONE. + if (traceLevel == TRACE_NONE) { + return null; + } + + java.io.PrintWriter printWriter = + computePrintWriter(logWriter, + traceDirectory, + traceFile, + traceFileAppend, + logWriterInUseSuffix, + traceFileSuffixIndex); + if (printWriter == null) { + return null; + } + + org.apache.derby.client.am.LogWriter dncLogWriter; + dncLogWriter = new org.apache.derby.client.net.NetLogWriter(printWriter, traceLevel); + if (printWriter != logWriter && traceDirectory != 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; + } + + // Compute a DNC log writer after a connection is created. + // Declared public for use by am.Connection. Not a public external. + public static org.apache.derby.client.am.LogWriter computeDncLogWriter(org.apache.derby.client.am.Connection connection, + java.io.PrintWriter logWriter, + String traceDirectory, + String traceFile, + boolean traceFileAppend, + String logWriterInUseSuffix, + int traceFileSuffixIndex, + int traceLevel) throws org.apache.derby.client.am.SqlException { + // Otherwise, the trace file will still be created even TRACE_NONE. + if (traceLevel == TRACE_NONE) { + return null; + } + + java.io.PrintWriter printWriter = + computePrintWriter(logWriter, + traceDirectory, + traceFile, + traceFileAppend, + logWriterInUseSuffix, + traceFileSuffixIndex); + if (printWriter == null) { + return null; + } + + org.apache.derby.client.am.LogWriter dncLogWriter = + connection.agent_.newLogWriter_(printWriter, traceLevel); + if (printWriter != logWriter && traceDirectory != 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. + static java.io.PrintWriter computePrintWriter(java.io.PrintWriter logWriter, + String traceDirectory, + String traceFile, + boolean traceFileAppend, + String logWriterInUseSuffix, // used only for trace directories to indicate whether + // log writer is use is from xads, cpds, sds, ds, driver, config. + int traceFileSuffixIndex) throws org.apache.derby.client.am.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 + "/" + logWriterInUseSuffix + "_" + traceFileSuffixIndex; + } else { + fileName = traceDirectory + "/" + traceFile + logWriterInUseSuffix + "_" + traceFileSuffixIndex; + } + return LogWriter.getPrintWriter(fileName, true); // no file append and not enable caching. + } else if (traceFile != null) { + return LogWriter.getPrintWriter(traceFile, traceFileAppend); } - } + } + return null; + } + + private static boolean parseBoolean(String boolString, boolean defaultBool) { + if (boolString != null) { + return (boolString.equalsIgnoreCase("true") || boolString.equalsIgnoreCase("yes")); + } + return defaultBool; + } - if (!java.lang.reflect.Modifier.isTransient (propertyField.getModifiers())) { - // if the property is not transient: - // set the property. - address = ref.get (propertyKey); - if (address != null) { - propertyField.setAccessible (true); - String type = propertyField.getType().toString(); - if (type.equals ("boolean")) { - boolean value = ((String) address.getContent()).equalsIgnoreCase("true"); - propertyField.setBoolean (this, value); - } - else if (type.equals ("byte")) { - byte value = Byte.parseByte ((String)address.getContent()); - propertyField.setByte (this, value); - } - else if (type.equals ("short")) { - short value = Short.parseShort ((String)address.getContent()); - propertyField.setShort (this, value); - } - else if (type.equals ("int")) { - int value = Integer.parseInt ((String)address.getContent()); - propertyField.setInt (this, value); - } - else if (type.equals ("long")) { - long value = Long.parseLong ((String)address.getContent()); - propertyField.setLong (this, value); - } - else if (type.equals ("float")) { - float value = Float.parseFloat ((String)address.getContent()); - propertyField.setFloat (this, value); - } - else if (type.equals ("double")) { - double value = Double.parseDouble ((String)address.getContent()); - propertyField.setDouble (this, value); - } - else if (type.equals ("char")) { - char value = ((String)address.getContent()).charAt(0); - propertyField.setChar (this, value); - } - else { - propertyField.set (this, address.getContent()); - } + private static String parseString(String string, String defaultString) { + if (string != null) { + return string; + } + return defaultString; + } + + private static short parseShort(String shortString, short defaultShort) { + if (shortString != null) { + return Short.parseShort(shortString); + } + return defaultShort; + } + + private static int parseInt(String intString, int defaultInt) { + if (intString != null) { + return Integer.parseInt(intString); + } + return defaultInt; + } + + private static long parseLong(String longString, long defaultLong) { + if (longString != null) { + return Long.parseLong(longString); + } + return defaultLong; + } + + private static int parseTernaryValue(String valueString, int defaultValue) { + if ("true".equalsIgnoreCase(valueString) || "yes".equalsIgnoreCase(valueString)) { + return YES; + } + if ("false".equalsIgnoreCase(valueString) || "no".equalsIgnoreCase(valueString)) { + return NO; + } + if (valueString != null) { + int value = Integer.parseInt(valueString); + if (value < 0 || value > 2) { + throw new java.lang.NumberFormatException(valueString); } - } + return value; + } + return defaultValue; + } + + // 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 java.util.Properties tokenizeAttributes(String attributeString, + java.util.Properties properties) throws SqlException { + java.util.Properties augmentedProperties; + + if (attributeString == null) { + return properties; + } + + if (properties != null) { + augmentedProperties = (java.util.Properties) properties.clone(); + } else { + augmentedProperties = new Properties(); } - catch (java.lang.IllegalAccessException e) { - throw new org.apache.derby.client.am.SqlException ( - new org.apache.derby.client.am.LogWriter (this.logWriter, this.traceLevel), - "bug check: property cannot be accessed" - ); - } - } - } - } - - // ----------------------supplemental methods--------------------------------- - /** - * Not an external. Do not document in pubs. - * Returns all non-transient properties of a ClientBaseDataSource. - */ - public java.util.Properties getProperties () throws java.sql.SQLException - { - java.util.Properties properties = new java.util.Properties(); - - Class clz = getClass(); - java.lang.reflect.Field[] fields = clz.getFields(); - for (int i=0; i<fields.length; i++) { - String name = fields[i].getName(); - if (name.startsWith ("propertyKey_")) { - if (java.lang.reflect.Modifier.isTransient (fields[i].getModifiers())) - continue; // if it is transient, then skip this propertyKey. try { - String propertyKey = fields[i].get (this).toString(); - // search for property field. - java.lang.reflect.Field propertyField; - clz = getClass(); // start from current class. - while (true) { - try { - propertyField = clz.getDeclaredField (name.substring (12)); - break; // found the property field, so break the while loop. - } - catch (java.lang.NoSuchFieldException nsfe) { - // property field is not found at current level of class, so continue to super class. - clz = clz.getSuperclass(); - if (clz == Object.class) - throw new org.apache.derby.client.am.SqlException ( - new org.apache.derby.client.am.LogWriter (this.logWriter, this.traceLevel), - "bug check: corresponding property field does not exist" - ); - continue; - } - } + java.util.StringTokenizer attrTokenizer = + new java.util.StringTokenizer(attributeString, ";"); + while (attrTokenizer.hasMoreTokens()) { + String v = attrTokenizer.nextToken(); + + int eqPos = v.indexOf('='); + if (eqPos == -1) { + throw new SqlException(null, "Invalid attribute syntax: " + attributeString); + } - if (!java.lang.reflect.Modifier.isTransient (propertyField.getModifiers())) { - // if the property is not transient: - // get the property. - propertyField.setAccessible (true); - Object propertyObj = propertyField.get (this); - String property = String.valueOf (propertyObj); // don't use toString becuase it may be null. - if ("password".equals(propertyKey)) { - StringBuffer sb = new StringBuffer (property); - for (int j = 0; j< property.length(); j++) { - sb.setCharAt(j,'*'); - } - property = sb.toString(); + augmentedProperties.setProperty((v.substring(0, eqPos)).trim(), + (v.substring(eqPos + 1)).trim()); } - // add into prperties. - properties.setProperty (propertyKey, property); - } - } - catch (java.lang.IllegalAccessException e) { - throw new org.apache.derby.client.am.SqlException ( - new org.apache.derby.client.am.LogWriter (this.logWriter, this.traceLevel), - "bug check: property cannot be accessed" - ); - } - } - } - - return properties; - } - - //---------------------- helper methods -------------------------------------- - - // The java.io.PrintWriter overrides the traceFile setting. - // If neither traceFile nor jdbc logWriter are set, then null is returned. - public org.apache.derby.client.am.LogWriter computeDncLogWriterForNewConnection ( - String logWriterInUseSuffix) // used only for trace directories to indicate whether - // log writer is use is from xads, cpds, sds, ds, driver, config, reset. - throws org.apache.derby.client.am.SqlException - { - return computeDncLogWriterForNewConnection ( - this.logWriter, - this.traceDirectory, - this.traceFile, - this.traceFileAppend, - this.traceLevel, - logWriterInUseSuffix, - this.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. - static public org.apache.derby.client.am.LogWriter computeDncLogWriterForNewConnection ( - java.io.PrintWriter logWriter, - String traceDirectory, - String traceFile, - boolean traceFileAppend, - int traceLevel, - String logWriterInUseSuffix, // used only for trace directories to indicate whether - // log writer is use is from xads, cpds, sds, ds, driver, config. - int traceFileSuffixIndex) throws org.apache.derby.client.am.SqlException - { - int globaltraceFileSuffixIndex = Configuration.traceFileSuffixIndex__++; - - org.apache.derby.client.am.LogWriter dncLogWriter; - // compute regular dnc log writer if there is any - dncLogWriter = - computeDncLogWriter ( - logWriter, - traceDirectory, - traceFile, - traceFileAppend, - logWriterInUseSuffix, - traceFileSuffixIndex, - traceLevel); - if (dncLogWriter != null) return dncLogWriter; - // compute global default dnc log writer if there is any - dncLogWriter = - computeDncLogWriter ( - null, - Configuration.traceDirectory__, - Configuration.traceFile__, - Configuration.traceFileAppend__, - "_global", - globaltraceFileSuffixIndex, - Configuration.traceLevel__); - return dncLogWriter; - } - - // Compute a DNC log writer before a connection is created. - static org.apache.derby.client.am.LogWriter computeDncLogWriter ( - java.io.PrintWriter logWriter, - String traceDirectory, - String traceFile, - boolean traceFileAppend, - String logWriterInUseSuffix, - int traceFileSuffixIndex, - int traceLevel) throws org.apache.derby.client.am.SqlException - { - // Otherwise, the trace file will still be created even TRACE_NONE. - if (traceLevel == TRACE_NONE) return null; - - java.io.PrintWriter printWriter = - computePrintWriter ( - logWriter, - traceDirectory, - traceFile, - traceFileAppend, - logWriterInUseSuffix, - traceFileSuffixIndex); - if (printWriter == null) return null; - - org.apache.derby.client.am.LogWriter dncLogWriter; - dncLogWriter = new org.apache.derby.client.net.NetLogWriter (printWriter, traceLevel); - if (printWriter != logWriter && traceDirectory != 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; - } - - // Compute a DNC log writer after a connection is created. - // Declared public for use by am.Connection. Not a public external. - public static org.apache.derby.client.am.LogWriter computeDncLogWriter ( - org.apache.derby.client.am.Connection connection, - java.io.PrintWriter logWriter, - String traceDirectory, - String traceFile, - boolean traceFileAppend, - String logWriterInUseSuffix, - int traceFileSuffixIndex, - int traceLevel) throws org.apache.derby.client.am.SqlException - { - // Otherwise, the trace file will still be created even TRACE_NONE. - if (traceLevel == TRACE_NONE) return null; - - java.io.PrintWriter printWriter = - computePrintWriter ( - logWriter, - traceDirectory, - traceFile, - traceFileAppend, - logWriterInUseSuffix, - traceFileSuffixIndex); - if (printWriter == null) return null; - - org.apache.derby.client.am.LogWriter dncLogWriter = - connection.agent_.newLogWriter_ (printWriter, traceLevel); - if (printWriter != logWriter && traceDirectory != 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. - static java.io.PrintWriter computePrintWriter ( - java.io.PrintWriter logWriter, - String traceDirectory, - String traceFile, - boolean traceFileAppend, - String logWriterInUseSuffix, // used only for trace directories to indicate whether - // log writer is use is from xads, cpds, sds, ds, driver, config. - int traceFileSuffixIndex) throws org.apache.derby.client.am.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 + "/" + logWriterInUseSuffix + "_" + traceFileSuffixIndex; - else fileName = traceDirectory + "/" + traceFile + logWriterInUseSuffix + "_" + traceFileSuffixIndex; - return LogWriter.getPrintWriter (fileName, true); // no file append and not enable caching. - } else if (traceFile != null) { - return LogWriter.getPrintWriter (traceFile, traceFileAppend); - } - } - return null; - } - - 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 short parseShort (String shortString, short defaultShort) - { - if (shortString != null) return Short.parseShort (shortString); - return defaultShort; - } - - private static int parseInt (String intString, int defaultInt) - { - if (intString != null) return Integer.parseInt (intString); - return defaultInt; - } - - private static long parseLong (String longString, long defaultLong) - { - if (longString != null) return Long.parseLong (longString); - return defaultLong; - } - - private static int parseTernaryValue (String valueString, int defaultValue) - { - if ("true".equalsIgnoreCase (valueString) || "yes".equalsIgnoreCase (valueString)) return YES; - if ("false".equalsIgnoreCase (valueString) || "no".equalsIgnoreCase (valueString)) return NO; - if (valueString != null) { - int value = Integer.parseInt (valueString); - if (value < 0 || value > 2) throw new java.lang.NumberFormatException (valueString); - return value; - } - return defaultValue; - } - - // 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 java.util.Properties tokenizeAttributes (String attributeString, - java.util.Properties properties) throws SqlException -{ - java.util.Properties augmentedProperties; - - if (attributeString == null) - return properties; - - if (properties != null) - augmentedProperties = (java.util.Properties) properties.clone(); - else - augmentedProperties = new Properties(); - try { - java.util.StringTokenizer attrTokenizer = - new java.util.StringTokenizer(attributeString,";"); - while (attrTokenizer.hasMoreTokens()) { - String v = attrTokenizer.nextToken(); - - int eqPos = v.indexOf('='); - if (eqPos == -1) - throw new SqlException (null, "Invalid attribute syntax: " + attributeString); - - augmentedProperties.setProperty((v.substring(0, eqPos)).trim(), - (v.substring(eqPos + 1)).trim() - ); - } - } - catch (java.util.NoSuchElementException e) { - // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced - throw new SqlException (null, e, "Invalid attribute syntax: " + attributeString); - } - checkBoolean(augmentedProperties,propertyKey_retrieveMessageText); - return augmentedProperties; - - } + } catch (java.util.NoSuchElementException e) { + // A null log writer is passed, because jdbc 1 sqlexceptions are automatically traced + throw new SqlException(null, e, "Invalid attribute syntax: " + attributeString); + } + checkBoolean(augmentedProperties, propertyKey_retrieveMessageText); + return augmentedProperties; - private static void checkBoolean(Properties set, String attribute) throws SqlException - { + } + + private static void checkBoolean(Properties set, String attribute) throws SqlException { final String[] booleanChoices = {"true", "false"}; - checkEnumeration( set, attribute, booleanChoices); - } + 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; + 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(java.util.Locale.ENGLISH).equals( choices[i].toUpperCase(java.util.Locale.ENGLISH))) + for (int i = 0; i < choices.length; i++) { + if (value.toUpperCase(java.util.Locale.ENGLISH).equals(choices[i].toUpperCase(java.util.Locale.ENGLISH))) { return; + } } - // The attribute value is invalid. Construct a string giving the choices for - // display in the error message. +// 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) + for (int i = 0; i < choices.length; i++) { + if (i > 0) { choicesStr += "|"; + } choicesStr += choices[i]; } - - throw new SqlException (null, "JDBC attribute " + attribute + - "has an invalid value " + value + - " Valid values are " + choicesStr); - } + throw new SqlException(null, "JDBC attribute " + attribute + + "has an invalid value " + value + + " Valid values are " + choicesStr); + } }