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 }