package com.highway2urhell.agent;
import com.highway2urhell.PluginUtils;
import com.highway2urhell.transformer.AbstractLeechTransformer;
import java.io.File;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
public class H2hellAgent {
public static void premain(String agentArgs, Instrumentation inst) {
// Hack for load Jar
findJarAndLoadIfNecessary();
for (AbstractLeechTransformer transformer : PluginUtils.autodiscoverPlugin(AbstractLeechTransformer.class)) {
inst.addTransformer(transformer);
}
InstrumentationHolder.getInstance().persistInMemory(inst);
}
private static void findJarAndLoadIfNecessary(){
List<String> listJar = new ArrayList<String>();
URLClassLoader currentThreadClassLoader= (URLClassLoader) Thread.currentThread().getContextClassLoader();
URL urlsThread[] = currentThreadClassLoader.getURLs();
for (int i = 0; i < urlsThread.length; i++) {
listJar.add(urlsThread[i].getFile());
}
URLClassLoader currentClassLoader= (URLClassLoader) ClassLoader.getSystemClassLoader();
URL urlsClass[] = currentClassLoader.getURLs();
for (int i = 0; i < urlsClass.length; i++) {
listJar.add(urlsClass[i].getFile());
}
addH2HJar(listJar);
}
private static void addH2HJar(List<String> listJar){
String rootH2h = System.getProperty("H2H_INSTALL");
System.out.println("H2H_INSTALL is "+rootH2h);
if(rootH2h != null){
if(!rootH2h.endsWith("/")){
rootH2h = rootH2h+"/";
}
if(!checkList(listJar,"reflections")){
addJar(rootH2h+"reflections-0.9.10");
}
if(!checkList(listJar,"guava")){
addJar(rootH2h+"guava-15.0");
}
if(!checkList(listJar,"javassist")){
addJar(rootH2h+"javassist-3.19.0-GA");
}
if(!checkList(listJar,"gson")){
addJar(rootH2h+"gson-2.2.4");
}
if(!checkList(listJar,"asm-all")){
addJar(rootH2h+"asm-all-5.0.3");
}
if(!checkList(listJar,"javax.servlet-api")){
addJar(rootH2h+"javax.servlet-api-3.1.0");
}
if(!checkList(listJar,"javax.ws.rs-api")){
addJar(rootH2h+"javax.ws.rs-api-2.0");
}
}else{
System.err.println("No Load dynamically jar because H2H_INSTALL is not configure");
}
}
private static Boolean checkList(List<String> listJar,String nameJar){
System.err.println(nameJar);
for(String item : listJar){
if(item.contains(nameJar)){
return true;
}
}
return false;
}
private static void addJar(String pathJar){
System.out.println("ADD pathjar "+pathJar);
try {
addURL(new File(pathJar + ".jar").toURL());
}catch (Exception e){
System.err.println("Error during add jar "+pathJar+ " stack "+e);
}
}
public static void addURL(URL url) throws Exception {
URLClassLoader classLoader
= (URLClassLoader) ClassLoader.getSystemClassLoader();
Class clazz= URLClassLoader.class;
// Use reflection
Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(classLoader, new Object[] { url });
}
}