001    package org.shiftone.jrat.jvmti;
002    
003    import org.shiftone.jrat.util.log.Logger;
004    
005    import java.lang.instrument.ClassFileTransformer;
006    import java.lang.instrument.IllegalClassFormatException;
007    import java.security.ProtectionDomain;
008    
009    /**
010     * @author jeff@shiftone.org (Jeff Drost)
011     */
012    public class SystemPropertyTweakingTransformer implements ClassFileTransformer {
013    
014        private static final Logger LOG = Logger.getLogger(SystemPropertyTweakingTransformer.class);
015        private final ClassFileTransformer transformer;
016        private boolean loggedDisableMessage = false;
017    
018    
019        public SystemPropertyTweakingTransformer(ClassFileTransformer transformer) {
020            this.transformer = transformer;
021        }
022    
023        public byte[] transform(
024                ClassLoader loader,
025                String className,
026                Class/*<?>*/ classBeingRedefined,
027                ProtectionDomain protectionDomain,
028                byte[] classfileBuffer) throws IllegalClassFormatException {
029    
030            if (className.startsWith("org/jboss/")) {
031    
032                setSystemProperty(
033                        "jboss.shutdown.forceHalt",
034                        "false",
035                        "You appear to be running JBoss. Tweaking system property to allow proper shutdown.");
036    
037            }
038    
039            return transformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
040    
041        }
042    
043        private void setSystemProperty(String key, String value, String reason) {
044    
045            if (value.equals(System.getProperty(key))) {
046                return;
047            }
048    
049            LOG.info(reason);
050            LOG.info("Setting system property : " + key + " = " + value);
051    
052            if (!loggedDisableMessage) {
053    
054                LOG.info("To prevent JRat from mucking with your system properties, configure 'systemPropertyTweakingEnabled' = false");
055                loggedDisableMessage = true;
056    
057            }
058    
059            System.setProperty(key, value);
060        }
061    
062    
063        public String toString() {
064            return "SystemPropertyTweakingTransformer[" + transformer + "]";
065        }
066    }