// Path: src/main/java/net/chandol/logjdbc/config/LogJdbcConfig.java
// public class LogJdbcConfig {
//     private DatabaseType type;
//     private ParameterConverter converter;
//     private SqlFormatter formatter;
//     private SqlPrinter sqlPrinter;
//     private ResultSetPrinter resultSetPrinter;
// 
//     // 로깅에 필요한 설정값을 담을 수 있다.
//     private LogJdbcProperties properties;
// 
//     public LogJdbcConfig() {
//         this(null, new LogJdbcProperties());
//     }
// 
//     public LogJdbcConfig(DatabaseType type) {
//         this(type, new LogJdbcProperties());
//     }
// 
//     public LogJdbcConfig(LogJdbcProperties properties) {
//         this(null, properties);
//     }
// 
//     public LogJdbcConfig(DatabaseType type, LogJdbcProperties properties) {
//         this.formatter = DefaultSqlFormatter.getInstance();
//         this.sqlPrinter = DefaultSqlPrinter.getInstance();
//         this.resultSetPrinter = ResultSetTablePrinter.getInstance();
//         this.properties = properties;
// 
//         if (type != null)
//             this.converter = type.getParameterConverter();
//     }
// 
//     /* getter */
//     public DatabaseType getType() {
//         return type;
//     }
// 
//     public ParameterConverter getConverter() {
//         return converter;
//     }
// 
//     public SqlFormatter getFormatter() {
//         return formatter;
//     }
// 
//     public SqlPrinter getSqlPrinter() {
//         return sqlPrinter;
//     }
// 
//     public ResultSetPrinter getResultSetPrinter() {
//         return resultSetPrinter;
//     }
// 
//     public LogJdbcProperties getProperties() {
//         return properties;
//     }
// 
//     /**
//      * Datasource를 분석하여 Database를 찾고 설정합니다.
//      *
//      * @param datasource
//      */
//     public void setDatabaseTypeBaseOnDatasource(DataSource datasource) {
//         DatabaseType type = DatabaseType.find(datasource);
// 
//         this.type = type;
//         this.converter = type.getParameterConverter();
//     }
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/LogContext.java
// public class LogContext {
//     private LogJdbcConfig config;
// 
//     private String sql;
//     private ParameterCollector parameterCollector;
//     private ResultSetCollector resultSetCollector;
// 
//     private PrintLogHelper helper;
// 
//     public void printLog() {
//         if (parameterPrintable())
//             config.getSqlPrinter().printParameter(this);
// 
//         if (sqlPrintable())
//             config.getSqlPrinter().printSql(this);
// 
//         if (resultSetPrintable())
//             config.getResultSetPrinter().printResultSet(this);
//     }
// 
//     public void setSql(String sql) {
//         this.sql = sql;
//     }
// 
//     public ParameterCollector initParameterCollector() {
//         this.parameterCollector = new ParameterCollector();
//         return this.parameterCollector;
//     }
// 
//     public ResultSetCollector initResultSetCollector(ResultSetMetaData metaData) {
//         this.resultSetCollector = new ResultSetCollector(metaData);
//         return this.resultSetCollector;
//     }
// 
//     /* getter */
//     public LogJdbcConfig getConfig() {
//         return config;
//     }
// 
//     public String getSql() {
//         return sql;
//     }
// 
//     public ParameterCollector getParameterCollector() {
//         return parameterCollector;
//     }
// 
//     public ResultSetCollector getResultSetCollector() {
//         return resultSetCollector;
//     }
// 
//     public PrintLogHelper getHelper() {
//         return helper;
//     }
// 
//     /* printable */
//     private boolean resultSetPrintable() {
//         return resultSetCollector != null;
//     }
// 
//     private boolean parameterPrintable() {
//         return parameterCollector != null;
//     }
// 
//     private boolean sqlPrintable() {
//         return sql != null && !sql.isEmpty();
//     }
// 
//     /* Constructor */
//     private LogContext(LogJdbcConfig config) {
//         this.config = config;
//         this.helper = new PrintLogHelper(config);
//     }
// 
//     private LogContext(LogJdbcConfig config, String sql) {
//         this(config);
//         this.sql = sql;
//     }
// 
//     public static LogContext of(LogJdbcConfig config) {
//         return new LogContext(config);
//     }
// 
//     public static LogContext of(LogJdbcConfig config, String sql) {
//         return new LogContext(config, sql);
//     }
// 
// }


import net.chandol.logjdbc.config.LogJdbcConfig;
import net.chandol.logjdbc.logging.LogContext;
import java.sql.*;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
package net.chandol.logjdbc.jdbcproxy;



public class ProxyConnection implements Connection {
    private Connection _connection;
    private LogJdbcConfig config;

    public ProxyConnection(LogJdbcConfig config, Connection connection) {
        this._connection = connection;
        this.config = config;
    }

