[jboss-svn-commits] JBL Code SVN: r29297 - in labs/jbosstm/workspace/adinn/byteman/trunk: src/org/jboss/byteman/agent and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Sep 10 10:34:18 EDT 2009


Author: adinn
Date: 2009-09-10 10:34:17 -0400 (Thu, 10 Sep 2009)
New Revision: 29297

Modified:
   labs/jbosstm/workspace/adinn/byteman/trunk/docs/ProgrammersGuide.odt
   labs/jbosstm/workspace/adinn/byteman/trunk/docs/ProgrammersGuide.pdf
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Main.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Retransformer.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Transformer.java
Log:
now always performs retrospective transform of loaded classes after installing transformer irrespective of listener option to -javaagent (was redefine option) -- fixes BYTEMAN-32

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/docs/ProgrammersGuide.odt
===================================================================
(Binary files differ)

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/docs/ProgrammersGuide.pdf
===================================================================
(Binary files differ)

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Main.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Main.java	2009-09-10 14:20:03 UTC (rev 29296)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Main.java	2009-09-10 14:34:17 UTC (rev 29297)
@@ -50,13 +50,17 @@
                     bootJarPaths.add(arg.substring(BOOT_PREFIX.length(), arg.length()));
                 } else if (arg.startsWith(SCRIPT_PREFIX)) {
                     scriptPaths.add(arg.substring(SCRIPT_PREFIX.length(), arg.length()));
+                } else if (arg.startsWith(LISTENER_PREFIX)) {
+                    String value = arg.substring(LISTENER_PREFIX.length(), arg.length());
+                    allowRedefine = Boolean.parseBoolean(value);
                 } else if (arg.startsWith(REDEFINE_PREFIX)) {
+                    // this is only for backwards compatibility -- it is the same as listener
                     String value = arg.substring(REDEFINE_PREFIX.length(), arg.length());
                     allowRedefine = Boolean.parseBoolean(value);
                 } else {
                     System.err.println("org.jboss.byteman.agent.Main:\n" +
                             "  illegal agent argument : " + arg + "\n" +
-                            "  valid arguments are boot:<path-to-jar>, script:<path-to-script> or redefine:<true-or-false>");
+                            "  valid arguments are boot:<path-to-jar>, script:<path-to-script> or listener:<true-or-false>");
                 }
             }
         }
@@ -97,16 +101,23 @@
 
         boolean isRedefine = inst.isRedefineClassesSupported();
 
+        Transformer transformer;
         if (allowRedefine && isRedefine) {
-            System.out.println("Adding retransformer");
-            Retransformer retransformer = new Retransformer(inst, scriptPaths, scripts);
-            inst.addTransformer(retransformer, true);
-            retransformer.installBootScripts();
+            if (Transformer.isVerbose()) {
+                System.out.println("Adding retransformer");
+            }
+            transformer = new Retransformer(inst, scriptPaths, scripts);
         } else {
-            System.out.println("Adding transformer");
-            inst.addTransformer(new Transformer(inst, scriptPaths, scripts, isRedefine), isRedefine);
+            if (Transformer.isVerbose()) {
+                System.out.println("Adding transformer");
+            }
+            transformer = new Transformer(inst, scriptPaths, scripts, isRedefine);
         }
-
+        
+        inst.addTransformer(transformer, true);
+        if (isRedefine) {
+            transformer.installBootScripts();
+        }
     }
 
     /**
@@ -124,6 +135,12 @@
      * prefix used to specify transformer type argument for agent
      */
 
