001    package org.shiftone.jrat.jvmti;
002    
003    
004    import org.shiftone.jrat.core.Environment;
005    import org.shiftone.jrat.core.Mode;
006    import org.shiftone.jrat.core.config.Configuration;
007    import org.shiftone.jrat.inject.InjectorOptions;
008    import org.shiftone.jrat.util.VersionUtil;
009    import org.shiftone.jrat.util.log.Logger;
010    
011    import java.lang.instrument.ClassFileTransformer;
012    import java.lang.instrument.Instrumentation;
013    
014    
015    /**
016     * -javaagent:
017     */
018    public class Agent {
019    
020        private static final Logger LOG = Logger.getLogger(Agent.class);
021        private static boolean installed = false;
022        private static Configuration configuration;
023    
024    
025        public static void premain(String agentArgs, Instrumentation instrumentation) {
026    
027            Mode.set(Mode.RUNTIME);
028    
029            if (installed) {
030    
031                LOG.warn("one JRat Agent was already installed.");
032                LOG.warn("your probably have the -javaagent arg on the command line twice");
033    
034                return;
035            }
036    
037            LOG.info("Installing JRat " + VersionUtil.getVersion() + " ClassFileTransformer...");
038    
039            if (configuration == null) {
040                // this must happen after the mode is set because it will
041                // GET the mode locking it.
042                configuration = Environment.getConfiguration();
043            }
044    
045            InjectorOptions injectorOptions = new InjectorOptions();
046            injectorOptions.setCriteria(configuration);
047    
048            try {
049    
050                ClassFileTransformer transformer;
051    
052    
053                transformer = new InjectClassFileTransformer(injectorOptions);
054                transformer = new FilterClassFileTransformer(configuration, transformer);
055    
056                if (configuration.getSettings().isSystemPropertyTweakingEnabled()) {
057                    transformer = new SystemPropertyTweakingTransformer(transformer);
058                }
059    
060                transformer = new TryCatchClassFileTransformer(transformer);
061    
062                instrumentation.addTransformer(transformer);
063                LOG.info("Installed " + transformer + ".");
064    
065                installed = true;
066            }
067            catch (Throwable e) {
068    
069                LOG.info("NOT Installed!", e);
070    
071            }
072        }
073    }