001package com.killcoding.jsplus;
002
003import java.io.File;
004import com.killcoding.tool.CommonTools;
005import com.killcoding.datasource.DriverDataSource;
006import java.util.Map;
007import java.util.HashMap;
008import com.killcoding.tool.FileTools;
009import java.io.StringReader;
010import java.nio.file.Path;
011import java.nio.file.Files;
012import com.killcoding.cache.CacheArray;
013import java.util.Scanner;
014import java.nio.file.Paths;
015import com.killcoding.tool.ConfigProperties;
016import com.killcoding.jsplus.GhostConsole;
017import net.bytebuddy.agent.ByteBuddyAgent;
018import java.lang.instrument.ClassFileTransformer;
019import java.security.ProtectionDomain;
020import java.net.URLEncoder;
021import java.nio.charset.StandardCharsets;
022
023public final class MainAgent { 
024    
025    public MainAgent(){
026        super();
027    }
028    
029    protected static long mainAgentClassCurrentIndex = 0;
030    protected static String mainAgentClassMatches = null;
031    protected static String mainAgentClassExportIndex = null;
032    protected static String mainAgentClassExportPath = null;
033        
034    public static void main(String[] args){
035        ByteBuddyAgent.install();
036        mainAgentClassMatches = System.getenv("MainAgentClassMatches") + "";
037        mainAgentClassExportIndex = System.getenv("MainAgentClassExportIndex") + "";
038        mainAgentClassExportPath = System.getenv("MainAgentClassExportPath");
039        
040        System.out.println("MainAgentClassMatches: " + mainAgentClassMatches);
041        System.out.println("MainAgentClassExportIndex: " + mainAgentClassExportIndex);
042        System.out.println("MainAgentClassExportPath: " + mainAgentClassExportPath);
043        System.out.println("MainAgentClassExportPath using default (e.g. CurrentFolder/javaClasses)");
044        
045        ByteBuddyAgent.getInstrumentation().addTransformer(new ClassFileTransformer() {
046            @Override
047            public byte[] transform(ClassLoader loader, String className,
048                                  Class<?> classBeingRedefined,
049                                  ProtectionDomain protectionDomain,
050                                  byte[] classfileBuffer) {
051                
052                if (className != null && className.matches(mainAgentClassMatches)) {
053                    saveBytecode(className, classfileBuffer);
054                }
055                return classfileBuffer;
056            }
057            
058            private void saveBytecode(String className, byte[] bytes) {
059                if(mainAgentClassExportPath == null){
060                    mainAgentClassExportPath = ScriptConsole.getJsPlusPath() + "/javaClasses/";
061                }
062                try {
063                    String classFileName = URLEncoder.encode(className.replace('/', '.'), StandardCharsets.UTF_8.toString());
064                    if(mainAgentClassExportIndex.equals("true")){
065                        classFileName = mainAgentClassCurrentIndex + "_" + classFileName;
066                    }
067                    Path path = Paths.get(mainAgentClassExportPath,classFileName + ".class");
068                    Files.createDirectories(path.getParent());
069                    Files.write(path, bytes);
070                } catch (Exception e) {
071                    e.printStackTrace();
072                }finally{
073                    mainAgentClassCurrentIndex++;
074                }
075            }
076        });   
077        
078        Main.appMain(args);
079    }
080    
081}