From df7ee7c4082bd8bd4c5d93eed8b106ea133b5b28 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Fri, 24 Aug 2012 09:40:46 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20interceptor=20load=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@533 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../java/com/profiler/TomcatProfiler.java | 8 +- .../interceptor/InterceptorRegistry.java | 19 +- .../interceptor/bci/ByteCodeInstrumentor.java | 4 + .../interceptor/bci/InstrumentClass.java | 2 + .../bci/JavaAssistByteCodeInstrumentor.java | 24 ++- .../interceptor/bci/JavaAssistClass.java | 162 +++++++++++++----- .../java/com/profiler/modifier/Modifier.java | 4 +- .../CubridPreparedStatementModifier.java | 4 +- .../db/cubrid/CubridResultSetModifier.java | 4 +- .../db/cubrid/CubridStatementModifier.java | 4 +- .../db/cubrid/CubridUStatementModifier.java | 4 +- .../db/dbcp/DBCPBasicDataSourceModifier.java | 4 +- .../modifier/db/dbcp/DBCPPoolModifier.java | 4 +- .../db/mssql/MSSQLConnectionModifier.java | 4 +- .../mssql/MSSQLPreparedStatementModifier.java | 4 +- .../db/mssql/MSSQLResultSetModifier.java | 4 +- .../db/mssql/MSSQLStatementModifier.java | 4 +- .../db/mysql/MySQLConnectionImplModifier.java | 4 +- .../mysql/MySQLPreparedStatementModifier.java | 4 +- .../db/mysql/MySQLResultSetModifier.java | 4 +- .../db/mysql/MySQLStatementModifier.java | 4 +- .../OraclePreparedStatementModifier.java | 4 +- .../db/oracle/OracleResultSetModifier.java | 4 +- .../db/oracle/OracleStatementModifier.java | 4 +- .../modifier/tomcat/CatalinaModifier.java | 4 +- .../EntryPointStandardHostValveModifier.java | 59 +++---- .../tomcat/InvokeMethodInterceptor.java | 34 ++-- .../tomcat/TomcatConnectorModifier.java | 4 +- .../tomcat/TomcatStandardServiceModifier.java | 4 +- .../interceptor/InterceptorRegistryTest.java | 20 ++- .../com/profiler/interceptor/TestObject.java | 12 -- .../interceptor/bci/JavaAssistClassTest.java | 71 ++++++++ .../profiler/interceptor/bci/TestObject.java | 23 +++ .../profiler/javaassist/JavaAssiastTest.java | 23 +++ .../tomcat/InvokeMethodInterceptorTest.java | 10 ++ src/test/resources/logging.properties | 1 - thrift.properties | 4 +- 37 files changed, 396 insertions(+), 164 deletions(-) delete mode 100644 src/test/java/com/profiler/interceptor/TestObject.java create mode 100644 src/test/java/com/profiler/interceptor/bci/JavaAssistClassTest.java create mode 100644 src/test/java/com/profiler/interceptor/bci/TestObject.java create mode 100644 src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java diff --git a/src/main/java/com/profiler/TomcatProfiler.java b/src/main/java/com/profiler/TomcatProfiler.java index f92da6e03..5a0b68a57 100644 --- a/src/main/java/com/profiler/TomcatProfiler.java +++ b/src/main/java/com/profiler/TomcatProfiler.java @@ -4,6 +4,7 @@ import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; +import java.util.logging.Level; import java.util.logging.Logger; import com.profiler.interceptor.bci.ByteCodeInstrumentor; @@ -38,6 +39,7 @@ public class TomcatProfiler implements ClassFileTransformer { // this.classPool = createClassPool(); this.modifierRepository = createModifierRegistry(byteCodeInstrumentor, tomcatProfilerConfig); this.tomcatProfilerConfig = tomcatProfilerConfig; + } private ModifierRegistry createModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor, TomcatProfilerConfig tomcatProfilerConfig) { @@ -51,12 +53,16 @@ public class TomcatProfiler implements ClassFileTransformer { @Override public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { + if (logger.isLoggable(Level.FINE)) { + logger.fine("[transform] cl" + classLoader + " className:" + className); + } Modifier findModifier = this.modifierRepository.findModifier(className); if (findModifier == null) { return null; } + String javassistClassName = className.replace('/', '.'); - return findModifier.modify(classLoader, javassistClassName, classFileBuffer); + return findModifier.modify(classLoader, javassistClassName, protectionDomain, classFileBuffer); } } diff --git a/src/main/java/com/profiler/interceptor/InterceptorRegistry.java b/src/main/java/com/profiler/interceptor/InterceptorRegistry.java index 0d4766aad..c50617f1c 100644 --- a/src/main/java/com/profiler/interceptor/InterceptorRegistry.java +++ b/src/main/java/com/profiler/interceptor/InterceptorRegistry.java @@ -1,18 +1,25 @@ package com.profiler.interceptor; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicInteger; public class InterceptorRegistry { - private static final ConcurrentMap INTERCEPTOR_MAP = new ConcurrentHashMap(256); + private static final AtomicInteger ID = new AtomicInteger(0); - public static void addInterceptor(Integer key, Interceptor interceptor) { - INTERCEPTOR_MAP.put(key, interceptor); + private static int MAX = 1024; + private static final Interceptor[] INDEX = new Interceptor[MAX]; + + public static int addInterceptor(Interceptor interceptor) { + int id = ID.getAndIncrement(); + if (id > MAX) { + throw new IllegalArgumentException("id" + id); + } + INDEX[id] = interceptor; + return id; } public static Interceptor getInterceptor(int key) { - return INTERCEPTOR_MAP.get(key); + return INDEX[key]; } } diff --git a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java index faa53f027..b5b5a6603 100644 --- a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java @@ -2,6 +2,8 @@ package com.profiler.interceptor.bci; import javassist.ClassPool; +import java.security.ProtectionDomain; + public interface ByteCodeInstrumentor { @@ -11,4 +13,6 @@ public interface ByteCodeInstrumentor { void checkLibrary(ClassLoader classLoader, String javassistClassName); InstrumentClass getClass(String javassistClassName); + + Class defineClass(ClassLoader classLoader, String defineClass, ProtectionDomain protectedDomain); } diff --git a/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java index fa46b7c0d..e15d78807 100644 --- a/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java +++ b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java @@ -6,4 +6,6 @@ public interface InstrumentClass { void addInterceptor(String methodName, String[] args, Interceptor interceptor); byte[] toBytecode(); + + Class toClass(); } diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java index b52fe4834..7536ea1cc 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java @@ -2,12 +2,14 @@ package com.profiler.interceptor.bci; import com.profiler.interceptor.Interceptor; import com.profiler.interceptor.StaticBeforeInterceptor; +import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import java.net.URL; import java.net.URLClassLoader; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -71,6 +73,23 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { } } + @Override + public Class defineClass(ClassLoader classLoader, String defineClass, ProtectionDomain protectedDomain) { + try { + CtClass clazz = classPool.get(defineClass); + return clazz.toClass(classLoader, protectedDomain); + } catch (NotFoundException e) { + if(logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, e.getMessage(), e); + } + } catch (CannotCompileException e) { + if(logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, e.getMessage(), e); + } + } + return null; + } + public boolean findClass(String javassistClassName) { // TODO 원래는 get인데. find는 ctclas를 생성하지 않아 변경. 어차피 아래서 생성하기는 함. 유효성 여부 확인 // 필요 @@ -94,8 +113,9 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { // TODO 여기서 로그로 class로더를 찍어보면 어떤 clasdLoader에서 로딩되는지 알수 있을거 // 것같음. // 만약 한개만 로딩해도 된다면. return true 할것 - // log("Loaded "+filePath+" library."); - + if(logger.isLoggable(Level.FINE)) { + logger.info("Loaded "+filePath+" library."); + } } catch (NotFoundException e) { } } diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java index 9ac358631..366ef64f2 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java @@ -5,62 +5,140 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.interceptor.*; import javassist.CannotCompileException; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; -import com.profiler.interceptor.Interceptor; -import com.profiler.interceptor.InterceptorRegistry; -import com.profiler.interceptor.StaticAroundInterceptor; - public class JavaAssistClass implements InstrumentClass { - private final Logger logger = Logger.getLogger(this.getClass().getName()); + private final Logger logger = Logger.getLogger(this.getClass().getName()); - private JavaAssistByteCodeInstrumentor instrumentor; - private CtClass ctClass; + private JavaAssistByteCodeInstrumentor instrumentor; + private CtClass ctClass; - private final AtomicInteger interceptorNo = new AtomicInteger(1); + public JavaAssistClass(JavaAssistByteCodeInstrumentor instrumentor, CtClass ctClass) { + this.instrumentor = instrumentor; + this.ctClass = ctClass; + } - public JavaAssistClass(JavaAssistByteCodeInstrumentor instrumentor, CtClass ctClass) { - this.instrumentor = instrumentor; - this.ctClass = ctClass; - } + @Override + public void addInterceptor(String methodName, String[] args, Interceptor interceptor) { + int id = InterceptorRegistry.addInterceptor(interceptor); + try { + CtMethod method = getMethod(methodName, args); + if (interceptor instanceof StaticAroundInterceptor) { + addAroundInterceptor(methodName, id, method); + } else if (interceptor instanceof StaticBeforeInterceptor) { + addStaticBeforeInterceptor(methodName, id, method); + } else if (interceptor instanceof StaticAfterInterceptor) { + addStaticAfterInterceptor(methodName, id, method); + } + } catch (NotFoundException e) { + e.printStackTrace(); + } catch (CannotCompileException e) { + e.printStackTrace(); + } + } - @Override - public void addInterceptor(String methodName, String[] args, Interceptor interceptor) { - int num = interceptorNo.getAndIncrement(); - InterceptorRegistry.addInterceptor(num, interceptor); + private void addAroundInterceptor(String methodName, int id, CtMethod method) throws NotFoundException, CannotCompileException { + addStaticBeforeInterceptor(methodName, id, method); + addStaticAfterInterceptor(methodName, id, method); + } - try { - CtClass[] params = new CtClass[args.length]; - for (int i = 0; i < args.length; i++) { - params[i] = instrumentor.getClassPool().getCtClass(args[i]); - } - CtMethod method = ctClass.getDeclaredMethod(methodName, params); -// if (interceptor instanceof StaticAroundInterceptor) { - method.insertBefore("System.out.println(\"request=\" + this.getClass().getClassLoader()); ((com.profiler.interceptor.StaticAroundInterceptor) com.profiler.interceptor.InterceptorRegistry.getInterceptor(" + num + ")).before(this, \"" + ctClass.getName() + "\", \"" + methodName + "\", $args);"); -// } + private void addStaticAfterInterceptor(String methodName, int id, CtMethod method) throws CannotCompileException, NotFoundException { + StringBuilder after = new StringBuilder(1024); + after.append("{"); + addGetStaticAfterInterceptor(after, id); + after.append(" interceptor.after(this, \"" + ctClass.getName() + "\", \"" + methodName + "\", $args, $_);"); + after.append("}"); + String buildAfter = after.toString(); + if (logger.isLoggable(Level.INFO)) { + logger.info("addStaticAfterInterceptor after method:" + method.getLongName() + " code:" + buildAfter); + } + method.insertAfter(buildAfter); - } catch (NotFoundException e) { - e.printStackTrace(); - } catch (CannotCompileException e) { - e.printStackTrace(); - } - } + StringBuilder catchCode = new StringBuilder(1024); + catchCode.append("{"); + addGetStaticAfterInterceptor(catchCode, id); + catchCode.append(" interceptor.after(this, \"" + ctClass.getName() + "\", \"" + methodName + "\", $args, $e);"); + catchCode.append(" throw $e;"); + catchCode.append("}"); + String buildCatch = catchCode.toString(); + if (logger.isLoggable(Level.INFO)) { + logger.info("addStaticAfterInterceptor catch method:" + method.getLongName() + " code:" + buildCatch); + } + CtClass th = instrumentor.getClassPool().get("java.lang.Throwable"); + method.addCatch(buildCatch, th); + + } + + private void addGetStaticAfterInterceptor(StringBuilder after, int id) { + after.append(" com.profiler.interceptor.StaticAfterInterceptor interceptor = " + + "(com.profiler.interceptor.StaticAfterInterceptor) com.profiler.interceptor.InterceptorRegistry.getInterceptor("); + after.append(id); + after.append(");"); + } + + private void addStaticBeforeInterceptor(String methodName, int id, CtMethod method) throws CannotCompileException { + StringBuilder code = new StringBuilder(1024); + code.append("{"); + addGetBeforeInterceptor(id, code); + code.append(" interceptor.before(this, \"" + ctClass.getName() + "\", \"" + methodName + "\", $args);"); + code.append("}"); + String buildBefore = code.toString(); + if (logger.isLoggable(Level.INFO)) { + logger.info("addStaticBeforeInterceptor catch method:" + method.getLongName() + " code:" + buildBefore); + } + method.insertBefore(buildBefore); + } + + private void addGetBeforeInterceptor(int id, StringBuilder code) { + code.append(" com.profiler.interceptor.StaticBeforeInterceptor interceptor = " + + "(com.profiler.interceptor.StaticBeforeInterceptor)com.profiler.interceptor.InterceptorRegistry.getInterceptor("); + code.append(id); + code.append(");"); + } + + + private CtMethod getMethod(String methodName, String[] args) throws NotFoundException { + CtClass[] params = getCtParameter(args); + return ctClass.getDeclaredMethod(methodName, params); + } + + private CtClass[] getCtParameter(String[] args) throws NotFoundException { + if(args == null) { + return null; + } + CtClass[] params = new CtClass[args.length]; + for (int i = 0; i < args.length; i++) { + params[i] = instrumentor.getClassPool().getCtClass(args[i]); + } + return params; + } + + @Override + public byte[] toBytecode() { + try { + return ctClass.toBytecode(); + } catch (IOException e) { + logger.log(Level.INFO, "IoException class:" + ctClass.getName() + " " + e.getMessage(), e); + } catch (CannotCompileException e) { + logger.log(Level.INFO, "CannotCompileException class:" + ctClass.getName() + " " + e.getMessage(), e); + } + return null; + } + + public Class toClass() { + try { + return ctClass.toClass(); + } catch (CannotCompileException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + return null; + } - @Override - public byte[] toBytecode() { - try { - return ctClass.toBytecode(); - } catch (IOException e) { - logger.log(Level.INFO, "IoException class:" + ctClass.getName() + " " + e.getMessage(), e); - } catch (CannotCompileException e) { - logger.log(Level.INFO, "CannotCompileException class:" + ctClass.getName() + " " + e.getMessage(), e); - } - return null; - } } diff --git a/src/main/java/com/profiler/modifier/Modifier.java b/src/main/java/com/profiler/modifier/Modifier.java index 23dec3b6d..b37e2498f 100644 --- a/src/main/java/com/profiler/modifier/Modifier.java +++ b/src/main/java/com/profiler/modifier/Modifier.java @@ -1,6 +1,8 @@ package com.profiler.modifier; +import java.security.ProtectionDomain; + public interface Modifier { - byte[] modify(ClassLoader classLoader, String className, byte[] classFileBuffer); + byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer); String getTargetClass(); } 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 3c2f593a5..f7018d46a 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.cubrid; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; @@ -10,6 +9,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -25,7 +25,7 @@ public class CubridPreparedStatementModifier extends AbstractModifier { return "cubrid/jdbc/driver/CUBRIDPreparedStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 57ad78c12..1aa8c2b0f 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.db.cubrid; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class CubridResultSetModifier extends AbstractModifier { return "cubrid/jdbc/driver/CUBRIDResultSet"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } 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 bfe0b45ff..c4dac1be3 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java @@ -3,7 +3,6 @@ package com.profiler.modifier.db.cubrid; import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.interceptor.bci.InstrumentClass; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -11,6 +10,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -26,7 +26,7 @@ public class CubridStatementModifier extends AbstractModifier { return "cubrid/jdbc/driver/CUBRIDStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } 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 d555ac1c1..50bc7232d 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.db.cubrid; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class CubridUStatementModifier extends AbstractModifier { return "cubrid/jdbc/jci/UStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 2eabe379c..84c67ad8a 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.dbcp; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class DBCPBasicDataSourceModifier extends AbstractModifier { return "org/apache/commons/dbcp/BasicDataSource"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 99760abe3..2a8c272e9 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.dbcp; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class DBCPPoolModifier extends AbstractModifier { return "org/apache/commons/dbcp/PoolingDataSource$PoolGuardConnectionWrapper"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 8be4efb73..0c86b888d 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mssql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class MSSQLConnectionModifier extends AbstractModifier { return "net/sourceforge/jtds/jdbc/ConnectionJDBC2"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 c95f6ca4a..d6f95c68e 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mssql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; @@ -10,6 +9,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -25,7 +25,7 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier { return "net/sourceforge/jtds/jdbc/JtdsPreparedStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + 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 d07533013..74c5d805d 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mssql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import javassist.CtMethod; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class MSSQLResultSetModifier extends AbstractModifier { return "net/sourceforge/jtds/jdbc/JtdsResultSet"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 8c4619bd1..6675347a0 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mssql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class MSSQLStatementModifier extends AbstractModifier { return "net/sourceforge/jtds/jdbc/JtdsStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 aa730c532..9e2e02094 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mysql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class MySQLConnectionImplModifier extends AbstractModifier { return "com/mysql/jdbc/ConnectionImpl"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 b9e9cb822..35c1a1adc 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mysql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; @@ -10,6 +9,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { return "com/mysql/jdbc/PreparedStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 f4467110f..99cf58998 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.db.mysql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class MySQLResultSetModifier extends AbstractModifier { return "com/mysql/jdbc/ResultSetImpl"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 2d86d387f..4c2d5cd37 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.mysql; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -24,7 +24,7 @@ public class MySQLStatementModifier extends AbstractModifier { return "com/mysql/jdbc/StatementImpl"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 933994ce1..2ed24b79c 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.oracle; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; @@ -11,6 +10,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -26,7 +26,7 @@ public class OraclePreparedStatementModifier extends AbstractModifier { return "oracle/jdbc/driver/OraclePreparedStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 1571fa320..843af44bb 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.db.oracle; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class OracleResultSetModifier extends AbstractModifier { return "oracle/jdbc/driver/OracleResultSetImpl"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } 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 ff4e5756b..83acad43f 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java @@ -1,7 +1,6 @@ package com.profiler.modifier.db.oracle; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -9,6 +8,7 @@ import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -23,7 +23,7 @@ public class OracleStatementModifier extends AbstractModifier { return "oracle/jdbc/driver/OracleStatement"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)){ logger.info("Modifing. " + javassistClassName); } diff --git a/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java b/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java index 7c8654c21..14f29badb 100644 --- a/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.tomcat; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.Agent; import com.profiler.modifier.AbstractModifier; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -29,7 +29,7 @@ public class CatalinaModifier extends AbstractModifier { return "org/apache/catalina/startup/Catalina"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } diff --git a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java index 05955822c..721088de9 100644 --- a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java @@ -2,10 +2,11 @@ package com.profiler.modifier.tomcat; import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_REQUEST_THRIFT_DTO; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; -import javassist.ByteArrayClassPath; +import javassist.*; import com.profiler.interceptor.Interceptor; import com.profiler.interceptor.bci.ByteCodeInstrumentor; @@ -31,60 +32,52 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier { return "org/apache/catalina/core/StandardHostValve"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } - addRequestTracerToCurrentClassLoader(classLoader); System.out.println("\n\n\n\n\n\n"); System.out.println("EntryPointStandardHostValveModifier=" + classLoader); System.out.println("EntryPointStandardHostValveModifier parent=" + classLoader.getParent()); - - try { -// Class.forName("com.profiler.modifier.tomcat.InvokeMethodInterceptor", false, classLoader); - - System.out.println(org.apache.catalina.Manager.class.getClassLoader().loadClass("com.profiler.modifier.tomcat.InvokeMethodInterceptor").newInstance().getClass().getClassLoader()); - - System.out.println(classLoader.loadClass("com.profiler.modifier.tomcat.InvokeMethodInterceptor").newInstance().getClass().getClassLoader()); - } catch (InstantiationException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (IllegalAccessException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (ClassNotFoundException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - System.out.println("\n\n\n\n\n\n"); + Interceptor interceptor = newInterceptor(classLoader, protectedDomain); + if(interceptor == null) { + return null; + } + System.out.println("\n\n\n\n\n\n"); this.byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classFileBuffer)); InstrumentClass aClass = this.byteCodeInstrumentor.getClass(javassistClassName); - - try { - aClass.addInterceptor("invoke", new String[] { "org.apache.catalina.connector.Request", "org.apache.catalina.connector.Response" }, (Interceptor) org.apache.catalina.Manager.class.getClassLoader().loadClass("com.profiler.modifier.tomcat.InvokeMethodInterceptor").newInstance()); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } + aClass.addInterceptor("invoke", new String[] { "org.apache.catalina.connector.Request", "org.apache.catalina.connector.Response" }, interceptor); return aClass.toBytecode(); } - private void addRequestTracerToCurrentClassLoader(ClassLoader classLoader) { + private Interceptor newInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain) { + Class aClass = this.byteCodeInstrumentor.defineClass(classLoader, "com.profiler.modifier.tomcat.InvokeMethodInterceptor", protectedDomain); + try { + return (Interceptor)aClass.newInstance(); + } catch (InstantiationException e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, e.getMessage(), e); + } + } catch (IllegalAccessException e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, e.getMessage(), e); + } + } + return null; + } + + private void addRequestTracerToCurrentClassLoader(ClassLoader classLoader) { try { classLoader.loadClass(RequestTracer.FQCN); classLoader.loadClass(CLASS_NAME_REQUEST_THRIFT_DTO); classLoader.loadClass("org.apache.thrift.TBase"); - // classLoader.loadClass("com.profiler.modifier.tomcat.InvokeMethodInterceptor"); } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); diff --git a/src/main/java/com/profiler/modifier/tomcat/InvokeMethodInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/InvokeMethodInterceptor.java index 9357ec0d3..db41c0ddf 100644 --- a/src/main/java/com/profiler/modifier/tomcat/InvokeMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/InvokeMethodInterceptor.java @@ -21,26 +21,30 @@ public class InvokeMethodInterceptor implements StaticAroundInterceptor { System.out.println("\n\n\n\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); System.out.println("interceptor=" + InvokeMethodInterceptor.class.getClassLoader()); - - javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) args[0]; - String requestURL = request.getRequestURI(); - String clientIP = request.getRemoteAddr(); - String traceID = request.getHeader(Header.HTTP_TRACE_ID.toString()); - String parentSpanID = request.getHeader(Header.HTTP_TRACE_PARENT_SPAN_ID.toString()); - Boolean debug = Boolean.valueOf(request.getHeader(Header.HTTP_TRACE_DEBUG.toString())); - String parameters = getParameter(request); - if (traceID == null) - traceID = TraceID.newTraceID(); + try { + HttpServletRequest request = (HttpServletRequest) args[0]; + String requestURL = request.getRequestURI(); + String clientIP = request.getRemoteAddr(); + String traceID = request.getHeader(Header.HTTP_TRACE_ID.toString()); + String parentSpanID = request.getHeader(Header.HTTP_TRACE_PARENT_SPAN_ID.toString()); + Boolean debug = Boolean.valueOf(request.getHeader(Header.HTTP_TRACE_DEBUG.toString())); + String parameters = getParameter(request); - Trace trace = RequestContext.getTrace(traceID, parentSpanID, "StandardHostValveInterceptor", debug); + if (traceID == null) + traceID = TraceID.newTraceID(); - Annotation a = new Annotation(); - a.setTimestamp(System.currentTimeMillis()); + Trace trace = RequestContext.getTrace(traceID, parentSpanID, "StandardHostValveInterceptor", debug); - RequestTracer.startTransaction(requestURL, clientIP, System.currentTimeMillis(), parameters); + Annotation a = new Annotation(); + a.setTimestamp(System.currentTimeMillis()); - } + RequestTracer.startTransaction(requestURL, clientIP, System.currentTimeMillis(), parameters); + } catch (Exception e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + System.out.println("end--------------"); + } @Override public void after(Object target, String className, String methodName, Object[] args, Object result) { diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java index e349582e0..fc6af7742 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java @@ -1,13 +1,13 @@ package com.profiler.modifier.tomcat; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import com.profiler.Agent; import com.profiler.modifier.AbstractModifier; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -29,7 +29,7 @@ public class TomcatConnectorModifier extends AbstractModifier { return "org/apache/catalina/connector/Connector"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java index 064e49843..56ddb75f5 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java @@ -1,10 +1,10 @@ package com.profiler.modifier.tomcat; +import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -31,7 +31,7 @@ public class TomcatStandardServiceModifier extends AbstractModifier { return "org/apache/catalina/core/StandardService"; } - public byte[] modify(ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) { + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { if (logger.isLoggable(Level.INFO)) { logger.info("Modifing. " + javassistClassName); } diff --git a/src/test/java/com/profiler/interceptor/InterceptorRegistryTest.java b/src/test/java/com/profiler/interceptor/InterceptorRegistryTest.java index 109fab01b..3abc86584 100644 --- a/src/test/java/com/profiler/interceptor/InterceptorRegistryTest.java +++ b/src/test/java/com/profiler/interceptor/InterceptorRegistryTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.util.Map; +import com.profiler.interceptor.bci.TestObject; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; @@ -26,29 +27,30 @@ public class InterceptorRegistryTest { } @Test public void interceptor() throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, IOException { - - InterceptorRegistry.addInterceptor(1, new AroundInterceptor() { + AroundInterceptor aroundInterceptor = new AroundInterceptor() { @Override public void before(InterceptorContext ctx) { - System.out.println("before ctx:" + ctx ); + System.out.println("before ctx:" + ctx); } @Override public void after(InterceptorContext ctx) { System.out.println("after ctx:" + ctx); } - }); + }; + int i = InterceptorRegistry.addInterceptor(aroundInterceptor); - ClassPool p = ClassPool.getDefault(); + ClassPool p = ClassPool.getDefault(); CtClass throwable = p.get(Throwable.class.getName()); - CtClass ctClass = p.get("com.profiler.interceptor.TestObject"); + CtClass ctClass = p.get("com.profiler.interceptor.bci.TestObject"); System.out.println(ctClass); final CtMethod hello = ctClass.getMethod("hello", "(Ljava/lang/String;)Ljava/lang/String;"); - + System.out.println("langname:" + hello.getLongName()); + System.out.println("name:" + hello.getName()); CtClass ctx = p.get(InterceptorContext.class.getName()); hello.addLocalVariable("ctx", ctx); @@ -78,7 +80,7 @@ public class InterceptorRegistryTest { // -// hello.setBody(generatedAroundInterceptor("com.profiler.interceptor.TestObject", "hello")); +// hello.setBody(generatedAroundInterceptor("com.profiler.interceptor.bci.TestObject", "hello")); // hello.setBody("{ System.out.println(\"ddd\"); }", ClassMap map ); hello.insertBefore(" System.out.println(\" before + \");"); hello.insertAfter(" System.out.println($_);"); @@ -96,7 +98,7 @@ public class InterceptorRegistryTest { // } catch (NotFoundException e) { // e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. // } -// String code = generatedAroundInterceptor("com.profiler.interceptor.TestObject", "hello"); +// String code = generatedAroundInterceptor("com.profiler.interceptor.bci.TestObject", "hello"); // m.replace(code); // } diff --git a/src/test/java/com/profiler/interceptor/TestObject.java b/src/test/java/com/profiler/interceptor/TestObject.java deleted file mode 100644 index 468930b64..000000000 --- a/src/test/java/com/profiler/interceptor/TestObject.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.profiler.interceptor; - -public class TestObject { - - public String hello(String a) { - System.out.println("a:" + a); - System.out.println("test"); -// throw new RuntimeException("test"); - return "a"; - } - -} diff --git a/src/test/java/com/profiler/interceptor/bci/JavaAssistClassTest.java b/src/test/java/com/profiler/interceptor/bci/JavaAssistClassTest.java new file mode 100644 index 000000000..359a2cdb1 --- /dev/null +++ b/src/test/java/com/profiler/interceptor/bci/JavaAssistClassTest.java @@ -0,0 +1,71 @@ +package com.profiler.interceptor.bci; + +import com.profiler.interceptor.StaticAfterInterceptor; +import com.profiler.interceptor.StaticBeforeInterceptor; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JavaAssistClassTest { + private Logger logger = Logger .getLogger(JavaAssistByteCodeInstrumentor.class.getName()); + @Test + public void testAddInterceptor() throws Exception { + Logger.getLogger(JavaAssistByteCodeInstrumentor.class.getName()).setLevel(Level.FINE); + Logger.getLogger(JavaAssistClass.class.getName()).setLevel(Level.FINE); + + + JavaAssistByteCodeInstrumentor javaAssistByteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(); + InstrumentClass aClass = javaAssistByteCodeInstrumentor.getClass("com.profiler.interceptor.bci.TestObject"); + + + StaticBeforeInterceptor staticBeforeInterceptor = new StaticBeforeInterceptor() { + private Logger logger = Logger.getLogger(StaticBeforeInterceptor.class.getName()); + private int call = 0; + @Override + public void before(Object target, String className, String methodName, Object[] args) { + logger.info("target:" + target); + logger.info("className:" + className); + logger.info("methodName:" + methodName); + logger.info("args:" + Arrays.toString(args)); + call++; + } + public int getCall() { + return call; + } + }; + + aClass.addInterceptor("callA", null, staticBeforeInterceptor); + + Class aClass1 = aClass.toClass(); + + Object o = aClass1.newInstance(); + Method aClass1Method = aClass1.getMethod("callA"); + aClass1Method.invoke(o, null); + + StaticAfterInterceptor staticAfterInterceptor = new StaticAfterInterceptor() { + private Logger logger = Logger.getLogger(StaticBeforeInterceptor.class.getName()); + private int call = 0; + @Override + public void after(Object target, String className, String methodName, Object[] args, Object result) { + logger.info("target:" + target); + logger.info("className:" + className); + logger.info("methodName:" + methodName); + logger.info("args:" + Arrays.toString(args)); + call++; + } + public int getCall() { + return call; + } + }; + aClass.addInterceptor("callA", null, staticAfterInterceptor); + Object o2 = aClass1.newInstance(); + + aClass1Method.invoke(o2, null); + } + + +} diff --git a/src/test/java/com/profiler/interceptor/bci/TestObject.java b/src/test/java/com/profiler/interceptor/bci/TestObject.java new file mode 100644 index 000000000..ec8208acb --- /dev/null +++ b/src/test/java/com/profiler/interceptor/bci/TestObject.java @@ -0,0 +1,23 @@ +package com.profiler.interceptor.bci; + +import java.util.logging.Logger; + +public class TestObject { + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private int callA; + + public int callA(){ + logger.info("callA"); + int i = callA++; + return i; + } + + public String hello(String a) { + System.out.println("a:" + a); + System.out.println("test"); +// throw new RuntimeException("test"); + return "a"; + } + +} diff --git a/src/test/java/com/profiler/javaassist/JavaAssiastTest.java b/src/test/java/com/profiler/javaassist/JavaAssiastTest.java index f8069b24d..0e6b79d90 100644 --- a/src/test/java/com/profiler/javaassist/JavaAssiastTest.java +++ b/src/test/java/com/profiler/javaassist/JavaAssiastTest.java @@ -4,11 +4,19 @@ import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; +import javassist.bytecode.ClassFile; import org.junit.Test; import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; public class JavaAssiastTest { + @Test + public void newClass() { + + + } @Test public void testAssist() throws NotFoundException, NoSuchMethodException { ClassPool getDefault = ClassPool.getDefault(); @@ -21,6 +29,7 @@ public class JavaAssiastTest { // for(CtMethod method : methods) { // System.out.println(method.getMethodInfo() +" " + method.getSignature()); // } + CtMethod endsWith = ctClass.getMethod("endsWith", "(Ljava/lang/String;)Z"); System.out.println(endsWith.getMethodInfo()); System.out.println(endsWith.getSignature()); @@ -34,4 +43,18 @@ public class JavaAssiastTest { System.out.println(endsWith1); } + + @Test + public void test() { + sout("java/lang/String"); + sout("java.lang.String"); + + } + + private void sout(String str) { + URL resource = this.getClass().getClassLoader().getResource(str); + System.out.println(resource); + +// new URLClassLoader() + } } diff --git a/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java b/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java new file mode 100644 index 000000000..aeb63d6ea --- /dev/null +++ b/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java @@ -0,0 +1,10 @@ +package com.profiler.modifier.tomcat; + +import org.junit.Test; + +public class InvokeMethodInterceptorTest { + @Test + public void getURLs() { + + } +} diff --git a/src/test/resources/logging.properties b/src/test/resources/logging.properties index 826641d12..1f9b2badd 100644 --- a/src/test/resources/logging.properties +++ b/src/test/resources/logging.properties @@ -65,4 +65,3 @@ java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # For example, set the com.xyz.foo logger to only log SEVERE # messages: com.profiler.level = FINE -com.profiler.level = FINE diff --git a/thrift.properties b/thrift.properties index 4f66ee1c4..3b910df2b 100644 --- a/thrift.properties +++ b/thrift.properties @@ -1,3 +1,3 @@ # ȯ濡 thrift compiler ġ Ұ. -#thrift.executable.property=${basedir}/../thriftcompiler/thrift-0.8.0 -thrift.executable.property=/Users/netspider/Documents/workspace_hippo/hippo-testbed/thrift-0.8.0/compiler/cpp/thrift +thrift.executable.property=${basedir}/../thriftcompiler/thrift-0.8.0 +#thrift.executable.property=/Users/netspider/Documents/workspace_hippo/hippo-testbed/thrift-0.8.0/compiler/cpp/thrift