[jboss-cvs] JBossAS SVN: r97710 - in projects/jboss-classpool/trunk/src: main/java/org/jboss/classpool/domain and 10 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Dec 10 20:48:43 EST 2009
Author: flavia.rainone at jboss.com
Date: 2009-12-10 20:48:42 -0500 (Thu, 10 Dec 2009)
New Revision: 97710
Added:
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/AbstractJBossClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/DelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/DomainRegistry.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolDomain.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdapter.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdaptorFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolRepository.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClParentDelegationStrategy.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/RegisterModuleCallback.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ScopedJBoss5ClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvoker.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvokerPoolReference.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/VFSClassLoaderDomainRegistry.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/LoaderRepositoryUrlUtil.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedJBossClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedRepositoryClassLoaderHelper.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvoker.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvokerPoolReference.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPoolFactory.java
Removed:
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/AbstractJBossClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/DelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/NonDelegatingClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/temp/
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/LoaderRepositoryUrlUtil.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedJBossClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedRepositoryClassLoaderHelper.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvoker.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvokerPoolReference.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ucl/
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ScopedJBoss5ClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvoker.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvokerPoolReference.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/
Modified:
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/AbstractParentDelegationStrategy.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/BaseClassPoolDomain.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/ParentDelegationStrategy.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/AbstractClassPoolDomain.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolDomain.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolToClassPoolDomainAdapter.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempClassPoolFactory.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossClassPool.java
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossDelegatingClassPool.java
projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/JBossCLFactory.java
projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/LoaderRegistry.java
projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java
projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/IsLocalResourcePluginFactoryTestCase.java
projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/ucl/test/UclClassPoolTest.java
Log:
[JBREFLECT-75] Prepare for splitting of classpool project. Removed package names that referenced AS version numbers. It makes no sense to use an as5 classpool module for AS6.
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/AbstractParentDelegationStrategy.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/AbstractParentDelegationStrategy.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/AbstractParentDelegationStrategy.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -27,7 +27,7 @@
import org.jboss.classpool.domain.AbstractClassPoolDomain;
import org.jboss.classpool.domain.ClassPoolDomain;
import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdaptorFactory;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import org.jboss.logging.Logger;
/**
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/BaseClassPoolDomain.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/BaseClassPoolDomain.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/BaseClassPoolDomain.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -27,7 +27,7 @@
import org.jboss.classpool.domain.AbstractClassPoolDomain;
import org.jboss.classpool.domain.ClassPoolDomain;
import org.jboss.classpool.helpers.ClassLoaderUtils;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import javassist.CtClass;
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/ParentDelegationStrategy.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/ParentDelegationStrategy.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/base/ParentDelegationStrategy.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -25,7 +25,7 @@
import javassist.CtClass;
import org.jboss.classpool.domain.ClassPoolDomain;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
/**
*
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/AbstractClassPoolDomain.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/AbstractClassPoolDomain.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/AbstractClassPoolDomain.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -22,7 +22,7 @@
package org.jboss.classpool.domain;
import org.jboss.classpool.base.BaseClassPool;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import org.jboss.logging.Logger;
import javassist.ClassPool;
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolDomain.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolDomain.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolDomain.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -23,7 +23,7 @@
import javassist.CtClass;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
/**
*
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolToClassPoolDomainAdapter.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolToClassPoolDomainAdapter.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/domain/ClassPoolToClassPoolDomainAdapter.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -22,7 +22,7 @@
package org.jboss.classpool.domain;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import javassist.ClassPool;
import javassist.CtClass;
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/AbstractJBossClassPoolFactory.java (from rev 97702, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/AbstractJBossClassPoolFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/AbstractJBossClassPoolFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/AbstractJBossClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,67 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.plugins.temp.TempJBossClassPool;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.classpool.spi.AbstractClassPoolFactory;
+import org.jboss.logging.Logger;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public abstract class AbstractJBossClassPoolFactory extends AbstractClassPoolFactory
+{
+ protected final Logger log = Logger.getLogger(this.getClass().getName());
+
+ protected ClassPool getCreateParentClassPools(final ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ //Make sure that we get classpools for all the parent classloaders
+ // TODO remove this?
+ if (cl == null)
+ {
+ return defaultClassPool;
+ }
+ ClassLoader parent = SecurityActions.getParent(cl);
+
+ if (parent != null)
+ {
+ return repository.registerClassLoader(parent);
+ }
+ else
+ {
+ return defaultClassPool;
+ }
+ }
+
+ public AbstractClassPool create(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ return new TempJBossClassPool(src, repository);
+ }
+
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/DelegatingClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/DelegatingClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/DelegatingClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/DelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,135 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins;
+
+
+import org.jboss.classpool.base.BaseClassPool;
+import org.jboss.classpool.domain.AbstractClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.helpers.ClassLoaderUtils;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * Base class for classpools backed by a domain
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class DelegatingClassPool extends BaseClassPool
+{
+ private final ClassPoolDomain domain;
+
+ private boolean closed;
+
+ public DelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent, ScopedClassPoolRepository repository)
+ {
+ super(cl, parent, repository);
+ if (domain == null)
+ {
+ throw new IllegalArgumentException("Domain was null");
+ }
+ if (domain instanceof AbstractClassPoolDomain == false)
+ {
+ throw new IllegalArgumentException("Domain must implement AbstractClassPoolDomain");
+ }
+ if (logger.isTraceEnabled()) logger.trace(this + " domain:" + this);
+ this.domain = domain;
+ this.domain.addClassPool(this);
+ }
+
+ public CtClass loadLocally(String classname, String resourceName, boolean create)
+ {
+ boolean trace = logger.isTraceEnabled();
+ if (trace) logger.trace(this + " attempt to load locally " + classname);
+
+ CtClass clazz = null;
+ if (isLocalResource(resourceName, trace))
+ {
+ clazz = getCachedLocally(classname);
+ if (clazz == null && create)
+ {
+ clazz = createCtClass(classname, true);
+ }
+ }
+ if (trace) logger.trace(this + " loaded locally " + classname + " " + getClassPoolLogStringForClass(clazz));
+ return clazz;
+ }
+
+ /**
+ * Overrides ClassPool.get0() so that we can look up classes without caching them in the initiating pool.
+ * The DelgatingClassPool + DomainClassPool handle the caching in the correct pool + handles the
+ * parentFirst functionality
+ */
+ @Override
+ public synchronized CtClass get0(String classname, boolean useCache) throws NotFoundException
+ {
+ if (isGeneratedClass(classname))
+ {
+ return null;
+ }
+ CtClass clazz = domain.getCachedOrCreate(this, classname, true);
+ if (clazz == null)
+ {
+ //It is probably a generated proxy. The package name can be different (for example if it is
+ //a proxy for a java system class) than the package names exported by the loaders.
+ //TODO It should be possible to remove this once these have been done:
+ //https://jira.jboss.org/jira/browse/JBCL-25
+ //https://jira.jboss.org/jira/browse/JBCL-92
+ clazz = loadLocally(classname, ClassLoaderUtils.getResourceName(classname), true);
+ }
+ return clazz;
+ }
+
+ @Override
+ public boolean isUnloadedClassLoader()
+ {
+ return closed;
+ }
+
+ @Override
+ public void close()
+ {
+ closed = true;
+ super.close();
+ domain.removeClassPool(this);
+ }
+
+ @Override
+ public CtClass getCached(String classname)
+ {
+ if (isGeneratedClass(classname))
+ {
+ return null;
+ }
+ return domain.getCachedOrCreate(this, classname, false);
+ }
+
+ @Override
+ public String toString()
+ {
+ return "[" + super.toString() + " domain: " + domain + "]";
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/NonDelegatingClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,69 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins;
+
+import org.jboss.classpool.base.BaseClassPool;
+import org.jboss.classpool.spi.AbstractClassPool;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+
+/**
+ * ClassPool for class loaders not backed by a repository/classloading domain
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class NonDelegatingClassPool extends BaseClassPool
+{
+ public NonDelegatingClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, boolean parentFirst)
+ {
+ super(cl, src, repository, AbstractClassPool.SEARCH_LOCAL_ONLY_STRATEGY);
+ super.childFirstLookup = !parentFirst;
+ }
+
+ @Override
+ public CtClass createCtClass(String classname, boolean useCache)
+ {
+ boolean trace = logger.isTraceEnabled();
+ CtClass clazz = null;
+ if (!childFirstLookup)
+ {
+ if (trace)logger.trace(this + " attempting to create " + classname + " in parent pool (parentFirst)");
+ clazz = createParentCtClass(classname, useCache, trace);
+ }
+ if (clazz == null && isLocalResource(getResourceName(classname), trace))
+ {
+ clazz = super.createCtClass(classname, useCache);
+ }
+ if (childFirstLookup && clazz == null)
+ {
+ if (trace)logger.trace(this + " attempting to create " + classname + " in parent pool (parentLast)");
+ clazz = createParentCtClass(classname, useCache, trace);
+ }
+
+ if (trace)logger.trace(this + " created " + classname + " " + getClassPoolLogStringForClass(clazz));
+ return clazz;
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/SecurityActions.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/SecurityActions.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/SecurityActions.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,80 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins;
+
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+class SecurityActions
+{
+ interface GetParentAction
+ {
+ ClassLoader getParent(ClassLoader loader);
+
+ GetParentAction NON_PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(ClassLoader loader)
+ {
+ return loader.getParent();
+ }
+ };
+
+ GetParentAction PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(final ClassLoader loader)
+ {
+ try
+ {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
+ {
+ public ClassLoader run() throws Exception
+ {
+ return loader.getParent();
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ throw new RuntimeException(e.getException());
+ }
+ }
+ };
+ }
+
+ public static ClassLoader getParent(ClassLoader loader)
+ {
+ if (System.getSecurityManager() == null)
+ {
+ return GetParentAction.NON_PRIVILEGED.getParent(loader);
+ }
+ else
+ {
+ return GetParentAction.PRIVILEGED.getParent(loader);
+ }
+ }
+}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/AbstractJBossClassPoolFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/AbstractJBossClassPoolFactory.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/AbstractJBossClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,67 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as;
-
-import javassist.ClassPool;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classpool.plugins.as.temp.TempJBossClassPool;
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.AbstractClassPoolFactory;
-import org.jboss.logging.Logger;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public abstract class AbstractJBossClassPoolFactory extends AbstractClassPoolFactory
-{
- protected final Logger log = Logger.getLogger(this.getClass().getName());
-
- protected ClassPool getCreateParentClassPools(final ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
- {
- //Make sure that we get classpools for all the parent classloaders
- // TODO remove this?
- if (cl == null)
- {
- return defaultClassPool;
- }
- ClassLoader parent = SecurityActions.getParent(cl);
-
- if (parent != null)
- {
- return repository.registerClassLoader(parent);
- }
- else
- {
- return defaultClassPool;
- }
- }
-
- public AbstractClassPool create(ClassPool src, ScopedClassPoolRepository repository)
- {
- return new TempJBossClassPool(src, repository);
- }
-
-
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/DelegatingClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/DelegatingClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/DelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,135 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as;
-
-
-import org.jboss.classpool.base.BaseClassPool;
-import org.jboss.classpool.domain.AbstractClassPoolDomain;
-import org.jboss.classpool.domain.ClassPoolDomain;
-import org.jboss.classpool.helpers.ClassLoaderUtils;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.NotFoundException;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-/**
- * Base class for classpools backed by a domain
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class DelegatingClassPool extends BaseClassPool
-{
- private final ClassPoolDomain domain;
-
- private boolean closed;
-
- public DelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent, ScopedClassPoolRepository repository)
- {
- super(cl, parent, repository);
- if (domain == null)
- {
- throw new IllegalArgumentException("Domain was null");
- }
- if (domain instanceof AbstractClassPoolDomain == false)
- {
- throw new IllegalArgumentException("Domain must implement AbstractClassPoolDomain");
- }
- if (logger.isTraceEnabled()) logger.trace(this + " domain:" + this);
- this.domain = domain;
- this.domain.addClassPool(this);
- }
-
- public CtClass loadLocally(String classname, String resourceName, boolean create)
- {
- boolean trace = logger.isTraceEnabled();
- if (trace) logger.trace(this + " attempt to load locally " + classname);
-
- CtClass clazz = null;
- if (isLocalResource(resourceName, trace))
- {
- clazz = getCachedLocally(classname);
- if (clazz == null && create)
- {
- clazz = createCtClass(classname, true);
- }
- }
- if (trace) logger.trace(this + " loaded locally " + classname + " " + getClassPoolLogStringForClass(clazz));
- return clazz;
- }
-
- /**
- * Overrides ClassPool.get0() so that we can look up classes without caching them in the initiating pool.
- * The DelgatingClassPool + DomainClassPool handle the caching in the correct pool + handles the
- * parentFirst functionality
- */
- @Override
- public synchronized CtClass get0(String classname, boolean useCache) throws NotFoundException
- {
- if (isGeneratedClass(classname))
- {
- return null;
- }
- CtClass clazz = domain.getCachedOrCreate(this, classname, true);
- if (clazz == null)
- {
- //It is probably a generated proxy. The package name can be different (for example if it is
- //a proxy for a java system class) than the package names exported by the loaders.
- //TODO It should be possible to remove this once these have been done:
- //https://jira.jboss.org/jira/browse/JBCL-25
- //https://jira.jboss.org/jira/browse/JBCL-92
- clazz = loadLocally(classname, ClassLoaderUtils.getResourceName(classname), true);
- }
- return clazz;
- }
-
- @Override
- public boolean isUnloadedClassLoader()
- {
- return closed;
- }
-
- @Override
- public void close()
- {
- closed = true;
- super.close();
- domain.removeClassPool(this);
- }
-
- @Override
- public CtClass getCached(String classname)
- {
- if (isGeneratedClass(classname))
- {
- return null;
- }
- return domain.getCachedOrCreate(this, classname, false);
- }
-
- @Override
- public String toString()
- {
- return "[" + super.toString() + " domain: " + domain + "]";
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/NonDelegatingClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/NonDelegatingClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/NonDelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,69 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as;
-
-import org.jboss.classpool.base.BaseClassPool;
-import org.jboss.classpool.spi.AbstractClassPool;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-
-/**
- * ClassPool for class loaders not backed by a repository/classloading domain
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class NonDelegatingClassPool extends BaseClassPool
-{
- public NonDelegatingClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, boolean parentFirst)
- {
- super(cl, src, repository, AbstractClassPool.SEARCH_LOCAL_ONLY_STRATEGY);
- super.childFirstLookup = !parentFirst;
- }
-
- @Override
- public CtClass createCtClass(String classname, boolean useCache)
- {
- boolean trace = logger.isTraceEnabled();
- CtClass clazz = null;
- if (!childFirstLookup)
- {
- if (trace)logger.trace(this + " attempting to create " + classname + " in parent pool (parentFirst)");
- clazz = createParentCtClass(classname, useCache, trace);
- }
- if (clazz == null && isLocalResource(getResourceName(classname), trace))
- {
- clazz = super.createCtClass(classname, useCache);
- }
- if (childFirstLookup && clazz == null)
- {
- if (trace)logger.trace(this + " attempting to create " + classname + " in parent pool (parentLast)");
- clazz = createParentCtClass(classname, useCache, trace);
- }
-
- if (trace)logger.trace(this + " created " + classname + " " + getClassPoolLogStringForClass(clazz));
- return clazz;
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/SecurityActions.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/SecurityActions.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,80 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as;
-
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-class SecurityActions
-{
- interface GetParentAction
- {
- ClassLoader getParent(ClassLoader loader);
-
- GetParentAction NON_PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(ClassLoader loader)
- {
- return loader.getParent();
- }
- };
-
- GetParentAction PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(final ClassLoader loader)
- {
- try
- {
- return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
- {
- public ClassLoader run() throws Exception
- {
- return loader.getParent();
- }
- });
- }
- catch (PrivilegedActionException e)
- {
- throw new RuntimeException(e.getException());
- }
- }
- };
- }
-
- public static ClassLoader getParent(ClassLoader loader)
- {
- if (System.getSecurityManager() == null)
- {
- return GetParentAction.NON_PRIVILEGED.getParent(loader);
- }
- else
- {
- return GetParentAction.PRIVILEGED.getParent(loader);
- }
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,84 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as4;
-
-import java.io.File;
-import java.net.URL;
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.mx.loading.RepositoryClassLoader;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @author adrian at jboss.org
- * @version $Revision$
- */
-public class JBossClassPool extends AbstractClassPool implements ToClassInvokerPoolReference
-{
- ToClassInvoker toClassInvoker = null;
-
- protected JBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
- {
- super(cl, src, repository);
- toClassInvoker = new ToClassInvoker(tmp);
- }
-
- protected JBossClassPool(ClassPool src, ScopedClassPoolRepository repository)
- {
- super(src, repository);
- }
-
- public boolean isUnloadedClassLoader()
- {
- if (getClassLoader() instanceof RepositoryClassLoader)
- {
- RepositoryClassLoader rcl = (RepositoryClassLoader) getClassLoader();
- return rcl.getLoaderRepository() == null;
- }
- return false;
- }
-
- public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
- {
- return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
- }
-
- public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
- {
- return super.toClass(cc, loader, domain);
- }
-
- @Override
- public void lockInCache(CtClass clazz)
- {
- super.lockInCache(clazz);
- localResources.put(getResourceName(clazz.getName()), Boolean.TRUE);
- }
-}
\ No newline at end of file
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPoolFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPoolFactory.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,129 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as4;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-import javassist.ClassPool;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classpool.plugins.as.AbstractJBossClassPoolFactory;
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.AbstractClassPoolFactory;
-import org.jboss.mx.loading.RepositoryClassLoader;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @author adrian at jboss.org
- * @version $Revision$
- **/
-public class JBossClassPoolFactory extends AbstractJBossClassPoolFactory
-{
- protected File tmpClassesDir;
-
- public JBossClassPoolFactory(File tmpClassesDir) throws IOException
- {
- this.tmpClassesDir = tmpClassesDir;
-
- }
- public AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
- {
- ClassPool parent = getCreateParentClassPools(cl, src, repository);
- if (cl instanceof RepositoryClassLoader)
- {
- File tempdir = getTempDirectory(cl);
- URL tmpCP;
- try
- {
- tmpCP = createURLAndAddToLoader(cl, tempdir);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- if (ScopedRepositoryClassLoaderHelper.isScopedClassLoader(cl))
- {
- //It is scoped
- return new ScopedJBossClassPool(cl, parent, repository, tempdir, tmpCP);
- }
- return new JBossClassPool(cl, parent, repository, tempdir, tmpCP);
- }
- return new AbstractClassPool(cl, parent, repository);
- }
-
- protected File getTempDirectory(ClassLoader cl)
- {
- File tempdir = null;
- int attempts = 0;
- IOException ex = null;
- while (tempdir == null && attempts < 5)
- {
- //Workaround for JBAOP-254, retry a few times
- try
- {
- tempdir = createTempDir(cl);
- }
- catch (IOException e)
- {
- ex = e;
- }
- }
-
- if (tempdir == null)
- {
- throw new RuntimeException("", ex);
- }
-
- return tempdir;
- }
-
- public File createTempDir(ClassLoader cl) throws IOException
- {
- File tempdir = File.createTempFile("ucl", "", tmpClassesDir);
- tempdir.delete();
- tempdir.mkdir();
- tempdir.deleteOnExit();
-
- return tempdir;
- }
-
- private URL createURLAndAddToLoader(ClassLoader cl, File tempdir) throws IOException
- {
- URL tmpURL = tempdir.toURL();
- URL tmpCP = new URL(tmpURL, "?dynamic=true");
-
- RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
-
- // We may be undeploying.
- if (ucl.getLoaderRepository() != null)
- {
- ucl.addURL(tmpCP);
- }
-
- return tmpCP;
- }
-
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/LoaderRepositoryUrlUtil.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/LoaderRepositoryUrlUtil.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/LoaderRepositoryUrlUtil.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,173 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as4;
-
-import java.net.URL;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanServer;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-
-import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
-import org.jboss.mx.loading.LoaderRepository;
-import org.jboss.mx.util.MBeanServerLocator;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class LoaderRepositoryUrlUtil implements NotificationListener
-{
- final static MBeanServer SERVER;
- final static ObjectName MAIN_LOADER_REPOSITORY_OBJECT_NAME;
- final static LoaderRepository MAIN_LOADER_REPOSITORY;
- static
- {
- SERVER = MBeanServerLocator.locateJBoss();
- try
- {
- MAIN_LOADER_REPOSITORY_OBJECT_NAME = new ObjectName("JMImplementation:name=Default,service=LoaderRepository");
- MAIN_LOADER_REPOSITORY = (LoaderRepository)SERVER.invoke(MAIN_LOADER_REPOSITORY_OBJECT_NAME, "getInstance", new Object[0], new String[0]);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- long currentSequenceNumber;
- long lastSequenceNumber = -1;
- URL[] urls;
-
- public LoaderRepositoryUrlUtil()
- {
- try
- {
- SERVER.addNotificationListener(MAIN_LOADER_REPOSITORY_OBJECT_NAME, this, null, null);
- }
- catch (InstanceNotFoundException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public synchronized void handleNotification(Notification notification, Object handback)
- {
- if (notification.getType().equals(LoaderRepository.CLASSLOADER_ADDED))
- {
- currentSequenceNumber = notification.getSequenceNumber();
- }
- else if (notification.getType().equals(LoaderRepository.CLASSLOADER_REMOVED))
- {
- currentSequenceNumber = notification.getSequenceNumber();
- }
- }
-
- public synchronized UrlInfo getURLInfo(HeirarchicalLoaderRepository3 scopedLoader, UrlInfo urlInfo)
- {
- boolean changed = false;
- if (lastSequenceNumber != currentSequenceNumber)
- {
- urls = MAIN_LOADER_REPOSITORY.getURLs();
- lastSequenceNumber = currentSequenceNumber;
- changed = true;
- }
- if (!changed)
- {
- changed = urlInfo != null && (urlInfo.getSequenceNumber() != lastSequenceNumber);
- }
- if (urlInfo == null || changed)
- {
- URL[] localUrls = getLocalUrls(scopedLoader, urls);
- urlInfo = new UrlInfo(urls, localUrls, lastSequenceNumber);
- }
- return urlInfo;
- }
-
- public long getCurrentSequenceNumber()
- {
- return currentSequenceNumber;
- }
-
- private URL[] getLocalUrls(HeirarchicalLoaderRepository3 scopedRepository, URL[] globalUrls)
- {
- URL[] scopedRepositoryUrls = scopedRepository.getURLs();
-
- //This is a bit of a hack, since this relies on the order of the urls returned by HeirarchicalLoaderRepository3
- //My urls, followed by parent urls.
- int scopedLength = 0;
- for (int i = 0 ; i < scopedRepositoryUrls.length ; i++)
- {
- for (int j = 0 ; j < globalUrls.length ; j ++)
- {
- if (scopedRepositoryUrls[i].equals(globalUrls[j]))
- {
- scopedLength = i;
- break;
- }
- }
- if (scopedLength > 0)
- {
- break;
- }
- }
-
- URL[] localUrls = new URL[scopedLength];
- System.arraycopy(scopedRepositoryUrls, 0, localUrls, 0, scopedLength);
- return localUrls;
- }
-
- public class UrlInfo
- {
-
- URL[] globalUrls;
- URL[] localUrls;
- long sequenceNumber;
-
- public UrlInfo(URL[] globalUrls, URL[] localUrls, long sequenceNumber)
- {
- super();
- this.globalUrls = globalUrls;
- this.localUrls = localUrls;
- this.sequenceNumber = sequenceNumber;
- }
-
- public URL[] getGlobalUrls()
- {
- return globalUrls;
- }
-
- public URL[] getLocalUrls()
- {
- return localUrls;
- }
-
- public long getSequenceNumber()
- {
- return sequenceNumber;
- }
- }
-
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedJBossClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedJBossClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedJBossClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,273 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as4;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.NotFoundException;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classpool.plugins.as4.LoaderRepositoryUrlUtil.UrlInfo;
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.ClassPoolRepository;
-import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
-import org.jboss.mx.loading.LoaderRepository;
-import org.jboss.mx.loading.RepositoryClassLoader;
-
-/**
- * A classpool in JBoss backed by a scoped (HierarchicalLoaderRepository) loader repository
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class ScopedJBossClassPool extends JBossClassPool
-{
- final static LoaderRepositoryUrlUtil LOADER_REPOSITORY_UTIL = new LoaderRepositoryUrlUtil();
-
- private UrlInfo urlInfo;
- private ThreadLocal<ClassPool> lastPool = new ThreadLocal<ClassPool>();
-
- public ScopedJBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
- {
- super(cl, src, repository, tmp, tmpURL);
-
- boolean parentFirst = false;
- LoaderRepository loaderRepository = null;
- ClassLoader prnt = cl;
- while (prnt != null)
- {
- if (prnt instanceof RepositoryClassLoader)
- {
- loaderRepository = ((RepositoryClassLoader)prnt).getLoaderRepository();
- if (loaderRepository instanceof HeirarchicalLoaderRepository3)
- {
- parentFirst = ((HeirarchicalLoaderRepository3)loaderRepository).getUseParentFirst();
- }
- break;
- }
- prnt = SecurityActions.getParent(cl);
- }
-
- super.childFirstLookup = !parentFirst;
- }
-
-
- private HeirarchicalLoaderRepository3 getRepository()
- {
- ClassLoader cl = getClassLoader0();
- if (cl != null)
- {
- return (HeirarchicalLoaderRepository3)((RepositoryClassLoader)cl).getLoaderRepository();
- }
- return null;
- }
-
- private URL getResourceUrlForClass(String resourcename)
- {
- HeirarchicalLoaderRepository3 repo = getRepository();
- return repo.getResource(resourcename, super.getClassLoader());
- }
-
- private boolean isMine(URL url)
- {
- HeirarchicalLoaderRepository3 repo = getRepository();
- if (repo != null)
- {
- //The URL of the class loaded with my scoped classloader
- if (url != null)
- {
- urlInfo = LOADER_REPOSITORY_UTIL.getURLInfo(getRepository(), urlInfo);
-
- URL[] myUrls = urlInfo.getLocalUrls();
- String resource = url.toString();
- for (int i = 0 ; i < myUrls.length ; i++)
- {
- if (resource.indexOf(myUrls[i].toString()) >= 0)
- {
- return true;
- }
- }
- return false;
- }
- }
- return true;
- }
-
- public CtClass getCached(String classname)
- {
- if (classname == null)
- {
- return null;
- }
- if (isUnloadedClassLoader())
- {
- return null;
- }
-
- if (generatedClasses.get(classname) != null)
- {
- //It is a new class, and this callback is probably coming from the frozen check when creating a new nested class
- return super.getCached(classname);
- }
-
- //Is this from the scoped classloader itself of from the parent?
- String resourcename = getResourceName(classname);
- URL url = getResourceUrlForClass(resourcename);
- boolean isMine = isMine(url);
-
- if (isMine)
- {
- if (super.childFirstLookup)
- {
- //Parent delegation is false, attempt to get this class out of ourselves
- CtClass clazz = super.getCachedLocally(classname);
- if (clazz == null)
- {
- clazz = createCtClass(classname, false);
- if (clazz != null)
- {
- lockInCache(clazz);
- }
- }
- if (clazz != null)
- {
- return clazz;
- }
- }
- return super.getCached(classname);
- }
-
-
- try
- {
- ClassPool pool = getCorrectPoolForResource(classname, url);
- if (pool != lastPool.get())
- {
- lastPool.set(pool);
- return pool.get(classname);
- }
- }
- catch (NotFoundException e)
- {
- }
- catch(StackOverflowError e)
- {
- throw e;
- }
- finally
- {
- lastPool.set(null);
- }
-
- return null;
- }
-
- @Override
- protected boolean includeInGlobalSearch()
- {
- return false;
- }
-
- private ClassPool getCorrectPoolForResource(String classname, URL url)
- {
- ClassPoolRepository classPoolRepository = ClassPoolRepository.getInstance();
- synchronized(classPoolRepository.getRegisteredCLs())
- {
- //JBoss 5 has an extra NoAnnotationURLCLassLoader that is not on the default path, make sure that that is checked at the end
- //FIXME This needs revisiting/removing once the
- ArrayList<AbstractClassPool> noAnnotationURLClassLoaderPools = null;
- String resource = url.toString();
- for(ClassPool pool : classPoolRepository.getRegisteredCLs().values())
- {
- AbstractClassPool candidate = (AbstractClassPool)pool;
- if (candidate.isUnloadedClassLoader())
- {
- classPoolRepository.unregisterClassLoader(candidate.getClassLoader());
- continue;
- }
-
- if (candidate.getClassLoader() instanceof RepositoryClassLoader)
- {
- //Sometimes the ClassLoader is a proxy for MBeanProxyExt?!
- RepositoryClassLoader rcl = (RepositoryClassLoader)candidate.getClassLoader();
- URL[] urls = rcl.getClasspath();
-
- for (int i = 0 ; i < urls.length ; i++)
- {
- if (resource.indexOf(urls[i].getFile()) >= 0)
- {
- return candidate;
- }
- }
- }
- //FIXME Remove once we have the JBoss 5 version of pool
- else if (isInstanceOfNoAnnotationURLClassLoader(candidate.getClassLoader()))
- {
- if (noAnnotationURLClassLoaderPools == null)
- {
- noAnnotationURLClassLoaderPools = new ArrayList<AbstractClassPool>();
- }
- noAnnotationURLClassLoaderPools.add(candidate);
- }
- }
-
- //FIXME Remove once we have the JBoss 5 version of pool
- if (noAnnotationURLClassLoaderPools != null)
- {
- for (AbstractClassPool pool : noAnnotationURLClassLoaderPools)
- {
- try
- {
- pool.get(classname);
- return pool;
- }
- catch(NotFoundException ignoreTryNext)
- {
- }
- }
- }
- }
- return ClassPoolRepository.getInstance().getClassPoolFactory().
- create(ClassPool.getDefault(), ClassPoolRepository.getInstance());
- }
-
- /**
- * NoAnnotationURLCLassLoader lives in different packages in JBoss 4 and 5
- */
- private boolean isInstanceOfNoAnnotationURLClassLoader(ClassLoader loader)
- {
- Class<?> parent = loader.getClass();
- while (parent != null)
- {
- if ("NoAnnotationURLClassLoader".equals(parent.getSimpleName()))
- {
- return true;
- }
- parent = parent.getSuperclass();
- }
- return false;
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedRepositoryClassLoaderHelper.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedRepositoryClassLoaderHelper.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedRepositoryClassLoaderHelper.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,51 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as4;
-
-import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
-import org.jboss.mx.loading.LoaderRepository;
-import org.jboss.mx.loading.RepositoryClassLoader;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @autor adrian at jboss.org
- * @version $Revision$
- */
-public class ScopedRepositoryClassLoaderHelper
-{
- public static boolean isScopedClassLoader(ClassLoader loader)
- {
- boolean scoped = false;
- if (loader instanceof RepositoryClassLoader)
- {
- LoaderRepository repository = ((RepositoryClassLoader)loader).getLoaderRepository();
- if (repository instanceof HeirarchicalLoaderRepository3)
- {
- scoped = true;
- //HeirarchicalLoaderRepository3 hlr = (HeirarchicalLoaderRepository3)repository;
- //boolean parentFirst = hlr.getUseParentFirst();
- }
- }
- return scoped;
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/SecurityActions.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/SecurityActions.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,84 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as4;
-
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-class SecurityActions
-{
- interface GetParentAction
- {
- ClassLoader getParent(ClassLoader loader);
-
- GetParentAction NON_PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(ClassLoader loader)
- {
- return loader.getParent();
- }
- };
-
- GetParentAction PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(final ClassLoader loader)
- {
- try
- {
- return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
- {
- public ClassLoader run() throws Exception
- {
- return loader.getParent();
- }
- });
- }
- catch (PrivilegedActionException e)
- {
- throw new RuntimeException(e.getException());
- }
- }
- };
- }
-
- public static ClassLoader getParent(ClassLoader loader)
- {
- if (loader == null)
- {
- return null;
- }
- if (System.getSecurityManager() == null)
- {
- return GetParentAction.NON_PRIVILEGED.getParent(loader);
- }
- else
- {
- return GetParentAction.PRIVILEGED.getParent(loader);
- }
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvoker.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvoker.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvoker.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,103 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as4;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.CtClass;
-
-import org.jboss.logging.Logger;
-import org.jboss.mx.loading.RepositoryClassLoader;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class ToClassInvoker
-{
- Logger logger = Logger.getLogger(this.getClass());
-
- public File tmpDir;
-
- public Object tmplock = new Object();
-
- public ToClassInvoker(File tmpDir)
- {
- this.tmpDir = tmpDir;
- }
-
- public Class<?> toClass(ToClassInvokerPoolReference pool, CtClass cc, String classFileName, ClassLoader loader, ProtectionDomain domain)
- throws CannotCompileException
- {
- boolean trace = logger.isTraceEnabled();
- pool.lockInCache(cc);
- final ClassLoader myloader = pool.getClassLoader();
- if (myloader == null || tmpDir == null)
- {
- if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " tmpDir:" + tmpDir + " default to superPool.toClass for " + cc.getName());
- Class<?> clazz = pool.superPoolToClass(cc, loader, domain);
- if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
- return clazz;
- }
- Class<?> dynClass = null;
- try
- {
- File classFile = null;
- // Write the clas file to the tmpdir
- synchronized (tmplock)
- {
- classFile = new File(tmpDir, classFileName);
- if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " writing bytes to " + classFile);
- File pkgDirs = classFile.getParentFile();
- pkgDirs.mkdirs();
- FileOutputStream stream = new FileOutputStream(classFile);
- stream.write(cc.toBytecode());
- stream.flush();
- stream.close();
- classFile.deleteOnExit();
- }
- // We have to clear Blacklist caches or the class will never
- // be found
- //((UnifiedClassLoader)dcl).clearBlacklists();
- // To be backward compatible
- RepositoryClassLoader rcl = (RepositoryClassLoader)myloader;
- rcl.clearClassBlackList();
- rcl.clearResourceBlackList();
-
- // Now load the class through the cl
- dynClass = myloader.loadClass(cc.getName());
- if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + dynClass);
- return dynClass;
- }
- catch (Exception ex)
- {
- ClassFormatError cfe = new ClassFormatError("Failed to load dyn class: " + cc.getName());
- cfe.initCause(ex);
- throw cfe;
- }
- }
-
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvokerPoolReference.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvokerPoolReference.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvokerPoolReference.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,39 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as4;
-
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.CtClass;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public interface ToClassInvokerPoolReference
-{
- Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException;
- ClassLoader getClassLoader();
- void lockInCache(CtClass clazz);
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,51 +0,0 @@
-package org.jboss.classpool.plugins.as5;
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.
-*/
-
-
-import org.jboss.classloader.spi.ClassLoaderDomain;
-import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloading.spi.dependency.Module;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public interface DomainRegistry
-{
- ClassLoaderSystem getSystem();
-
- ClassLoaderDomain getDefaultDomain();
-
- boolean initMapsForModule(Module module);
-
- void cleanupModule(Module module);
-
- ClassLoaderDomain getClassLoaderDomainForLoader(ClassLoader cl);
-
- ClassLoader getParentUnitLoader(ClassLoader loader);
-
- Module getModule(ClassLoader loader);
-
- ClassLoader getClassLoader(Module module);
-}
\ No newline at end of file
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,76 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.net.URL;
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classpool.spi.AbstractClassPool;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-class JBoss5ClassPool extends AbstractClassPool implements ToClassInvokerPoolReference
-{
- protected ToClassInvoker toClassInvoker = null;
-
- boolean closed;
-
- protected JBoss5ClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, URL tmpURL)
- {
- super(cl, src, repository);
- toClassInvoker = new ToClassInvoker(tmpURL);
- }
-
- protected JBoss5ClassPool(ClassPool src, ScopedClassPoolRepository repository)
- {
- super(src, repository);
- }
-
- public boolean isUnloadedClassLoader()
- {
- return closed;
- }
-
- public void close()
- {
- closed = true;
- super.close();
- }
-
- public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
- {
- return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
- }
-
- public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
- {
- return super.toClass(cc, loader, domain);
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPoolFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPoolFactory.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,102 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt 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.classpool.plugins.as5;
-
-import java.net.URL;
-
-import javassist.ClassPool;
-import javassist.scopedpool.ScopedClassPoolFactory;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classloader.spi.ClassLoaderDomain;
-import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloading.spi.RealClassLoader;
-import org.jboss.classloading.spi.dependency.Module;
-import org.jboss.classpool.plugins.as.AbstractJBossClassPoolFactory;
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.ClassPoolRepository;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @author adrian at jboss.org
- * @version $Revision$
- **/
- at Deprecated
-public class JBoss5ClassPoolFactory extends AbstractJBossClassPoolFactory implements ScopedClassPoolFactory
-{
- private DomainRegistry registry;
-
- public JBoss5ClassPoolFactory(DomainRegistry registry)
- {
- this.registry = registry;
- }
-
- public AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
- {
- ClassPool parent = getCreateParentClassPools(cl, src, repository);
-
- AbstractClassPool pool = null;
-
- if (cl instanceof RealClassLoader)
- {
- Module module = registry.getModule(cl);
- if (module != null && module.getDeterminedParentDomainName() != null)
- {
- //It is scoped
- ClassLoaderSystem sys = registry.getSystem();
- ClassLoaderDomain domain = sys.getDomain(module.getDeterminedDomainName());
- boolean parentFirst = module.isJ2seClassLoadingCompliance();
- ClassPool parentDomainPool = getParentUnitClassPool(cl);
- pool = new ScopedJBoss5ClassPool(cl, parent, parentDomainPool, repository, getTempURL(module), parentFirst, domain);
- }
- else
- {
- pool = new JBoss5ClassPool(cl, parent, repository, getTempURL(module));
- }
- }
-
- if (pool == null)
- {
- pool = new AbstractClassPool(cl, parent, repository);
- }
- log.debug("Created pool " + pool + " for loader " + cl);
-
- return pool;
- }
-
- private ClassPool getParentUnitClassPool(ClassLoader cl)
- {
- ClassLoader parent = registry.getParentUnitLoader(cl);
- return ClassPoolRepository.getInstance().registerClassLoader(parent);
- }
-
-
- private URL getTempURL(Module module)
- {
- if (module == null)
- return null;
-
- return module.getDynamicClassRoot();
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,95 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.jboss.classloading.spi.dependency.Module;
-import org.jboss.classloading.spi.dependency.ModuleRegistry;
-import org.jboss.classpool.plugins.as5.jbosscl.JBossClDelegatingClassPoolRepository;
-import org.jboss.logging.Logger;
-
-/**
- * Use with org.jboss.classpool.jbosscl.JBossClDelegatingClassPoolFactory
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @author <a href="ales.justin at jboss.com">Ales Justin</a>
- * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
- * @version $Revision$
- */
-public class RegisterModuleCallback implements ModuleRegistry
-{
- Logger logger = Logger.getLogger(this.getClass());
-
- private Set<Module> registeredModules = new HashSet<Module>();
- private Set<Module> unregisteredModules = new HashSet<Module>();
- private DomainRegistry domainRegistry;
-
- public RegisterModuleCallback(DomainRegistry domainRegistry)
- {
- this.domainRegistry = domainRegistry;
- }
-
- public synchronized void addModule(Module module)
- {
- if (logger.isTraceEnabled())
- {
- logger.trace("Adding module " + module);
- }
- unregisteredModules.add(module);
- }
-
- public synchronized void removeModule(Module module)
- {
-
- ClassLoader classLoader = domainRegistry.getClassLoader(module);
- if (logger.isTraceEnabled())
- {
- logger.trace("Removing module " + module + " and class loader " + classLoader);
- }
- JBossClDelegatingClassPoolRepository.getInstance().unregisterClassLoader(classLoader, module);
- domainRegistry.cleanupModule(module);
- registeredModules.remove(module);
- unregisteredModules.remove(module);
- }
-
- public synchronized void registerModule(Module module)
- {
- if (logger.isTraceEnabled())
- {
- logger.trace("Registering module " + module);
- }
-
- registeredModules.add(module);
- unregisteredModules.remove(module);
-
- domainRegistry.initMapsForModule(module);
- }
-
- public synchronized Collection<Module> getUnregisteredModules()
- {
- return new ArrayList<Module>(unregisteredModules);
- }
-}
\ No newline at end of file
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ScopedJBoss5ClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ScopedJBoss5ClassPool.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ScopedJBoss5ClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,400 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.lang.ref.WeakReference;
-import java.net.URL;
-import java.util.ArrayList;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.NotFoundException;
-import javassist.scopedpool.ScopedClassPoolRepository;
-
-import org.jboss.classloader.spi.ClassLoaderDomain;
-import org.jboss.classloader.spi.Loader;
-import org.jboss.classloading.spi.RealClassLoader;
-import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.ClassPoolRepository;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class ScopedJBoss5ClassPool extends JBoss5ClassPool
-{
- ThreadLocal<ClassPool> lastPool = new ThreadLocal<ClassPool>();
- WeakReference<ClassLoaderDomain> domainRef;
- /** The classpool representing the parent domain of this one */
- ClassPool parentDomainPool;
-
- public ScopedJBoss5ClassPool(ClassLoader cl, ClassPool src, ClassPool parentDomainPool, ScopedClassPoolRepository repository,
- URL tmpURL, boolean parentFirst, ClassLoaderDomain domain)
- {
- super(cl, src, repository, tmpURL);
- super.childFirstLookup = !parentFirst;
- this.parentDomainPool = parentDomainPool;
- this.domainRef = new WeakReference<ClassLoaderDomain>(domain);
-
- logger.debug("Created new ScopedJBoss5ClasPool for " + cl + ", with parent: " + src + ", parentDomain: " + parentDomainPool + ", parentFirst: " + parentFirst);
- }
-
- private URL getResourceUrlForClass(String resourcename)
- {
- ClassLoaderDomain domain = domainRef.get();
- return domain.getResource(resourcename);
- }
-
- private boolean isMine(URL myURL, String resourceName)
- {
- if (myURL == null)
- {
- return false;
- }
-
- ClassLoaderDomain domain = domainRef.get();
- Loader parent = domain.getParent();
- URL parentURL = parent.getResource(resourceName);
-
- if (parentURL == null)
- {
- return true;
- }
-
- if (!myURL.equals(parentURL))
- {
- return true;
- }
-
- return false;
- }
-
-
- @Override
- protected synchronized CtClass get0(String classname, boolean useCache) throws NotFoundException
- {
- CtClass clazz = null;
- if (useCache)
- {
- clazz = getCached(classname);
- if (clazz != null)
- return clazz;
- }
-
- if (!childFirstLookup)
- {
- if (parentDomainPool != null)
- {
- clazz = performGet(parentDomainPool, classname);
- if (clazz != null)
- {
- return clazz;
- }
- }
- if (parent != null)
- {
- clazz = performGet(parent, classname);
- if (clazz != null)
- {
- return clazz;
- }
- }
- }
-
- clazz = createCtClass(classname, useCache);
- if (clazz != null)
- {
- // clazz.getName() != classname if classname is "[L<name>;".
- if (useCache)
- cacheCtClass(clazz.getName(), clazz, false);
-
- return clazz;
- }
-
- if (childFirstLookup)
- {
- if (parent != null)
- {
- clazz = performGet(parent, classname);
- if (clazz != null)
- {
- return clazz;
- }
- }
- if (parentDomainPool != null)
- {
- clazz = performGet(parentDomainPool, classname);
- if (clazz != null)
- {
- return clazz;
- }
- }
- }
-
- return clazz;
- }
-
- private CtClass performGet(ClassPool pool, String classname)
- {
- try
- {
- // TODO check whether we should enable this optimization
- //Want to avoid calling get() if possible since that creates NotFoundExceptions
- //on misses which is expensive
- /*if (pool instanceof AbstractClassPool)
- {
- return ((AbstractClassPool)pool).internalGet0(classname, true);
- }
- else
- {*/
- return pool.getCtClass(classname);
- }
- catch (NotFoundException e)
- {
- return null;
- }
- }
-
-
- public CtClass getCached(String classname)
- {
- boolean trace = logger.isTraceEnabled();
-
- if (trace)
- {
- logger.trace("getCached() " + classname);
- }
-
- if (classname == null)
- {
- if (trace)
- {
- logger.trace("getCached() returning null (classname == null)");
- }
- return null;
- }
- if (isUnloadedClassLoader())
- {
- if (trace)
- {
- logger.trace("getCached() returning null (unloaded)");
- }
- return null;
- }
-
- if (generatedClasses.get(classname) != null)
- {
- //It is a new class, and this callback is probably coming from the frozen check when creating a new nested class
- if (trace)
- {
- logger.trace("getCached() In generated classes - check super");
- }
- return super.getCached(classname);
- }
-
- //Is this from the scoped classloader itself of from the parent?
- String resourcename = getResourceName(classname);
- URL url = getResourceUrlForClass(resourcename);
-
- if (isMine(url, resourcename))
- {
- if (super.childFirstLookup)
- {
- //Parent delegation is false, attempt to get this class out of ourselves
- CtClass clazz = super.getCachedLocally(classname);
- if (clazz == null)
- {
- if (trace)
- {
- logger.trace("getCached() Creating my class " + classname);
- }
- clazz = createCtClass(classname, false);
- if (clazz != null)
- {
- lockInCache(clazz);
- }
- }
- if (clazz != null)
- {
- if (trace)
- {
- logger.trace("getCached() Returning my class " + classname);
- }
- return clazz;
- }
- }
- if (trace)
- {
- logger.trace("getCached() Checking super for my class " + classname);
- }
- return super.getCached(classname);
- }
- else if (url == null)
- {
- if (trace)
- {
- logger.trace("getCached() Checking super for my class " + classname + " (no url)");
- }
- return super.getCached(classname);
- }
-
-
- try
- {
- ClassPool pool = getCorrectPoolForResource(classname, resourcename, url, trace);
- if (trace)
- {
- logger.trace("getCached() Found pool for class " + classname + " " + pool);
- }
- if (pool != lastPool.get())
- {
- lastPool.set(pool);
- CtClass found = pool.get(classname);
- if (trace)
- {
- logger.trace("getCached() Found clazz " + classname + " in " + pool + " : " + found);
- }
- return found;
- }
- }
- catch (NotFoundException e)
- {
- }
- catch(StackOverflowError e)
- {
- throw e;
- }
- finally
- {
- lastPool.set(null);
- }
-
- return null;
- }
-
- @Override
- protected boolean includeInGlobalSearch()
- {
- return false;
- }
-
- private ClassPool getCorrectPoolForResource(String classname, String resourceName, URL url, boolean trace)
- {
- synchronized(ClassPoolRepository.getInstance().getRegisteredCLs())
- {
- //JBoss 5 has an extra NoAnnotationURLCLassLoader that is not on the default path, make sure that that is checked at the end
- //FIXME This needs revisiting/removing once the
- ArrayList<ClassPool> noAnnotationURLClassLoaderPools = null;
-
- ClassPoolRepository classPoolRepository = ClassPoolRepository.getInstance();
- for(ClassPool classPool: classPoolRepository.getRegisteredCLs().values())
- {
- AbstractClassPool candidate = (AbstractClassPool)classPool;
- if (candidate.isUnloadedClassLoader())
- {
- classPoolRepository.unregisterClassLoader(candidate.getClassLoader());
- continue;
- }
-
- if (candidate.getClassLoader() instanceof RealClassLoader)
- {
- //Sometimes the ClassLoader is a proxy for MBeanProxyExt?!
- RealClassLoader bcl = (RealClassLoader)candidate.getClassLoader();
- URL foundUrl = bcl.getResourceLocally(resourceName);
- if (foundUrl != null)
- {
- if (url.equals(foundUrl))
- {
- if (trace)
- {
- logger.trace("getCorrectPoolForResource() Candidate classloader " + bcl + " has local resource " + foundUrl);
- }
- return candidate;
- }
- }
- }
- //FIXME Remove once we have the JBoss 5 version of pool
- else if (isInstanceOfNoAnnotationURLClassLoader(candidate.getClassLoader()))
- {
- if (noAnnotationURLClassLoaderPools == null)
- {
- noAnnotationURLClassLoaderPools = new ArrayList<ClassPool>();
- }
- noAnnotationURLClassLoaderPools.add(candidate);
- }
- }
-
- //FIXME Remove once we have the JBoss 5 version of pool
- if (noAnnotationURLClassLoaderPools != null)
- {
- for (ClassPool pool : noAnnotationURLClassLoaderPools)
- {
- try
- {
- pool.get(classname);
- if (trace)
- {
- logger.trace("getCorrectPoolForResource(() Found " + classname + " (no url)");
- }
- return pool;
- }
- catch(NotFoundException ignoreTryNext)
- {
- }
- }
- }
- }
- return createTempPool();
- }
-
- private ClassPool createTempPool()
- {
- //Rememeber that the stuff in jboss5/lib goes in a child classloader of the default classloader. We need
- //to make this the parent of the temp classloader
- ClassLoader loader = this.getClass().getClassLoader();// AspectManager.class.getClassLoader(); TODO validate this
- ClassPool pool = ClassPoolRepository.getInstance().registerClassLoader(loader);
- return ClassPoolRepository.getInstance().getClassPoolFactory().create(pool, ClassPoolRepository.getInstance());
- }
-
- /**
- * NoAnnotationURLCLassLoader lives in different packages in JBoss 4 and 5
- */
- private boolean isInstanceOfNoAnnotationURLClassLoader(ClassLoader loader)
- {
- if (loader == null)
- {
- return false;
- }
- Class<?> parent = loader.getClass();
- while (parent != null)
- {
- if ("NoAnnotationURLClassLoader".equals(parent.getSimpleName()))
- {
- return true;
- }
- parent = parent.getSuperclass();
- }
- return false;
- }
-
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,118 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-import org.jboss.classloader.spi.base.BaseClassLoaderSource;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-class SecurityActions
-{
- interface GetParentAction
- {
- ClassLoader getParent(ClassLoader loader);
-
- GetParentAction NON_PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(ClassLoader loader)
- {
- return loader.getParent();
- }
- };
-
- GetParentAction PRIVILEGED = new GetParentAction()
- {
- public ClassLoader getParent(final ClassLoader loader)
- {
- try
- {
- return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
- {
- public ClassLoader run() throws Exception
- {
- return loader.getParent();
- }
- });
- }
- catch (PrivilegedActionException e)
- {
- throw new RuntimeException(e.getException());
- }
- }
- };
- }
-
- public static ClassLoader getParent(ClassLoader loader)
- {
- if (System.getSecurityManager() == null)
- {
- return GetParentAction.NON_PRIVILEGED.getParent(loader);
- }
- else
- {
- return GetParentAction.PRIVILEGED.getParent(loader);
- }
- }
-
- private static final Method getClassLoader;
-
- static
- {
- getClassLoader = AccessController.doPrivileged(new PrivilegedAction<Method>()
- {
- public Method run()
- {
- try
- {
- Method method = BaseClassLoaderSource.class.getDeclaredMethod("getClassLoader");
- method.setAccessible(true);
- return method;
- }
- catch (NoSuchMethodException e)
- {
- throw new RuntimeException("Cannot get classloader from " + BaseClassLoaderSource.class.getName(), e);
- }
- }
- });
- }
-
- static ClassLoader getClassLoader(BaseClassLoaderSource clSource)
- {
- try
- {
- return (ClassLoader)getClassLoader.invoke(clSource);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvoker.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvoker.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvoker.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,102 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.net.URL;
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.CtClass;
-
-import org.jboss.classloading.spi.RealClassLoader;
-import org.jboss.logging.Logger;
-import org.jboss.virtual.plugins.context.memory.MemoryContextFactory;
-
-/**
- *
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class ToClassInvoker
-{
- Logger logger = Logger.getLogger(this.getClass());
-
- public URL tempURL;
-
- public Object tmplock = new Object();
-
- public ToClassInvoker(URL tempURL)
- {
- this.tempURL = tempURL;
- }
-
- public Class<?> toClass(ToClassInvokerPoolReference pool, CtClass cc, String classFileName, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
- {
- boolean trace = logger.isTraceEnabled();
- pool.lockInCache(cc);
- final ClassLoader myloader = pool.getClassLoader();
- if (myloader == null || tempURL == null)
- {
- if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " tempURL:" + tempURL + " default to superPool.toClass for " + cc.getName());
- Class<?> clazz = pool.superPoolToClass(cc, loader, domain);
- if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
- return clazz;
- }
-
- try
- {
- URL outputURL = new URL(tempURL.toString() + "/" + classFileName);
- //Write the classfile to the temporary url
- synchronized (tmplock)
- {
- if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " writing bytes to " + tempURL);
- ByteArrayOutputStream byteout = new ByteArrayOutputStream();
- BufferedOutputStream out = new BufferedOutputStream(byteout);
- out.write(cc.toBytecode());
- out.flush();
- out.close();
-
- byte[] classBytes = byteout.toByteArray();
- MemoryContextFactory factory = MemoryContextFactory.getInstance();
- factory.putFile(outputURL, classBytes);
-
- if (myloader instanceof RealClassLoader)
- {
- ((RealClassLoader)myloader).clearBlackList(classFileName);
- }
-
- Class<?> clazz = myloader.loadClass(cc.getName());
- if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
- return clazz;
- }
- }
- catch(Exception e)
- {
- ClassFormatError cfe = new ClassFormatError("Failed to load dyn class: " + cc.getName() + " on " + this + " loader:" + myloader);
- cfe.initCause(e);
- throw cfe;
- }
- }
-}
\ No newline at end of file
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvokerPoolReference.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvokerPoolReference.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvokerPoolReference.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,40 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.classpool.plugins.as5;
-
-import java.security.ProtectionDomain;
-
-import javassist.CannotCompileException;
-import javassist.CtClass;
-
-/**
- * Exposes methods on ClassPool needed by JBoss5ClassPool
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public interface ToClassInvokerPoolReference
-{
- Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException;
- ClassLoader getClassLoader();
- void lockInCache(CtClass clazz);
-}
Deleted: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -1,250 +0,0 @@
-package org.jboss.classpool.plugins.as5;
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.
-*/
-
-
-import java.lang.ref.WeakReference;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
-import org.jboss.classloader.spi.ClassLoaderDomain;
-import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloading.spi.dependency.ClassLoading;
-import org.jboss.classloading.spi.dependency.Module;
-import org.jboss.deployers.plugins.classloading.AbstractDeploymentClassLoaderPolicyModule;
-import org.jboss.deployers.structure.spi.DeploymentUnit;
-
-/**
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public class VFSClassLoaderDomainRegistry implements DomainRegistry
-{
- protected final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
-
- private static final VFSClassLoaderDomainRegistry instance = new VFSClassLoaderDomainRegistry();
-
- public static final VFSClassLoaderDomainRegistry getInstance()
- {
- return instance;
- }
-
- private ClassLoaderSystem system;
-
- private ClassLoaderDomain defaultDomain;
-
- /** classloader domains by their classloaders */
- protected Map<ClassLoader, WeakReference<ClassLoaderDomain>> classLoaderDomainsByLoader = new WeakHashMap<ClassLoader, WeakReference<ClassLoaderDomain>>();
-
- /** parent deployment unit classloaders indexed by children */
- private Map<ClassLoader, WeakReference<ClassLoader>> classLoaderUnitParents = new WeakHashMap<ClassLoader, WeakReference<ClassLoader>>();
-
- /** Modules by classloader */
- private Map<ClassLoader, WeakReference<Module>> classLoaderModules = new WeakHashMap<ClassLoader, WeakReference<Module>>();
-
- /** classloaders by module */
- private Map<Module, WeakReference<ClassLoader>> moduleClassLoaders = new WeakHashMap<Module, WeakReference<ClassLoader>>();
-
- protected Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
-
- protected VFSClassLoaderDomainRegistry() {}
-
- /**
- * Needed for the tests, not expected to be needed in production
- */
- public void setSystem(ClassLoaderSystem system)
- {
- this.system = system;
- }
-
- /**
- * Needed for the tests, not expected to be needed in production
- */
- public void setDefaultDomain(ClassLoaderDomain domain)
- {
- this.defaultDomain = domain;
- }
-
- public synchronized ClassLoaderSystem getSystem()
- {
- if (system == null)
- {
- system = ClassLoaderSystem.getInstance();
- }
- return system;
- }
-
- public synchronized ClassLoaderDomain getDefaultDomain()
- {
- if (defaultDomain == null)
- {
- defaultDomain = getSystem().getDefaultDomain();
- }
- return defaultDomain;
- }
-
- public synchronized boolean initMapsForModule(Module module)
- {
- ClassLoader loader = ClassLoading.getClassLoaderForModule(module);
- ClassLoader parentUnitLoader = findParentUnitLoader(module);
- if (loader == parentUnitLoader)
- {
- throw new IllegalArgumentException("initMapsForLoader() should only be called if parentUnitLoader is different from loader");
- }
- ClassLoaderSystem system = getSystem();
-
- String domainName = module.getDeterminedDomainName();
- ClassLoaderDomain clDomain = system.getDomain(domainName);
- this.validateInitMaps(loader, clDomain, module, parentUnitLoader);
-
- boolean ret = false;
- if (!classLoaderDomainsByLoader.containsKey(loader))
- {
- Integer count = classLoaderDomainReferenceCounts.get(clDomain);
- int cnt = count == null ? 0 : count.intValue();
- classLoaderDomainReferenceCounts.put(clDomain, cnt);
-
- classLoaderDomainsByLoader.put(loader, new WeakReference<ClassLoaderDomain>(clDomain));
- classLoaderUnitParents.put(loader, new WeakReference<ClassLoader>(parentUnitLoader));
- classLoaderModules.put(loader, new WeakReference<Module>(module));
- moduleClassLoaders.put(module, new WeakReference<ClassLoader>(loader));
- ret = true;
- this.initMapsDone(loader, clDomain, module, parentUnitLoader);
- }
-
-
- return ret;
- }
-
- protected void validateInitMaps(ClassLoader loader, ClassLoaderDomain loaderDomain, Module module, ClassLoader parentUnitLoader)
- {
-
- }
-
- protected void initMapsDone(ClassLoader loader, ClassLoaderDomain loaderDomain, Module module, ClassLoader parentUnitLoader)
- {
-
- }
-
- public synchronized void cleanupModule(Module module)
- {
- ClassLoader loader = this.getClassLoader(module);
- validateCleanupLoader(loader);
- WeakReference<ClassLoaderDomain> clDomainRef = classLoaderDomainsByLoader.remove(loader);
- ClassLoaderDomain clDomain = clDomainRef == null ? null : clDomainRef.get();
- int cnt = 0;
- if (clDomain != null)
- {
- Integer count = classLoaderDomainReferenceCounts.get(clDomain);
- cnt = count == null ? 0 : count.intValue();
- if (cnt > 0)
- {
- cnt--;
- }
- if (cnt == 0)
- {
- classLoaderDomainReferenceCounts.remove(clDomain);
- }
- else
- {
- classLoaderDomainReferenceCounts.put(clDomain, ++cnt);
- }
- classLoaderUnitParents.remove(loader);
- classLoaderModules.remove(loader);
- moduleClassLoaders.remove(module);
- }
- cleanupLoaderDone(loader, clDomain, cnt);
- }
-
- protected void validateCleanupLoader(ClassLoader loader) {}
-
- protected void cleanupLoaderDone(ClassLoader loader, ClassLoaderDomain loaderDomain, int domainReferences) {}
-
- public synchronized ClassLoaderDomain getClassLoaderDomainForLoader(ClassLoader cl)
- {
- WeakReference<ClassLoaderDomain> clDomainRef = classLoaderDomainsByLoader.get(cl);
- if (clDomainRef != null)
- {
- return clDomainRef.get();
- }
-
- ClassLoader parent = SecurityActions.getParent(cl);
- if (parent != null)
- {
- ClassLoaderDomain domain = getClassLoaderDomainForLoader(parent);
- if (domain != null)
- {
- classLoaderDomainsByLoader.put(parent, new WeakReference<ClassLoaderDomain>(domain));
- return domain;
- }
- }
- return null;
- }
-
- public synchronized ClassLoader getParentUnitLoader(ClassLoader loader)
- {
- WeakReference<ClassLoader> parentRef = classLoaderUnitParents.get(loader);
- if (parentRef != null)
- {
- return parentRef.get();
- }
- return null;
- }
-
- public synchronized Module getModule(ClassLoader loader)
- {
- WeakReference<Module> moduleRef = classLoaderModules.get(loader);
- if (moduleRef != null)
- {
- return moduleRef.get();
- }
- return null;
- }
-
- public synchronized ClassLoader getClassLoader(Module module)
- {
- WeakReference<ClassLoader> loaderRef = moduleClassLoaders.get(module);
- if (loaderRef != null)
- {
- return loaderRef.get();
- }
- return null;
- }
-
- private ClassLoader findParentUnitLoader(Module module)
- {
- if (module instanceof AbstractDeploymentClassLoaderPolicyModule)
- {
- DeploymentUnit unit = AbstractDeploymentClassLoaderPolicyModule.class.cast(module).getDeploymentUnit();
- return unit.isTopLevel() ? null : unit.getParent().getClassLoader();
- }
- ClassLoaderDomain domain = ClassLoaderSystem.getInstance().getDomain(module.getDeterminedDomainName());
- if (domain.getParent() instanceof ClassLoaderToLoaderAdapter)
- {
- ClassLoaderToLoaderAdapter cp2la = (ClassLoaderToLoaderAdapter)domain.getParent();
- return SecurityActions.getClassLoader(cp2la);
- }
- return null;
- }
-}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/DomainRegistry.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/DomainRegistry.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/DomainRegistry.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,51 @@
+package org.jboss.classpool.plugins.jbosscl;
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.
+*/
+
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloading.spi.dependency.Module;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public interface DomainRegistry
+{
+ ClassLoaderSystem getSystem();
+
+ ClassLoaderDomain getDefaultDomain();
+
+ boolean initMapsForModule(Module module);
+
+ void cleanupModule(Module module);
+
+ ClassLoaderDomain getClassLoaderDomainForLoader(ClassLoader cl);
+
+ ClassLoader getParentUnitLoader(ClassLoader loader);
+
+ Module getModule(ClassLoader loader);
+
+ ClassLoader getClassLoader(Module module);
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,76 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.spi.AbstractClassPool;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+class JBoss5ClassPool extends AbstractClassPool implements ToClassInvokerPoolReference
+{
+ protected ToClassInvoker toClassInvoker = null;
+
+ boolean closed;
+
+ protected JBoss5ClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, URL tmpURL)
+ {
+ super(cl, src, repository);
+ toClassInvoker = new ToClassInvoker(tmpURL);
+ }
+
+ protected JBoss5ClassPool(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ super(src, repository);
+ }
+
+ public boolean isUnloadedClassLoader()
+ {
+ return closed;
+ }
+
+ public void close()
+ {
+ closed = true;
+ super.close();
+ }
+
+ public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
+ }
+
+ public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return super.toClass(cc, loader, domain);
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPoolFactory.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/JBoss5ClassPoolFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPoolFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBoss5ClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,102 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.jbosscl;
+
+import java.net.URL;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classpool.plugins.AbstractJBossClassPoolFactory;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.classpool.spi.ClassPoolRepository;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @author adrian at jboss.org
+ * @version $Revision$
+ **/
+ at Deprecated
+public class JBoss5ClassPoolFactory extends AbstractJBossClassPoolFactory implements ScopedClassPoolFactory
+{
+ private DomainRegistry registry;
+
+ public JBoss5ClassPoolFactory(DomainRegistry registry)
+ {
+ this.registry = registry;
+ }
+
+ public AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ ClassPool parent = getCreateParentClassPools(cl, src, repository);
+
+ AbstractClassPool pool = null;
+
+ if (cl instanceof RealClassLoader)
+ {
+ Module module = registry.getModule(cl);
+ if (module != null && module.getDeterminedParentDomainName() != null)
+ {
+ //It is scoped
+ ClassLoaderSystem sys = registry.getSystem();
+ ClassLoaderDomain domain = sys.getDomain(module.getDeterminedDomainName());
+ boolean parentFirst = module.isJ2seClassLoadingCompliance();
+ ClassPool parentDomainPool = getParentUnitClassPool(cl);
+ pool = new ScopedJBoss5ClassPool(cl, parent, parentDomainPool, repository, getTempURL(module), parentFirst, domain);
+ }
+ else
+ {
+ pool = new JBoss5ClassPool(cl, parent, repository, getTempURL(module));
+ }
+ }
+
+ if (pool == null)
+ {
+ pool = new AbstractClassPool(cl, parent, repository);
+ }
+ log.debug("Created pool " + pool + " for loader " + cl);
+
+ return pool;
+ }
+
+ private ClassPool getParentUnitClassPool(ClassLoader cl)
+ {
+ ClassLoader parent = registry.getParentUnitLoader(cl);
+ return ClassPoolRepository.getInstance().registerClassLoader(parent);
+ }
+
+
+ private URL getTempURL(Module module)
+ {
+ if (module == null)
+ return null;
+
+ return module.getDynamicClassRoot();
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolDomain.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClClassPoolDomain.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolDomain.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolDomain.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,266 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+
+import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classpool.base.BaseClassPool;
+import org.jboss.classpool.base.BaseClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.helpers.ClassLoaderUtils;
+import org.jboss.classpool.plugins.DelegatingClassPool;
+import org.jboss.classpool.spi.ClassPoolRepository;
+
+/**
+ * JBoss Cl class pool domain.
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="mailto:flavia.rainone at jboss.com">Flavia Rainone</a>
+ * @version $Revision$
+ */
+class JBossClClassPoolDomain extends BaseClassPoolDomain
+{
+ private Map<String, Set<DelegatingClassPool>> poolsByPackage = new HashMap<String, Set<DelegatingClassPool>>();
+ private DomainRegistry registry;
+
+ public JBossClClassPoolDomain(String domainName, ParentPolicy parentPolicy, DomainRegistry registry)
+ {
+ super(domainName,
+ new JBossClParentDelegationStrategy(parentPolicy,
+ JBossClClassPoolToClassPoolDomainAdaptorFactory.getInstance())
+ );
+ this.registry = registry;
+ }
+
+ public JBossClClassPoolDomain(String domainName, ClassPoolDomain parent, ParentPolicy parentPolicy, DomainRegistry registry)
+ {
+ super(domainName,
+ new JBossClParentDelegationStrategy(
+ parent,
+ parentPolicy,
+ JBossClClassPoolToClassPoolDomainAdaptorFactory.getInstance())
+ );
+ this.registry = registry;
+ }
+
+ public JBossClClassPoolDomain(String domainName, ClassPool parent, ParentPolicy parentPolicy, DomainRegistry registry)
+ {
+ super(domainName,
+ new JBossClParentDelegationStrategy(
+ parent,
+ parentPolicy,
+ JBossClClassPoolToClassPoolDomainAdaptorFactory.getInstance())
+ );
+ this.registry = registry;
+ }
+
+ synchronized void setupPoolsByPackage(DelegatingClassPool pool)
+ {
+ if (pool instanceof JBossClDelegatingClassPool == false)
+ {
+ throw new IllegalStateException("Not an instance of JBossClDelegatingClassPool: " + pool.getClass().getName());
+ }
+
+ Module module = getModuleForPool(pool);
+ boolean trace = logger.isTraceEnabled();
+
+ for (String pkg : module.getPackageNames())
+ {
+ Set<DelegatingClassPool> pools = poolsByPackage.get(pkg);
+ if (pools == null)
+ {
+ pools = new LinkedHashSet<DelegatingClassPool>();
+ poolsByPackage.put(pkg, pools);
+ }
+ pools.add(pool);
+ if (trace) logger.trace(this + " adding package " + pkg + " for pool " + pool);
+ }
+ }
+
+ @Override
+ public synchronized void removeClassPool(DelegatingClassPool pool)
+ {
+ super.removeClassPool(pool);
+
+ Module module = getModuleForPool(pool);
+ boolean trace = logger.isTraceEnabled();
+
+ for (String pkg : module.getPackageNames())
+ {
+ Set<DelegatingClassPool> pools = poolsByPackage.get(pkg);
+ if (pools != null)
+ {
+ pools.remove(pool);
+ if (pools.size() == 0)
+ {
+ poolsByPackage.remove(pkg);
+ if (trace) logger.trace(this + " removing package " + pkg + " for pool " + pool);
+ }
+ }
+ }
+ }
+
+ @Override
+ public CtClass getCachedOrCreate(DelegatingClassPool initiatingPool, String classname, String resourceName, boolean create, boolean trace)
+ {
+ if (trace) logger.trace(this + " looking for " + classname);
+
+ CtClass clazz = getCheckPrimitive(classname);
+ if (clazz != null)
+ {
+ if (trace) logger.trace(this + " isPrimitive " + classname);
+ }
+ else
+ {
+ Module module = getModuleForPool(initiatingPool);
+ if (module != null && module.isImportAll())
+ {
+ //Use the old "big ball of mud" model
+ if (trace) logger.trace(this + " isImportAll");
+ return super.getCachedOrCreate(initiatingPool, classname, resourceName, create, trace);
+ }
+
+ //Attempt OSGi style loading
+ if (isParentBefore(classname))
+ {
+ if (trace) logger.trace(this + " checking parent first for " + classname);
+ clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
+ }
+
+ //Check imports first
+ if (clazz == null && module != null)
+ {
+ if (trace) logger.trace(this + " checking imports for " + classname);
+ clazz = getCtClassFromModule(module, classname, trace);
+ }
+
+ //Try to check the initiating pool itself
+ if (clazz == null && initiatingPool != null)
+ {
+ if (trace) logger.trace(this + " checking pool " + initiatingPool + " locally for " + classname);
+ clazz = initiatingPool.loadLocally(classname, resourceName, create);
+ }
+
+ if (clazz == null && isParentAfter(classname))
+ {
+ if (trace) logger.trace(this + " checking parent last for " + classname);
+ clazz = getCachedOrCreateFromParent(null, classname, resourceName, create, trace);
+ }
+ }
+ if (trace) logger.trace(this + " found " + classname + " in " + (clazz == null ? "null" : clazz.getClassPool()));
+ return clazz;
+ }
+
+ private CtClass getCheckPrimitive(String classname)
+ {
+ if (ClassLoaderUtils.isPrimitiveType(classname))
+ {
+ try
+ {
+ return ClassPool.getDefault().get(classname);
+ }
+ catch(NotFoundException e)
+ {
+ throw new RuntimeException(classname + " should have been a primitive", e);
+ }
+ }
+ return null;
+ }
+
+ private Module getModuleForPool(DelegatingClassPool pool)
+ {
+ if (pool == null)
+ {
+ return null;
+ }
+ Module module = ((JBossClDelegatingClassPool)pool).getModule();
+ if (logger.isTraceEnabled()) logger.trace(this + " got module " + module + " for " + pool);
+ return module;
+ }
+
+ @Override
+ protected List<DelegatingClassPool> getPoolsForClassName(String classname)
+ {
+ String packageName = ClassLoaderUtils.getPackageName(classname);
+ Set<DelegatingClassPool> poolSet = poolsByPackage.get(packageName);
+ return (poolSet == null) ? Collections.<DelegatingClassPool>emptyList() : new ArrayList<DelegatingClassPool>(poolSet);
+ }
+
+ private CtClass getCtClassFromModule(final Module module, final String classname, boolean trace)
+ {
+ Module found = null;
+ try
+ {
+ found = AccessController.doPrivileged(new PrivilegedExceptionAction<Module>()
+ {
+
+ public Module run() throws Exception
+ {
+ return module.getModuleForClass(ClassLoaderUtils.stripArrayFromClassName(classname));
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ if (e.getCause() instanceof ClassNotFoundException == false)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ if (trace) logger.trace(this + " module for " + classname + " " + found);
+
+ if (found == null || found == module)
+ {
+ return null;
+ }
+ ClassLoader foundLoader = registry.getClassLoader(found);
+ ClassPool pool = ClassPoolRepository.getInstance().registerClassLoader(foundLoader);
+ try
+ {
+ if (pool instanceof BaseClassPool)
+ {
+ return getCachedOrCreateFromPool((BaseClassPool)pool, classname, true, trace);
+ }
+ return pool.get(classname);
+ }
+ catch(NotFoundException ignore)
+ {
+ }
+ return null;
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdapter.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClClassPoolToClassPoolDomainAdapter.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdapter.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdapter.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,54 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import javassist.ClassPool;
+
+import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
+import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdapter;
+import org.jboss.classpool.spi.ClassPoolRepository;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="mailto:flavia.rainone at jboss.com">Flavia Rainone</a>
+ * @version $Revision$
+ */
+class JBossClClassPoolToClassPoolDomainAdapter extends ClassPoolToClassPoolDomainAdapter
+{
+ public JBossClClassPoolToClassPoolDomainAdapter()
+ {
+ super();
+ }
+
+ public JBossClClassPoolToClassPoolDomainAdapter(ClassPool classPool)
+ {
+ super(classPool);
+ }
+
+ // TODO JBREFLECT-65 FIXME this methd shouldn't be returning always the app classloader
+ @Override
+ public ClassPool initialiseParentClassLoader()
+ {
+ return ClassPoolRepository.getInstance().registerClassLoader(BaseClassLoaderDomain.class.getClassLoader());
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdaptorFactory.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClClassPoolToClassPoolDomainAdaptorFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdaptorFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClClassPoolToClassPoolDomainAdaptorFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,59 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import javassist.ClassPool;
+
+import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdapter;
+import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdaptorFactory;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="mailto:flavia.rainone at jboss.com">Flavia Rainone</a>
+ * @version $Revision$
+ */
+class JBossClClassPoolToClassPoolDomainAdaptorFactory implements ClassPoolToClassPoolDomainAdaptorFactory
+{
+ private static final JBossClClassPoolToClassPoolDomainAdaptorFactory INSTANCE = new JBossClClassPoolToClassPoolDomainAdaptorFactory();
+
+ private JBossClClassPoolToClassPoolDomainAdaptorFactory()
+ {
+
+ }
+
+ public static ClassPoolToClassPoolDomainAdaptorFactory getInstance()
+ {
+ return INSTANCE;
+ }
+
+ public ClassPoolToClassPoolDomainAdapter createAdaptor()
+ {
+ return new JBossClClassPoolToClassPoolDomainAdapter();
+ }
+
+ public ClassPoolToClassPoolDomainAdapter createAdaptor(ClassPool classPool)
+ {
+ return new JBossClClassPoolToClassPoolDomainAdapter(classPool);
+ }
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,95 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.lang.ref.WeakReference;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.plugins.DelegatingClassPool;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+class JBossClDelegatingClassPool extends DelegatingClassPool implements ToClassInvokerPoolReference
+{
+ private WeakReference<Module> module;
+ private RegisterModuleCallback callback;
+
+ ToClassInvoker toClassInvoker;
+
+ protected JBossClDelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent,
+ ScopedClassPoolRepository repository, Module module, RegisterModuleCallback callback)
+ {
+ super(domain, cl, parent, repository);
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("ClassPool being created: " + cl + " - " + this);
+ }
+ if (module == null)
+ {
+ throw new IllegalStateException("Null Module for loader " + cl);
+ }
+ if (domain instanceof JBossClClassPoolDomain == false)
+ {
+ throw new IllegalArgumentException("Domain was not instance of JBossClClassPoolDomain: " + domain.getClass().getName());
+ }
+ this.module = new WeakReference<Module>(module);
+ this.callback = callback;
+ toClassInvoker = new ToClassInvoker(module == null ? null : module.getDynamicClassRoot());
+ if (logger.isTraceEnabled()) logger.trace(this + " module");
+ ((JBossClClassPoolDomain)domain).setupPoolsByPackage(this);
+ }
+
+ Module getModule()
+ {
+ if (module != null)
+ {
+ return module.get();
+ }
+ return null;
+ }
+
+ public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
+ }
+
+ public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return super.toClass(cc, loader, domain);
+ }
+
+ @Override
+ public void close()
+ {
+ super.close();
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolFactory.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,220 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Collection;
+import java.util.HashSet;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.classloading.spi.dependency.ClassLoading;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolDomainRegistry;
+import org.jboss.classpool.plugins.NonDelegatingClassPool;
+import org.jboss.classpool.plugins.temp.TempClassPoolFactory;
+import org.jboss.classpool.spi.AbstractClassPool;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class JBossClDelegatingClassPoolFactory extends TempClassPoolFactory implements ScopedClassPoolFactory
+{
+ private final DomainRegistry registry;
+
+ private final RegisterModuleCallback registerModuleCallback;
+
+ private Collection<ClassLoader> currentClassLoaders = new HashSet<ClassLoader>();
+
+ public JBossClDelegatingClassPoolFactory(DomainRegistry registry, RegisterModuleCallback registerModuleCallback)
+ {
+ this.registry = registry;
+ this.registerModuleCallback = registerModuleCallback;
+ }
+
+ public synchronized AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ if (this.currentClassLoaders.contains(cl))
+ {
+ return null;
+ }
+ currentClassLoaders.add(cl);
+ try
+ {
+ ClassPool parent = getCreateParentClassPools(cl, src, repository);
+
+ if (cl instanceof RealClassLoader)
+ {
+ Module module = registry.getModule(cl);
+ if (module == null)
+ {
+ module = getModuleForClassLoader(cl);
+ }
+ registerModuleCallback.registerModule(module);
+ registerBootstrapLoaders(module, repository);
+ ClassPoolDomain domain = getDomain(module, cl, repository);
+ // this indicates that the domain corresponds to a cp that is being created
+ // to avoid duplicate class pools
+ if (domain == null)
+ {
+ return null;
+ }
+ return new JBossClDelegatingClassPool(domain, cl, parent, repository, module, registerModuleCallback);
+ }
+ if (parent == null)
+ {
+ parent = ClassPool.getDefault();
+ }
+ return new NonDelegatingClassPool(cl, parent, repository, true);
+ }
+ finally
+ {
+ this.currentClassLoaders.remove(cl);
+ }
+ }
+
+ private synchronized ClassPoolDomain getDomain(Module module, ClassLoader cl, ScopedClassPoolRepository repository)
+ {
+ ClassLoaderDomain domain = null;
+ ClassLoaderSystem sys = registry.getSystem();
+ if (module != null && module.getDeterminedParentDomainName() != null)
+ {
+ //It is scoped
+ domain = sys.getDomain(module.getDeterminedDomainName());
+ }
+
+ if (domain == null)
+ {
+ domain = registry.getDefaultDomain();
+ }
+
+ return getDomain(cl, domain, sys, repository);
+ }
+
+ private ClassPoolDomain getDomain(ClassLoader cl, ClassLoaderDomain domain,
+ ClassLoaderSystem sys, ScopedClassPoolRepository repository)
+ {
+ ClassPoolDomain poolDomain = ClassPoolDomainRegistry.getInstance().getDomain(domain);
+ if (poolDomain == null)
+ {
+ String parentDomainName = domain.getParentDomainName();
+ if (parentDomainName != null)
+ {
+ ClassLoaderDomain parentDomain = sys.getDomain(parentDomainName);
+ if (parentDomain == null)
+ {
+ throw new RuntimeException("No domain found, domain name: " + parentDomainName);
+ }
+ ClassPoolDomain parentPoolDomain = this.getDomain(null, parentDomain, sys, repository);
+ poolDomain = new JBossClClassPoolDomain(domain.getName(), parentPoolDomain, domain.getParentPolicy(), registry);
+ }
+ else
+ {
+ ClassLoader parentUnitLoader = registry.getParentUnitLoader(cl);
+ if (this.currentClassLoaders.contains(parentUnitLoader))
+ {
+ return null;
+ }
+ ClassPool parentUnitPool = parentUnitLoader == null? null: repository.registerClassLoader(parentUnitLoader);
+ if (parentUnitPool == null)
+ {
+ poolDomain = new JBossClClassPoolDomain(domain.getName(), domain.getParentPolicy(), registry);
+ }
+ else
+ {
+ poolDomain = new JBossClClassPoolDomain(domain.getName(), parentUnitPool, domain.getParentPolicy(), registry);
+ }
+ }
+ ClassPoolDomainRegistry.getInstance().addClassPoolDomain(domain, poolDomain);
+ }
+ return poolDomain;
+ }
+
+ @Override
+ protected ClassPool getCreateParentClassPools(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ ClassPool parent = super.getCreateParentClassPools(cl, src, repository);
+ if (parent == ClassPool.getDefault())
+ {
+ //In AS BaseClassLoader seems to normally have a null parent
+ return null;
+ }
+ return parent;
+ }
+
+ private void registerBootstrapLoaders(Module skip, ScopedClassPoolRepository repository)
+ {
+ Collection<Module> unregistered = registerModuleCallback.getUnregisteredModules();
+ if (unregistered.size() > 0)
+ {
+ for (Module module : unregistered)
+ {
+ if (module == skip)
+ {
+ continue;
+ }
+ ClassLoader loader = getClassLoaderForModule(module);
+ if (this.currentClassLoaders.contains(loader))
+ {
+ continue;
+ }
+ ClassPool classPool = repository.registerClassLoader(loader);
+ if (classPool == null)
+ {
+ repository.unregisterClassLoader(loader);
+ }
+ }
+ }
+ }
+
+ private ClassLoader getClassLoaderForModule(final Module module)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+
+ public ClassLoader run()
+ {
+ return ClassLoading.getClassLoaderForModule(module);
+ }
+ });
+ }
+
+ private Module getModuleForClassLoader(final ClassLoader classLoader)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<Module>()
+ {
+ public Module run()
+ {
+ return ClassLoading.getModuleForClassLoader(classLoader);
+ }
+ });
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolRepository.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolRepository.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolRepository.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClDelegatingClassPoolRepository.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,110 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt 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.classpool.plugins.jbosscl;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+
+import org.jboss.classloading.spi.dependency.ClassLoading;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classpool.spi.ClassPoolRepository;
+import org.jboss.logging.Logger;
+
+/**
+ * Repository for JBossclDelegatingClassPools.
+ *
+ * @author <a href="mailto:flavia.rainone at jboss.org">Flavia Rainone</a>
+ *
+ * @version $Revision$
+ */
+
+public class JBossClDelegatingClassPoolRepository extends ClassPoolRepository
+{
+ Logger logger = Logger.getLogger(this.getClass());
+
+ private final static JBossClDelegatingClassPoolRepository instance = new JBossClDelegatingClassPoolRepository();
+
+ /**
+ * Returns the singleton instance.
+ *
+ * @return the singleton repository instance
+ */
+ public static JBossClDelegatingClassPoolRepository getInstance()
+ {
+ return instance;
+ }
+
+ /** The registered modules */
+ protected Map<Module, ScopedClassPool> registeredModules =
+ Collections.synchronizedMap(new WeakHashMap<Module, ScopedClassPool>());
+
+ @Override
+ public synchronized ClassPool registerClassLoader(ClassLoader classLoader)
+ {
+ ScopedClassPool classPool = (ScopedClassPool) super.registerClassLoader(classLoader);
+ if (classPool == null)
+ {
+ delegate.unregisterClassLoader(classLoader);
+ }
+ else
+ {
+ Module module = getModuleForClassLoader(classLoader);
+ this.registeredModules.put(module, classPool);
+ }
+ return classPool;
+ }
+
+
+ public synchronized void unregisterClassLoader(ClassLoader classLoader, Module module)
+ {
+ ScopedClassPool classPool = registeredModules.remove(module);
+ if (classLoader == null)
+ {
+ if (classPool == null)
+ {
+ throw new IllegalStateException("Module " + module + " is not registered");
+ }
+ classPool.close();
+ }
+ else
+ {
+ unregisterClassLoader(classLoader);
+ }
+ }
+
+ private Module getModuleForClassLoader(final ClassLoader classLoader)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<Module>()
+ {
+ public Module run()
+ {
+ return ClassLoading.getModuleForClassLoader(classLoader);
+ }
+ });
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClParentDelegationStrategy.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClParentDelegationStrategy.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClParentDelegationStrategy.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/JBossClParentDelegationStrategy.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,88 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import javassist.ClassPool;
+
+import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloader.spi.filter.ClassFilter;
+import org.jboss.classpool.base.AbstractParentDelegationStrategy;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdaptorFactory;
+import org.jboss.classpool.helpers.ClassLoaderUtils;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="mailto:flavia.rainone at jboss.com">Flavia Rainone</a>
+ * @version $Revision$
+ */
+class JBossClParentDelegationStrategy extends AbstractParentDelegationStrategy
+{
+ ParentPolicy parentPolicy;
+
+ JBossClParentDelegationStrategy(ParentPolicy parentPolicy, ClassPoolToClassPoolDomainAdaptorFactory adaptorFactory)
+ {
+ super((ClassPoolDomain) null, adaptorFactory);
+ if (parentPolicy == null)
+ {
+ throw new IllegalStateException("Null parent policy");
+ }
+ this.parentPolicy = parentPolicy;
+ }
+
+ JBossClParentDelegationStrategy(ClassPoolDomain parent, ParentPolicy parentPolicy, ClassPoolToClassPoolDomainAdaptorFactory adaptorFactory)
+ {
+ super(parent, adaptorFactory);
+ if (parentPolicy == null)
+ {
+ throw new IllegalStateException("Null parent policy");
+ }
+ this.parentPolicy = parentPolicy;
+ }
+
+ JBossClParentDelegationStrategy(ClassPool parent, ParentPolicy parentPolicy, ClassPoolToClassPoolDomainAdaptorFactory adaptorFactory)
+ {
+ super(parent, adaptorFactory);
+ if (parentPolicy == null)
+ {
+ throw new IllegalStateException("Null parent policy");
+ }
+ this.parentPolicy = parentPolicy;
+ }
+
+ public boolean isParentAfter(String classname)
+ {
+ ClassFilter filter = parentPolicy.getAfterFilter();
+ boolean isParentAfter = filter.matchesClassName(ClassLoaderUtils.stripArrayFromClassName(classname));
+ if (logger.isTraceEnabled()) logger.trace(this + " " + getDomain() + " isParentAfter " + isParentAfter);
+ return isParentAfter;
+ }
+
+ public boolean isParentBefore(String classname)
+ {
+ ClassFilter filter = parentPolicy.getBeforeFilter();
+ boolean isParentBefore = filter.matchesClassName(ClassLoaderUtils.stripArrayFromClassName(classname));
+ if (logger.isTraceEnabled()) logger.trace(this + " " + getDomain() + " isParentBefore " + isParentBefore);
+ return isParentBefore;
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/RegisterModuleCallback.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/RegisterModuleCallback.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/RegisterModuleCallback.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,94 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.ModuleRegistry;
+import org.jboss.logging.Logger;
+
+/**
+ * Use with org.jboss.classpool.jbosscl.JBossClDelegatingClassPoolFactory
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
+ * @version $Revision$
+ */
+public class RegisterModuleCallback implements ModuleRegistry
+{
+ Logger logger = Logger.getLogger(this.getClass());
+
+ private Set<Module> registeredModules = new HashSet<Module>();
+ private Set<Module> unregisteredModules = new HashSet<Module>();
+ private DomainRegistry domainRegistry;
+
+ public RegisterModuleCallback(DomainRegistry domainRegistry)
+ {
+ this.domainRegistry = domainRegistry;
+ }
+
+ public synchronized void addModule(Module module)
+ {
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("Adding module " + module);
+ }
+ unregisteredModules.add(module);
+ }
+
+ public synchronized void removeModule(Module module)
+ {
+
+ ClassLoader classLoader = domainRegistry.getClassLoader(module);
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("Removing module " + module + " and class loader " + classLoader);
+ }
+ JBossClDelegatingClassPoolRepository.getInstance().unregisterClassLoader(classLoader, module);
+ domainRegistry.cleanupModule(module);
+ registeredModules.remove(module);
+ unregisteredModules.remove(module);
+ }
+
+ public synchronized void registerModule(Module module)
+ {
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("Registering module " + module);
+ }
+
+ registeredModules.add(module);
+ unregisteredModules.remove(module);
+
+ domainRegistry.initMapsForModule(module);
+ }
+
+ public synchronized Collection<Module> getUnregisteredModules()
+ {
+ return new ArrayList<Module>(unregisteredModules);
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ScopedJBoss5ClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ScopedJBoss5ClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ScopedJBoss5ClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ScopedJBoss5ClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,400 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.Loader;
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.classpool.spi.ClassPoolRepository;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class ScopedJBoss5ClassPool extends JBoss5ClassPool
+{
+ ThreadLocal<ClassPool> lastPool = new ThreadLocal<ClassPool>();
+ WeakReference<ClassLoaderDomain> domainRef;
+ /** The classpool representing the parent domain of this one */
+ ClassPool parentDomainPool;
+
+ public ScopedJBoss5ClassPool(ClassLoader cl, ClassPool src, ClassPool parentDomainPool, ScopedClassPoolRepository repository,
+ URL tmpURL, boolean parentFirst, ClassLoaderDomain domain)
+ {
+ super(cl, src, repository, tmpURL);
+ super.childFirstLookup = !parentFirst;
+ this.parentDomainPool = parentDomainPool;
+ this.domainRef = new WeakReference<ClassLoaderDomain>(domain);
+
+ logger.debug("Created new ScopedJBoss5ClasPool for " + cl + ", with parent: " + src + ", parentDomain: " + parentDomainPool + ", parentFirst: " + parentFirst);
+ }
+
+ private URL getResourceUrlForClass(String resourcename)
+ {
+ ClassLoaderDomain domain = domainRef.get();
+ return domain.getResource(resourcename);
+ }
+
+ private boolean isMine(URL myURL, String resourceName)
+ {
+ if (myURL == null)
+ {
+ return false;
+ }
+
+ ClassLoaderDomain domain = domainRef.get();
+ Loader parent = domain.getParent();
+ URL parentURL = parent.getResource(resourceName);
+
+ if (parentURL == null)
+ {
+ return true;
+ }
+
+ if (!myURL.equals(parentURL))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ @Override
+ protected synchronized CtClass get0(String classname, boolean useCache) throws NotFoundException
+ {
+ CtClass clazz = null;
+ if (useCache)
+ {
+ clazz = getCached(classname);
+ if (clazz != null)
+ return clazz;
+ }
+
+ if (!childFirstLookup)
+ {
+ if (parentDomainPool != null)
+ {
+ clazz = performGet(parentDomainPool, classname);
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ if (parent != null)
+ {
+ clazz = performGet(parent, classname);
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ }
+
+ clazz = createCtClass(classname, useCache);
+ if (clazz != null)
+ {
+ // clazz.getName() != classname if classname is "[L<name>;".
+ if (useCache)
+ cacheCtClass(clazz.getName(), clazz, false);
+
+ return clazz;
+ }
+
+ if (childFirstLookup)
+ {
+ if (parent != null)
+ {
+ clazz = performGet(parent, classname);
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ if (parentDomainPool != null)
+ {
+ clazz = performGet(parentDomainPool, classname);
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ }
+
+ return clazz;
+ }
+
+ private CtClass performGet(ClassPool pool, String classname)
+ {
+ try
+ {
+ // TODO check whether we should enable this optimization
+ //Want to avoid calling get() if possible since that creates NotFoundExceptions
+ //on misses which is expensive
+ /*if (pool instanceof AbstractClassPool)
+ {
+ return ((AbstractClassPool)pool).internalGet0(classname, true);
+ }
+ else
+ {*/
+ return pool.getCtClass(classname);
+ }
+ catch (NotFoundException e)
+ {
+ return null;
+ }
+ }
+
+
+ public CtClass getCached(String classname)
+ {
+ boolean trace = logger.isTraceEnabled();
+
+ if (trace)
+ {
+ logger.trace("getCached() " + classname);
+ }
+
+ if (classname == null)
+ {
+ if (trace)
+ {
+ logger.trace("getCached() returning null (classname == null)");
+ }
+ return null;
+ }
+ if (isUnloadedClassLoader())
+ {
+ if (trace)
+ {
+ logger.trace("getCached() returning null (unloaded)");
+ }
+ return null;
+ }
+
+ if (generatedClasses.get(classname) != null)
+ {
+ //It is a new class, and this callback is probably coming from the frozen check when creating a new nested class
+ if (trace)
+ {
+ logger.trace("getCached() In generated classes - check super");
+ }
+ return super.getCached(classname);
+ }
+
+ //Is this from the scoped classloader itself of from the parent?
+ String resourcename = getResourceName(classname);
+ URL url = getResourceUrlForClass(resourcename);
+
+ if (isMine(url, resourcename))
+ {
+ if (super.childFirstLookup)
+ {
+ //Parent delegation is false, attempt to get this class out of ourselves
+ CtClass clazz = super.getCachedLocally(classname);
+ if (clazz == null)
+ {
+ if (trace)
+ {
+ logger.trace("getCached() Creating my class " + classname);
+ }
+ clazz = createCtClass(classname, false);
+ if (clazz != null)
+ {
+ lockInCache(clazz);
+ }
+ }
+ if (clazz != null)
+ {
+ if (trace)
+ {
+ logger.trace("getCached() Returning my class " + classname);
+ }
+ return clazz;
+ }
+ }
+ if (trace)
+ {
+ logger.trace("getCached() Checking super for my class " + classname);
+ }
+ return super.getCached(classname);
+ }
+ else if (url == null)
+ {
+ if (trace)
+ {
+ logger.trace("getCached() Checking super for my class " + classname + " (no url)");
+ }
+ return super.getCached(classname);
+ }
+
+
+ try
+ {
+ ClassPool pool = getCorrectPoolForResource(classname, resourcename, url, trace);
+ if (trace)
+ {
+ logger.trace("getCached() Found pool for class " + classname + " " + pool);
+ }
+ if (pool != lastPool.get())
+ {
+ lastPool.set(pool);
+ CtClass found = pool.get(classname);
+ if (trace)
+ {
+ logger.trace("getCached() Found clazz " + classname + " in " + pool + " : " + found);
+ }
+ return found;
+ }
+ }
+ catch (NotFoundException e)
+ {
+ }
+ catch(StackOverflowError e)
+ {
+ throw e;
+ }
+ finally
+ {
+ lastPool.set(null);
+ }
+
+ return null;
+ }
+
+ @Override
+ protected boolean includeInGlobalSearch()
+ {
+ return false;
+ }
+
+ private ClassPool getCorrectPoolForResource(String classname, String resourceName, URL url, boolean trace)
+ {
+ synchronized(ClassPoolRepository.getInstance().getRegisteredCLs())
+ {
+ //JBoss 5 has an extra NoAnnotationURLCLassLoader that is not on the default path, make sure that that is checked at the end
+ //FIXME This needs revisiting/removing once the
+ ArrayList<ClassPool> noAnnotationURLClassLoaderPools = null;
+
+ ClassPoolRepository classPoolRepository = ClassPoolRepository.getInstance();
+ for(ClassPool classPool: classPoolRepository.getRegisteredCLs().values())
+ {
+ AbstractClassPool candidate = (AbstractClassPool)classPool;
+ if (candidate.isUnloadedClassLoader())
+ {
+ classPoolRepository.unregisterClassLoader(candidate.getClassLoader());
+ continue;
+ }
+
+ if (candidate.getClassLoader() instanceof RealClassLoader)
+ {
+ //Sometimes the ClassLoader is a proxy for MBeanProxyExt?!
+ RealClassLoader bcl = (RealClassLoader)candidate.getClassLoader();
+ URL foundUrl = bcl.getResourceLocally(resourceName);
+ if (foundUrl != null)
+ {
+ if (url.equals(foundUrl))
+ {
+ if (trace)
+ {
+ logger.trace("getCorrectPoolForResource() Candidate classloader " + bcl + " has local resource " + foundUrl);
+ }
+ return candidate;
+ }
+ }
+ }
+ //FIXME Remove once we have the JBoss 5 version of pool
+ else if (isInstanceOfNoAnnotationURLClassLoader(candidate.getClassLoader()))
+ {
+ if (noAnnotationURLClassLoaderPools == null)
+ {
+ noAnnotationURLClassLoaderPools = new ArrayList<ClassPool>();
+ }
+ noAnnotationURLClassLoaderPools.add(candidate);
+ }
+ }
+
+ //FIXME Remove once we have the JBoss 5 version of pool
+ if (noAnnotationURLClassLoaderPools != null)
+ {
+ for (ClassPool pool : noAnnotationURLClassLoaderPools)
+ {
+ try
+ {
+ pool.get(classname);
+ if (trace)
+ {
+ logger.trace("getCorrectPoolForResource(() Found " + classname + " (no url)");
+ }
+ return pool;
+ }
+ catch(NotFoundException ignoreTryNext)
+ {
+ }
+ }
+ }
+ }
+ return createTempPool();
+ }
+
+ private ClassPool createTempPool()
+ {
+ //Rememeber that the stuff in jboss5/lib goes in a child classloader of the default classloader. We need
+ //to make this the parent of the temp classloader
+ ClassLoader loader = this.getClass().getClassLoader();// AspectManager.class.getClassLoader(); TODO validate this
+ ClassPool pool = ClassPoolRepository.getInstance().registerClassLoader(loader);
+ return ClassPoolRepository.getInstance().getClassPoolFactory().create(pool, ClassPoolRepository.getInstance());
+ }
+
+ /**
+ * NoAnnotationURLCLassLoader lives in different packages in JBoss 4 and 5
+ */
+ private boolean isInstanceOfNoAnnotationURLClassLoader(ClassLoader loader)
+ {
+ if (loader == null)
+ {
+ return false;
+ }
+ Class<?> parent = loader.getClass();
+ while (parent != null)
+ {
+ if ("NoAnnotationURLClassLoader".equals(parent.getSimpleName()))
+ {
+ return true;
+ }
+ parent = parent.getSuperclass();
+ }
+ return false;
+ }
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/SecurityActions.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/SecurityActions.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,118 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+import org.jboss.classloader.spi.base.BaseClassLoaderSource;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+class SecurityActions
+{
+ interface GetParentAction
+ {
+ ClassLoader getParent(ClassLoader loader);
+
+ GetParentAction NON_PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(ClassLoader loader)
+ {
+ return loader.getParent();
+ }
+ };
+
+ GetParentAction PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(final ClassLoader loader)
+ {
+ try
+ {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
+ {
+ public ClassLoader run() throws Exception
+ {
+ return loader.getParent();
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ throw new RuntimeException(e.getException());
+ }
+ }
+ };
+ }
+
+ public static ClassLoader getParent(ClassLoader loader)
+ {
+ if (System.getSecurityManager() == null)
+ {
+ return GetParentAction.NON_PRIVILEGED.getParent(loader);
+ }
+ else
+ {
+ return GetParentAction.PRIVILEGED.getParent(loader);
+ }
+ }
+
+ private static final Method getClassLoader;
+
+ static
+ {
+ getClassLoader = AccessController.doPrivileged(new PrivilegedAction<Method>()
+ {
+ public Method run()
+ {
+ try
+ {
+ Method method = BaseClassLoaderSource.class.getDeclaredMethod("getClassLoader");
+ method.setAccessible(true);
+ return method;
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new RuntimeException("Cannot get classloader from " + BaseClassLoaderSource.class.getName(), e);
+ }
+ }
+ });
+ }
+
+ static ClassLoader getClassLoader(BaseClassLoaderSource clSource)
+ {
+ try
+ {
+ return (ClassLoader)getClassLoader.invoke(clSource);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvoker.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvoker.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvoker.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvoker.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,102 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.CtClass;
+
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.logging.Logger;
+import org.jboss.virtual.plugins.context.memory.MemoryContextFactory;
+
+/**
+ *
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class ToClassInvoker
+{
+ Logger logger = Logger.getLogger(this.getClass());
+
+ public URL tempURL;
+
+ public Object tmplock = new Object();
+
+ public ToClassInvoker(URL tempURL)
+ {
+ this.tempURL = tempURL;
+ }
+
+ public Class<?> toClass(ToClassInvokerPoolReference pool, CtClass cc, String classFileName, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ boolean trace = logger.isTraceEnabled();
+ pool.lockInCache(cc);
+ final ClassLoader myloader = pool.getClassLoader();
+ if (myloader == null || tempURL == null)
+ {
+ if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " tempURL:" + tempURL + " default to superPool.toClass for " + cc.getName());
+ Class<?> clazz = pool.superPoolToClass(cc, loader, domain);
+ if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
+ return clazz;
+ }
+
+ try
+ {
+ URL outputURL = new URL(tempURL.toString() + "/" + classFileName);
+ //Write the classfile to the temporary url
+ synchronized (tmplock)
+ {
+ if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " writing bytes to " + tempURL);
+ ByteArrayOutputStream byteout = new ByteArrayOutputStream();
+ BufferedOutputStream out = new BufferedOutputStream(byteout);
+ out.write(cc.toBytecode());
+ out.flush();
+ out.close();
+
+ byte[] classBytes = byteout.toByteArray();
+ MemoryContextFactory factory = MemoryContextFactory.getInstance();
+ factory.putFile(outputURL, classBytes);
+
+ if (myloader instanceof RealClassLoader)
+ {
+ ((RealClassLoader)myloader).clearBlackList(classFileName);
+ }
+
+ Class<?> clazz = myloader.loadClass(cc.getName());
+ if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
+ return clazz;
+ }
+ }
+ catch(Exception e)
+ {
+ ClassFormatError cfe = new ClassFormatError("Failed to load dyn class: " + cc.getName() + " on " + this + " loader:" + myloader);
+ cfe.initCause(e);
+ throw cfe;
+ }
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvokerPoolReference.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/ToClassInvokerPoolReference.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvokerPoolReference.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/ToClassInvokerPoolReference.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.jbosscl;
+
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.CtClass;
+
+/**
+ * Exposes methods on ClassPool needed by JBoss5ClassPool
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public interface ToClassInvokerPoolReference
+{
+ Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException;
+ ClassLoader getClassLoader();
+ void lockInCache(CtClass clazz);
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/VFSClassLoaderDomainRegistry.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/VFSClassLoaderDomainRegistry.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/jbosscl/VFSClassLoaderDomainRegistry.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,250 @@
+package org.jboss.classpool.plugins.jbosscl;
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.
+*/
+
+
+import java.lang.ref.WeakReference;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloading.spi.dependency.ClassLoading;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.deployers.plugins.classloading.AbstractDeploymentClassLoaderPolicyModule;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class VFSClassLoaderDomainRegistry implements DomainRegistry
+{
+ protected final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
+
+ private static final VFSClassLoaderDomainRegistry instance = new VFSClassLoaderDomainRegistry();
+
+ public static final VFSClassLoaderDomainRegistry getInstance()
+ {
+ return instance;
+ }
+
+ private ClassLoaderSystem system;
+
+ private ClassLoaderDomain defaultDomain;
+
+ /** classloader domains by their classloaders */
+ protected Map<ClassLoader, WeakReference<ClassLoaderDomain>> classLoaderDomainsByLoader = new WeakHashMap<ClassLoader, WeakReference<ClassLoaderDomain>>();
+
+ /** parent deployment unit classloaders indexed by children */
+ private Map<ClassLoader, WeakReference<ClassLoader>> classLoaderUnitParents = new WeakHashMap<ClassLoader, WeakReference<ClassLoader>>();
+
+ /** Modules by classloader */
+ private Map<ClassLoader, WeakReference<Module>> classLoaderModules = new WeakHashMap<ClassLoader, WeakReference<Module>>();
+
+ /** classloaders by module */
+ private Map<Module, WeakReference<ClassLoader>> moduleClassLoaders = new WeakHashMap<Module, WeakReference<ClassLoader>>();
+
+ protected Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
+
+ protected VFSClassLoaderDomainRegistry() {}
+
+ /**
+ * Needed for the tests, not expected to be needed in production
+ */
+ public void setSystem(ClassLoaderSystem system)
+ {
+ this.system = system;
+ }
+
+ /**
+ * Needed for the tests, not expected to be needed in production
+ */
+ public void setDefaultDomain(ClassLoaderDomain domain)
+ {
+ this.defaultDomain = domain;
+ }
+
+ public synchronized ClassLoaderSystem getSystem()
+ {
+ if (system == null)
+ {
+ system = ClassLoaderSystem.getInstance();
+ }
+ return system;
+ }
+
+ public synchronized ClassLoaderDomain getDefaultDomain()
+ {
+ if (defaultDomain == null)
+ {
+ defaultDomain = getSystem().getDefaultDomain();
+ }
+ return defaultDomain;
+ }
+
+ public synchronized boolean initMapsForModule(Module module)
+ {
+ ClassLoader loader = ClassLoading.getClassLoaderForModule(module);
+ ClassLoader parentUnitLoader = findParentUnitLoader(module);
+ if (loader == parentUnitLoader)
+ {
+ throw new IllegalArgumentException("initMapsForLoader() should only be called if parentUnitLoader is different from loader");
+ }
+ ClassLoaderSystem system = getSystem();
+
+ String domainName = module.getDeterminedDomainName();
+ ClassLoaderDomain clDomain = system.getDomain(domainName);
+ this.validateInitMaps(loader, clDomain, module, parentUnitLoader);
+
+ boolean ret = false;
+ if (!classLoaderDomainsByLoader.containsKey(loader))
+ {
+ Integer count = classLoaderDomainReferenceCounts.get(clDomain);
+ int cnt = count == null ? 0 : count.intValue();
+ classLoaderDomainReferenceCounts.put(clDomain, cnt);
+
+ classLoaderDomainsByLoader.put(loader, new WeakReference<ClassLoaderDomain>(clDomain));
+ classLoaderUnitParents.put(loader, new WeakReference<ClassLoader>(parentUnitLoader));
+ classLoaderModules.put(loader, new WeakReference<Module>(module));
+ moduleClassLoaders.put(module, new WeakReference<ClassLoader>(loader));
+ ret = true;
+ this.initMapsDone(loader, clDomain, module, parentUnitLoader);
+ }
+
+
+ return ret;
+ }
+
+ protected void validateInitMaps(ClassLoader loader, ClassLoaderDomain loaderDomain, Module module, ClassLoader parentUnitLoader)
+ {
+
+ }
+
+ protected void initMapsDone(ClassLoader loader, ClassLoaderDomain loaderDomain, Module module, ClassLoader parentUnitLoader)
+ {
+
+ }
+
+ public synchronized void cleanupModule(Module module)
+ {
+ ClassLoader loader = this.getClassLoader(module);
+ validateCleanupLoader(loader);
+ WeakReference<ClassLoaderDomain> clDomainRef = classLoaderDomainsByLoader.remove(loader);
+ ClassLoaderDomain clDomain = clDomainRef == null ? null : clDomainRef.get();
+ int cnt = 0;
+ if (clDomain != null)
+ {
+ Integer count = classLoaderDomainReferenceCounts.get(clDomain);
+ cnt = count == null ? 0 : count.intValue();
+ if (cnt > 0)
+ {
+ cnt--;
+ }
+ if (cnt == 0)
+ {
+ classLoaderDomainReferenceCounts.remove(clDomain);
+ }
+ else
+ {
+ classLoaderDomainReferenceCounts.put(clDomain, ++cnt);
+ }
+ classLoaderUnitParents.remove(loader);
+ classLoaderModules.remove(loader);
+ moduleClassLoaders.remove(module);
+ }
+ cleanupLoaderDone(loader, clDomain, cnt);
+ }
+
+ protected void validateCleanupLoader(ClassLoader loader) {}
+
+ protected void cleanupLoaderDone(ClassLoader loader, ClassLoaderDomain loaderDomain, int domainReferences) {}
+
+ public synchronized ClassLoaderDomain getClassLoaderDomainForLoader(ClassLoader cl)
+ {
+ WeakReference<ClassLoaderDomain> clDomainRef = classLoaderDomainsByLoader.get(cl);
+ if (clDomainRef != null)
+ {
+ return clDomainRef.get();
+ }
+
+ ClassLoader parent = SecurityActions.getParent(cl);
+ if (parent != null)
+ {
+ ClassLoaderDomain domain = getClassLoaderDomainForLoader(parent);
+ if (domain != null)
+ {
+ classLoaderDomainsByLoader.put(parent, new WeakReference<ClassLoaderDomain>(domain));
+ return domain;
+ }
+ }
+ return null;
+ }
+
+ public synchronized ClassLoader getParentUnitLoader(ClassLoader loader)
+ {
+ WeakReference<ClassLoader> parentRef = classLoaderUnitParents.get(loader);
+ if (parentRef != null)
+ {
+ return parentRef.get();
+ }
+ return null;
+ }
+
+ public synchronized Module getModule(ClassLoader loader)
+ {
+ WeakReference<Module> moduleRef = classLoaderModules.get(loader);
+ if (moduleRef != null)
+ {
+ return moduleRef.get();
+ }
+ return null;
+ }
+
+ public synchronized ClassLoader getClassLoader(Module module)
+ {
+ WeakReference<ClassLoader> loaderRef = moduleClassLoaders.get(module);
+ if (loaderRef != null)
+ {
+ return loaderRef.get();
+ }
+ return null;
+ }
+
+ private ClassLoader findParentUnitLoader(Module module)
+ {
+ if (module instanceof AbstractDeploymentClassLoaderPolicyModule)
+ {
+ DeploymentUnit unit = AbstractDeploymentClassLoaderPolicyModule.class.cast(module).getDeploymentUnit();
+ return unit.isTopLevel() ? null : unit.getParent().getClassLoader();
+ }
+ ClassLoaderDomain domain = ClassLoaderSystem.getInstance().getDomain(module.getDeterminedDomainName());
+ if (domain.getParent() instanceof ClassLoaderToLoaderAdapter)
+ {
+ ClassLoaderToLoaderAdapter cp2la = (ClassLoaderToLoaderAdapter)domain.getParent();
+ return SecurityActions.getClassLoader(cp2la);
+ }
+ return null;
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/temp)
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempClassPoolFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/temp/TempClassPoolFactory.java 2009-12-09 01:06:36 UTC (rev 97574)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -19,9 +19,9 @@
* 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.classpool.plugins.as.temp;
+package org.jboss.classpool.plugins.temp;
-import org.jboss.classpool.plugins.as.AbstractJBossClassPoolFactory;
+import org.jboss.classpool.plugins.AbstractJBossClassPoolFactory;
import org.jboss.classpool.spi.AbstractClassPool;
import javassist.ClassPool;
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/temp/TempJBossClassPool.java 2009-12-09 01:06:36 UTC (rev 97574)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -19,7 +19,7 @@
* 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.classpool.plugins.as.temp;
+package org.jboss.classpool.plugins.temp;
import org.jboss.classpool.spi.AbstractClassPool;
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossDelegatingClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as/temp/TempJBossDelegatingClassPool.java 2009-12-09 01:06:36 UTC (rev 97574)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/temp/TempJBossDelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -19,7 +19,7 @@
* 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.classpool.plugins.as.temp;
+package org.jboss.classpool.plugins.temp;
import org.jboss.classpool.base.BaseClassPool;
import org.jboss.classpool.spi.AbstractClassPool;
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,84 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @author adrian at jboss.org
+ * @version $Revision$
+ */
+public class JBossClassPool extends AbstractClassPool implements ToClassInvokerPoolReference
+{
+ ToClassInvoker toClassInvoker = null;
+
+ protected JBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
+ {
+ super(cl, src, repository);
+ toClassInvoker = new ToClassInvoker(tmp);
+ }
+
+ protected JBossClassPool(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ super(src, repository);
+ }
+
+ public boolean isUnloadedClassLoader()
+ {
+ if (getClassLoader() instanceof RepositoryClassLoader)
+ {
+ RepositoryClassLoader rcl = (RepositoryClassLoader) getClassLoader();
+ return rcl.getLoaderRepository() == null;
+ }
+ return false;
+ }
+
+ public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
+ }
+
+ public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return super.toClass(cc, loader, domain);
+ }
+
+ @Override
+ public void lockInCache(CtClass clazz)
+ {
+ super.lockInCache(clazz);
+ localResources.put(getResourceName(clazz.getName()), Boolean.TRUE);
+ }
+}
\ No newline at end of file
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPoolFactory.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/JBossClassPoolFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPoolFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/JBossClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,128 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.plugins.AbstractJBossClassPoolFactory;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @author adrian at jboss.org
+ * @version $Revision$
+ **/
+public class JBossClassPoolFactory extends AbstractJBossClassPoolFactory
+{
+ protected File tmpClassesDir;
+
+ public JBossClassPoolFactory(File tmpClassesDir) throws IOException
+ {
+ this.tmpClassesDir = tmpClassesDir;
+
+ }
+ public AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ ClassPool parent = getCreateParentClassPools(cl, src, repository);
+ if (cl instanceof RepositoryClassLoader)
+ {
+ File tempdir = getTempDirectory(cl);
+ URL tmpCP;
+ try
+ {
+ tmpCP = createURLAndAddToLoader(cl, tempdir);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ if (ScopedRepositoryClassLoaderHelper.isScopedClassLoader(cl))
+ {
+ //It is scoped
+ return new ScopedJBossClassPool(cl, parent, repository, tempdir, tmpCP);
+ }
+ return new JBossClassPool(cl, parent, repository, tempdir, tmpCP);
+ }
+ return new AbstractClassPool(cl, parent, repository);
+ }
+
+ protected File getTempDirectory(ClassLoader cl)
+ {
+ File tempdir = null;
+ int attempts = 0;
+ IOException ex = null;
+ while (tempdir == null && attempts < 5)
+ {
+ //Workaround for JBAOP-254, retry a few times
+ try
+ {
+ tempdir = createTempDir(cl);
+ }
+ catch (IOException e)
+ {
+ ex = e;
+ }
+ }
+
+ if (tempdir == null)
+ {
+ throw new RuntimeException("", ex);
+ }
+
+ return tempdir;
+ }
+
+ public File createTempDir(ClassLoader cl) throws IOException
+ {
+ File tempdir = File.createTempFile("ucl", "", tmpClassesDir);
+ tempdir.delete();
+ tempdir.mkdir();
+ tempdir.deleteOnExit();
+
+ return tempdir;
+ }
+
+ private URL createURLAndAddToLoader(ClassLoader cl, File tempdir) throws IOException
+ {
+ URL tmpURL = tempdir.toURL();
+ URL tmpCP = new URL(tmpURL, "?dynamic=true");
+
+ RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
+
+ // We may be undeploying.
+ if (ucl.getLoaderRepository() != null)
+ {
+ ucl.addURL(tmpCP);
+ }
+
+ return tmpCP;
+ }
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/LoaderRepositoryUrlUtil.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/LoaderRepositoryUrlUtil.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/LoaderRepositoryUrlUtil.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/LoaderRepositoryUrlUtil.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,173 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.ucl;
+
+import java.net.URL;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.util.MBeanServerLocator;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class LoaderRepositoryUrlUtil implements NotificationListener
+{
+ final static MBeanServer SERVER;
+ final static ObjectName MAIN_LOADER_REPOSITORY_OBJECT_NAME;
+ final static LoaderRepository MAIN_LOADER_REPOSITORY;
+ static
+ {
+ SERVER = MBeanServerLocator.locateJBoss();
+ try
+ {
+ MAIN_LOADER_REPOSITORY_OBJECT_NAME = new ObjectName("JMImplementation:name=Default,service=LoaderRepository");
+ MAIN_LOADER_REPOSITORY = (LoaderRepository)SERVER.invoke(MAIN_LOADER_REPOSITORY_OBJECT_NAME, "getInstance", new Object[0], new String[0]);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ long currentSequenceNumber;
+ long lastSequenceNumber = -1;
+ URL[] urls;
+
+ public LoaderRepositoryUrlUtil()
+ {
+ try
+ {
+ SERVER.addNotificationListener(MAIN_LOADER_REPOSITORY_OBJECT_NAME, this, null, null);
+ }
+ catch (InstanceNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public synchronized void handleNotification(Notification notification, Object handback)
+ {
+ if (notification.getType().equals(LoaderRepository.CLASSLOADER_ADDED))
+ {
+ currentSequenceNumber = notification.getSequenceNumber();
+ }
+ else if (notification.getType().equals(LoaderRepository.CLASSLOADER_REMOVED))
+ {
+ currentSequenceNumber = notification.getSequenceNumber();
+ }
+ }
+
+ public synchronized UrlInfo getURLInfo(HeirarchicalLoaderRepository3 scopedLoader, UrlInfo urlInfo)
+ {
+ boolean changed = false;
+ if (lastSequenceNumber != currentSequenceNumber)
+ {
+ urls = MAIN_LOADER_REPOSITORY.getURLs();
+ lastSequenceNumber = currentSequenceNumber;
+ changed = true;
+ }
+ if (!changed)
+ {
+ changed = urlInfo != null && (urlInfo.getSequenceNumber() != lastSequenceNumber);
+ }
+ if (urlInfo == null || changed)
+ {
+ URL[] localUrls = getLocalUrls(scopedLoader, urls);
+ urlInfo = new UrlInfo(urls, localUrls, lastSequenceNumber);
+ }
+ return urlInfo;
+ }
+
+ public long getCurrentSequenceNumber()
+ {
+ return currentSequenceNumber;
+ }
+
+ private URL[] getLocalUrls(HeirarchicalLoaderRepository3 scopedRepository, URL[] globalUrls)
+ {
+ URL[] scopedRepositoryUrls = scopedRepository.getURLs();
+
+ //This is a bit of a hack, since this relies on the order of the urls returned by HeirarchicalLoaderRepository3
+ //My urls, followed by parent urls.
+ int scopedLength = 0;
+ for (int i = 0 ; i < scopedRepositoryUrls.length ; i++)
+ {
+ for (int j = 0 ; j < globalUrls.length ; j ++)
+ {
+ if (scopedRepositoryUrls[i].equals(globalUrls[j]))
+ {
+ scopedLength = i;
+ break;
+ }
+ }
+ if (scopedLength > 0)
+ {
+ break;
+ }
+ }
+
+ URL[] localUrls = new URL[scopedLength];
+ System.arraycopy(scopedRepositoryUrls, 0, localUrls, 0, scopedLength);
+ return localUrls;
+ }
+
+ public class UrlInfo
+ {
+
+ URL[] globalUrls;
+ URL[] localUrls;
+ long sequenceNumber;
+
+ public UrlInfo(URL[] globalUrls, URL[] localUrls, long sequenceNumber)
+ {
+ super();
+ this.globalUrls = globalUrls;
+ this.localUrls = localUrls;
+ this.sequenceNumber = sequenceNumber;
+ }
+
+ public URL[] getGlobalUrls()
+ {
+ return globalUrls;
+ }
+
+ public URL[] getLocalUrls()
+ {
+ return localUrls;
+ }
+
+ public long getSequenceNumber()
+ {
+ return sequenceNumber;
+ }
+ }
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedJBossClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedJBossClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedJBossClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedJBossClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,273 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.plugins.ucl.LoaderRepositoryUrlUtil.UrlInfo;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.classpool.spi.ClassPoolRepository;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+/**
+ * A classpool in JBoss backed by a scoped (HierarchicalLoaderRepository) loader repository
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class ScopedJBossClassPool extends JBossClassPool
+{
+ final static LoaderRepositoryUrlUtil LOADER_REPOSITORY_UTIL = new LoaderRepositoryUrlUtil();
+
+ private UrlInfo urlInfo;
+ private ThreadLocal<ClassPool> lastPool = new ThreadLocal<ClassPool>();
+
+ public ScopedJBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
+ {
+ super(cl, src, repository, tmp, tmpURL);
+
+ boolean parentFirst = false;
+ LoaderRepository loaderRepository = null;
+ ClassLoader prnt = cl;
+ while (prnt != null)
+ {
+ if (prnt instanceof RepositoryClassLoader)
+ {
+ loaderRepository = ((RepositoryClassLoader)prnt).getLoaderRepository();
+ if (loaderRepository instanceof HeirarchicalLoaderRepository3)
+ {
+ parentFirst = ((HeirarchicalLoaderRepository3)loaderRepository).getUseParentFirst();
+ }
+ break;
+ }
+ prnt = SecurityActions.getParent(cl);
+ }
+
+ super.childFirstLookup = !parentFirst;
+ }
+
+
+ private HeirarchicalLoaderRepository3 getRepository()
+ {
+ ClassLoader cl = getClassLoader0();
+ if (cl != null)
+ {
+ return (HeirarchicalLoaderRepository3)((RepositoryClassLoader)cl).getLoaderRepository();
+ }
+ return null;
+ }
+
+ private URL getResourceUrlForClass(String resourcename)
+ {
+ HeirarchicalLoaderRepository3 repo = getRepository();
+ return repo.getResource(resourcename, super.getClassLoader());
+ }
+
+ private boolean isMine(URL url)
+ {
+ HeirarchicalLoaderRepository3 repo = getRepository();
+ if (repo != null)
+ {
+ //The URL of the class loaded with my scoped classloader
+ if (url != null)
+ {
+ urlInfo = LOADER_REPOSITORY_UTIL.getURLInfo(getRepository(), urlInfo);
+
+ URL[] myUrls = urlInfo.getLocalUrls();
+ String resource = url.toString();
+ for (int i = 0 ; i < myUrls.length ; i++)
+ {
+ if (resource.indexOf(myUrls[i].toString()) >= 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public CtClass getCached(String classname)
+ {
+ if (classname == null)
+ {
+ return null;
+ }
+ if (isUnloadedClassLoader())
+ {
+ return null;
+ }
+
+ if (generatedClasses.get(classname) != null)
+ {
+ //It is a new class, and this callback is probably coming from the frozen check when creating a new nested class
+ return super.getCached(classname);
+ }
+
+ //Is this from the scoped classloader itself of from the parent?
+ String resourcename = getResourceName(classname);
+ URL url = getResourceUrlForClass(resourcename);
+ boolean isMine = isMine(url);
+
+ if (isMine)
+ {
+ if (super.childFirstLookup)
+ {
+ //Parent delegation is false, attempt to get this class out of ourselves
+ CtClass clazz = super.getCachedLocally(classname);
+ if (clazz == null)
+ {
+ clazz = createCtClass(classname, false);
+ if (clazz != null)
+ {
+ lockInCache(clazz);
+ }
+ }
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ return super.getCached(classname);
+ }
+
+
+ try
+ {
+ ClassPool pool = getCorrectPoolForResource(classname, url);
+ if (pool != lastPool.get())
+ {
+ lastPool.set(pool);
+ return pool.get(classname);
+ }
+ }
+ catch (NotFoundException e)
+ {
+ }
+ catch(StackOverflowError e)
+ {
+ throw e;
+ }
+ finally
+ {
+ lastPool.set(null);
+ }
+
+ return null;
+ }
+
+ @Override
+ protected boolean includeInGlobalSearch()
+ {
+ return false;
+ }
+
+ private ClassPool getCorrectPoolForResource(String classname, URL url)
+ {
+ ClassPoolRepository classPoolRepository = ClassPoolRepository.getInstance();
+ synchronized(classPoolRepository.getRegisteredCLs())
+ {
+ //JBoss 5 has an extra NoAnnotationURLCLassLoader that is not on the default path, make sure that that is checked at the end
+ //FIXME This needs revisiting/removing once the
+ ArrayList<AbstractClassPool> noAnnotationURLClassLoaderPools = null;
+ String resource = url.toString();
+ for(ClassPool pool : classPoolRepository.getRegisteredCLs().values())
+ {
+ AbstractClassPool candidate = (AbstractClassPool)pool;
+ if (candidate.isUnloadedClassLoader())
+ {
+ classPoolRepository.unregisterClassLoader(candidate.getClassLoader());
+ continue;
+ }
+
+ if (candidate.getClassLoader() instanceof RepositoryClassLoader)
+ {
+ //Sometimes the ClassLoader is a proxy for MBeanProxyExt?!
+ RepositoryClassLoader rcl = (RepositoryClassLoader)candidate.getClassLoader();
+ URL[] urls = rcl.getClasspath();
+
+ for (int i = 0 ; i < urls.length ; i++)
+ {
+ if (resource.indexOf(urls[i].getFile()) >= 0)
+ {
+ return candidate;
+ }
+ }
+ }
+ //FIXME Remove once we have the JBoss 5 version of pool
+ else if (isInstanceOfNoAnnotationURLClassLoader(candidate.getClassLoader()))
+ {
+ if (noAnnotationURLClassLoaderPools == null)
+ {
+ noAnnotationURLClassLoaderPools = new ArrayList<AbstractClassPool>();
+ }
+ noAnnotationURLClassLoaderPools.add(candidate);
+ }
+ }
+
+ //FIXME Remove once we have the JBoss 5 version of pool
+ if (noAnnotationURLClassLoaderPools != null)
+ {
+ for (AbstractClassPool pool : noAnnotationURLClassLoaderPools)
+ {
+ try
+ {
+ pool.get(classname);
+ return pool;
+ }
+ catch(NotFoundException ignoreTryNext)
+ {
+ }
+ }
+ }
+ }
+ return ClassPoolRepository.getInstance().getClassPoolFactory().
+ create(ClassPool.getDefault(), ClassPoolRepository.getInstance());
+ }
+
+ /**
+ * NoAnnotationURLCLassLoader lives in different packages in JBoss 4 and 5
+ */
+ private boolean isInstanceOfNoAnnotationURLClassLoader(ClassLoader loader)
+ {
+ Class<?> parent = loader.getClass();
+ while (parent != null)
+ {
+ if ("NoAnnotationURLClassLoader".equals(parent.getSimpleName()))
+ {
+ return true;
+ }
+ parent = parent.getSuperclass();
+ }
+ return false;
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedRepositoryClassLoaderHelper.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ScopedRepositoryClassLoaderHelper.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedRepositoryClassLoaderHelper.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ScopedRepositoryClassLoaderHelper.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,51 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classpool.plugins.ucl;
+
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @autor adrian at jboss.org
+ * @version $Revision$
+ */
+public class ScopedRepositoryClassLoaderHelper
+{
+ public static boolean isScopedClassLoader(ClassLoader loader)
+ {
+ boolean scoped = false;
+ if (loader instanceof RepositoryClassLoader)
+ {
+ LoaderRepository repository = ((RepositoryClassLoader)loader).getLoaderRepository();
+ if (repository instanceof HeirarchicalLoaderRepository3)
+ {
+ scoped = true;
+ //HeirarchicalLoaderRepository3 hlr = (HeirarchicalLoaderRepository3)repository;
+ //boolean parentFirst = hlr.getUseParentFirst();
+ }
+ }
+ return scoped;
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/SecurityActions.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/SecurityActions.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/SecurityActions.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/SecurityActions.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,84 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.ucl;
+
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+class SecurityActions
+{
+ interface GetParentAction
+ {
+ ClassLoader getParent(ClassLoader loader);
+
+ GetParentAction NON_PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(ClassLoader loader)
+ {
+ return loader.getParent();
+ }
+ };
+
+ GetParentAction PRIVILEGED = new GetParentAction()
+ {
+ public ClassLoader getParent(final ClassLoader loader)
+ {
+ try
+ {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
+ {
+ public ClassLoader run() throws Exception
+ {
+ return loader.getParent();
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ throw new RuntimeException(e.getException());
+ }
+ }
+ };
+ }
+
+ public static ClassLoader getParent(ClassLoader loader)
+ {
+ if (loader == null)
+ {
+ return null;
+ }
+ if (System.getSecurityManager() == null)
+ {
+ return GetParentAction.NON_PRIVILEGED.getParent(loader);
+ }
+ else
+ {
+ return GetParentAction.PRIVILEGED.getParent(loader);
+ }
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvoker.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvoker.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvoker.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvoker.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,103 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.CtClass;
+
+import org.jboss.logging.Logger;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class ToClassInvoker
+{
+ Logger logger = Logger.getLogger(this.getClass());
+
+ public File tmpDir;
+
+ public Object tmplock = new Object();
+
+ public ToClassInvoker(File tmpDir)
+ {
+ this.tmpDir = tmpDir;
+ }
+
+ public Class<?> toClass(ToClassInvokerPoolReference pool, CtClass cc, String classFileName, ClassLoader loader, ProtectionDomain domain)
+ throws CannotCompileException
+ {
+ boolean trace = logger.isTraceEnabled();
+ pool.lockInCache(cc);
+ final ClassLoader myloader = pool.getClassLoader();
+ if (myloader == null || tmpDir == null)
+ {
+ if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " tmpDir:" + tmpDir + " default to superPool.toClass for " + cc.getName());
+ Class<?> clazz = pool.superPoolToClass(cc, loader, domain);
+ if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + clazz);
+ return clazz;
+ }
+ Class<?> dynClass = null;
+ try
+ {
+ File classFile = null;
+ // Write the clas file to the tmpdir
+ synchronized (tmplock)
+ {
+ classFile = new File(tmpDir, classFileName);
+ if (trace) logger.trace(this + " " + pool + ".toClass() myloader:" + myloader + " writing bytes to " + classFile);
+ File pkgDirs = classFile.getParentFile();
+ pkgDirs.mkdirs();
+ FileOutputStream stream = new FileOutputStream(classFile);
+ stream.write(cc.toBytecode());
+ stream.flush();
+ stream.close();
+ classFile.deleteOnExit();
+ }
+ // We have to clear Blacklist caches or the class will never
+ // be found
+ //((UnifiedClassLoader)dcl).clearBlacklists();
+ // To be backward compatible
+ RepositoryClassLoader rcl = (RepositoryClassLoader)myloader;
+ rcl.clearClassBlackList();
+ rcl.clearResourceBlackList();
+
+ // Now load the class through the cl
+ dynClass = myloader.loadClass(cc.getName());
+ if (trace) logger.trace(this + " " + pool + " myloader:" + myloader + " created class:" + dynClass);
+ return dynClass;
+ }
+ catch (Exception ex)
+ {
+ ClassFormatError cfe = new ClassFormatError("Failed to load dyn class: " + cc.getName());
+ cfe.initCause(ex);
+ throw cfe;
+ }
+ }
+
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvokerPoolReference.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ToClassInvokerPoolReference.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvokerPoolReference.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/ToClassInvokerPoolReference.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,39 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.ucl;
+
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.CtClass;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public interface ToClassInvokerPoolReference
+{
+ Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException;
+ ClassLoader getClassLoader();
+ void lockInCache(CtClass clazz);
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPool.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ucl/JBossUclDelegatingClassPool.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPool.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPool.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,68 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.plugins.DelegatingClassPool;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class UclDelegatingClassPool extends DelegatingClassPool implements ToClassInvokerPoolReference
+{
+ ToClassInvoker toClassInvoker = null;
+
+ public UclDelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent,
+ ScopedClassPoolRepository repository, File tmpDir, URL tmpURL)
+ {
+ super(domain, cl, parent, repository);
+ toClassInvoker = new ToClassInvoker(tmpDir);
+ }
+
+ public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return toClassInvoker.toClass(this, cc, getResourceName(cc.getName()), loader, domain);
+ }
+
+ public Class<?> superPoolToClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+ {
+ return super.toClass(cc, loader, domain);
+ }
+
+ @Override
+ public void lockInCache(CtClass clazz)
+ {
+ super.lockInCache(clazz);
+ localResources.put(getResourceName(clazz.getName()), Boolean.TRUE);
+ }
+}
Copied: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPoolFactory.java (from rev 97574, projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as4/ucl/JBossUclDelegatingClassPoolFactory.java)
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPoolFactory.java (rev 0)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/ucl/UclDelegatingClassPoolFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -0,0 +1,169 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.classpool.plugins.ucl;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.classpool.base.BaseClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.domain.ClassPoolDomainRegistry;
+import org.jboss.classpool.plugins.NonDelegatingClassPool;
+import org.jboss.classpool.plugins.temp.TempClassPoolFactory;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+import org.jboss.mx.server.ServerConstants;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class UclDelegatingClassPoolFactory extends TempClassPoolFactory
+{
+ private ClassPoolDomain mainDomain;
+ protected File tmpClassesDir;
+
+ public UclDelegatingClassPoolFactory(File tmpClassesDir) throws IOException
+ {
+ System.out.println("TMP CLASSES DIR: " + tmpClassesDir);
+ this.tmpClassesDir = tmpClassesDir;
+ }
+
+ public synchronized AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ ClassPool parent = getCreateParentClassPools(cl, src, repository);
+
+ if (cl instanceof RepositoryClassLoader)
+ {
+ ClassPoolDomain domain = getDomain((RepositoryClassLoader)cl);
+
+ File tempdir = getTempDirectory(cl);
+ URL tmpCP = createURLAndAddToLoader(cl, tempdir);
+
+ return new UclDelegatingClassPool(domain, cl, parent, repository, tempdir, tmpCP);
+ }
+
+ if (parent == null)
+ {
+ parent = ClassPool.getDefault();
+ }
+ return new NonDelegatingClassPool(cl, parent, repository, true);
+ }
+
+ private ClassPoolDomain getDomain(RepositoryClassLoader cl)
+ {
+ LoaderRepository loaderRepository = cl.getLoaderRepository();
+ ClassPoolDomainRegistry registry = ClassPoolDomainRegistry.getInstance();
+ ClassPoolDomain domain = registry.getDomain(loaderRepository);
+ if (domain == null)
+ {
+ if (loaderRepository instanceof HeirarchicalLoaderRepository3)
+ {
+
+ boolean parentFirst = ((HeirarchicalLoaderRepository3)loaderRepository).getUseParentFirst();
+ domain = new BaseClassPoolDomain("Scoped" + System.identityHashCode(loaderRepository), mainDomain, parentFirst);
+ }
+ else
+ {
+ if (mainDomain == null)
+ {
+ domain = new BaseClassPoolDomain(ServerConstants.DEFAULT_LOADER_NAME, null, false);
+ mainDomain = domain;
+ }
+ else
+ {
+ domain = mainDomain;
+ }
+ registry.addClassPoolDomain(loaderRepository, domain);
+ }
+ }
+ return domain;
+ }
+
+ protected File getTempDirectory(ClassLoader cl)
+ {
+ File tempdir = null;
+ int attempts = 0;
+ IOException ex = null;
+ while (tempdir == null && attempts < 5)
+ {
+ //Workaround for JBAOP-254, retry a few times
+ try
+ {
+ tempdir = createTempDir(cl);
+ }
+ catch (IOException e)
+ {
+ ex = e;
+ }
+ }
+
+ if (tempdir == null)
+ {
+ throw new RuntimeException("", ex);
+ }
+
+ return tempdir;
+ }
+
+ public File createTempDir(ClassLoader cl) throws IOException
+ {
+ File tempdir = File.createTempFile("ucl", "", tmpClassesDir);
+ tempdir.delete();
+ tempdir.mkdir();
+ tempdir.deleteOnExit();
+
+ return tempdir;
+ }
+
+ private URL createURLAndAddToLoader(ClassLoader cl, File tempdir)
+ {
+ try
+ {
+ URL tmpURL = tempdir.toURL();
+ URL tmpCP = new URL(tmpURL, "?dynamic=true");
+
+ RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
+
+ // We may be undeploying.
+ if (ucl.getLoaderRepository() != null)
+ {
+ ucl.addURL(tmpCP);
+ }
+
+ return tmpCP;
+ }
+ catch(Exception e)
+ {
+ // AutoGenerated
+ throw new RuntimeException(e);
+ }
+ }
+
+}
Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/JBossCLFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/JBossCLFactory.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/JBossCLFactory.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -30,7 +30,7 @@
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.base.BaseClassLoader;
import org.jboss.classloading.spi.vfs.metadata.VFSClassLoaderFactory;
-import org.jboss.classpool.plugins.as5.VFSClassLoaderDomainRegistry;
+import org.jboss.classpool.plugins.jbosscl.VFSClassLoaderDomainRegistry;
import org.jboss.kernel.spi.deployment.KernelDeployment;
import org.jboss.logging.Logger;
import org.jboss.test.AbstractTestCase;
Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/LoaderRegistry.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/LoaderRegistry.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/support/LoaderRegistry.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -34,7 +34,7 @@
import org.jboss.classloader.spi.base.BaseClassLoader;
import org.jboss.classloading.spi.dependency.Module;
import org.jboss.classloading.spi.vfs.metadata.VFSClassLoaderFactory;
-import org.jboss.classpool.plugins.as5.VFSClassLoaderDomainRegistry;
+import org.jboss.classpool.plugins.jbosscl.VFSClassLoaderDomainRegistry;
import org.jboss.kernel.spi.deployment.KernelDeployment;
import org.jboss.logging.Logger;
import org.jboss.test.AbstractTestCase;
Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -34,7 +34,7 @@
import org.jboss.classpool.base.BaseClassPoolDomain;
import org.jboss.classpool.domain.AbstractClassPoolDomain;
import org.jboss.classpool.domain.ClassPoolDomain;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import org.jboss.classpool.spi.ClassPoolRepository;
import org.jboss.test.AbstractTestCaseWithSetup;
import org.jboss.test.AbstractTestDelegate;
Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/IsLocalResourcePluginFactoryTestCase.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/IsLocalResourcePluginFactoryTestCase.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/test/IsLocalResourcePluginFactoryTestCase.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -41,7 +41,7 @@
import org.jboss.classpool.base.URLClassLoaderIsLocalResourcePlugin;
import org.jboss.classpool.base.URLClassLoaderIsLocalResourcePluginFactory;
import org.jboss.classpool.domain.ClassPoolDomain;
-import org.jboss.classpool.plugins.as.DelegatingClassPool;
+import org.jboss.classpool.plugins.DelegatingClassPool;
import org.jboss.classpool.spi.ClassPoolRepository;
import org.jboss.util.loading.Translatable;
Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/ucl/test/UclClassPoolTest.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/ucl/test/UclClassPoolTest.java 2009-12-11 01:17:05 UTC (rev 97709)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/ucl/test/UclClassPoolTest.java 2009-12-11 01:48:42 UTC (rev 97710)
@@ -26,7 +26,7 @@
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
-import org.jboss.classpool.plugins.as4.ucl.JBossUclDelegatingClassPoolFactory;
+import org.jboss.classpool.plugins.ucl.UclDelegatingClassPoolFactory;
import org.jboss.classpool.spi.ClassPoolRepository;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.test.AbstractTestCaseWithSetup;
@@ -49,7 +49,7 @@
try
{
ClassPoolRepository.getInstance().setClassPoolFactory(
- new JBossUclDelegatingClassPoolFactory(new File(".")));
+ new UclDelegatingClassPoolFactory(new File(".")));
}
catch (Exception e)
{
More information about the jboss-cvs-commits
mailing list