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