Launcher/ServerWrapper/src/main/java/ru/gravit/launcher/server/ServerAgent.java

79 lines
2.9 KiB
Java
Raw Normal View History

2018-09-24 14:36:20 +03:00
package ru.gravit.launcher.server;
import ru.gravit.utils.helper.IOHelper;
2018-09-24 14:36:20 +03:00
import ru.gravit.utils.helper.LogHelper;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
2018-09-24 14:36:20 +03:00
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.jar.JarFile;
public class ServerAgent {
2018-11-08 15:30:16 +03:00
private static boolean isAgentStarted = false;
2018-09-24 14:36:20 +03:00
public static Instrumentation inst;
2018-11-08 15:30:16 +03:00
2018-09-24 14:36:20 +03:00
public static final class StarterVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.toFile().getName().endsWith(".jar")) addJVMClassPath(new JarFile(file.toFile()));
return super.visitFile(file, attrs);
}
}
2018-11-08 15:30:16 +03:00
2018-09-24 14:36:20 +03:00
public static void addJVMClassPath(String path) throws IOException {
2018-11-08 15:30:16 +03:00
LogHelper.debug("Load %s", path);
2018-09-24 14:36:20 +03:00
inst.appendToSystemClassLoaderSearch(new JarFile(path));
}
2018-11-08 15:30:16 +03:00
2018-09-24 14:36:20 +03:00
public static void addJVMClassPath(JarFile file) throws IOException {
2018-11-08 15:30:16 +03:00
LogHelper.debug("Load %s", file.getName());
2018-09-24 14:36:20 +03:00
inst.appendToSystemClassLoaderSearch(file);
}
2018-11-08 15:30:16 +03:00
public static boolean isAgentStarted() {
2018-09-24 14:36:20 +03:00
return isAgentStarted;
}
2018-11-08 15:30:16 +03:00
2018-09-24 14:36:20 +03:00
public static long getObjSize(Object obj) {
return inst.getObjectSize(obj);
}
public static Boolean isAutoloadLibraries = Boolean.getBoolean(System.getProperty("serverwrapper,agentlibrariesload","false"));
public static Boolean isAgentProxy = Boolean.getBoolean(System.getProperty("serverwrapper,agentproxy","false"));
2018-09-24 14:36:20 +03:00
public static void premain(String agentArgument, Instrumentation instrumentation) {
LogHelper.debug("Server Agent");
inst = instrumentation;
isAgentStarted = true;
if(isAutoloadLibraries)
{
Path libraries = Paths.get("libraries");
if(IOHelper.exists(libraries)) loadLibraries(libraries);
}
if(isAgentProxy)
{
String proxyClassName = System.getProperty("serverwrapper,agentproxyclass");
Class proxyClass;
try {
proxyClass = Class.forName(proxyClassName);
MethodHandle mainMethod = MethodHandles.publicLookup().findStatic(proxyClass, "premain", MethodType.methodType(void.class, String.class, Instrumentation.class));
Object[] args = {agentArgument,instrumentation};
mainMethod.invoke(args);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
public static void loadLibraries(Path dir)
{
2018-09-24 14:36:20 +03:00
try {
Files.walkFileTree(dir, Collections.singleton(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new StarterVisitor());
2018-09-24 14:36:20 +03:00
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
}