static void genclass(DelegatorGenerator dg, Class intfcl, String fqcn, File srcroot) throws IOException { File genDir = new File(srcroot, dirForFqcn(fqcn)); if (!genDir.exists()) { System.err.println( JdbcProxyGenerator.class.getName() + " -- creating directory: " + genDir.getAbsolutePath()); genDir.mkdirs(); } String fileName = CodegenUtils.fqcnLastElement(fqcn) + ".java"; Writer w = null; try { w = new BufferedWriter(new FileWriter(new File(genDir, fileName))); dg.writeDelegator(intfcl, fqcn, w); w.flush(); System.err.println("Generated " + fileName); } finally { try { if (w != null) w.close(); } catch (Exception e) { e.printStackTrace(); } } }
protected void generateExtraDeclarations(Class intfcl, String genclass, IndentedWriter iw) throws IOException { super.generateExtraDeclarations(intfcl, genclass, iw); iw.println(); iw.println("NewProxyConnection proxyCon;"); iw.println(); iw.print(CodegenUtils.fqcnLastElement(genclass)); iw.println( "( " + CodegenUtils.simpleClassName(intfcl) + " inner, NewPooledConnection parentPooledConnection, NewProxyConnection proxyCon )"); iw.println("{"); iw.upIndent(); iw.println("this( inner, parentPooledConnection );"); iw.println("this.proxyCon = proxyCon;"); iw.downIndent(); iw.println("}"); }
protected void generateExtraDeclarations(Class intfcl, String genclass, IndentedWriter iw) throws IOException { super.generateExtraDeclarations(intfcl, genclass, iw); iw.println(); iw.println("Object creator;"); iw.println("Object creatorProxy;"); iw.println("NewProxyConnection proxyConn;"); iw.println(); iw.print(CodegenUtils.fqcnLastElement(genclass)); iw.println( "( " + CodegenUtils.simpleClassName(intfcl) + " inner, NewPooledConnection parentPooledConnection, Object c, Object cProxy )"); iw.println("{"); iw.upIndent(); iw.println("this( inner, parentPooledConnection );"); iw.println("this.creator = c;"); iw.println("this.creatorProxy = cProxy;"); iw.println( "if (creatorProxy instanceof NewProxyConnection) this.proxyConn = (NewProxyConnection) cProxy;"); iw.downIndent(); iw.println("}"); }
protected void generateExtraDeclarations(Class intfcl, String genclass, IndentedWriter iw) throws IOException { // premature-detach-debug-debug only! if (PREMATURE_DETACH_DEBUG) { iw.println("com.mchange.v2.debug.ThreadNameStackTraceRecorder prematureDetachRecorder"); iw.upIndent(); iw.println( "= new com.mchange.v2.debug.ThreadNameStackTraceRecorder(\042Premature Detach Recorder\042);"); iw.downIndent(); } // end-premature-detach-debug-only! iw.println("private final static MLogger logger = MLog.getLogger( \042" + genclass + "\042 );"); iw.println(); iw.println("volatile NewPooledConnection parentPooledConnection;"); iw.println(); iw.println("ConnectionEventListener cel = new ConnectionEventListener()"); iw.println("{"); iw.upIndent(); iw.println("public void connectionErrorOccurred(ConnectionEvent evt)"); iw.println( "{ /* DON'T detach()... IGNORE -- this could be an ordinary error. Leave it to the PooledConnection to test, but leave proxies intact */ }"); // BAD puppy -- iw.println("{ detach(); }"); iw.println(); iw.println("public void connectionClosed(ConnectionEvent evt)"); iw.println("{ detach(); }"); iw.downIndent(); iw.println("};"); iw.println(); iw.println("void attach( NewPooledConnection parentPooledConnection )"); iw.println("{"); iw.upIndent(); // iw.println("System.err.println( \"attach( \" + parentPooledConnection + \" )\" );"); iw.println("this.parentPooledConnection = parentPooledConnection;"); iw.println("parentPooledConnection.addConnectionEventListener( cel );"); iw.downIndent(); iw.println("}"); iw.println(); iw.println("private void detach()"); iw.println("{"); iw.upIndent(); // factored out so we could define debug versions... writeDetachBody(iw); iw.downIndent(); iw.println("}"); iw.println(); iw.print(CodegenUtils.fqcnLastElement(genclass)); iw.println( "( " + CodegenUtils.simpleClassName(intfcl) + " inner, NewPooledConnection parentPooledConnection )"); iw.println("{"); iw.upIndent(); iw.println("this( inner );"); iw.println("attach( parentPooledConnection );"); generateExtraConstructorCode(intfcl, genclass, iw); iw.downIndent(); iw.println("}"); iw.println(); iw.println("boolean isDetached()"); iw.println("{ return (this.parentPooledConnection == null); }"); iw.println(); iw.println( "public String toString() { return super.toString() + \042 [wrapping: \042 + inner + \042]\042; }"); /* // Support JDBC4 Wrapper interface String wrappedLiteral = intfcl.getName() + ".class"; iw.println(); iw.println("public boolean isWrapperFor(Class<?> iface) throws SQLException"); iw.println("{"); iw.upIndent(); iw.println("return ( " + wrappedLiteral + "== iface || " + wrappedLiteral + ".isAssignableFrom( iface ) );" ); iw.downIndent(); iw.println("}"); iw.println(); iw.println("public <T> T unwrap(Class<T> iface) throws SQLException"); iw.println("{"); iw.upIndent(); iw.println("if (this.isWrapperFor( iface )) return inner;"); iw.println("else throw new SQLException( this + \042 is not a wrapper for \042 + iface.getName());"); iw.downIndent(); iw.println("}"); */ iw.println(); generateIsWrapperHelperMethods(intfcl, iw); }
protected void generateExtraDeclarations(Class intfcl, String genclass, IndentedWriter iw) throws IOException { super.generateExtraDeclarations(intfcl, genclass, iw); iw.println(); // concurrent-access-debug only! if (CONCURRENT_ACCESS_DEBUG) { iw.println("com.mchange.v2.debug.ThreadNameStackTraceRecorder concurrentAccessRecorder"); iw.upIndent(); iw.println( "= new com.mchange.v2.debug.ThreadNameStackTraceRecorder(\042Concurrent Access Recorder\042);"); iw.downIndent(); } // end concurrent-access-debug only! iw.println("boolean is_cached;"); iw.println("NewProxyConnection creatorProxy;"); iw.println(); iw.println("// Although formally unnecessary, we sync access to myProxyResultSets on"); iw.println("// that set's own lock, in case clients (illegally but not uncommonly) close()"); iw.println("// the Statement from a Thread other than the one they use in general"); iw.println("// with the Statement"); iw.println("HashSet myProxyResultSets = new HashSet();"); iw.println(); iw.println("public void detachProxyResultSet( ResultSet prs )"); iw.println("{"); iw.upIndent(); // iw.println("System.err.println(\042detachProxyResultSet\042);"); iw.println("synchronized (myProxyResultSets) { myProxyResultSets.remove( prs ); }"); iw.downIndent(); iw.println("}"); iw.println(); iw.print(CodegenUtils.fqcnLastElement(genclass)); iw.println( "( " + CodegenUtils.simpleClassName(intfcl) + " inner, NewPooledConnection parentPooledConnection, boolean cached, NewProxyConnection cProxy )"); iw.println("{"); iw.upIndent(); iw.println("this( inner, parentPooledConnection );"); iw.println("this.is_cached = cached;"); iw.println("this.creatorProxy = cProxy;"); iw.downIndent(); iw.println("}"); iw.println(); iw.println( "public Object rawStatementOperation(Method m, Object target, Object[] args) " + "throws IllegalAccessException, InvocationTargetException, SQLException"); iw.println("{"); iw.upIndent(); iw.println("maybeDirtyTransaction();"); iw.println(); iw.println("if (target == C3P0ProxyStatement.RAW_STATEMENT) target = inner;"); iw.println("for (int i = 0, len = args.length; i < len; ++i)"); iw.upIndent(); iw.println("if (args[i] == C3P0ProxyStatement.RAW_STATEMENT) args[i] = inner;"); iw.downIndent(); iw.println("Object out = m.invoke(target, args);"); iw.println("if (out instanceof ResultSet)"); iw.println("{"); iw.upIndent(); iw.println("ResultSet innerResultSet = (ResultSet) out;"); iw.println( "parentPooledConnection.markActiveResultSetForStatement( inner, innerResultSet );"); iw.println( "out = new NewProxyResultSet( innerResultSet, parentPooledConnection, inner, this );"); iw.downIndent(); iw.println("}"); iw.println(); iw.println("return out;"); iw.downIndent(); iw.println("}"); iw.println(); iw.println("void maybeDirtyTransaction()"); iw.println("{ if (creatorProxy != null) creatorProxy.maybeDirtyTransaction(); }"); }