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