[jboss-cvs] JBossAS SVN: r86441 - in projects/spring-int/trunk/weaving/src/main/java/org/jboss: instrument and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat Mar 28 14:00:39 EDT 2009


Author: alesj
Date: 2009-03-28 14:00:39 -0400 (Sat, 28 Mar 2009)
New Revision: 86441

Added:
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/ClassFileTransformer2Translator.java
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5ClassLoader.java
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5LoadTimeWeaver.java
Removed:
   projects/spring-int/trunk/weaving/src/main/java/org/jboss/classloader/
Log:
Use reflection instead of split package.

Copied: projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/ClassFileTransformer2Translator.java (from rev 86439, projects/spring-int/trunk/weaving/src/main/java/org/jboss/classloader/spi/base/ClassFileTransformer2Translator.java)
===================================================================
--- projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/ClassFileTransformer2Translator.java	                        (rev 0)
+++ projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/ClassFileTransformer2Translator.java	2009-03-28 18:00:39 UTC (rev 86441)
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.instrument.classloading;
+
+import java.security.ProtectionDomain;
+import java.lang.instrument.ClassFileTransformer;
+
+import org.jboss.util.loading.Translator;
+
+/**
+ * ClassFileTransfomer to Translator bridge.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class ClassFileTransformer2Translator implements Translator
+{
+   private ClassFileTransformer transformer;
+
+   public ClassFileTransformer2Translator(ClassFileTransformer transformer)
+   {
+      if (transformer == null)
+         throw new IllegalArgumentException("Null transformer");
+
+      this.transformer = transformer;
+   }
+
+   public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws Exception
+   {
+      return transformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
+   }
+
+   public void unregisterClassLoader(ClassLoader loader)
+   {
+   }
+}
\ No newline at end of file

Added: projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5ClassLoader.java
===================================================================
--- projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5ClassLoader.java	                        (rev 0)
+++ projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5ClassLoader.java	2009-03-28 18:00:39 UTC (rev 86441)
@@ -0,0 +1,122 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.instrument.classloading;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.reflect.Method;
+
+import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
+import org.jboss.classloader.spi.base.BaseClassLoaderPolicy;
+import org.jboss.classloader.spi.base.BaseClassLoaderSystem;
+import org.jboss.logging.Logger;
+import org.jboss.util.loading.Translator;
+import org.springframework.util.Assert;
+
+/**
+ * Reflective wrapper around a JBoss5 class loader. Used to
+ * encapsulate the classloader-specific methods (discovered and
+ * called through reflection) from the load-time weaver.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class JBoss5ClassLoader
+{
+   private static Logger log = Logger.getLogger(JBoss5ClassLoader.class);
+
+   private final BaseClassLoader classLoader;
+   private final ClassLoaderPolicy policy;
+   private ClassLoaderSystem system;
+
+   private Method setTranslator;
+
+   public JBoss5ClassLoader(BaseClassLoader classLoader)
+   {
+      Assert.notNull(classLoader, "ClassLoader must not be null");
+      this.classLoader = classLoader;
+
+      try
+      {
+         Method getPolicy = BaseClassLoader.class.getDeclaredMethod("getPolicy");
+         policy = (ClassLoaderPolicy)getPolicy.invoke(classLoader);
+         try
+         {
+            // let's check if we have a patched policy, with translator per policy
+            setTranslator = BaseClassLoaderPolicy.class.getDeclaredMethod("setTranslator");
+         }
+         catch (Exception ignored)
+         {
+            log.info("Policy doesn't have setTranslator, falling back to ClassLoaderSystem.");
+
+            Method getClassLoaderDomain = BaseClassLoaderPolicy.class.getDeclaredMethod("getClassLoaderDomain");
+            BaseClassLoaderDomain domain = (BaseClassLoaderDomain)getClassLoaderDomain.invoke(policy);
+            Method getClassLoaderSystem = BaseClassLoaderDomain.class.getDeclaredMethod("getClassLoaderSystem");
+            BaseClassLoaderSystem system = (BaseClassLoaderSystem)getClassLoaderSystem.invoke(domain);
+            if (system instanceof ClassLoaderSystem)
+            {
+               this.system = ClassLoaderSystem.class.cast(system);
+            }
+            else
+            {
+               throw new IllegalArgumentException("ClassLoaderSyatem must be instance of [" + ClassLoaderSystem.class.getName() + "]");
+            }
+         }
+      }
+      catch (Exception e)
+      {
+         throw new IllegalStateException("Could not initialize JBoss ClassLoader because JBoss5 API classes are not available", e);
+      }
+   }
+
+   public void addTransformer(ClassFileTransformer transformer)
+   {
+      Assert.notNull(transformer, "ClassFileTransformer must not be null");
+      Translator translator = new ClassFileTransformer2Translator(transformer);
+      if (setTranslator != null)
+      {
+         try
+         {
+            setTranslator.invoke(translator);
+         }
+         catch (Exception e)
+         {
+            throw new IllegalArgumentException(e);
+         }
+      }
+      else
+      {
+         system.setTranslator(translator);   
+      }
+   }
+
+   public ClassLoader getInternalClassLoader()
+   {
+      return classLoader;
+   }
+
+   public ClassLoader getThrowawayClassLoader()
+   {
+      return new BaseClassLoader(policy);
+   }
+}
\ No newline at end of file

Copied: projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5LoadTimeWeaver.java (from rev 86439, projects/spring-int/trunk/weaving/src/main/java/org/jboss/classloader/spi/base/JBoss5LoadTimeWeaver.java)
===================================================================
--- projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5LoadTimeWeaver.java	                        (rev 0)
+++ projects/spring-int/trunk/weaving/src/main/java/org/jboss/instrument/classloading/JBoss5LoadTimeWeaver.java	2009-03-28 18:00:39 UTC (rev 86441)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.instrument.classloading;
+
+import java.lang.instrument.ClassFileTransformer;
+
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.springframework.instrument.classloading.LoadTimeWeaver;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+/**
+ * {@link LoadTimeWeaver} implementation for JBoss5's instrumentable ClassLoader.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class JBoss5LoadTimeWeaver implements LoadTimeWeaver
+{
+   private JBoss5ClassLoader classLoader;
+
+   public JBoss5LoadTimeWeaver()
+   {
+      this(ClassUtils.getDefaultClassLoader());
+   }
+
+   public JBoss5LoadTimeWeaver(ClassLoader classLoader)
+   {
+      Assert.notNull(classLoader, "ClassLoader must not be null");
+      BaseClassLoader bcl = determineClassLoader(classLoader);
+      if (bcl == null)
+      {
+         throw new IllegalArgumentException(classLoader + " and its parents are not suitable ClassLoaders: " +
+               "An [" + BaseClassLoader.class.getName() + "] implementation is required.");
+      }
+      this.classLoader = new JBoss5ClassLoader(bcl);
+   }
+
+   /**
+    * Find first BaseClassLoader implementation.
+    *
+    * @param classLoader the classloader
+    * @return BaseClassLoader instance or null if not found
+    */
+   private BaseClassLoader determineClassLoader(ClassLoader classLoader)
+   {
+      for (ClassLoader cl = classLoader; cl != null; cl = cl.getParent())
+      {
+         if (cl instanceof BaseClassLoader)
+         {
+            return (BaseClassLoader)cl;
+         }
+      }
+      return null;
+   }
+
+   public void addTransformer(ClassFileTransformer transformer)
+   {
+      classLoader.addTransformer(transformer);
+   }
+
+   public ClassLoader getInstrumentableClassLoader()
+   {
+      return classLoader.getInternalClassLoader();
+   }
+
+   public ClassLoader getThrowawayClassLoader()
+   {
+      return classLoader.getThrowawayClassLoader();
+   }
+}




More information about the jboss-cvs-commits mailing list