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 }