[jboss-cvs] JBossAS SVN: r86600 - in projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi: base and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Apr 1 12:31:06 EDT 2009


Author: alesj
Date: 2009-04-01 12:31:06 -0400 (Wed, 01 Apr 2009)
New Revision: 86600

Added:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/ClassFileTransformer2Translator.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/TranslatorUtils.java
Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderSystem.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
Log:
[JBCL-95]; add multiple translators.
TODO - tests.

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderSystem.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderSystem.java	2009-04-01 16:23:23 UTC (rev 86599)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderSystem.java	2009-04-01 16:31:06 UTC (rev 86600)
@@ -30,6 +30,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Collections;
 
 import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
@@ -38,6 +39,7 @@
 
 import org.jboss.classloader.plugins.system.ClassLoaderSystemBuilder;
 import org.jboss.classloader.spi.base.BaseClassLoaderSystem;
+import org.jboss.classloader.spi.translator.TranslatorUtils;
 import org.jboss.logging.Logger;
 import org.jboss.util.loading.Translator;
 
@@ -45,6 +47,7 @@
  * ClassLoaderSystem.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
 public abstract class ClassLoaderSystem extends BaseClassLoaderSystem implements ClassLoaderSystemMBean, MBeanRegistration
@@ -64,8 +67,8 @@
    /** The registered domains by name */
    private Map<String, ClassLoaderDomain> registeredDomains = new HashMap<String, ClassLoaderDomain>();
 
-   /** Any translator */
-   private Translator translator;
+   /** Any translators */
+   private List<Translator> translators;
    
    /** Whether the system is shutdown */
    private boolean shutdown = false;
@@ -514,29 +517,35 @@
     * Get the translator.
     * 
     * @return the translator.
+    * @deprecated use translator list
     */
+   @Deprecated
    public Translator getTranslator()
    {
-      return translator;
+      if (translators == null || translators.isEmpty())
+         return null;
+
+      return translators.get(0);
    }
 
    /**
     * Set the translator.
     * 
     * @param translator the translator.
+    * @deprecated use translator list
     */
+   @Deprecated
    public void setTranslator(Translator translator)
    {
       log.debug(this + " set translator to " + translator);
-      this.translator = translator;
+      translators = Collections.singletonList(translator);
    }
 
    @Override
    protected byte[] transform(ClassLoader classLoader, String className, byte[] byteCode, ProtectionDomain protectionDomain) throws Exception
    {
-      if (translator != null)
-         return translator.transform(classLoader, className, null, protectionDomain, byteCode);
-      return super.transform(classLoader, className, byteCode, protectionDomain);
+      byte[] result = TranslatorUtils.applyTranslatorsOnTransform(translators, classLoader, className, byteCode, protectionDomain);
+      return super.transform(classLoader, className, result, protectionDomain);
    }
 
    @Override
@@ -544,8 +553,7 @@
    {
       try
       {
-         if (translator != null)
-            translator.unregisterClassLoader(classLoader);
+         TranslatorUtils.applyTranslatorsAtUnregister(translators, classLoader);
       }
       catch (Throwable t)
       {
@@ -681,4 +689,60 @@
          builder.append("SHUTDOWN! ");
       super.toLongString(builder);
    }
+
+
+   /**
+    * Get the policy's translators.
+    *
+    * @return the translators
+    */
+   public List<Translator> getTranslators()
+   {
+      if (translators == null || translators.isEmpty())
+         return Collections.emptyList();
+      else
+         return Collections.unmodifiableList(translators);
+   }
+
+   /**
+    * Set the translators.
+    *
+    * @param translators the translators
+    */
+   public synchronized void setTranslators(List<Translator> translators)
+   {
+      this.translators = translators;
+   }
+
+   /**
+    * Add the translator.
+    *
+    * @param translator the translator to add
+    * @throws IllegalArgumentException for null translator
+    */
+   public synchronized void addTranslator(Translator translator)
+   {
+      if (translator == null)
+         throw new IllegalArgumentException("Null translator");
+
+      if (translators == null)
+         translators = new ArrayList<Translator>();
+
+      translators.add(translator);
+   }
+
+   /**
+    * Remove the translator.
+    *
+    * @param translator the translator to remove
+    * @throws IllegalArgumentException for null translator
+    */
+   public synchronized void removeTranslator(Translator translator)
+   {
+      if (translator == null)
+         throw new IllegalArgumentException("Null translator");
+
+      if (translators != null)
+         translators.remove(translator);
+   }
 }

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2009-04-01 16:23:23 UTC (rev 86599)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2009-04-01 16:31:06 UTC (rev 86600)
@@ -24,13 +24,16 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-
 import javax.management.ObjectName;
 
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.classloader.spi.translator.TranslatorUtils;
 import org.jboss.logging.Logger;
+import org.jboss.util.loading.Translator;
 
 /**
  * Base ClassLoader policy.<p>
@@ -39,6 +42,7 @@
  * package access to the protected methods.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
 public abstract class BaseClassLoaderPolicy
@@ -54,7 +58,10 @@
 
    /** The access control context for this policy */
    private AccessControlContext access;
