/* * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.jdbcra.spi; import javax.resource.ResourceException; import javax.resource.spi.ConnectionRequestInfo; import javax.resource.spi.ConnectionDefinition; import javax.resource.spi.ConfigProperty; import com.sun.jdbcra.common.DataSourceSpec; import com.sun.jdbcra.common.DataSourceObjectBuilder; import com.sun.jdbcra.util.SecurityUtils; import javax.resource.spi.security.PasswordCredential; import java.util.logging.Logger; import java.util.logging.Level; /** * Data Source <code>ManagedConnectionFactory</code> implementation for Generic JDBC Connector. * * @version 1.0, 02/07/30 * @author Evani Sai Surya Kiran */ @ConnectionDefinition( connection = java.sql.Connection.class, connectionImpl = com.sun.jdbcra.spi.ConnectionHolder.class, connectionFactory = javax.sql.DataSource.class, connectionFactoryImpl = com.sun.jdbcra.spi.DataSource.class ) public class DSManagedConnectionFactory extends ManagedConnectionFactory { private transient javax.sql.DataSource dataSourceObj; private static Logger _logger; static { _logger = Logger.getAnonymousLogger(); } private boolean debug = false; /** * Creates a new physical connection to the underlying EIS resource * manager. * * @param subject <code>Subject</code> instance passed by the application server * @param cxRequestInfo <code>ConnectionRequestInfo</code> which may be created * as a result of the invocation <code>getConnection(user, password)</code> * on the <code>DataSource</code> object * @return <code>ManagedConnection</code> object created * @throws ResourceException if there is an error in instantiating the * <code>DataSource</code> object used for the * creation of the <code>ManagedConnection</code> object * @throws SecurityException if there ino <code>PasswordCredential</code> object * satisfying this request * @throws ResourceAllocationException if there is an error in allocating the * physical connection */ public javax.resource.spi.ManagedConnection createManagedConnection(javax.security.auth.Subject subject, ConnectionRequestInfo cxRequestInfo) throws ResourceException { if(logWriter != null) { logWriter.println("In createManagedConnection"); } PasswordCredential pc = SecurityUtils.getPasswordCredential(this, subject, cxRequestInfo); if(dataSourceObj == null) { if(dsObjBuilder == null) { dsObjBuilder = new DataSourceObjectBuilder(spec); } System.out.println("V3-TEST : before getting datasource object"); try { dataSourceObj = (javax.sql.DataSource) dsObjBuilder.constructDataSourceObject(); } catch(ClassCastException cce) { _logger.log(Level.SEVERE, "jdbc.exc_cce", cce); throw new javax.resource.ResourceException(cce.getMessage()); } } java.sql.Connection dsConn = null; try { /* For the case where the user/passwd of the connection pool is * equal to the PasswordCredential for the connection request * get a connection from this pool directly. * for all other conditions go create a new connection */ if ( isEqual( pc, getUser(), getPassword() ) ) { dsConn = dataSourceObj.getConnection(); } else { dsConn = dataSourceObj.getConnection(pc.getUserName(), new String(pc.getPassword())); } } catch(java.sql.SQLException sqle) { sqle.printStackTrace(); _logger.log(Level.WARNING, "jdbc.exc_create_conn", sqle); throw new javax.resource.spi.ResourceAllocationException("The connection could not be allocated: " + sqle.getMessage()); } catch(Exception e){ System.out.println("V3-TEST : unable to get connection"); e.printStackTrace(); } System.out.println("V3-TEST : got connection"); com.sun.jdbcra.spi.ManagedConnection mc = new com.sun.jdbcra.spi.ManagedConnection(null, dsConn, pc, this); //GJCINT /* setIsolation(mc); isValid(mc); */ System.out.println("V3-TEST : returning connection"); return mc; } /** * Check if this <code>ManagedConnectionFactory</code> is equal to * another <code>ManagedConnectionFactory</code>. * * @param other <code>ManagedConnectionFactory</code> object for checking equality with * @return true if the property sets of both the * <code>ManagedConnectionFactory</code> objects are the same * false otherwise */ public boolean equals(Object other) { if(logWriter != null) { logWriter.println("In equals"); } /** * The check below means that two ManagedConnectionFactory objects are equal * if and only if their properties are the same. */ if(other instanceof com.sun.jdbcra.spi.DSManagedConnectionFactory) { com.sun.jdbcra.spi.DSManagedConnectionFactory otherMCF = (com.sun.jdbcra.spi.DSManagedConnectionFactory) other; return this.spec.equals(otherMCF.spec); } return false; } /** * Sets the server name. * * @param serverName <code>String</code> * @see <code>getServerName</code> */ public void setserverName(String serverName) { spec.setDetail(DataSourceSpec.SERVERNAME, serverName); } /** * Gets the server name. * * @return serverName * @see <code>setServerName</code> */ public String getserverName() { return spec.getDetail(DataSourceSpec.SERVERNAME); } private void validateDealiasing(String propertyName, String propertyValue){ System.out.println("Validating property ["+propertyName+"] with value ["+propertyValue+"] in DSMCF"); //check whether the value is dealiased or not and fail //if it's not dealiased. if(propertyValue != null && propertyValue.contains("${ALIAS")){ throw new IllegalArgumentException(propertyName + "'s value is not de-aliased : " + propertyValue); } } /** * Sets the server name. * * @param serverName <code>String</code> * @see <code>getServerName</code> */ @ConfigProperty( defaultValue = "localhost", type = java.lang.String.class ) public void setServerName(String serverName) { spec.setDetail(DataSourceSpec.SERVERNAME, serverName); } /** * Gets the server name. * * @return serverName * @see <code>setServerName</code> */ public String getServerName() { return spec.getDetail(DataSourceSpec.SERVERNAME); } private String aliasTest; @ConfigProperty( defaultValue = "${ALIAS=ALIAS_TEST_PROPERTY}", type = java.lang.String.class, confidential = true ) public void setAliasTest (String value) { validateDealiasing("AliasTest", value); System.out.println("setAliasTest called : " + value); aliasTest = value; } public String getAliasTest () { return aliasTest; } /** * Sets the port number. * * @param portNumber <code>String</code> * @see <code>getPortNumber</code> */ public void setportNumber(String portNumber) { spec.setDetail(DataSourceSpec.PORTNUMBER, portNumber); } /** * Gets the port number. * * @return portNumber * @see <code>setPortNumber</code> */ public String getportNumber() { return spec.getDetail(DataSourceSpec.PORTNUMBER); } /** * Sets the port number. * * @param portNumber <code>String</code> * @see <code>getPortNumber</code> */ @ConfigProperty( defaultValue = "1527", type = java.lang.String.class ) public void setPortNumber(String portNumber) { spec.setDetail(DataSourceSpec.PORTNUMBER, portNumber); } /** * Gets the port number. * * @return portNumber * @see <code>setPortNumber</code> */ public String getPortNumber() { return spec.getDetail(DataSourceSpec.PORTNUMBER); } /** * Sets the database name. * * @param databaseName <code>String</code> * @see <code>getDatabaseName</code> */ public void setdatabaseName(String databaseName) { spec.setDetail(DataSourceSpec.DATABASENAME, databaseName); } /** * Gets the database name. * * @return databaseName * @see <code>setDatabaseName</code> */ public String getdatabaseName() { return spec.getDetail(DataSourceSpec.DATABASENAME); } /** * Sets the database name. * * @param databaseName <code>String</code> * @see <code>getDatabaseName</code> */ @ConfigProperty( defaultValue="testdb", type=java.lang.String.class ) public void setDatabaseName(String databaseName) { spec.setDetail(DataSourceSpec.DATABASENAME, databaseName); } /** * Gets the database name. * * @return databaseName * @see <code>setDatabaseName</code> */ public String getDatabaseName() { return spec.getDetail(DataSourceSpec.DATABASENAME); } /** * Sets the data source name. * * @param dsn <code>String</code> * @see <code>getDataSourceName</code> */ public void setdataSourceName(String dsn) { spec.setDetail(DataSourceSpec.DATASOURCENAME, dsn); } /** * Gets the data source name. * * @return dsn * @see <code>setDataSourceName</code> */ public String getdataSourceName() { return spec.getDetail(DataSourceSpec.DATASOURCENAME); } /** * Sets the data source name. * * @param dsn <code>String</code> * @see <code>getDataSourceName</code> */ @ConfigProperty( type=java.lang.String.class ) public void setDataSourceName(String dsn) { spec.setDetail(DataSourceSpec.DATASOURCENAME, dsn); } /** * Gets the data source name. * * @return dsn * @see <code>setDataSourceName</code> */ public String getDataSourceName() { return spec.getDetail(DataSourceSpec.DATASOURCENAME); } /** * Sets the description. * * @param desc <code>String</code> * @see <code>getDescription</code> */ public void setdescription(String desc) { spec.setDetail(DataSourceSpec.DESCRIPTION, desc); } /** * Gets the description. * * @return desc * @see <code>setDescription</code> */ public String getdescription() { return spec.getDetail(DataSourceSpec.DESCRIPTION); } /** * Sets the description. * * @param desc <code>String</code> * @see <code>getDescription</code> */ public void setDescription(String desc) { spec.setDetail(DataSourceSpec.DESCRIPTION, desc); } /** * Gets the description. * * @return desc * @see <code>setDescription</code> */ public String getDescription() { return spec.getDetail(DataSourceSpec.DESCRIPTION); } /** * Sets the network protocol. * * @param nwProtocol <code>String</code> * @see <code>getNetworkProtocol</code> */ public void setnetworkProtocol(String nwProtocol) { spec.setDetail(DataSourceSpec.NETWORKPROTOCOL, nwProtocol); } /** * Gets the network protocol. * * @return nwProtocol * @see <code>setNetworkProtocol</code> */ public String getnetworkProtocol() { return spec.getDetail(DataSourceSpec.NETWORKPROTOCOL); } /** * Sets the network protocol. * * @param nwProtocol <code>String</code> * @see <code>getNetworkProtocol</code> */ public void setNetworkProtocol(String nwProtocol) { spec.setDetail(DataSourceSpec.NETWORKPROTOCOL, nwProtocol); } /** * Gets the network protocol. * * @return nwProtocol * @see <code>setNetworkProtocol</code> */ public String getNetworkProtocol() { return spec.getDetail(DataSourceSpec.NETWORKPROTOCOL); } /** * Sets the role name. * * @param roleName <code>String</code> * @see <code>getRoleName</code> */ public void setroleName(String roleName) { spec.setDetail(DataSourceSpec.ROLENAME, roleName); } /** * Gets the role name. * * @return roleName * @see <code>setRoleName</code> */ public String getroleName() { return spec.getDetail(DataSourceSpec.ROLENAME); } /** * Sets the role name. * * @param roleName <code>String</code> * @see <code>getRoleName</code> */ public void setRoleName(String roleName) { spec.setDetail(DataSourceSpec.ROLENAME, roleName); } /** * Gets the role name. * * @return roleName * @see <code>setRoleName</code> */ public String getRoleName() { return spec.getDetail(DataSourceSpec.ROLENAME); } /** * Sets the login timeout. * * @param loginTimeOut <code>String</code> * @see <code>getLoginTimeOut</code> */ public void setloginTimeOut(String loginTimeOut) { spec.setDetail(DataSourceSpec.LOGINTIMEOUT, loginTimeOut); } /** * Gets the login timeout. * * @return loginTimeout * @see <code>setLoginTimeOut</code> */ public String getloginTimeOut() { return spec.getDetail(DataSourceSpec.LOGINTIMEOUT); } /** * Sets the login timeout. * * @param loginTimeOut <code>String</code> * @see <code>getLoginTimeOut</code> */ public void setLoginTimeOut(String loginTimeOut) { spec.setDetail(DataSourceSpec.LOGINTIMEOUT, loginTimeOut); } /** * Gets the login timeout. * * @return loginTimeout * @see <code>setLoginTimeOut</code> */ public String getLoginTimeOut() { return spec.getDetail(DataSourceSpec.LOGINTIMEOUT); } /** * Sets the delimiter. * * @param delim <code>String</code> * @see <code>getDelimiter</code> */ public void setdelimiter(String delim) { spec.setDetail(DataSourceSpec.DELIMITER, delim); } /** * Gets the delimiter. * * @return delim * @see <code>setDelimiter</code> */ public String getdelimiter() { return spec.getDetail(DataSourceSpec.DELIMITER); } /** * Sets the delimiter. * * @param delim <code>String</code> * @see <code>getDelimiter</code> */ @ConfigProperty( defaultValue = "#", type = java.lang.String.class ) public void setDelimiter(String delim) { spec.setDetail(DataSourceSpec.DELIMITER, delim); } /** * Gets the delimiter. * * @return delim * @see <code>setDelimiter</code> */ public String getDelimiter() { return spec.getDetail(DataSourceSpec.DELIMITER); } /** * Sets the driver specific properties. * * @param driverProps <code>String</code> * @see <code>getDriverProperties</code> */ public void setdriverProperties(String driverProps) { spec.setDetail(DataSourceSpec.DRIVERPROPERTIES, driverProps); } /** * Gets the driver specific properties. * * @return driverProps * @see <code>setDriverProperties</code> */ public String getdriverProperties() { return spec.getDetail(DataSourceSpec.DRIVERPROPERTIES); } /** * Sets the driver specific properties. * * @param driverProps <code>String</code> * @see <code>getDriverProperties</code> */ public void setDriverProperties(String driverProps) { spec.setDetail(DataSourceSpec.DRIVERPROPERTIES, driverProps); } /** * Gets the driver specific properties. * * @return driverProps * @see <code>setDriverProperties</code> */ public String getDriverProperties() { return spec.getDetail(DataSourceSpec.DRIVERPROPERTIES); } /* * Check if the PasswordCredential passed for this get connection * request is equal to the user/passwd of this connection pool. */ private boolean isEqual( PasswordCredential pc, String user, String password) { //if equal get direct connection else //get connection with user and password. if (user == null && pc == null) { return true; } if ( user == null && pc != null ) { return false; } if( pc == null ) { return true; } if ( user.equals( pc.getUserName() ) ) { if ( password == null && pc.getPassword() == null ) { return true; } } if ( user.equals(pc.getUserName()) && password.equals(pc.getPassword()) ) { return true; } return false; } }