    @Override
    public Statement createStatement() throws SQLException {
// Path: src/main/java/net/chandol/logjdbc/config/LogJdbcConfig.java
// public class LogJdbcConfig {
//     private DatabaseType type;
//     private ParameterConverter converter;
//     private SqlFormatter formatter;
//     private SqlPrinter sqlPrinter;
//     private ResultSetPrinter resultSetPrinter;
// 
//     // 로깅에 필요한 설정값을 담을 수 있다.
//     private LogJdbcProperties properties;
// 
//     public LogJdbcConfig() {
//         this(null, new LogJdbcProperties());
//     }
// 
//     public LogJdbcConfig(DatabaseType type) {
//         this(type, new LogJdbcProperties());
//     }
// 
//     public LogJdbcConfig(LogJdbcProperties properties) {
//         this(null, properties);
//     }
// 
//     public LogJdbcConfig(DatabaseType type, LogJdbcProperties properties) {
//         this.formatter = DefaultSqlFormatter.getInstance();
//         this.sqlPrinter = DefaultSqlPrinter.getInstance();
//         this.resultSetPrinter = ResultSetTablePrinter.getInstance();
//         this.properties = properties;
// 
//         if (type != null)
//             this.converter = type.getParameterConverter();
//     }
// 
//     /* getter */
//     public DatabaseType getType() {
//         return type;
//     }
// 
//     public ParameterConverter getConverter() {
//         return converter;
//     }
// 
//     public SqlFormatter getFormatter() {
//         return formatter;
//     }
// 
//     public SqlPrinter getSqlPrinter() {
//         return sqlPrinter;
//     }
// 
//     public ResultSetPrinter getResultSetPrinter() {
//         return resultSetPrinter;
//     }
// 
//     public LogJdbcProperties getProperties() {
//         return properties;
//     }
// 
//     /**
//      * Datasource를 분석하여 Database를 찾고 설정합니다.
//      *
//      * @param datasource
//      */
//     public void setDatabaseTypeBaseOnDatasource(DataSource datasource) {
//         DatabaseType type = DatabaseType.find(datasource);
// 
//         this.type = type;
//         this.converter = type.getParameterConverter();
//     }
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/LogContext.java
// public class LogContext {
//     private LogJdbcConfig config;
// 
//     private String sql;
//     private ParameterCollector parameterCollector;
//     private ResultSetCollector resultSetCollector;
// 
//     private PrintLogHelper helper;
// 
//     public void printLog() {
//         if (parameterPrintable())
//             config.getSqlPrinter().printParameter(this);
// 
//         if (sqlPrintable())
//             config.getSqlPrinter().printSql(this);
// 
//         if (resultSetPrintable())
//             config.getResultSetPrinter().printResultSet(this);
//     }
// 
//     public void setSql(String sql) {
//         this.sql = sql;
//     }
// 
//     public ParameterCollector initParameterCollector() {
//         this.parameterCollector = new ParameterCollector();
//         return this.parameterCollector;
//     }
// 
//     public ResultSetCollector initResultSetCollector(ResultSetMetaData metaData) {
//         this.resultSetCollector = new ResultSetCollector(metaData);
//         return this.resultSetCollector;
//     }
// 
//     /* getter */
//     public LogJdbcConfig getConfig() {
//         return config;
//     }
// 
//     public String getSql() {
//         return sql;
//     }
// 
//     public ParameterCollector getParameterCollector() {
//         return parameterCollector;
//     }
// 
//     public ResultSetCollector getResultSetCollector() {
//         return resultSetCollector;
//     }
// 
//     public PrintLogHelper getHelper() {
//         return helper;
//     }
// 
//     /* printable */
//     private boolean resultSetPrintable() {
//         return resultSetCollector != null;
//     }
// 
//     private boolean parameterPrintable() {
//         return parameterCollector != null;
//     }
// 
//     private boolean sqlPrintable() {
//         return sql != null && !sql.isEmpty();
//     }
// 
//     /* Constructor */
//     private LogContext(LogJdbcConfig config) {
//         this.config = config;
//         this.helper = new PrintLogHelper(config);
//     }
// 
//     private LogContext(LogJdbcConfig config, String sql) {
//         this(config);
//         this.sql = sql;
//     }
// 
//     public static LogContext of(LogJdbcConfig config) {
//         return new LogContext(config);
//     }
// 
//     public static LogContext of(LogJdbcConfig config, String sql) {
//         return new LogContext(config, sql);
//     }
// 
// }


// Path: src/main/java/net/chandol/logjdbc/jdbcproxy/ProxyConnection.java
import net.chandol.logjdbc.config.LogJdbcConfig;
import net.chandol.logjdbc.logging.LogContext;
import java.sql.*;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;

package net.chandol.logjdbc.jdbcproxy;



public class ProxyConnection implements Connection {
    private Connection _connection;
    private LogJdbcConfig config;

    public ProxyConnection(LogJdbcConfig config, Connection connection) {
        this._connection = connection;
        this.config = config;
    }

    @Override
    public Statement createStatement() throws SQLException {
        LogContext context = LogContext.of(config);