[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