package com.profiler.modifier; import java.util.HashMap; import java.util.Map; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.modifier.db.cubrid.CubridPreparedStatementModifier; import com.profiler.modifier.db.cubrid.CubridResultSetModifier; import com.profiler.modifier.db.cubrid.CubridStatementModifier; import com.profiler.modifier.db.cubrid.CubridUStatementModifier; import com.profiler.modifier.db.dbcp.DBCPBasicDataSourceModifier; import com.profiler.modifier.db.dbcp.DBCPPoolModifier; import com.profiler.modifier.db.mssql.MSSQLConnectionModifier; import com.profiler.modifier.db.mssql.MSSQLPreparedStatementModifier; import com.profiler.modifier.db.mssql.MSSQLResultSetModifier; import com.profiler.modifier.db.mssql.MSSQLStatementModifier; import com.profiler.modifier.db.mysql.MySQLConnectionImplModifier; import com.profiler.modifier.db.mysql.MySQLPreparedStatementModifier; import com.profiler.modifier.db.mysql.MySQLResultSetModifier; import com.profiler.modifier.db.mysql.MySQLStatementModifier; import com.profiler.modifier.db.oracle.OraclePreparedStatementModifier; import com.profiler.modifier.db.oracle.OracleResultSetModifier; import com.profiler.modifier.db.oracle.OracleStatementModifier; import com.profiler.modifier.tomcat.CatalinaModifier; import com.profiler.modifier.tomcat.EntryPointStandardHostValveModifier; import com.profiler.modifier.tomcat.TomcatConnectorModifier; import com.profiler.modifier.tomcat.TomcatStandardServiceModifier; public class DefaultModifierRegistry implements ModifierRegistry { // TODO 혹시 동시성을 고려 해야 되는지 검토. private Map registry = new HashMap(); private final ByteCodeInstrumentor byteCodeInstrumentor; public DefaultModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor) { this.byteCodeInstrumentor = byteCodeInstrumentor; } @Override public Modifier findModifier(String className) { return registry.get(className); } public void addTomcatModifier() { Map registry = this.registry; Modifier entryPointStandardHostValveModifier = new EntryPointStandardHostValveModifier(byteCodeInstrumentor); registry.put(entryPointStandardHostValveModifier.getTargetClass(), entryPointStandardHostValveModifier); Modifier tomcatStandardServiceModifier = new TomcatStandardServiceModifier(byteCodeInstrumentor); registry.put(tomcatStandardServiceModifier.getTargetClass(), tomcatStandardServiceModifier); Modifier tomcatConnectorModifier = new TomcatConnectorModifier(byteCodeInstrumentor); registry.put(tomcatConnectorModifier.getTargetClass(), tomcatConnectorModifier); Modifier tomcatCatalinaModifier = new CatalinaModifier(byteCodeInstrumentor); registry.put(tomcatCatalinaModifier.getTargetClass(), tomcatCatalinaModifier); } public void addJdbcModifier() { // TODO 드라이버 존재 체크 로직을 앞단으로 이동 시킬수 없는지 검토 addMySqlDriver(); addMsSqlDriver(); addOracleDriver(); addCubridDriver(); addDbcpDriver(); } private void addMySqlDriver() { // TODO MySqlDriver는 버전별로 Connection이 interface인지 class인지가 다름. 문제 없는지 // 확인필요. Modifier mysqlConnectionImplModifier = new MySQLConnectionImplModifier(byteCodeInstrumentor); registry.put(mysqlConnectionImplModifier.getTargetClass(), mysqlConnectionImplModifier); Modifier mysqlStatementModifier = new MySQLStatementModifier(byteCodeInstrumentor); registry.put(mysqlStatementModifier.getTargetClass(), mysqlStatementModifier); Modifier mysqlPreparedStatementModifier = new MySQLPreparedStatementModifier(byteCodeInstrumentor); registry.put(mysqlPreparedStatementModifier.getTargetClass(), mysqlPreparedStatementModifier); Modifier mysqlResultSetModifier = new MySQLResultSetModifier(byteCodeInstrumentor); registry.put(mysqlResultSetModifier.getTargetClass(), mysqlResultSetModifier); } private void addMsSqlDriver() { Map registry = this.registry; Modifier mssqlConnectionModifier = new MSSQLConnectionModifier(byteCodeInstrumentor); registry.put(mssqlConnectionModifier.getTargetClass(), mssqlConnectionModifier); Modifier mssqlStatementModifier = new MSSQLStatementModifier(byteCodeInstrumentor); registry.put(mssqlStatementModifier.getTargetClass(), mssqlStatementModifier); Modifier mssqlPreparedStatementModifier = new MSSQLPreparedStatementModifier(byteCodeInstrumentor); registry.put(mssqlPreparedStatementModifier.getTargetClass(), mssqlPreparedStatementModifier); Modifier mssqlResultSetModifier = new MSSQLResultSetModifier(byteCodeInstrumentor); registry.put(mssqlResultSetModifier.getTargetClass(), mssqlResultSetModifier); } private void addOracleDriver() { Map registry = this.registry; // TODO oracle의 경우 connection에 대한 impl이 없음. 확인필요. Modifier oraclePreparedStatementModifier = new OraclePreparedStatementModifier(byteCodeInstrumentor); registry.put(oraclePreparedStatementModifier.getTargetClass(), oraclePreparedStatementModifier); Modifier oracleStatement = new OracleStatementModifier(byteCodeInstrumentor); registry.put(oracleStatement.getTargetClass(), oracleStatement); Modifier oracleResultSetModifier = new OracleResultSetModifier(byteCodeInstrumentor); registry.put(oracleResultSetModifier.getTargetClass(), oracleResultSetModifier); } private void addCubridDriver() { Map registry = this.registry; // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. Modifier cubridStatementModifier = new CubridStatementModifier(byteCodeInstrumentor); registry.put(cubridStatementModifier.getTargetClass(), cubridStatementModifier); Modifier cubridPreparedStatementModifier = new CubridPreparedStatementModifier(byteCodeInstrumentor); registry.put(cubridPreparedStatementModifier.getTargetClass(), cubridPreparedStatementModifier); Modifier cubridResultSetModifier = new CubridResultSetModifier(byteCodeInstrumentor); registry.put(cubridResultSetModifier.getTargetClass(), cubridResultSetModifier); Modifier cubridUStatementModifier = new CubridUStatementModifier(byteCodeInstrumentor); registry.put(cubridStatementModifier.getTargetClass(), cubridUStatementModifier); } private void addDbcpDriver() { Map registry = this.registry; // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. Modifier dbcpBasicDataSourceModifier = new DBCPBasicDataSourceModifier(byteCodeInstrumentor); registry.put(dbcpBasicDataSourceModifier.getTargetClass(), dbcpBasicDataSourceModifier); Modifier dbcpPoolModifier = new DBCPPoolModifier(byteCodeInstrumentor); registry.put(dbcpPoolModifier.getTargetClass(), dbcpPoolModifier); } }