diff --git a/src/main/java/com/profiler/TomcatProfiler.java b/src/main/java/com/profiler/TomcatProfiler.java index c9b7b4007..09877895a 100644 --- a/src/main/java/com/profiler/TomcatProfiler.java +++ b/src/main/java/com/profiler/TomcatProfiler.java @@ -7,6 +7,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.security.ProtectionDomain; +import com.profiler.modifier.Modifier; import javassist.ClassPool; import javassist.NotFoundException; @@ -37,49 +38,62 @@ public class TomcatProfiler implements ClassFileTransformer { private static final Logger logger = Logger.getLogger(TomcatProfiler.class); - protected String agentArgString = ""; - protected Instrumentation instrumentation; - ClassPool classPool; + private String agentArgString = ""; + private Instrumentation instrumentation; + private ClassPool classPool; + + public static void premain(String agentArgs, Instrumentation inst) { new TomcatProfiler(agentArgs, inst); } public TomcatProfiler(String agentArgs, Instrumentation inst) { - agentArgString = agentArgs; - instrumentation = inst; - instrumentation.addTransformer(this); - classPool = ClassPool.getDefault(); - try { - String catalinaHome = System.getProperty("catalina.home"); - logger.info("CATALINA_HOME=%s", catalinaHome); - - logger.info("TEST"); - - classPool.appendClassPath(catalinaHome + "/lib/servlet-api.jar"); - classPool.appendClassPath(catalinaHome + "/lib/catalina.jar"); - } catch (Exception e) { - logger.error(e.getMessage()); - } + this.agentArgString = agentArgs; + this.instrumentation = inst; + this.instrumentation.addTransformer(this); + this.classPool = createClassPool(); } - @Override + private ClassPool createClassPool() { + ClassPool classPool = new ClassPool(null); + classPool.appendSystemPath(); + + String catalinaHome = System.getProperty("catalina.home"); + logger.info("CATALINA_HOME=%s", catalinaHome); + appendClassPath(classPool, catalinaHome + "/lib/servlet-api.jar"); + appendClassPath(classPool, catalinaHome + "/lib/catalina.jar"); + return classPool; + } + + private void appendClassPath(ClassPool classPool, String pathName) { + try { + classPool.appendClassPath(pathName); + } catch (NotFoundException e) { + logger.error("lib not found. " + e.getMessage()); + } + } + + @Override public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { if (className.startsWith("org/apache/catalina")) { String javassistClassName = className.replace('/', '.'); if (javassistClassName.equals("org.apache.catalina.core.StandardHostValve")) { // Add code to monitor Request and Response - byte[] result = EntryPointStandardHostValveModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new EntryPointStandardHostValveModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("org.apache.catalina.core.StandardService")) { // Add code to monitor Tomcat start and stop - byte[] result = TomcatStandardServiceModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new TomcatStandardServiceModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("org.apache.catalina.connector.Connector")) { // Add code to set Tomcat's port numbers - byte[] result = TomcatConnectorModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + TomcatConnectorModifier modifier = new TomcatConnectorModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } @@ -91,22 +105,26 @@ public class TomcatProfiler implements ClassFileTransformer { String javassistClassName = className.replace('/', '.'); if (javassistClassName.equals("com.mysql.jdbc.ConnectionImpl")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MySQLConnectionImplModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MySQLConnectionImplModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("com.mysql.jdbc.StatementImpl")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MySQLStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MySQLStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("com.mysql.jdbc.PreparedStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MySQLPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MySQLPreparedStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("com.mysql.jdbc.ResultSetImpl")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MySQLResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MySQLResultSetModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } @@ -115,22 +133,26 @@ public class TomcatProfiler implements ClassFileTransformer { String javassistClassName = className.replace('/', '.'); if (javassistClassName.equals("net.sourceforge.jtds.jdbc.ConnectionJDBC2")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MSSQLConnectionModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MSSQLConnectionModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MSSQLStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MSSQLStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsPreparedStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MSSQLPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MSSQLPreparedStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsResultSet")) { checkLibrary(javassistClassName, classLoader); - byte[] result = MSSQLResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new MSSQLResultSetModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } @@ -139,12 +161,14 @@ public class TomcatProfiler implements ClassFileTransformer { String javassistClassName = className.replace('/', '.'); if (javassistClassName.equals("org.apache.commons.dbcp.BasicDataSource")) { checkLibrary(javassistClassName, classLoader); - byte[] result = DBCPBasicDataSourceModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new DBCPBasicDataSourceModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper")) { checkLibrary(javassistClassName, classLoader); - byte[] result = DBCPPoolModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new DBCPPoolModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } @@ -162,22 +186,26 @@ public class TomcatProfiler implements ClassFileTransformer { if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = CubridStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new CubridStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDPreparedStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = CubridPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new CubridPreparedStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDResultSet")) { checkLibrary(javassistClassName, classLoader); - byte[] result = CubridResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new CubridResultSetModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("cubrid.jdbc.jci.UStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = CubridUStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new CubridUStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } @@ -185,17 +213,20 @@ public class TomcatProfiler implements ClassFileTransformer { String javassistClassName = className.replace('/', '.'); if (javassistClassName.equals("oracle.jdbc.driver.OraclePreparedStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = OraclePreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new OraclePreparedStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("oracle.jdbc.driver.OracleStatement")) { checkLibrary(javassistClassName, classLoader); - byte[] result = OracleStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new OracleStatementModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } else if (javassistClassName.equals("oracle.jdbc.driver.OracleResultSetImpl")) { checkLibrary(javassistClassName, classLoader); - byte[] result = OracleResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); + Modifier modifier = new OracleResultSetModifier(); + byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer); if (result != null) return result; } diff --git a/src/main/java/com/profiler/modifier/AbstractModifier.java b/src/main/java/com/profiler/modifier/AbstractModifier.java index 236418784..ad315123f 100644 --- a/src/main/java/com/profiler/modifier/AbstractModifier.java +++ b/src/main/java/com/profiler/modifier/AbstractModifier.java @@ -7,62 +7,11 @@ import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; -public abstract class AbstractModifier { +public abstract class AbstractModifier implements Modifier { private static final Logger logger = Logger.getLogger(AbstractModifier.class); - public static void printClassInfo(String className) { - logger.debug("Printing Class Info of [" + className + "]"); - try { - ClassPool pool = ClassPool.getDefault(); - logger.debug("try"); - String javaassistClassName = className.replace('/', '.'); - logger.debug("replace"); - CtClass cc = pool.get(javaassistClassName); - logger.debug("ClassName:" + javaassistClassName); - CtConstructor[] constructorList = cc.getConstructors(); - - for (CtConstructor cons : constructorList) { - try { - String signature = cons.getSignature(); - logger.info("Constructor signature:%s", signature); - } catch (Exception e) { - logger.error(e.getMessage()); - e.printStackTrace(); - } - } - - CtMethod[] methodList = cc.getDeclaredMethods(); - - for (CtMethod tempMethod : methodList) { - try { - String methodName = tempMethod.getLongName(); - - logger.debug("MethodName:" + methodName); - - CtClass[] params = tempMethod.getParameterTypes(); - - if (params.length != 0) { - int paramsLength = params.length; - for (int loop = paramsLength - 1; loop > 0; loop--) { - logger.debug("Param" + loop + ":" + params[loop].getName()); - } - } else { - logger.debug(" No params"); - } - - logger.debug("ReturnType=" + tempMethod.getReturnType().getName()); - } catch (Exception methodException) { - logger.error("Exception : " + methodException.getMessage()); - } - } - } catch (Exception e) { - logger.error(e.getMessage()); - e.printStackTrace(); - } - } - - public static byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) { + public byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) { try { CtClass cc = classPool.get(javassistClassName); CtMethod[] methods = cc.getDeclaredMethods(); @@ -118,7 +67,7 @@ public abstract class AbstractModifier { } } - public static void printClassConvertComplete(String javassistClassName) { + public void printClassConvertComplete(String javassistClassName) { logger.info("%s class is converted.", javassistClassName); } } diff --git a/src/main/java/com/profiler/modifier/Modifier.java b/src/main/java/com/profiler/modifier/Modifier.java new file mode 100644 index 000000000..0f32b118b --- /dev/null +++ b/src/main/java/com/profiler/modifier/Modifier.java @@ -0,0 +1,8 @@ +package com.profiler.modifier; + + +import javassist.ClassPool; + +public interface Modifier { + byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer); +} diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java index 5555f795c..320f9b37d 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java @@ -13,12 +13,12 @@ public class CubridPreparedStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(CubridPreparedStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("CubridPreparedStatementModifier modifing"); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java index a17f59894..793a2f1cf 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java @@ -12,12 +12,12 @@ public class CubridResultSetModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(CubridResultSetModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("CubridResultSetModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateNextMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java index 94c94876d..571cc3a39 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java @@ -12,12 +12,12 @@ public class CubridStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(CubridStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("CubridStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java index c28c8dfec..6df436d2a 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java @@ -12,12 +12,12 @@ public class CubridUStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(CubridUStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("CubridUStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateBindValueMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java index b17445dd2..b8bb8ff14 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java @@ -12,12 +12,12 @@ public class DBCPBasicDataSourceModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(DBCPBasicDataSourceModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("DBCPBasicDataSourceModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateGetConnectionMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java index 2156c531e..007a52922 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java @@ -12,12 +12,12 @@ public class DBCPPoolModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(DBCPPoolModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("DBCPPoolModifier(PoolingDataSource$PoolGuardConnectionWrapper) modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateCloseMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java index ef0ca48a6..e05c8cd35 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java @@ -12,12 +12,12 @@ public class MSSQLConnectionModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MSSQLConnectionModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MSSQLConnectionModifier modifing. %s", javassistClassName); return changeMethods(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateCreateStatementMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java index a4a1010b3..6612d1f26 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java @@ -13,12 +13,12 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MSSQLPreparedStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MSSQLPreparedStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java index 2e76516bb..2a9e1db3d 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java @@ -12,12 +12,12 @@ public class MSSQLResultSetModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MSSQLResultSetModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MSSQLResultSetModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateNextMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java index c269a612d..febc5e0bf 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java @@ -11,12 +11,12 @@ import com.profiler.modifier.AbstractModifier; public class MSSQLStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MSSQLStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MSSQLStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java index dd37353c8..964bab855 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java @@ -12,12 +12,12 @@ public class MySQLConnectionImplModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MySQLConnectionImplModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MySQLConnectionImplModifier modifing. %s", javassistClassName); return changeMethods(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateGetInstanceMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java index 68823882e..f08b4c276 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -12,12 +12,12 @@ import com.profiler.modifier.AbstractModifier; public class MySQLPreparedStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MySQLPreparedStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MySQLPreparedStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateSetInternalMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java index ca645f718..a3c2c7790 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java @@ -12,12 +12,12 @@ public class MySQLResultSetModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MySQLResultSetModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("ResultSetImpl modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateNextMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java index 8c2287df5..280e552b0 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java @@ -12,12 +12,12 @@ public class MySQLStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(MySQLStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("MySQLStatementModifier modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java index 082ab5cba..8b31e216c 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java @@ -13,14 +13,14 @@ public class OraclePreparedStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(OraclePreparedStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("OraclePreparedStatementModifier modifing. %s", javassistClassName); // printClassInfo(javassistClassName); // return addBeforeAfterLogics(classPool,javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateSetInternalMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java index 4c651c5a3..e0ca80b6c 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java @@ -12,12 +12,12 @@ public class OracleResultSetModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(OracleResultSetModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("OracleResultSetImpl modifing. %s", javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateNextMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java index ff4e41acc..24b21c95f 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java @@ -11,14 +11,14 @@ import com.profiler.modifier.AbstractModifier; public class OracleStatementModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(OracleStatementModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("OracleStatementModifier modifing. %s", javassistClassName); // printClassInfo(javassistClassName); // return addBeforeAfterLogics(classPool,javassistClassName); return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(classPool, cc); diff --git a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java index ddd561eb5..fc7d2715b 100644 --- a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java @@ -20,12 +20,12 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(EntryPointStandardHostValveModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { logger.info("EntryPointModifier.modifyStandardHostValve(). %s", javassistClassName); return changeServiceMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - private static byte[] changeServiceMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + private byte[] changeServiceMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classfileBuffer)); try { addRequestTracerToCurrentClassLoader(classLoader); diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java index 70ba4f64e..3691f9d36 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java @@ -1,5 +1,6 @@ package com.profiler.modifier.tomcat; +import com.profiler.util.ByteCodeUtil; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -18,17 +19,16 @@ public class TomcatConnectorModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(TomcatConnectorModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { if (logger.isDebugEnabled()) { - printClassInfo(javassistClassName); + ByteCodeUtil.printClassInfo(classPool, javassistClassName); } return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - public static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + public byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); - CtClass param[] = new CtClass[1]; param[0] = classPool.getCtClass("int"); CtMethod setPortMethod = cc.getDeclaredMethod("setPort", param); diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java index 8531747ec..9c88af3f3 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java @@ -1,6 +1,8 @@ package com.profiler.modifier.tomcat; import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_AGENT_STATE_MANAGER; + +import com.profiler.util.ByteCodeUtil; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -19,14 +21,14 @@ public class TomcatStandardServiceModifier extends AbstractModifier { private static final Logger logger = Logger.getLogger(TomcatStandardServiceModifier.class); - public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { if (logger.isDebugEnabled()) { - printClassInfo(javassistClassName); + ByteCodeUtil.printClassInfo(classPool, javassistClassName); } return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer); } - public static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { + public byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) { try { CtClass cc = classPool.get(javassistClassName); diff --git a/src/main/java/com/profiler/util/ByteCodeUtil.java b/src/main/java/com/profiler/util/ByteCodeUtil.java new file mode 100644 index 000000000..04f6b8a57 --- /dev/null +++ b/src/main/java/com/profiler/util/ByteCodeUtil.java @@ -0,0 +1,62 @@ +package com.profiler.util; + +import com.profiler.logging.Logger; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; +import javassist.CtMethod; + +public class ByteCodeUtil { + // TODO logger 를 별도로 써야 되는지 않는지 검토. + private static final Logger logger = Logger.getLogger(ByteCodeUtil.class); + + public static void printClassInfo(ClassPool classPool, String className) { + logger.debug("Printing Class Info of [" + className + "]"); + try { + logger.debug("try"); + String javaassistClassName = className.replace('/', '.'); + logger.debug("replace"); + CtClass cc = classPool.get(javaassistClassName); + logger.debug("ClassName:" + javaassistClassName); + CtConstructor[] constructorList = cc.getConstructors(); + + for (CtConstructor cons : constructorList) { + try { + String signature = cons.getSignature(); + logger.info("Constructor signature:%s", signature); + } catch (Exception e) { + logger.error(e.getMessage()); + e.printStackTrace(); + } + } + + CtMethod[] methodList = cc.getDeclaredMethods(); + + for (CtMethod tempMethod : methodList) { + try { + String methodName = tempMethod.getLongName(); + + logger.debug("MethodName:" + methodName); + + CtClass[] params = tempMethod.getParameterTypes(); + + if (params.length != 0) { + int paramsLength = params.length; + for (int loop = paramsLength - 1; loop > 0; loop--) { + logger.debug("Param" + loop + ":" + params[loop].getName()); + } + } else { + logger.debug(" No params"); + } + + logger.debug("ReturnType=" + tempMethod.getReturnType().getName()); + } catch (Exception methodException) { + logger.error("Exception : " + methodException.getMessage()); + } + } + } catch (Exception e) { + logger.error(e.getMessage()); + e.printStackTrace(); + } + } +}