void generateFindMethodAndArgs(Method method, IndentedWriter iw) throws IOException { iw.println("Class[] argTypes = "); iw.println("{"); iw.upIndent(); Class[] argTypes = method.getParameterTypes(); for (int i = 0, len = argTypes.length; i < len; ++i) { if (i != 0) iw.println(","); iw.print(CodegenUtils.simpleClassName(argTypes[i]) + ".class"); } iw.println(); iw.downIndent(); iw.println("};"); iw.println( "Method method = Connection.class.getMethod( \042" + method.getName() + "\042 , argTypes );"); iw.println(); iw.println("Object[] args = "); iw.println("{"); iw.upIndent(); for (int i = 0, len = argTypes.length; i < len; ++i) { if (i != 0) iw.println(","); String argName = CodegenUtils.generatedArgumentName(i); Class argType = argTypes[i]; if (argType.isPrimitive()) { if (argType == boolean.class) iw.print("Boolean.valueOf( " + argName + " )"); else if (argType == byte.class) iw.print("new Byte( " + argName + " )"); else if (argType == char.class) iw.print("new Character( " + argName + " )"); else if (argType == short.class) iw.print("new Short( " + argName + " )"); else if (argType == int.class) iw.print("new Integer( " + argName + " )"); else if (argType == long.class) iw.print("new Long( " + argName + " )"); else if (argType == float.class) iw.print("new Float( " + argName + " )"); else if (argType == double.class) iw.print("new Double( " + argName + " )"); } else iw.print(argName); } iw.downIndent(); iw.println("};"); }
protected void generateDelegateCode( Class intfcl, String genclass, Method method, IndentedWriter iw) throws IOException { String mname = method.getName(); if (jdbc4WrapperMethod(mname)) { generateWrapperDelegateCode(intfcl, genclass, method, iw); return; } if (mname.equals("createStatement")) { iw.println("txn_known_resolved = false;"); iw.println(); iw.println("Statement innerStmt = inner." + CodegenUtils.methodCall(method) + ";"); iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );"); iw.println( "return new NewProxyStatement( innerStmt, parentPooledConnection, false, this );"); } else if (mname.equals("prepareStatement")) { iw.println("txn_known_resolved = false;"); iw.println(); iw.println("PreparedStatement innerStmt;"); iw.println(); iw.println("if ( parentPooledConnection.isStatementCaching() )"); iw.println("{"); iw.upIndent(); iw.println("try"); iw.println("{"); iw.upIndent(); generateFindMethodAndArgs(method, iw); iw.println( "innerStmt = (PreparedStatement) parentPooledConnection.checkoutStatement( method, args );"); iw.println( "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, true, this );"); iw.downIndent(); iw.println("}"); iw.println("catch (ResourceClosedException e)"); iw.println("{"); iw.upIndent(); iw.println("if ( logger.isLoggable( MLevel.FINE ) )"); iw.upIndent(); iw.println( "logger.log( MLevel.FINE, " + "\042A Connection tried to prepare a Statement via a Statement cache that is already closed. " + "This can happen -- rarely -- if a DataSource is closed or reset() while Connections are checked-out and in use.\042, e );"); iw.downIndent(); // repeated code... any changes probably need to be duplicated below iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";"); iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );"); iw.println( "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, false, this );"); iw.downIndent(); iw.println("}"); iw.downIndent(); iw.println("}"); iw.println("else"); iw.println("{"); iw.upIndent(); // repeated code... any changes probably need to be duplicated above iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";"); iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );"); iw.println( "return new NewProxyPreparedStatement( innerStmt, parentPooledConnection, false, this );"); iw.downIndent(); iw.println("}"); } else if (mname.equals("prepareCall")) { iw.println("txn_known_resolved = false;"); iw.println(); iw.println("CallableStatement innerStmt;"); iw.println(); iw.println("if ( parentPooledConnection.isStatementCaching() )"); iw.println("{"); iw.upIndent(); iw.println("try"); iw.println("{"); iw.upIndent(); generateFindMethodAndArgs(method, iw); iw.println( "innerStmt = (CallableStatement) parentPooledConnection.checkoutStatement( method, args );"); iw.println( "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, true, this );"); iw.downIndent(); iw.println("}"); iw.println("catch (ResourceClosedException e)"); iw.println("{"); iw.upIndent(); iw.println("if ( logger.isLoggable( MLevel.FINE ) )"); iw.upIndent(); iw.println( "logger.log( MLevel.FINE, " + "\042A Connection tried to prepare a CallableStatement via a Statement cache that is already closed. " + "This can happen -- rarely -- if a DataSource is closed or reset() while Connections are checked-out and in use.\042, e );"); iw.downIndent(); // repeated code... any changes probably need to be duplicated below iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";"); iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );"); iw.println( "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, false, this );"); iw.downIndent(); iw.println("}"); iw.downIndent(); iw.println("}"); iw.println("else"); iw.println("{"); iw.upIndent(); // repeated code... any changes probably need to be duplicated above iw.println("innerStmt = inner." + CodegenUtils.methodCall(method) + ";"); iw.println("parentPooledConnection.markActiveUncachedStatement( innerStmt );"); iw.println( "return new NewProxyCallableStatement( innerStmt, parentPooledConnection, false, this );"); iw.downIndent(); iw.println("}"); } else if (mname.equals("getMetaData")) { iw.println("txn_known_resolved = false;"); iw.println(); iw.println("if (this.metaData == null)"); iw.println("{"); iw.upIndent(); iw.println( "DatabaseMetaData innerMetaData = inner." + CodegenUtils.methodCall(method) + ";"); iw.println( "this.metaData = new NewProxyDatabaseMetaData( innerMetaData, parentPooledConnection, this );"); iw.downIndent(); iw.println("}"); iw.println("return this.metaData;"); } else if (mname.equals("setTransactionIsolation")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); iw.println( "parentPooledConnection.markNewTxnIsolation( " + CodegenUtils.generatedArgumentName(0) + " );"); } else if (mname.equals("setCatalog")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); iw.println( "parentPooledConnection.markNewCatalog( " + CodegenUtils.generatedArgumentName(0) + " );"); } else if (mname.equals("setHoldability")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); iw.println( "parentPooledConnection.markNewHoldability( " + CodegenUtils.generatedArgumentName(0) + " );"); } else if (mname.equals("setReadOnly")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); iw.println( "parentPooledConnection.markNewReadOnly( " + CodegenUtils.generatedArgumentName(0) + " );"); } else if (mname.equals("setTypeMap")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); iw.println( "parentPooledConnection.markNewTypeMap( " + CodegenUtils.generatedArgumentName(0) + " );"); } else if (mname.equals("getWarnings") || mname.equals("clearWarnings")) { // do nothing with txn_known_resolved super.generateDelegateCode(intfcl, genclass, method, iw); } else if (mname.equals("close")) { iw.println("if (! this.isDetached())"); iw.println("{"); iw.upIndent(); iw.println("NewPooledConnection npc = parentPooledConnection;"); iw.println("this.detach();"); iw.println("npc.markClosedProxyConnection( this, txn_known_resolved );"); iw.println("this.inner = null;"); iw.downIndent(); iw.println("}"); iw.println("else if (Debug.DEBUG && logger.isLoggable( MLevel.FINE ))"); iw.println("{"); iw.upIndent(); iw.println("logger.log( MLevel.FINE, this + \042: close() called more than once.\042 );"); // premature-detach-debug-debug only! if (PREMATURE_DETACH_DEBUG) { iw.println("prematureDetachRecorder.record();"); iw.println( "logger.warning( prematureDetachRecorder.getDump(\042Apparent multiple close of " + getInnerTypeName() + ".\042) );"); } // end-premature-detach-debug-only! iw.downIndent(); iw.println("}"); } else if (mname.equals("isClosed")) { iw.println("return this.isDetached();"); } else if (mname.equals("isValid")) { iw.println("if (this.isDetached()) return false;"); super.generateDelegateCode(intfcl, genclass, method, iw); } else { boolean known_resolved = (mname.equals("commit") || mname.equals("rollback") || mname.equals("setAutoCommit")); if (!known_resolved) { iw.println("txn_known_resolved = false;"); iw.println(); } super.generateDelegateCode(intfcl, genclass, method, iw); if (known_resolved) { iw.println(); iw.println("txn_known_resolved = true;"); } } }