[강운덕] [LUCYSUS-1744] modifier관련 static api를 instance api로 변경 완료.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@467 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Woonduk Kang
2012-07-23 06:42:03 +00:00
parent bdd316fd00
commit 2c02691282
20 changed files with 229 additions and 246 deletions
@@ -2,72 +2,110 @@ package com.profiler.modifier;
import com.profiler.logging.Logger;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;
import javassist.*;
import java.net.URL;
import java.net.URLClassLoader;
public abstract class AbstractModifier implements Modifier {
private static final Logger logger = Logger.getLogger(AbstractModifier.class);
private static final Logger logger = Logger.getLogger(AbstractModifier.class);
public byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) {
try {
CtClass cc = classPool.get(javassistClassName);
CtMethod[] methods = cc.getDeclaredMethods();
public byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) {
try {
CtClass cc = classPool.get(javassistClassName);
CtMethod[] methods = cc.getDeclaredMethods();
for (CtMethod method : methods) {
if (!method.isEmpty()) {
String methodName = method.getName();
CtClass[] params = method.getParameterTypes();
StringBuilder sb = new StringBuilder();
for (CtMethod method : methods) {
if (!method.isEmpty()) {
String methodName = method.getName();
CtClass[] params = method.getParameterTypes();
StringBuilder sb = new StringBuilder();
if (params.length != 0) {
int paramsLength = params.length;
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
}
method.insertBefore("{System.out.println(\"*****" + javassistClassName + "." + methodName + "(" + sb + ") is started.\");}");
method.insertAfter("{System.out.println(\"*****" + javassistClassName + "." + methodName + "(" + sb + ") is finished.\");}");
} else {
logger.warn(method.getLongName() + " is empty !!!!!");
}
}
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
}
method.insertBefore("{System.out.println(\"*****" + javassistClassName + "." + methodName + "(" + sb + ") is started.\");}");
method.insertAfter("{System.out.println(\"*****" + javassistClassName + "." + methodName + "(" + sb + ") is finished.\");}");
} else {
logger.warn(method.getLongName() + " is empty !!!!!");
}
}
CtConstructor[] constructors = cc.getConstructors();
CtConstructor[] constructors = cc.getConstructors();
for (CtConstructor constructor : constructors) {
for (CtConstructor constructor : constructors) {
if (!constructor.isEmpty()) {
CtClass[] params = constructor.getParameterTypes();
StringBuilder sb = new StringBuilder();
if (!constructor.isEmpty()) {
CtClass[] params = constructor.getParameterTypes();
StringBuilder sb = new StringBuilder();
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
}
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
}
constructor.insertBefore("{System.out.println(\"*****" + javassistClassName + " Constructor:Param=(" + sb + ") is started.\");}");
constructor.insertAfter("{System.out.println(\"*****" + javassistClassName + " Constructor:Param=(" + sb + ") is finished.\");}");
} else {
logger.warn(constructor.getLongName() + " is empty !!!!!");
}
}
return cc.toBytecode();
} catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
return null;
}
}
constructor.insertBefore("{System.out.println(\"*****" + javassistClassName + " Constructor:Param=(" + sb + ") is started.\");}");
constructor.insertAfter("{System.out.println(\"*****" + javassistClassName + " Constructor:Param=(" + sb + ") is finished.\");}");
} else {
logger.warn(constructor.getLongName() + " is empty !!!!!");
}
}
return cc.toBytecode();
} catch (Exception e) {
logger.error(e.getMessage());
e.printStackTrace();
return null;
}
}
public void printClassConvertComplete(String javassistClassName) {
logger.info("%s class is converted.", javassistClassName);
}
public void printClassConvertComplete(String javassistClassName) {
logger.info("%s class is converted.", javassistClassName);
}
protected void checkLibrary(ClassPool classPool, String javassistClassName, ClassLoader classLoader) {
// TODO Util로 뽑을까?
boolean findClass = findClass(classPool, javassistClassName);
if(findClass) {
return;
}
loadClassLoaderLibraries(classPool, classLoader);
}
public boolean findClass(ClassPool classPool, String javassistClassName) {
// TODO 원래는 get인데. find는 ctclas를 생성하지 않아 변경. 어차피 아래서 생성하기는 함. 유효성 여부 확인 필요
URL url = classPool.find(javassistClassName);
if (url == null) {
return false;
}
return true;
}
private void loadClassLoaderLibraries(ClassPool classPool, ClassLoader classLoader) {
if (classLoader instanceof URLClassLoader) {
URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
// TODO classLoader가 가지고 있는 전체 리소스를 모두 로드해야 되는것인지? 테스트 케이스 만들어서 확인해봐야 할듯.
URL[] urlList = urlClassLoader.getURLs();
for (URL tempURL : urlList) {
String filePath = tempURL.getFile();
try {
classPool.appendClassPath(filePath);
// TODO 여기서 로그로 class로더를 찍어보면 어떤 clasdLoader에서 로딩되는지 알수 있을거 것같음.
// 만약 한개만 로딩해도 된다면. return true 할것
// log("Loaded "+filePath+" library.");
} catch (NotFoundException e) {
}
}
}
}
}