From 34482ca3aefcb530dd6234de43d1ada602ed107a Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Thu, 6 Sep 2012 09:09:14 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20class=20define=EC=8B=9C=20nested=20class=EB=8F=84=20?= =?UTF-8?q?=EA=B0=99=EC=9D=B4=20=EB=A1=9C=EB=93=9C=20=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=ED=95=A8.=20thrift=20=EC=A0=95=EC=9D=98=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD.?= 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@598 84d0f5b1-2673-498c-a247-62c4ff18d310 --- pom.xml | 13 +++++------ .../interceptor/InterceptorRegistry.java | 12 +++++++--- .../interceptor/LoggingInterceptor.java | 7 ++++-- .../bci/JavaAssistByteCodeInstrumentor.java | 22 ++++++++++++++++--- .../java/com/profiler/util/StringUtils.java | 7 +++++- .../main/thrift}/JVMInfoThriftDTO.thrift | 0 .../main/thrift}/RequestDataThriftDTO.thrift | 0 .../main/thrift}/RequestThriftDTO.thrift | 0 {thrift => src/main/thrift}/Trace.thrift | 0 {thrift => src/main/thrift}/makethrift.sh | 0 10 files changed, 45 insertions(+), 16 deletions(-) rename {thrift => src/main/thrift}/JVMInfoThriftDTO.thrift (100%) rename {thrift => src/main/thrift}/RequestDataThriftDTO.thrift (100%) rename {thrift => src/main/thrift}/RequestThriftDTO.thrift (100%) rename {thrift => src/main/thrift}/Trace.thrift (100%) rename {thrift => src/main/thrift}/makethrift.sh (100%) diff --git a/pom.xml b/pom.xml index 914ac7d91..454d58b13 100644 --- a/pom.xml +++ b/pom.xml @@ -242,6 +242,7 @@ generate-sources + @@ -251,35 +252,33 @@ - + - + - + - + - - - + diff --git a/src/main/java/com/profiler/interceptor/InterceptorRegistry.java b/src/main/java/com/profiler/interceptor/InterceptorRegistry.java index c25a89860..f45c91995 100644 --- a/src/main/java/com/profiler/interceptor/InterceptorRegistry.java +++ b/src/main/java/com/profiler/interceptor/InterceptorRegistry.java @@ -4,14 +4,15 @@ import java.util.concurrent.atomic.AtomicInteger; public class InterceptorRegistry { + private static final Interceptor DUMMY = new LoggingInterceptor("com.profiler.interceptor.DUMMY"); + public static final InterceptorRegistry REGISTRY = new InterceptorRegistry(); + private final static int DEFAULT_MAX = 1024; private final int max; private final AtomicInteger id = new AtomicInteger(0); private final Interceptor[] index; - public static final InterceptorRegistry REGISTRY = new InterceptorRegistry(); - InterceptorRegistry() { this(DEFAULT_MAX); } @@ -36,7 +37,12 @@ public class InterceptorRegistry { } Interceptor getInterceptor0(int key) { - return index[key]; + Interceptor interceptor = index[key]; + if (interceptor == null) { + // 로직이 잘못되었을 경우 에러가 발생하지 않도록 더미를 리턴. + return DUMMY; + } + return index[key]; } public static int addInterceptor(Interceptor interceptor) { diff --git a/src/main/java/com/profiler/interceptor/LoggingInterceptor.java b/src/main/java/com/profiler/interceptor/LoggingInterceptor.java index 85fc1b846..c2fd80675 100644 --- a/src/main/java/com/profiler/interceptor/LoggingInterceptor.java +++ b/src/main/java/com/profiler/interceptor/LoggingInterceptor.java @@ -1,5 +1,7 @@ package com.profiler.interceptor; +import com.profiler.util.StringUtils; + import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; @@ -15,14 +17,15 @@ public class LoggingInterceptor implements StaticAroundInterceptor { @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (logger.isLoggable(Level.INFO)) { - logger.info("before " + target.toString() + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); + logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } } @Override public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { - logger.info("after " + target.toString() + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); + logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } } + } diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java index de6c3a19a..769f8905d 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java @@ -73,12 +73,13 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { @Override public Class defineClass(ClassLoader classLoader, String defineClass, ProtectionDomain protectedDomain) throws InstrumentException { if (logger.isLoggable(Level.INFO)) { - logger.info("defineClass classLoader:" + classLoader + " class:" + defineClass); + logger.info("defineClass classLoader:" + classLoader + " class:" + defineClass); } try { CtClass clazz = classPool.get(defineClass); - return clazz.toClass(classLoader, protectedDomain); + defineNestedClass(clazz, classLoader, protectedDomain); + return clazz.toClass(classLoader, protectedDomain); } catch (NotFoundException e) { throw new InstrumentException(defineClass + " class not fund. Cause:" + e.getMessage(), e); } catch (CannotCompileException e) { @@ -86,7 +87,22 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { } } - public boolean findClass(String javassistClassName) { + private void defineNestedClass(CtClass clazz, ClassLoader classLoader, ProtectionDomain protectedDomain) throws NotFoundException, CannotCompileException { + CtClass[] nestedClasses = clazz.getNestedClasses(); + if (nestedClasses.length == 0) { + return; + } + for(CtClass nested : nestedClasses) { + // 재귀하면서 최하위부터 로드 + defineNestedClass(nested, classLoader, protectedDomain); + if (logger.isLoggable(Level.INFO)) { + logger.info("defineNestedClass classLoader:" + classLoader + " class:" + nested.getName()); + } + nested.toClass(classLoader, protectedDomain); + } + } + + public boolean findClass(String javassistClassName) { // TODO 원래는 get인데. find는 ctclas를 생성하지 않아 변경. 어차피 아래서 생성하기는 함. 유효성 여부 확인 // 필요 URL url = classPool.find(javassistClassName); diff --git a/src/main/java/com/profiler/util/StringUtils.java b/src/main/java/com/profiler/util/StringUtils.java index ff81351cb..b7f5e9563 100644 --- a/src/main/java/com/profiler/util/StringUtils.java +++ b/src/main/java/com/profiler/util/StringUtils.java @@ -6,5 +6,10 @@ public class StringUtils { return str == null ? defaultStr : str; } - + public static String toString(Object object) { + if (object == null) { + return "null"; + } + return object.toString(); + } } diff --git a/thrift/JVMInfoThriftDTO.thrift b/src/main/thrift/JVMInfoThriftDTO.thrift similarity index 100% rename from thrift/JVMInfoThriftDTO.thrift rename to src/main/thrift/JVMInfoThriftDTO.thrift diff --git a/thrift/RequestDataThriftDTO.thrift b/src/main/thrift/RequestDataThriftDTO.thrift similarity index 100% rename from thrift/RequestDataThriftDTO.thrift rename to src/main/thrift/RequestDataThriftDTO.thrift diff --git a/thrift/RequestThriftDTO.thrift b/src/main/thrift/RequestThriftDTO.thrift similarity index 100% rename from thrift/RequestThriftDTO.thrift rename to src/main/thrift/RequestThriftDTO.thrift diff --git a/thrift/Trace.thrift b/src/main/thrift/Trace.thrift similarity index 100% rename from thrift/Trace.thrift rename to src/main/thrift/Trace.thrift diff --git a/thrift/makethrift.sh b/src/main/thrift/makethrift.sh similarity index 100% rename from thrift/makethrift.sh rename to src/main/thrift/makethrift.sh