-   
+
+   /** The translators */
+   private List<Translator> translators;
+
    /**
     * Create a new BaseClassLoaderPolicy.
     * 
@@ -147,10 +154,17 @@
     */
    protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain) throws Exception
    {
+      byte[] result = byteCode;
+
       BaseClassLoaderDomain domain = getClassLoaderDomain();
       if (domain != null)
-         return domain.transform(getClassLoader(), className, byteCode, protectionDomain);
-      return byteCode;
+         result = domain.transform(getClassLoader(), className, result, protectionDomain);
+
+      ClassLoader classLoader = getClassLoaderUnchecked();
+      if (classLoader != null)
+         result = TranslatorUtils.applyTranslatorsOnTransform(translators, classLoader, className, result, protectionDomain);
+
+      return result;
    }
 
    /**
@@ -322,6 +336,7 @@
       log.debug(toString() + " shutdown!");
       BaseClassLoader classLoader = this.classLoader;
       this.classLoader = null;
+      TranslatorUtils.applyTranslatorsAtUnregister(translators, classLoader);
       classLoader.shutdownClassLoader();
    }
    
@@ -337,4 +352,59 @@
           domain.clearBlackList(name);
        }
    }
+
+   /**
+    * Get the policy's translators.
+    *
+    * @return the translators
+    */
+   public List<Translator> getTranslators()
+   {
+      if (translators == null || translators.isEmpty())
+         return Collections.emptyList();
+      else
+         return Collections.unmodifiableList(translators);
+   }
+
+   /**
+    * Set the translators.
+    *
+    * @param translators the translators
+    */
+   public synchronized void setTranslators(List<Translator> translators)
+   {
+      this.translators = translators;
+   }
+
+   /**
+    * Add the translator.
+    *
+    * @param translator the translator to add
+    * @throws IllegalArgumentException for null translator
+    */
+   public synchronized void addTranslator(Translator translator)
+   {
+      if (translator == null)
+         throw new IllegalArgumentException("Null translator");
+
+      if (translators == null)
+         translators = new ArrayList<Translator>();
+
+      translators.add(translator);
+   }
+
+   /**
+    * Remove the translator.
+    *
+    * @param translator the translator to remove
+    * @throws IllegalArgumentException for null translator
+    */
+   public synchronized void removeTranslator(Translator translator)
+   {
+      if (translator == null)
+         throw new IllegalArgumentException("Null translator");
+
+      if (translators != null)
+         translators.remove(translator);
+   }
 }

Added: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/ClassFileTransformer2Translator.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/ClassFileTransformer2Translator.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/ClassFileTransformer2Translator.java	2009-04-01 16:31:06 UTC (rev 86600)
@@ -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.classloader.spi.translator;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.security.ProtectionDomain;
+
+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/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/TranslatorUtils.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/TranslatorUtils.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/translator/TranslatorUtils.java	2009-04-01 16:31:06 UTC (rev 86600)
@@ -0,0 +1,91 @@
+/*
+ * 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.classloader.spi.translator;
+
+import java.security.ProtectionDomain;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.jboss.logging.Logger;
+import org.jboss.util.loading.Translator;
+
+/**
+ * The translator utils/helper.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class TranslatorUtils
+{
+   /** The log */
+   private static final Logger log = Logger.getLogger(TranslatorUtils.class);
+
+   /**
+    * Apply transformers on transform.
+    *
+    * @param translators the translators
+    * @param classLoader the classloader
+    * @param className the class name
+    * @param byteCode the byte code
+    * @param protectionDomain the protection domain
+    * @return trabsformed bytes
+    * @throws Exception for any error
+    */
+   public static byte[] applyTranslatorsOnTransform(List<Translator> translators, ClassLoader classLoader, String className, byte[] byteCode, ProtectionDomain protectionDomain) throws Exception
+   {
+      if (translators == null || translators.isEmpty())
+         return byteCode;
+
+      byte[] result = byteCode;
+      for (Translator translator : translators)
+      {
+         result = translator.transform(classLoader, className, null, protectionDomain, result);
+      }
+      return result;
+   }
+
+   /**
+    * Apply translators on policy shutdown.
+    *
+    * @param translators the translators
+    * @param classLoader the policy's classloader
+    */
+   public static void applyTranslatorsAtUnregister(List<Translator> translators, ClassLoader classLoader)
+   {
+      if (translators != null && translators.isEmpty() == false)
+      {
+         // go in reverse order
+         ListIterator<Translator> iter = translators.listIterator(translators.size() - 1);
+         while(iter.hasPrevious())
+         {
+            Translator translator = iter.previous();
+            try
+            {
+               translator.unregisterClassLoader(classLoader);
+            }
+            catch (Exception e)
+            {
+               log.warn("Exception for translator " + translator + " on CL unregister: " + e);
+            }
+         }
+      }
+   }
+}




More information about the jboss-cvs-commits mailing list