[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