From e13abc08b50d2e7ac67a991f801800217303f7ac Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Wed, 22 Aug 2012 08:55:32 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20=EB=B0=94=EC=9D=B4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EB=B6=80=EB=B6=84=20=EC=B6=94=EC=83=81=ED=99=94.?= 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@531 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../interceptor/bci/ByteCodeInstrumentor.java | 6 +-- .../interceptor/bci/InstrumentClass.java | 9 +++++ .../bci/JavaAssistByteCodeInstrumentor.java | 22 +++++----- .../interceptor/bci/JavaAssistClass.java | 40 +++++++++++++++++++ .../db/cubrid/CubridStatementModifier.java | 26 +++++++++++- .../profiler/javaassist/JavaAssiastTest.java | 37 +++++++++++++++++ .../com/profiler/sender/DataSenderTest.java | 15 +++++++ 7 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/profiler/interceptor/bci/InstrumentClass.java create mode 100644 src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java create mode 100644 src/test/java/com/profiler/javaassist/JavaAssiastTest.java create mode 100644 src/test/java/com/profiler/sender/DataSenderTest.java diff --git a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java index bbb1ca980..faa53f027 100644 --- a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java @@ -1,14 +1,14 @@ package com.profiler.interceptor.bci; -import com.profiler.interceptor.Interceptor; import javassist.ClassPool; -public interface ByteCodeInstrumentor { - void addInterceptor(String className, String methodName, String[] args, Interceptor interceptor); +public interface ByteCodeInstrumentor { // 임시로 만들자. ClassPool getClassPool(); void checkLibrary(ClassLoader classLoader, String javassistClassName); + + InstrumentClass getClass(String javassistClassName); } diff --git a/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java new file mode 100644 index 000000000..fa46b7c0d --- /dev/null +++ b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java @@ -0,0 +1,9 @@ +package com.profiler.interceptor.bci; + +import com.profiler.interceptor.Interceptor; + +public interface InstrumentClass { + void addInterceptor(String methodName, String[] args, Interceptor interceptor); + + byte[] toBytecode(); +} diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java index aeb00a9b0..b52fe4834 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java @@ -3,6 +3,7 @@ package com.profiler.interceptor.bci; import com.profiler.interceptor.Interceptor; import com.profiler.interceptor.StaticBeforeInterceptor; import javassist.ClassPool; +import javassist.CtClass; import javassist.NotFoundException; import java.net.URL; @@ -12,7 +13,7 @@ import java.util.logging.Logger; public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { - private final Logger logger = Logger.getLogger(JavaAssistByteCodeInstrumentor.class.getName()); + private final Logger logger = Logger.getLogger(this.getClass().getName()); private ClassPool classPool; @@ -20,13 +21,6 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { this.classPool = createClassPool(); } - @Override - public void addInterceptor(String className, String methodName, String[] args, Interceptor interceptor) { - if(interceptor instanceof StaticBeforeInterceptor) { - - } - } - public ClassPool getClassPool() { return this.classPool; } @@ -67,7 +61,17 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { loadClassLoaderLibraries(classLoader); } - public boolean findClass(String javassistClassName) { + @Override + public InstrumentClass getClass(String javassistClassName) { + try { + CtClass cc = classPool.get(javassistClassName); + return new JavaAssistClass(this, cc); + } catch (NotFoundException e) { + return null; + } + } + + public boolean findClass(String javassistClassName) { // TODO 원래는 get인데. find는 ctclas를 생성하지 않아 변경. 어차피 아래서 생성하기는 함. 유효성 여부 확인 // 필요 URL url = classPool.find(javassistClassName); diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java new file mode 100644 index 000000000..32cab092e --- /dev/null +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java @@ -0,0 +1,40 @@ +package com.profiler.interceptor.bci; + +import com.profiler.interceptor.Interceptor; +import javassist.CannotCompileException; +import javassist.CtClass; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JavaAssistClass implements InstrumentClass { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private JavaAssistByteCodeInstrumentor instrumentor; + private CtClass ctClass; + + public JavaAssistClass(JavaAssistByteCodeInstrumentor instrumentor, CtClass ctClass) { + this.instrumentor = instrumentor; + this.ctClass = ctClass; + } + + @Override + public void addInterceptor(String methodName, String[] args, Interceptor interceptor) { + + + } + + @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/db/cubrid/CubridStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java index 48f84bcd7..bfe0b45ff 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java @@ -1,6 +1,8 @@ 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; @@ -33,12 +35,32 @@ public class CubridStatementModifier extends AbstractModifier { } private byte[] changeMethod(String javassistClassName, byte[] classfileBuffer) { - try { + + StaticAroundInterceptor interceptor = new StaticAroundInterceptor() { + @Override + public void after(Object target, String className, String methodName, Object[] args, Object result) { + DatabaseRequestTracer.putSqlQuery(TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY, (String) args[0]); + } + + @Override + public void before(Object target, String className, String methodName, Object[] args) { + DatabaseRequestTracer.put(TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY);; + } + }; + + InstrumentClass aClass = this.byteCodeInstrumentor.getClass(javassistClassName); + aClass.addInterceptor("executeQuery", new String[] {"java.lang.String"}, interceptor); + + printClassConvertComplete(javassistClassName); +// return aClass.toBytecode(); + + + try { CtClass cc = classPool.get(javassistClassName); updateExecuteQueryMethod(cc); - printClassConvertComplete(javassistClassName); + return cc.toBytecode(); } catch (Exception e) { diff --git a/src/test/java/com/profiler/javaassist/JavaAssiastTest.java b/src/test/java/com/profiler/javaassist/JavaAssiastTest.java new file mode 100644 index 000000000..f8069b24d --- /dev/null +++ b/src/test/java/com/profiler/javaassist/JavaAssiastTest.java @@ -0,0 +1,37 @@ +package com.profiler.javaassist; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import org.junit.Test; + +import java.lang.reflect.Method; + +public class JavaAssiastTest { + @Test + public void testAssist() throws NotFoundException, NoSuchMethodException { + ClassPool getDefault = ClassPool.getDefault(); + CtClass ctClass = getDefault.get(String.class.getName()); +// System.out.println(ctClass) ; + String s = ""; +// ctClass.getMethod("valueOf", "(D)"); + + CtMethod[] methods = ctClass.getMethods(); +// 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()); + System.out.println(endsWith.getLongName()); + System.out.println(endsWith); + System.out.println(endsWith.getName()); + System.out.println(endsWith.getMethodInfo().getName()); + System.out.println(endsWith.getMethodInfo().getDescriptor()); + + Method endsWith1 = String.class.getMethod("endsWith", new Class[]{String.class}); + System.out.println(endsWith1); + + } +} diff --git a/src/test/java/com/profiler/sender/DataSenderTest.java b/src/test/java/com/profiler/sender/DataSenderTest.java new file mode 100644 index 000000000..ac6cf74fb --- /dev/null +++ b/src/test/java/com/profiler/sender/DataSenderTest.java @@ -0,0 +1,15 @@ +package com.profiler.sender; + +import junit.framework.TestCase; +import org.junit.Test; + + +public class DataSenderTest { + @Test + public void send() { + + + + } + +}