+    private static final String LISTENER_PREFIX = "listener:";
+
+    /**
+     * for backwards compatibiltiy
+     */
+
     private static final String REDEFINE_PREFIX = "redefine:";
 
     /**

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Retransformer.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Retransformer.java	2009-09-10 14:20:03 UTC (rev 29296)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Retransformer.java	2009-09-10 14:34:17 UTC (rev 29297)
@@ -168,76 +168,4 @@
     {
         TransformListener.initialize(this);
     }
-
-    /**
-     * ensure that scripts which apply to classes loaded before registering the transformer get
-     * are installed by retransforming the relevant classes
-     */
-
-    public void installBootScripts() throws Exception
-    {
-        // check for scrips which apply to classes already loaded during bootstrap and retransform those classes
-        // so that rule triggers are injected
-
-        List<Class<?>> omitted = new LinkedList<Class<?>>();
-
-        Class<?>[] loaded = inst.getAllLoadedClasses();
-        if (isVerbose()) {
-            System.out.println("loaded classes size = " + loaded.length);
-        }
-
-        for (Class clazz : loaded) {
-            String name = clazz.getName();
-            int lastDot = name.lastIndexOf('.');
-
-            if (isBytemanClass(name) || !isTransformable(name)) {
-                continue;
-            }
-
-            boolean found = false;
-
-            // although this is done synchronized a transformation may sneak in between this check and
-            // the retransformClasses call below causing unnecessary redefinition of the some classes
-            // TODO -- see if we can tighten up the synchronization here (probably very tricky :-)
-            synchronized(targetToScriptMap) {
-                List<RuleScript> scripts = targetToScriptMap.get(name);
-                if (scripts != null) {
-                    for (RuleScript script : scripts) {
-                        System.out.println("Checking script " + script.getName());
-                        if (!script.hasTransform(clazz)) {
-                            omitted.add(clazz);
-                            found = true;
-                            if (isVerbose()) {
-                                System.out.println("Found script for bootstrap class " + clazz.getName());
-                            }
-                            break;
-                        }
-                    }
-                }
-                if (!found && lastDot >= 0) {
-                    scripts = targetToScriptMap.get(name.substring(lastDot + 1));
-                    if (scripts != null) {
-                        for (RuleScript script : scripts) {
-                            System.out.println("Checking script " + script.getName());
-                            if (!script.hasTransform(clazz)) {
-                                omitted.add(clazz);
-                                found = true;
-                                if (isVerbose()) {
-                                    System.out.println("Found script for bootstrap class " + clazz.getName());
-                                }
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        // retransform all classes for which we found untransformed rules
-
-        if (!omitted.isEmpty()) {
-            Class<?>[] transformedArray = new Class<?>[omitted.size()];
-            inst.retransformClasses(omitted.toArray(transformedArray));
-        }
-    }
 }

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Transformer.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Transformer.java	2009-09-10 14:20:03 UTC (rev 29296)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/agent/Transformer.java	2009-09-10 14:34:17 UTC (rev 29297)
@@ -231,6 +231,78 @@
     }
 
     /**
+     * ensure that scripts which apply to classes loaded before registering the transformer get
+     * are installed by retransforming the relevant classes
+     */
+
+    public void installBootScripts() throws Exception
+    {
+        // check for scrips which apply to classes already loaded during bootstrap and retransform those classes
+        // so that rule triggers are injected
+
+        List<Class<?>> omitted = new LinkedList<Class<?>>();
+
+        Class<?>[] loaded = inst.getAllLoadedClasses();
+        if (isVerbose()) {
+            System.out.println("loaded classes size = " + loaded.length);
+        }
+
+        for (Class clazz : loaded) {
+            String name = clazz.getName();
+            int lastDot = name.lastIndexOf('.');
+
+            if (isBytemanClass(name) || !isTransformable(name)) {
+                continue;
+            }
+
+            boolean found = false;
+
+            // although this is done synchronized a transformation may sneak in between this check and
+            // the retransformClasses call below causing unnecessary redefinition of the some classes
+            // TODO -- see if we can tighten up the synchronization here (probably very tricky :-)
+            synchronized(targetToScriptMap) {
+                List<RuleScript> scripts = targetToScriptMap.get(name);
+                if (scripts != null) {
+                    for (RuleScript script : scripts) {
+                        System.out.println("Checking script " + script.getName());
+                        if (!script.hasTransform(clazz)) {
+                            omitted.add(clazz);
+                            found = true;
+                            if (isVerbose()) {
+                                System.out.println("Found script for bootstrap class " + clazz.getName());
+                            }
+                            break;
+                        }
+                    }
+                }
+                if (!found && lastDot >= 0) {
+                    scripts = targetToScriptMap.get(name.substring(lastDot + 1));
+                    if (scripts != null) {
+                        for (RuleScript script : scripts) {
+                            System.out.println("Checking script " + script.getName());
+                            if (!script.hasTransform(clazz)) {
+                                omitted.add(clazz);
+                                found = true;
+                                if (isVerbose()) {
+                                    System.out.println("Found script for bootstrap class " + clazz.getName());
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // retransform all classes for which we found untransformed rules
+
+        if (!omitted.isEmpty()) {
+            Class<?>[] transformedArray = new Class<?>[omitted.size()];
+            inst.retransformClasses(omitted.toArray(transformedArray));
+        }
+    }
+
+    /**
      * The implementation of this method may transform the supplied class file and
      * return a new replacement class file.
      * <p/>



More information about the jboss-svn-commits mailing list