[Jboss-cvs] JBossAS SVN: r57056 - in branches/Branch_AOP_1_5: aop aop/src/jdk15/org/jboss/aop/standalone aop/src/main/org/jboss/aop aop/src/main/org/jboss/aop/advice aop/src/main/org/jboss/aop/classpool aop/src/main/org/jboss/aop/contrib aop/src/main/org/jboss/aop/instrument aspects/src/jdk15/org/jboss/aop/deployment aspects/src/main/org/jboss/aop/deployment
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Sep 21 14:04:55 EDT 2006
Author: kabir.khan at jboss.com
Date: 2006-09-21 14:04:34 -0400 (Thu, 21 Sep 2006)
New Revision: 57056
Added:
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java
Removed:
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java
Modified:
branches/Branch_AOP_1_5/aop/build.xml
branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java
branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java
branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java
branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java
branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java
branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java
Log:
[JBAOP-288] Unify API used by AspectDeployer with AOP 2.0
Modified: branches/Branch_AOP_1_5/aop/build.xml
===================================================================
--- branches/Branch_AOP_1_5/aop/build.xml 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/build.xml 2006-09-21 18:04:34 UTC (rev 57056)
@@ -57,7 +57,7 @@
-->
<target name="configure" unless="configure.disable">
- <property name="aop.version" value="jboss-aop-1.5.1.GA"/>
+ <property name="aop.version" value="jboss-aop-1.5.2.GA"/>
<property name="aop.title" value="JBoss AOP Framework"/>
<!-- =================== -->
@@ -67,7 +67,7 @@
<!-- Module name(s) & version -->
<property name="module.name" value="aop"/>
<property name="module.Name" value="JBoss AOP"/>
- <property name="module.version" value="1.5.1.GA"/>
+ <property name="module.version" value="1.5.2.GA"/>
<!-- ========= -->
<!-- Libraries -->
Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/Agent.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -38,7 +38,8 @@
public static void premain(String agentArgs, Instrumentation inst)
{
- AspectManager.classPoolFactory = new StandaloneClassPoolFactory();
+ StandaloneClassPoolFactory factory = new StandaloneClassPoolFactory();
+ AspectManager.setClassPoolFactory(factory);
// necessary for configuration
AspectManager.instance();
if (agentArgs != null && agentArgs.indexOf("-hotSwap") != -1)
@@ -46,7 +47,7 @@
// setting dynamic aop strategy: hot swap classes through InstrumentationAdapter
DynamicAOPStrategy strategy = new HotSwapStrategy(new InstrumentationAdapter(inst));
AspectManager.instance().setDynamicAOPStrategy(strategy);
- AspectManager.prune = false; // no prune
+ AspectManager.setPrune(false); // no prune
}
inst.addTransformer(new AOPTransformer());
}
Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPool.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -25,9 +25,10 @@
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
/**
* Comment
@@ -38,14 +39,14 @@
*/
public class StandaloneClassPool extends AOPClassPool
{
- public StandaloneClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
+ public StandaloneClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
- super(cl, src, manager);
+ super(cl, src, repository);
}
- public StandaloneClassPool(ClassPool src, AspectManager manager)
+ public StandaloneClassPool(ClassPool src, ScopedClassPoolRepository repository)
{
- super(src, manager);
+ super(src, repository);
}
//KAB: removed NotFoundException, IOException from throws clause, as
Modified: branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/jdk15/org/jboss/aop/standalone/StandaloneClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,9 +21,11 @@
*/
package org.jboss.aop.standalone;
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPoolFactory;
+
import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
/**
* Comment
@@ -31,15 +33,15 @@
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
* @version $Revision$
*/
-public class StandaloneClassPoolFactory extends org.jboss.aop.AOPClassPoolFactory
+public class StandaloneClassPoolFactory extends AOPClassPoolFactory
{
- public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
- return new StandaloneClassPool(cl, src, manager);
+ return new StandaloneClassPool(cl, src, repository);
}
- public AOPClassPool create(ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
{
- return new StandaloneClassPool(src, manager);
+ return new StandaloneClassPool(src, repository);
}
}
Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPool.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,240 +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.aop;
-
-import java.lang.ref.WeakReference;
-import java.security.ProtectionDomain;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.jboss.util.collection.SoftValueHashMap;
-import javassist.CannotCompileException;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.LoaderClassPath;
-import javassist.NotFoundException;
-
-/**
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- */
-public class AOPClassPool extends ClassPool
-{
- protected AspectManager manager;
- //protected ClassLoader dcl;
- private WeakReference dcl;
- protected LoaderClassPath classPath;
- protected SoftValueHashMap softcache = new SoftValueHashMap();
-
- static
- {
- ClassPool.doPruning = false;
- ClassPool.releaseUnmodifiedClassFile = false;
- }
-
- public AOPClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
- {
- super(src);
- this.manager = manager;
- setClassLoader(cl);
- if (cl != null)
- {
- classPath = new LoaderClassPath(cl);
- this.insertClassPath(classPath);
- }
- childFirstLookup = true;
- }
-
- protected AOPClassPool(ClassPool src, AspectManager manager)
- {
- this(null, src, manager);
- }
-
- public ClassLoader getClassLoader()
- {
- if (dcl==null)
- {
- return null;
- }
- else
- {
- return (ClassLoader)dcl.get();
- }
- }
-
- public void setClassLoader(ClassLoader loader)
- {
- if (loader == null)
- {
- this.dcl = null;
- }
- else
- {
- this.dcl = new WeakReference(loader);
- }
- }
-
- public void close()
- {
- this.removeClassPath(classPath);
- classPath.close();
- classes.clear();
- softcache.clear();
- }
-
- public synchronized void flushClass(String classname)
- {
- classes.remove(classname);
- softcache.remove(classname);
- }
-
- public synchronized void soften(CtClass clazz)
- {
- if (AspectManager.prune) clazz.prune();
- classes.remove(clazz.getName());
- softcache.put(clazz.getName(), clazz);
- }
-
-
- public boolean isUnloadedClassLoader()
- {
- return false;
- }
-
- protected CtClass getCached(String classname)
- {
- CtClass clazz = getCachedLocally(classname);
- if (clazz == null)
- {
- boolean isLocal = false;
-
- if (getClassLoader() != null)
- {
- final int lastIndex = classname.lastIndexOf('$');
- String classResourceName = null;
- if (lastIndex < 0)
- {
- classResourceName = classname.replaceAll("[\\.]", "/") + ".class";
- }
- else
- {
- classResourceName = classname.substring(0, lastIndex).replaceAll("[\\.]", "/") + classname.substring(lastIndex) + ".class";
- }
-
- isLocal = getClassLoader().getResource(classResourceName) != null;
- }
-
- if (!isLocal)
- {
- Map registeredCLs = manager.getRegisteredCLs();
- synchronized (registeredCLs)
- {
- Iterator it = registeredCLs.values().iterator();
- while (it.hasNext())
- {
- AOPClassPool pool = (AOPClassPool) it.next();
- if (pool.isUnloadedClassLoader())
- {
- AspectManager.instance().unregisterClassLoader(pool.getClassLoader());
- continue;
- }
-
- clazz = pool.getCachedLocally(classname);
- if (clazz != null)
- {
- return clazz;
- }
- }
- }
- }
- }
- // *NOTE* NEED TO TEST WHEN SUPERCLASS IS IN ANOTHER UCL!!!!!!
- return clazz;
- }
- protected void cacheCtClass(String classname, CtClass c, boolean dynamic)
- {
- if (dynamic)
- {
- super.cacheCtClass(classname, c, dynamic);
- }
- else
- {
- if (AspectManager.prune) c.prune();
- softcache.put(classname, c);
- }
- }
-
- public void lockInCache(CtClass c)
- {
- super.cacheCtClass(c.getName(), c, false);
- }
-
- protected CtClass getCachedLocally(String classname)
- {
- CtClass cached = (CtClass) classes.get(classname);
- if (cached != null) return cached;
- synchronized (softcache)
- {
- return (CtClass) softcache.get(classname);
- }
- }
-
- public synchronized CtClass getLocally(String classname)
- throws NotFoundException
- {
- softcache.remove(classname);
- CtClass clazz = (CtClass) classes.get(classname);
- if (clazz == null)
- {
- clazz = createCtClass(classname, true);
- if (clazz == null) throw new NotFoundException(classname);
- super.cacheCtClass(classname, clazz, false);
- }
-
- return clazz;
- }
-
-
- public static AOPClassPool createAOPClassPool(ClassLoader cl, ClassPool src, AspectManager manager)
- {
- return AspectManager.classPoolFactory.create(cl, src, manager);
- }
-
- public static AOPClassPool createAOPClassPool(ClassPool src, AspectManager manager)
- {
- return AspectManager.classPoolFactory.create(src, manager);
- }
-
- public Class toClass(CtClass ct, ClassLoader loader, ProtectionDomain domain)
- throws CannotCompileException
- {
- //We need to pass up the classloader stored in this pool, as the default implementation uses the Thread context cl.
- //In the case of JSP's in Tomcat, org.apache.jasper.servlet.JasperLoader will be stored here, while it's parent
- //org.jboss.web.tomcat.tc5.WebCtxLoader$ENCLoader is used as the Thread context cl. The invocation class needs to
- // be generated in the JasperLoader classloader since in the case of method invocations, the package name will be
- //the same as for the class generated from the jsp, i.e. org.apache.jsp. For classes belonging to org.apache.jsp,
- //JasperLoader does NOT delegate to its parent if it cannot find them.
- lockInCache(ct);
- return super.toClass(ct, getClassLoader(), domain);
- }
-
-}
Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,44 +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.aop;
-
-import javassist.ClassPool;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- *
- **/
-public class AOPClassPoolFactory implements ClassPoolFactory
-{
- public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
- {
- return new AOPClassPool(cl, src, manager);
- }
-
- public AOPClassPool create(ClassPool src, AspectManager manager)
- {
- return new AOPClassPool(src, manager);
- }
-}
Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AOPScopedClassLoaderHelper.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,35 +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.aop;
-
-/**
- * Helper to determine if we are running within a scoped classloader.
- *
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision$
- */
-public interface AOPScopedClassLoaderHelper
-{
-
- ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
- ClassLoader getTopLevelJBossClassLoader();
-}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/AspectManager.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -41,14 +41,19 @@
import org.jboss.aop.advice.AdviceBinding;
import org.jboss.aop.advice.AdviceStack;
import org.jboss.aop.advice.AspectDefinition;
+import org.jboss.aop.advice.AspectFactoryWithClassLoader;
import org.jboss.aop.advice.DynamicCFlowDefinition;
import org.jboss.aop.advice.InterceptorFactory;
import org.jboss.aop.advice.PrecedenceDef;
import org.jboss.aop.advice.PrecedenceDefEntry;
import org.jboss.aop.advice.PrecedenceSorter;
import org.jboss.aop.advice.Scope;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
+import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
import org.jboss.aop.instrument.Instrumentor;
import org.jboss.aop.instrument.InstrumentorFactory;
+import org.jboss.aop.instrument.TransformerCommon;
import org.jboss.aop.introduction.AnnotationIntroduction;
import org.jboss.aop.introduction.InterfaceIntroduction;
import org.jboss.aop.metadata.ClassMetaDataBinding;
@@ -69,8 +74,9 @@
import javassist.ByteArrayClassPath;
import javassist.ClassPool;
import javassist.CtClass;
-import javassist.LoaderClassPath;
import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
/**
* This singleton class manages all pointcuts and metadata.
@@ -98,8 +104,6 @@
};
// Attributes ---------------------------------------------------
- protected final WeakHashMap registeredCLs = new WeakHashMap();
- protected final HashMap ucl2classes = new HashMap();
protected final WeakHashMap advisors = new WeakHashMap();
/** A map of domains by classloader, maintaned by the top level AspectManager */
@@ -114,7 +118,6 @@
/** A queue for adding new subscribed subdomains to */
protected final WeakHashMap subscribedSubDomainsQueue = new WeakHashMap();
protected int subscribedDomainQueueRef;
- protected ClassPool classpool;
protected final LinkedHashMap interfaceIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationOverrides = new LinkedHashMap();
@@ -227,7 +230,6 @@
protected static AspectManager manager;
public static boolean optimize = true;
- public static boolean prune = true;
public static boolean debugClasses;//If true, the generated advisor instrumentor will output the generated classes
public static ClassLoaderValidation classLoaderValidator;
@@ -235,7 +237,6 @@
* logging switch. We don't use log4j to avoid another heavy library
*/
public static boolean verbose = false;
- public static ClassPoolFactory classPoolFactory = new AOPClassPoolFactory();
public static synchronized AspectManager getTopLevelAspectManager()
{
@@ -270,9 +271,10 @@
String pruneit = System.getProperty("jboss.aop.prune", null);
if (pruneit != null)
{
- prune = (new Boolean(pruneit)).booleanValue();
+ AOPClassPoolRepository.getInstance().setPrune((new Boolean(pruneit)).booleanValue());
}
manager = new AspectManager();
+ AOPClassPoolRepository.getInstance().setAspectManager(manager);
if (!verbose)
{
@@ -333,12 +335,12 @@
if (scopedClassLoader != null)
{
Domain scopedManager = null;
- synchronized (manager.registeredCLs)
+ synchronized (AOPClassPoolRepository.getInstance().getRegisteredCLs())
{
scopedManager = (Domain)manager.scopedClassLoaderDomains.get(scopedClassLoader);
if (scopedManager == null)
{
- scopedManager = new Domain(manager, false);
+ scopedManager = scopedCLHelper.getScopedClassLoaderDomain(scopedClassLoader, manager);
if (verbose)
{
System.out.println("Created domain " + scopedManager + " for scoped deployment on: " +
@@ -426,9 +428,6 @@
// Constructors -------------------------------------------------
public AspectManager()
{
- classpool = ClassPool.getDefault();
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- classpool.insertClassPath(new LoaderClassPath(cl));
}
/**
@@ -509,7 +508,11 @@
if (subDomain != null && subDomain != this)
{
- return subDomain.findAdvisor(clazz);
+ Advisor advisor = subDomain.findAdvisor(clazz);
+ if (advisor != null)
+ {
+ return advisor;
+ }
}
}
@@ -595,41 +598,17 @@
// Public -------------------------------------------------------
- public Map getRegisteredCLs()
+ public static Map getRegisteredCLs()
{
- clearUnregisteredClassLoaders();
- return registeredCLs;
+ return AOPClassPoolRepository.getInstance().getRegisteredCLs();
}
- private Map getRegisteredCLsNoClear()
- {
- return registeredCLs;
- }
/**
* This method will check to see if a register classloader has been undeployed (as in JBoss)
*/
public void clearUnregisteredClassLoaders()
{
- ArrayList toUnregister = null;
- synchronized (getRegisteredCLsNoClear())
- {
- Iterator it = getRegisteredCLsNoClear().values().iterator();
- while (it.hasNext())
- {
- AOPClassPool pool = (AOPClassPool) it.next();
- if (pool.isUnloadedClassLoader())
- {
- it.remove();
- }
- }
- if (toUnregister != null)
- {
- for (int i = 0; i < toUnregister.size(); i++)
- {
- unregisterClassLoader((ClassLoader) toUnregister.get(i));
- }
- }
- }
+ AOPClassPoolRepository.getInstance().clearUnregisteredClassLoaders();
}
/**
@@ -643,7 +622,7 @@
synchronized (getRegisteredCLs())
{
if (!advisors.containsKey(advisor.getClazz())) return false;
- AOPClassPool pool = (AOPClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
+ ScopedClassPool pool = (ScopedClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
if (pool == null) return false;
if (pool.isUnloadedClassLoader())
{
@@ -675,39 +654,12 @@
public ClassPool registerClassLoader(ClassLoader ucl)
{
-// System.out.println("------> registerClassLoader " + ucl);
- synchronized (getRegisteredCLs())
- {
- // FIXME: Probably want to take this method out later
- // so that AOP framework can be independent of JMX
- // This is in here so that we can remove a UCL from the ClassPool as a
- // ClassPool.classpath
- if (getRegisteredCLs().containsKey(ucl))
- {
-// System.out.println("------> found pool");
- return (ClassPool) getRegisteredCLs().get(ucl);
- }
-// System.out.println("------> creating pool");
- AOPClassPool pool = AOPClassPool.createAOPClassPool(ucl, classpool, this);
- getRegisteredCLs().put(ucl, pool);
- return pool;
- }
+ return AOPClassPoolRepository.getInstance().registerClassLoader(ucl);
}
- protected Map getUcl2Classes()
- {
- return ucl2classes;
- }
-
protected void registerClass(Class clazz)
{
- HashSet classes = (HashSet) getUcl2Classes().get(clazz.getClassLoader());
- if (classes == null)
- {
- classes = new HashSet();
- getUcl2Classes().put(clazz.getClassLoader(), classes);
- }
- classes.add(clazz);
+ AOPClassPoolRepository.getInstance().registerClass(clazz);
}
protected Map getScopedClassLoaderDomains()
@@ -717,42 +669,9 @@
public void unregisterClassLoader(ClassLoader cl)
{
- synchronized (getRegisteredCLs())
- {
- AOPClassPool pool = (AOPClassPool) getRegisteredCLs().remove(cl);
- if (pool != null) pool.close();
- HashSet classes = (HashSet) getUcl2Classes().remove(cl);
- if (classes != null)
- {
- Iterator it = classes.iterator();
- while (it.hasNext())
- {
- Object clazz = it.next();
- synchronized (advisors)
- {
- advisors.remove(clazz);
- Class advisedClass = (Class)clazz;
- try
- {
- //The static advisor field should be the only remaining hard reference to the advisor
- Field f = advisedClass.getDeclaredField(Instrumentor.HELPER_FIELD_NAME);
- f.setAccessible(true);
- f.set(null, null);
- }
- catch(NoSuchFieldException e)
- {
- System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + e);
- }
- catch(IllegalAccessException e)
- {
- System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + e);
- }
- }
- }
- }
-
- getScopedClassLoaderDomains().remove(cl);
- }
+ AOPClassPoolRepository.getInstance().unregisterClassLoader(cl);
+ //top-level only
+ getScopedClassLoaderDomains().remove(cl);
}
public ArrayList getExclude()
@@ -834,6 +753,25 @@
return false;
}
+ public static boolean getPrune()
+ {
+ return AOPClassPoolRepository.getInstance().isPrune();
+ }
+
+ public static void setPrune(boolean prune)
+ {
+ AOPClassPoolRepository.getInstance().setPrune(prune);
+ }
+
+ public static void setClassPoolFactory(ScopedClassPoolFactory factory)
+ {
+ AOPClassPoolRepository.getInstance().setClassPoolFactory(factory);
+ }
+
+ public static ScopedClassPoolFactory getClassPoolFactory()
+ {
+ return AOPClassPoolRepository.getInstance().getClassPoolFactory();
+ }
public boolean isNonAdvisableClassName(String classname)
{
if (ignoreClass(classname)) return true;
@@ -972,7 +910,7 @@
{
pool.lockInCache(clazz);
byte[] rtn = clazz.toBytecode();
- if (AspectManager.prune) clazz.prune();
+ if (AspectManager.getPrune()) clazz.prune();
return rtn;
}
else
@@ -1535,7 +1473,7 @@
Advisor advisor = getAdvisorFromAdvisorsKeySetIterator(it);
if (advisor == null) continue;
- Class clazz = ((ClassAdvisor) advisor).getClazz();
+ Class clazz = advisor.getClazz();
addAdvisorToClassMetaDataBinding(meta, clazz, advisor, clazz);
}
}
@@ -1785,13 +1723,37 @@
{
synchronized (aspect)
{
- AspectDefinition adef = (AspectDefinition) aspect;
- aspect = adef.getFactory().createPerVM();
- perVMAspects.put(def, aspect);
+ return createPerVmAspect(def, (AspectDefinition)aspect, null);
}
}
return aspect;
}
+
+ protected Object createPerVmAspect(String def, AspectDefinition adef, ClassLoader scopedClassLoader)
+ {
+ Object instance = null;
+ synchronized (adef)
+ {
+ try
+ {
+ if (scopedClassLoader != null && adef.getFactory() instanceof AspectFactoryWithClassLoader)
+ {
+ //If a scoped classloader with no parent delegation redefines the class, we need to make sure that that class is pushed on the stack
+ ((AspectFactoryWithClassLoader)adef.getFactory()).pushScopedClassLoader(scopedClassLoader);
+ }
+ instance = adef.getFactory().createPerVM();
+ perVMAspects.put(def, instance);
+ }
+ finally
+ {
+ if (scopedClassLoader != null && adef.getFactory() instanceof AspectFactoryWithClassLoader)
+ {
+ ((AspectFactoryWithClassLoader)adef.getFactory()).popScopedClassLoader();
+ }
+ }
+ }
+ return instance;
+ }
public void addAspectDefinition(AspectDefinition def)
{
Deleted: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/ClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -1,38 +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.aop;
-
-import javassist.ClassPool;
-
-/**
- * Comment
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- *
- **/
-public interface ClassPoolFactory
-{
- public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager);
-
- public AOPClassPool create(ClassPool src, AspectManager manager);
-}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/Domain.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -678,19 +678,6 @@
//Methods that should delegate to the top AspectManager
/** Managed by the top-level aspect manager */
- public Map getRegisteredCLs()
- {
- //ClassLoaders etc. are only managed by the top-level AspectManager
- return parent.getRegisteredCLs();
- }
-
- /** Managed by the top-level aspect manager */
- protected Map getUcl2Classes()
- {
- return parent.getUcl2Classes();
- }
-
- /** Managed by the top-level aspect manager */
protected Map getScopedClassLoaderDomains()
{
return parent.getScopedClassLoaderDomains();
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoader.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -31,4 +31,7 @@
public interface AspectFactoryWithClassLoader
{
public void setClassLoader(ClassLoader cl);
+ public void pushScopedClassLoader(ClassLoader scopedCl);
+ public void popScopedClassLoader();
+ public ClassLoader peekScopedClassLoader();
}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/advice/AspectFactoryWithClassLoaderSupport.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -34,6 +34,9 @@
{
private WeakReference loader;
+ /** If a scoped classloader with no parent delegation redefines the class, we need to make sure that that class is pushed on the stack */
+ private ThreadLocal scopedClassLoader = new ThreadLocal();
+
protected AspectFactoryWithClassLoaderSupport()
{
}
@@ -51,6 +54,21 @@
}
return null;
}
+
+ public void pushScopedClassLoader(ClassLoader scopedCl)
+ {
+ scopedClassLoader.set(scopedCl);
+ }
+
+ public void popScopedClassLoader()
+ {
+ scopedClassLoader.set(null);
+ }
+
+ public ClassLoader peekScopedClassLoader()
+ {
+ return (ClassLoader)scopedClassLoader.get();
+ }
protected Class loadClass(String name) throws ClassNotFoundException
{
Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,206 @@
+/*
+ * 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.aop.classpool;
+
+import java.lang.ref.WeakReference;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jboss.aop.AspectManager;
+
+import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision: 56792 $
+ */
+public class AOPClassPool extends ScopedClassPool
+{
+ /** Classnames of classes that will be created - we do not want to look for these in other pools */
+ protected ConcurrentReaderHashMap generatedClasses = new ConcurrentReaderHashMap();
+
+ protected ConcurrentReaderHashMap localResources = new ConcurrentReaderHashMap();
+
+ static
+ {
+ ClassPool.doPruning = false;
+ ClassPool.releaseUnmodifiedClassFile = false;
+ }
+
+ public AOPClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ super(cl, src, repository);
+ }
+
+ protected AOPClassPool(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ this(null, src, repository);
+ }
+
+ public void setClassLoader(ClassLoader cl)
+ {
+ classLoader = new WeakReference(cl);
+ }
+
+ public void registerGeneratedClass(String className)
+ {
+ generatedClasses.put(className, className);
+ }
+
+ public void close()
+ {
+ super.close();
+ AOPClassPoolRepository.getInstance().perfomUnregisterClassLoader(getClassLoader());
+ }
+
+ public CtClass getCached(String classname)
+ {
+ CtClass clazz = getCachedLocally(classname);
+ if (clazz == null)
+ {
+ boolean isLocal = false;
+
+ //FIXME - Once Javassist > 3.3.0 is out use getClassLoader0() and get rid of try/catch
+ ClassLoader cl = null;
+ try
+ {
+ cl = getClassLoader();
+ }
+ catch (RuntimeException e)
+ {
+ //Ignore, the ScopedClassPoll throws an exception if pool is not associated with a cl
+ }
+
+ if (cl != null)
+ {
+ String classResourceName = getResourceName(classname);
+ isLocal = isLocalResource(classResourceName);
+ }
+
+ if (!isLocal)
+ {
+ Object o = generatedClasses.get(classname);
+ if (o == null)
+ {
+ Map registeredCLs = AspectManager.getRegisteredCLs();
+ synchronized (registeredCLs)
+ {
+ Iterator it = registeredCLs.values().iterator();
+ while (it.hasNext())
+ {
+ AOPClassPool pool = (AOPClassPool) it.next();
+ if (pool.isUnloadedClassLoader())
+ {
+ AspectManager.instance().unregisterClassLoader(pool.getClassLoader());
+ continue;
+ }
+
+ //Do not check classpools for scoped classloaders
+ if (pool.getClass().getName().equals("org.jboss.aop.deployment.ScopedJBossClassPool"))
+ {
+ continue;
+ }
+
+ clazz = pool.getCachedLocally(classname);
+ if (clazz != null)
+ {
+ return clazz;
+ }
+ }
+ }
+ }
+ }
+ }
+ // *NOTE* NEED TO TEST WHEN SUPERCLASS IS IN ANOTHER UCL!!!!!!
+ return clazz;
+ }
+
+ protected String getResourceName(String classname)
+ {
+ final int lastIndex = classname.lastIndexOf('$');
+ if (lastIndex < 0)
+ {
+ return classname.replaceAll("[\\.]", "/") + ".class";
+ }
+ else
+ {
+ return classname.substring(0, lastIndex).replaceAll("[\\.]", "/") + classname.substring(lastIndex) + ".class";
+ }
+ }
+
+ protected boolean isLocalResource(String resourceName)
+ {
+ String classResourceName = getResourceName(resourceName);
+ Boolean isLocal = (Boolean)localResources.get(classResourceName);
+ if (isLocal != null)
+ {
+ return isLocal.booleanValue();
+ }
+ boolean localResource = getClassLoader().getResource(classResourceName) != null;
+ localResources.put(classResourceName, localResource ? Boolean.TRUE : Boolean.FALSE);
+ return localResource;
+ }
+
+ public synchronized CtClass getLocally(String classname)
+ throws NotFoundException
+ {
+ softcache.remove(classname);
+ CtClass clazz = (CtClass) classes.get(classname);
+ if (clazz == null)
+ {
+ clazz = createCtClass(classname, true);
+ if (clazz == null) throw new NotFoundException(classname);
+ lockInCache(clazz);//Avoid use of the softclasscache
+ }
+
+ return clazz;
+ }
+
+
+ public static AOPClassPool createAOPClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ return (AOPClassPool)AspectManager.getClassPoolFactory().create(cl, src, repository);
+ }
+
+ public static AOPClassPool createAOPClassPool(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ return (AOPClassPool)AspectManager.getClassPoolFactory().create(src, repository);
+ }
+
+ public String toString()
+ {
+ ClassLoader cl = null;
+ try
+ {
+ cl = getClassLoader();
+ }
+ catch(IllegalStateException ignore)
+ {
+ }
+ return super.toString() + " - dcl " + cl;
+ }
+}
Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,47 @@
+/*
+ * 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.aop.classpool;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision: 55872 $
+ *
+ **/
+public class AOPClassPoolFactory implements ScopedClassPoolFactory
+{
+ public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ {
+ return new AOPClassPool(cl, src, repository);
+ }
+
+ public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
+ {
+ return new AOPClassPool(src, repository);
+ }
+}
Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPClassPoolRepository.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,234 @@
+/*
+* 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.aop.classpool;
+
+import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.instrument.Instrumentor;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+import javassist.scopedpool.ScopedClassPoolRepositoryImpl;
+
+/**
+ * Singleton classpool repository used by aop
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 46253 $
+ */
+public class AOPClassPoolRepository implements ScopedClassPoolRepository
+{
+ private final static AOPClassPoolRepository instance = new AOPClassPoolRepository();
+
+ /** The classes per classppol */
+ protected final HashMap ucl2classes = new HashMap();
+
+ /** The top-level AspectManager this pool belongs to */
+ AspectManager manager;
+
+ ScopedClassPoolRepository delegate;
+
+ public static AOPClassPoolRepository getInstance()
+ {
+ return instance;
+ }
+
+ private AOPClassPoolRepository()
+ {
+ this.delegate = ScopedClassPoolRepositoryImpl.getInstance();
+ delegate.setClassPoolFactory(new AOPClassPoolFactory());
+ }
+
+
+ public void setClassPoolFactory(ScopedClassPoolFactory factory)
+ {
+ delegate.setClassPoolFactory(factory);
+ }
+
+ public ScopedClassPoolFactory getClassPoolFactory()
+ {
+ return delegate.getClassPoolFactory();
+ }
+
+ public boolean isPrune()
+ {
+ return delegate.isPrune();
+ }
+
+ public void setPrune(boolean prune)
+ {
+ delegate.setPrune(prune);
+ }
+
+ public ScopedClassPool createScopedClassPool(ClassLoader cl, ClassPool src)
+ {
+ return delegate.createScopedClassPool(cl, src);
+ }
+
+ public ClassPool findClassPool(ClassLoader cl)
+ {
+ return delegate.findClassPool(cl);
+ }
+
+ public void setAspectManager(AspectManager manager)
+ {
+ this.manager = manager;
+ }
+
+ /**
+ * Get the registered classloaders
+ *
+ * @return the registered classloaders
+ */
+ public Map getRegisteredCLs()
+ {
+ return delegate.getRegisteredCLs();
+ }
+
+ /**
+ * This method will check to see if a register classloader has been undeployed (as in JBoss)
+ */
+ public void clearUnregisteredClassLoaders()
+ {
+ delegate.clearUnregisteredClassLoaders();
+ }
+
+ public ClassPool registerClassLoader(ClassLoader ucl)
+ {
+ return delegate.registerClassLoader(ucl);
+ }
+
+ public void unregisterClassLoader(ClassLoader cl)
+ {
+ delegate.unregisterClassLoader(cl);
+ }
+
+ public void registerClass(Class clazz)
+ {
+ HashSet classes = (HashSet) ucl2classes.get(clazz.getClassLoader());
+ if (classes == null)
+ {
+ classes = new HashSet();
+ ucl2classes.put(clazz.getClassLoader(), classes);
+ }
+ classes.add(clazz);
+ }
+
+ public void perfomUnregisterClassLoader(ClassLoader cl)
+ {
+ if (System.getSecurityManager() == null)
+ {
+ UnregisterClassLoaderAction.NON_PRIVILEGED.unregister(this, cl);
+ }
+ else
+ {
+ UnregisterClassLoaderAction.PRIVILEGED.unregister(this, cl);
+ }
+ }
+
+ private void doUnregisterClassLoader(ClassLoader cl)
+ {
+ synchronized (delegate.getRegisteredCLs())
+ {
+ HashSet classes = (HashSet) ucl2classes.remove(cl);
+ if (classes != null)
+ {
+ Iterator it = classes.iterator();
+ while (it.hasNext())
+ {
+ Object clazz = it.next();
+ synchronized (manager.getAdvisors())
+ {
+ manager.getAdvisors().remove(clazz);
+ Class advisedClass = (Class)clazz;
+ try
+ {
+ //The static advisor field should be the only remaining hard reference to the advisor
+ Field f = advisedClass.getDeclaredField(Instrumentor.HELPER_FIELD_NAME);
+ f.setAccessible(true);
+ f.set(null, null);
+ }
+ catch(NoSuchFieldException e)
+ {
+ System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
+ }
+ catch(IllegalAccessException e)
+ {
+ System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ interface UnregisterClassLoaderAction
+ {
+ void unregister(AOPClassPoolRepository repository, ClassLoader loader);
+
+ UnregisterClassLoaderAction PRIVILEGED = new UnregisterClassLoaderAction()
+ {
+ public void unregister(final AOPClassPoolRepository repository, final ClassLoader loader)
+ {
+ try
+ {
+ AccessController.doPrivileged(new PrivilegedExceptionAction()
+ {
+ public Object run()
+ {
+ repository.doUnregisterClassLoader(loader);
+ return null;
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ Exception ex = e.getException();
+ if (ex instanceof RuntimeException)
+ {
+ throw (RuntimeException)ex;
+ }
+ throw new RuntimeException(ex);
+ }
+ }
+ };
+
+ UnregisterClassLoaderAction NON_PRIVILEGED = new UnregisterClassLoaderAction()
+ {
+ public void unregister(AOPClassPoolRepository repository, ClassLoader loader)
+ {
+ repository.doUnregisterClassLoader(loader);
+ }
+ };
+ }
+}
Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/classpool/AOPScopedClassLoaderHelper.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,39 @@
+/*
+* 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.aop.classpool;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+
+/**
+ * Helper to determine if we are running within a scoped classloader.
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 56777 $
+ */
+public interface AOPScopedClassLoaderHelper
+{
+
+ ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader);
+ ClassLoader getTopLevelJBossClassLoader();
+ Domain getScopedClassLoaderDomain(ClassLoader cl, AspectManager parent);
+}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/contrib/IDEClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -30,17 +30,19 @@
import javassist.ClassPool;
import javassist.CtClass;
import javassist.LoaderClassPath;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
+import org.jboss.aop.classpool.AOPClassPool;
/**
* @author Marshall
* <p/>
* This is a class pool factory used by JBossIDE to create an AOP Class Pool
*/
-public class IDEClassPoolFactory implements ClassPoolFactory
+public class IDEClassPoolFactory implements ScopedClassPoolFactory
{
private ArrayList classPaths;
@@ -50,15 +52,15 @@
classPaths = new ArrayList();
}
- public AOPClassPool create(ClassLoader loader, ClassPool pool, AspectManager manager)
+ public ScopedClassPool create(ClassLoader loader, ClassPool pool, ScopedClassPoolRepository repository)
{
- SimpleClassPool classPool = new SimpleClassPool(loader, pool, manager);
+ SimpleClassPool classPool = new SimpleClassPool(loader, pool, repository);
return classPool;
}
- public AOPClassPool create(ClassPool pool, AspectManager manager)
+ public ScopedClassPool create(ClassPool pool, ScopedClassPoolRepository repository)
{
- SimpleClassPool classPool = new SimpleClassPool(pool, manager);
+ SimpleClassPool classPool = new SimpleClassPool(pool, repository);
return classPool;
}
@@ -78,15 +80,15 @@
{
private Loader loader;
- public SimpleClassPool(ClassLoader loader, ClassPool pool, AspectManager manager)
+ public SimpleClassPool(ClassLoader loader, ClassPool pool, ScopedClassPoolRepository repository)
{
- super(loader, pool, manager);
+ super(loader, pool, repository);
loadClasspath();
}
- public SimpleClassPool(ClassPool pool, AspectManager manager)
+ public SimpleClassPool(ClassPool pool, ScopedClassPoolRepository repository)
{
- super(pool, manager);
+ super(pool, repository);
loadClasspath();
}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/ClassicInstrumentor.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -28,9 +28,9 @@
import javassist.CtNewMethod;
import javassist.NotFoundException;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
/**
* Comment
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/FieldAccessTransformer.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,9 +24,9 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
import javassist.CannotCompileException;
import javassist.ClassPool;
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -31,7 +31,6 @@
import javassist.Modifier;
import javassist.NotFoundException;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
import org.jboss.aop.ClassAdvisor;
import org.jboss.aop.ConByMethodInfo;
@@ -40,6 +39,7 @@
import org.jboss.aop.JoinPointInfo;
import org.jboss.aop.MethodByMethodInfo;
import org.jboss.aop.MethodInfo;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.util.JavassistToReflect;
/**
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/Instrumentor.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -29,12 +29,13 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.Advised;
import org.jboss.aop.Advisor;
import org.jboss.aop.AspectManager;
import org.jboss.aop.ClassAdvisor;
import org.jboss.aop.annotation.compiler.AnnotationInfoCreator;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
import org.jboss.aop.introduction.AnnotationIntroduction;
import org.jboss.aop.introduction.InterfaceIntroduction;
import org.jboss.aop.util.CtConstructorComparator;
@@ -546,7 +547,7 @@
String ref = null;
try
{
- AOPClassPool pool = AOPClassPool.createAOPClassPool(clazz.getClassPool(), manager);
+ AOPClassPool pool = AOPClassPool.createAOPClassPool(clazz.getClassPool(), AOPClassPoolRepository.getInstance());
Iterator it = clazz.getRefClasses().iterator();
while (it.hasNext())
Added: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorEnum.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,41 @@
+/*
+* 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.aop.instrument;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 45806 $
+ */
+public class InstrumentorEnum
+{
+ public static final InstrumentorEnum CLASSIC = new InstrumentorEnum(1);
+ public static final InstrumentorEnum GENERATED_ADVISOR = new InstrumentorEnum(2);
+ public static final InstrumentorEnum OTHER_INSTRUMENTOR = new InstrumentorEnum(1000); //The jrockit aop instrumentor is in another jar which we should not depend on
+
+ int instrumentor;
+
+ public InstrumentorEnum(int i)
+ {
+ instrumentor = i;
+ }
+}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/InstrumentorFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,8 +23,8 @@
import java.lang.reflect.Constructor;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
/**
* Comment
@@ -33,12 +33,9 @@
* @version $Revision$
*/
public class InstrumentorFactory
-{
- protected static final int CLASSIC = 1;
- protected static final int GENERATED_ADVISOR = 2;
- protected static final int OTHER_INSTRUMENTOR = 1000; //The jrockit aop instrumentor is in another jar which we should not depend on
- protected static int instrumentor = 0;
-
+{
+ protected static InstrumentorEnum instrumentor;
+
protected static Constructor otherInstrumentorConstructor;
private static final Class[] CONSTRUCTOR_SIG = new Class[] {AOPClassPool.class, AspectManager.class, JoinpointClassifier.class, DynamicTransformationObserver.class};
@@ -54,11 +51,11 @@
{
if (property.equals(ClassicInstrumentor.class.getName()))
{
- instrumentor = CLASSIC;
+ instrumentor = InstrumentorEnum.CLASSIC;
}
else if (property.equals(GeneratedAdvisorInstrumentor.class.getName()))
{
- instrumentor = GENERATED_ADVISOR;
+ instrumentor = InstrumentorEnum.GENERATED_ADVISOR;
}
else
{
@@ -84,17 +81,17 @@
{
System.out.println("[debug] Defaulting instrumentor to: " + ClassicInstrumentor.class.getName());
}
- instrumentor = CLASSIC;
+ instrumentor = InstrumentorEnum.CLASSIC;
}
}
public static Instrumentor getInstrumentor(AOPClassPool pool, AspectManager manager, JoinpointClassifier joinpointClassifier, DynamicTransformationObserver observer)
{
- if (instrumentor == CLASSIC)
+ if (instrumentor == InstrumentorEnum.CLASSIC)
{
return new ClassicInstrumentor(pool, manager, joinpointClassifier, observer);
}
- else if (instrumentor == GENERATED_ADVISOR)
+ else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
{
return new GeneratedAdvisorInstrumentor(pool, manager, joinpointClassifier, observer);
}
@@ -115,19 +112,39 @@
}
}
-
public static Instrumentor getInstrumentor(AspectManager manager, JoinpointClassifier joinpointClassifier)
{
- switch(instrumentor)
+ if (instrumentor == InstrumentorEnum.CLASSIC)
{
- case CLASSIC:
- return new ClassicInstrumentor(manager, joinpointClassifier);
- case GENERATED_ADVISOR:
- return new GeneratedAdvisorInstrumentor(manager, joinpointClassifier);
- default:
- throw new RuntimeException("Instrumentor is not set");
-
+ return new ClassicInstrumentor(manager, joinpointClassifier);
}
+ else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
+ {
+ return new GeneratedAdvisorInstrumentor(manager, joinpointClassifier);
+ }
+ else
+ {
+ throw new RuntimeException("Instrumentor is not set");
+ }
}
-
+
+ public static String getInstrumentorName()
+ {
+ if (instrumentor == InstrumentorEnum.CLASSIC)
+ {
+ return ClassicInstrumentor.class.getName();
+ }
+ else if (instrumentor == InstrumentorEnum.GENERATED_ADVISOR)
+ {
+ return GeneratedAdvisorInstrumentor.class.getName();
+ }
+ else if (instrumentor == InstrumentorEnum.OTHER_INSTRUMENTOR)
+ {
+ return otherInstrumentorConstructor.getName();
+ }
+ else
+ {
+ throw new RuntimeException("Instrumentor is not set");
+ }
+ }
}
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -25,8 +25,8 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.util.JavassistMethodHashing;
import javassist.CannotCompileException;
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedCallerInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -22,6 +22,8 @@
package org.jboss.aop.instrument;
+import org.jboss.aop.classpool.AOPClassPool;
+
import javassist.CannotCompileException;
import javassist.CtClass;
import javassist.CtConstructor;
@@ -31,8 +33,6 @@
import javassist.Modifier;
import javassist.NotFoundException;
-import org.jboss.aop.AOPClassPool;
-
/**
* Comment
*
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructionInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -26,7 +26,7 @@
import java.net.URI;
import java.net.URL;
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.standalone.Compiler;
import javassist.ClassPool;
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedConstructorInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -26,7 +26,7 @@
import java.net.URI;
import java.net.URL;
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.standalone.Compiler;
import javassist.CannotCompileException;
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedFieldInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,7 +21,7 @@
*/
package org.jboss.aop.instrument;
-import org.jboss.aop.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.util.JavassistToReflect;
import javassist.CannotCompileException;
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -22,14 +22,14 @@
package org.jboss.aop.instrument;
+import org.jboss.aop.classpool.AOPClassPool;
+
import javassist.CannotCompileException;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtNewConstructor;
import javassist.NotFoundException;
-import org.jboss.aop.AOPClassPool;
-
/**
* Comment
*
Modified: branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java
===================================================================
--- branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aop/src/main/org/jboss/aop/instrument/OptimizedMethodInvocations.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -32,8 +32,8 @@
import javassist.Modifier;
import javassist.NotFoundException;
-import org.jboss.aop.AOPClassPool;
import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.classpool.AOPClassPool;
/**
* Comment
Modified: branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/jdk15/org/jboss/aop/deployment/AspectManagerService32JDK5.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,7 +21,8 @@
*/
package org.jboss.aop.deployment;
-import org.jboss.aop.ClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolFactory;
+
import org.jboss.aop.ClassLoaderValidation;
/**
@@ -31,7 +32,7 @@
*/
public class AspectManagerService32JDK5 extends AspectManagerServiceJDK5
{
- protected ClassPoolFactory createFactory() throws Exception
+ protected ScopedClassPoolFactory createFactory() throws Exception
{
return new JBossClassPoolFactory32(tmpClassesDir);
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectDeployer.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -167,7 +167,7 @@
AspectXmlLoader.deployXML(docURL, scl);
Notification msg = new Notification("AOP Deploy", this, getNextNotificationSequenceNumber());
sendNotification(msg);
- log.info("Deployed AOP: " + di.url);
+ log.debug("Deployed AOP: " + di.url);
}
catch (Exception ex)
{
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -28,6 +28,9 @@
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
+
+import javassist.scopedpool.ScopedClassPoolFactory;
+
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
@@ -40,10 +43,10 @@
import org.jboss.aop.AspectNotificationHandler;
import org.jboss.aop.AspectXmlLoader;
import org.jboss.aop.ClassLoaderValidation;
-import org.jboss.aop.ClassPoolFactory;
import org.jboss.aop.Deployment;
import org.jboss.aop.hook.JDK14Transformer;
import org.jboss.aop.hook.JDK14TransformerManager;
+import org.jboss.aop.instrument.InstrumentorFactory;
import org.jboss.mx.server.ServerConstants;
import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.system.ServiceMBeanSupport;
@@ -81,7 +84,7 @@
// Public -------------------------------------------------------
- protected ClassPoolFactory createFactory() throws Exception
+ protected ScopedClassPoolFactory createFactory() throws Exception
{
return new JBossClassPoolFactory(tmpClassesDir);
}
@@ -105,7 +108,7 @@
// Validate the the tmp dir exists
if (tmpClassesDir.exists() == false && tmpClassesDir.mkdirs() == false)
throw new FileNotFoundException("Failed to create tmpClassesDir: " + tmpClassesDir.getAbsolutePath());
- AspectManager.classPoolFactory = createFactory();
+ AspectManager.setClassPoolFactory(createFactory());
AspectManager.classLoaderValidator = createClassLoaderValidation();
// Add the tmp classes dir to our UCL classpath
@@ -243,12 +246,12 @@
public boolean getPrune()
{
- return AspectManager.prune;
+ return AspectManager.getPrune();
}
public void setPrune(boolean prune)
{
- AspectManager.prune = prune;
+ AspectManager.setPrune(prune);
}
public String getExclude()
@@ -562,4 +565,15 @@
}
this.enableLoadtimeWeaving = enableTransformer;
}
+
+ public String getInstrumentor()
+ {
+ return InstrumentorFactory.getInstrumentorName();
+ }
+
+ public void setInstrumentor(String instrumentor)
+ {
+ InstrumentorFactory.initialise(instrumentor);
+ }
+
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerService32.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,8 +21,9 @@
*/
package org.jboss.aop.deployment;
+import javassist.scopedpool.ScopedClassPoolFactory;
+
import org.jboss.aop.ClassLoaderValidation;
-import org.jboss.aop.ClassPoolFactory;
/**
* Comment
@@ -32,7 +33,7 @@
*/
public class AspectManagerService32 extends AspectManagerService
{
- protected ClassPoolFactory createFactory() throws Exception
+ protected ScopedClassPoolFactory createFactory() throws Exception
{
return new JBossClassPoolFactory32(tmpClassesDir);
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/AspectManagerServiceMBean.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -119,4 +119,9 @@
void setIgnore(String ignore);
+ String getInstrumentor();
+
+ void setInstrumentor(String instrumentor);
+
+
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,12 +23,15 @@
import java.io.File;
import java.io.FileOutputStream;
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.mx.loading.RepositoryClassLoader;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
/**
* Comment
@@ -42,18 +45,20 @@
* Used for dynamically created classes (see loadClass(String, byte[]), ClassLoader)
*/
protected File tempdir = null;
+ protected URL tempURL = null;
// For loadClass tmpdir creation for UCL
protected final Object tmplock = new Object();
-
- protected JBossClassPool(ClassLoader cl, ClassPool src, AspectManager manager, File tmp)
+
+ protected JBossClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp, URL tmpURL)
{
- super(cl, src, manager);
+ super(cl, src, repository);
tempdir = tmp;
+ tempURL = tmpURL;
}
- protected JBossClassPool(ClassPool src, AspectManager manager)
+ protected JBossClassPool(ClassPool src, ScopedClassPoolRepository repository)
{
- super(src, manager);
+ super(src, repository);
}
public boolean isUnloadedClassLoader()
@@ -66,19 +71,19 @@
return false;
}
- public Class toClass(CtClass cc, ClassLoader loader)
+ public Class toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain)
throws CannotCompileException
{
lockInCache(cc);
if (getClassLoader() == null || tempdir == null)
{
- return super.toClass(cc);
+ return super.toClass(cc, loader, domain);
}
Class dynClass = null;
try
{
File classFile = null;
- String classFileName = cc.getName().replace('.', '/') + ".class";
+ String classFileName = getResourceName(cc.getName());
// Write the clas file to the tmpdir
synchronized (tmplock)
{
@@ -112,4 +117,19 @@
return dynClass;
}
+ protected boolean isLocalResource(String resourceName)
+ {
+ if (super.isLocalResource(resourceName))
+ {
+ return true;
+ }
+
+ File file = new File(tempdir, resourceName);
+ if (file.exists())
+ {
+ return true;
+ }
+
+ return false;
+ }
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPool32.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -23,13 +23,16 @@
import java.io.File;
import java.io.FileOutputStream;
-import org.jboss.aop.AOPClassPool;
+import java.security.ProtectionDomain;
+
import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.mx.loading.RepositoryClassLoader;
import org.jboss.mx.loading.UnifiedClassLoader;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
/**
* Comment
@@ -46,15 +49,15 @@
// For loadClass tmpdir creation for UCL
protected final Object tmplock = new Object();
- protected JBossClassPool32(ClassLoader cl, ClassPool src, AspectManager manager, File tmp)
+ protected JBossClassPool32(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, File tmp)
{
- super(cl, src, manager);
+ super(cl, src, repository);
tempdir = tmp;
}
- protected JBossClassPool32(ClassPool src, AspectManager manager)
+ protected JBossClassPool32(ClassPool src, ScopedClassPoolRepository repository)
{
- super(src, manager);
+ super(src, repository);
}
public boolean isUnloadedClassLoader()
@@ -67,13 +70,13 @@
return false;
}
- public Class toClass(CtClass cc, ClassLoader loader)
+ public Class toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain)
throws CannotCompileException
{
lockInCache(cc);
if (getClassLoader() == null || tempdir == null)
{
- return super.toClass(cc);
+ return super.toClass(cc, loader, domain);
}
Class dynClass = null;
try
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,11 +24,14 @@
import java.io.File;
import java.io.IOException;
import java.net.URL;
-import org.jboss.aop.AOPClassPool;
+
import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.mx.loading.RepositoryClassLoader;
import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
/**
* Comment
@@ -37,7 +40,7 @@
* @version $Revision$
*
**/
-public class JBossClassPoolFactory implements ClassPoolFactory
+public class JBossClassPoolFactory implements ScopedClassPoolFactory
{
protected File tmpClassesDir;
@@ -46,16 +49,22 @@
this.tmpClassesDir = tmpClassesDir;
}
- public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
try
{
if (cl instanceof RepositoryClassLoader)
{
File tempdir = createTempDir(cl);
- return new JBossClassPool(cl, src, manager, tempdir);
+ URL tmpCP = createURLAndAddToLoader(cl, tempdir);
+ if (AspectManager.scopedCLHelper.ifScopedDeploymentGetScopedParentUclForCL(cl) != null)
+ {
+ //It is scoped
+ return new ScopedJBossClassPool(cl, src, repository, tempdir, tmpCP);
+ }
+ return new JBossClassPool(cl, src, repository, tempdir, tmpCP);
}
- return new AOPClassPool(cl, src, manager);
+ return new AOPClassPool(cl, src, repository);
}
catch (IOException e)
{
@@ -63,9 +72,9 @@
}
}
- public AOPClassPool create(ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
{
- return new JBossClassPool(src, manager);
+ return new JBossClassPool(src, repository);
}
public File createTempDir(ClassLoader cl) throws IOException
@@ -74,12 +83,23 @@
tempdir.delete();
tempdir.mkdir();
tempdir.deleteOnExit();
- RepositoryClassLoader ucl = (RepositoryClassLoader) cl;
+
+ 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 tempdir;
+ if (ucl.getLoaderRepository() != null)
+ {
+ ucl.addURL(tmpCP);
+ }
+
+ return tmpCP;
}
}
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossClassPoolFactory32.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -24,11 +24,11 @@
import java.io.File;
import java.io.IOException;
import java.net.URL;
-import org.jboss.aop.AOPClassPool;
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.ClassPoolFactory;
import org.jboss.mx.loading.UnifiedClassLoader;
import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
/**
* Comment
@@ -37,7 +37,7 @@
* @version $Revision$
*
**/
-public class JBossClassPoolFactory32 implements ClassPoolFactory
+public class JBossClassPoolFactory32 implements ScopedClassPoolFactory
{
protected File tmpClassesDir;
@@ -46,12 +46,12 @@
this.tmpClassesDir = tmpClassesDir;
}
- public AOPClassPool create(ClassLoader cl, ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
try
{
File tempdir = createTempDir(cl);
- return new JBossClassPool32(cl, src, manager, tempdir);
+ return new JBossClassPool32(cl, src, repository, tempdir);
}
catch (IOException e)
{
@@ -59,9 +59,9 @@
}
}
- public AOPClassPool create(ClassPool src, AspectManager manager)
+ public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
{
- return new JBossClassPool32(src, manager);
+ return new JBossClassPool32(src, repository);
}
public File createTempDir(ClassLoader cl) throws IOException
Modified: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/JBossScopedClassLoaderHelper.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -21,10 +21,12 @@
*/
package org.jboss.aop.deployment;
-import org.jboss.aop.AOPScopedClassLoaderHelper;
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
import org.jboss.mx.loading.RepositoryClassLoader;
-import org.jboss.system.server.NoAnnotationURLClassLoader;
/**
*
@@ -33,7 +35,6 @@
*/
public class JBossScopedClassLoaderHelper implements AOPScopedClassLoaderHelper
{
-
public ClassLoader ifScopedDeploymentGetScopedParentUclForCL(ClassLoader loader)
{
ClassLoader parent = loader;
@@ -59,23 +60,17 @@
boolean scoped = false;
if (loader instanceof RepositoryClassLoader)
{
- ClassLoader parent = loader.getParent();
-
- //TODO is this really the best way to find out if we are scoped or not?
- if (parent.getClass().equals(NoAnnotationURLClassLoader.class))
+ LoaderRepository repository = ((RepositoryClassLoader)loader).getLoaderRepository();
+ if (repository instanceof HeirarchicalLoaderRepository3)
{
- RepositoryClassLoader rloader = (RepositoryClassLoader)loader;
- //Scoped with java2ParentDelegation=true
- scoped = rloader.getLoaderRepository().getClass().equals(HeirarchicalLoaderRepository3.class);
+ scoped = true;
+ HeirarchicalLoaderRepository3 hlr = (HeirarchicalLoaderRepository3)repository;
+ boolean parentFirst = hlr.getUseParentFirst();
}
- else
- {
- //Scoped with java2ParentDelegation=false
- scoped = parent.getClass().getName().equals("org.jboss.mx.loading.HeirarchicalLoaderRepository3$NoParentClassLoader");
- }
}
return scoped;
}
+
public ClassLoader getTopLevelJBossClassLoader()
{
@@ -92,4 +87,15 @@
return topRcl;
}
+ public Domain getScopedClassLoaderDomain(ClassLoader cl, AspectManager parent)
+ {
+ boolean parentDelegation = true;
+ if (cl instanceof RepositoryClassLoader)
+ {
+ HeirarchicalLoaderRepository3 repository = (HeirarchicalLoaderRepository3)((RepositoryClassLoader)cl).getLoaderRepository();
+ parentDelegation = repository.getUseParentFirst();
+ }
+ return new ScopedClassLoaderDomain(cl, parentDelegation, parent, false);
+ }
+
}
Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/LoaderRepositoryUrlUtil.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,175 @@
+/*
+* 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.aop.deployment;
+
+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: 1.1 $
+ */
+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++)
+ {
+ URL scopedUrl = scopedRepositoryUrls[i];
+ for (int j = 0 ; j < globalUrls.length ; j ++)
+ {
+ URL globalUrl = globalUrls[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;
+ }
+ }
+
+}
Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedClassLoaderDomain.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,153 @@
+/*
+* 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.aop.deployment;
+
+import java.lang.ref.WeakReference;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.aop.advice.AspectDefinition;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
+
+/**
+ * A domain that is used for scoped classloaders
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ScopedClassLoaderDomain extends Domain
+{
+
+ WeakReference loader;
+ boolean parentDelegation;
+ ConcurrentReaderHashMap myPerVMAspects = new ConcurrentReaderHashMap();
+ ConcurrentReaderHashMap notMyPerVMAspects = new ConcurrentReaderHashMap();
+
+ public ScopedClassLoaderDomain(ClassLoader loader, boolean parentDelegation, AspectManager manager, boolean parentFirst)
+ {
+ // FIXME ScopedClassLoaderDomain constructor
+ super(manager, parentFirst);
+ this.loader = new WeakReference(loader);
+ this.parentDelegation = parentDelegation;
+ }
+
+ protected ClassLoader getClassLoader()
+ {
+ ClassLoader cl = (ClassLoader)loader.get();
+ if (cl != null)
+ {
+ return cl;
+ }
+ return null;
+ }
+
+ public Object getPerVMAspect(AspectDefinition def)
+ {
+ return getPerVMAspect(def.getName());
+ }
+
+ public Object getPerVMAspect(String def)
+ {
+ if (parentDelegation == true)
+ {
+ //We will alway be loading up the correct class
+ Object aspect = super.getPerVMAspect(def);
+ return aspect;
+ }
+ else
+ {
+ return getPerVmAspectWithNoParentDelegation(def);
+ }
+ }
+
+ private Object getPerVmAspectWithNoParentDelegation(String def)
+ {
+ Object aspect = myPerVMAspects.get(def);
+ if (aspect != null)
+ {
+ return aspect;
+ }
+
+ aspect = super.getPerVMAspect(def);
+ if (aspect != null)
+ {
+ LoaderRepository loadingRepository = getAspectRepository(aspect);
+ LoaderRepository myRepository = getScopedRepository();
+ if (loadingRepository == myRepository)
+ {
+ //The parent does not load this class
+ myPerVMAspects.put(def, aspect);
+ }
+ else
+ {
+ //The class has been loaded by a parent classloader, find out if we also have a copy
+ try
+ {
+ Class clazz = myRepository.loadClass(aspect.getClass().getName());
+ if (clazz == aspect.getClass())
+ {
+ notMyPerVMAspects.put(def, Boolean.TRUE);
+ }
+ else
+ {
+ //We have a different version of the class deployed
+ AspectDefinition aspectDefinition = getAspectDefinition(def);
+ //Override the classloader to create the aspect instance
+ aspect = createPerVmAspect(def, aspectDefinition, getClassLoader());
+ myPerVMAspects.put(def, aspect);
+ }
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ return aspect;
+ }
+
+ private LoaderRepository getAspectRepository(Object aspect)
+ {
+ ClassLoader cl = aspect.getClass().getClassLoader();
+ ClassLoader parent = cl;
+ while (parent != null)
+ {
+ if (parent instanceof RepositoryClassLoader)
+ {
+ return ((RepositoryClassLoader)parent).getLoaderRepository();
+ }
+ parent = parent.getParent();
+ }
+ return null;
+ }
+
+ private HeirarchicalLoaderRepository3 getScopedRepository()
+ {
+ HeirarchicalLoaderRepository3 myRepository = (HeirarchicalLoaderRepository3)((RepositoryClassLoader)getClassLoader()).getLoaderRepository();
+ return myRepository;
+ }
+}
Added: branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java
===================================================================
--- branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java 2006-09-21 17:14:07 UTC (rev 57055)
+++ branches/Branch_AOP_1_5/aspects/src/main/org/jboss/aop/deployment/ScopedJBossClassPool.java 2006-09-21 18:04:34 UTC (rev 57056)
@@ -0,0 +1,214 @@
+/*
+* 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.aop.deployment;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.util.Iterator;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
+import org.jboss.aop.deployment.LoaderRepositoryUrlUtil.UrlInfo;
+import org.jboss.mx.loading.HeirarchicalLoaderRepository3;
+import org.jboss.mx.loading.LoaderRepository;
+import org.jboss.mx.loading.RepositoryClassLoader;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+/**
+ * A classpool in JBoss backed by a scoped (HierarchicalLoaderRepository) loader repository
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ScopedJBossClassPool extends JBossClassPool
+{
+ final static LoaderRepositoryUrlUtil LOADER_REPOSITORY_UTIL = new LoaderRepositoryUrlUtil();
+
+ WeakReference repository = null;
+ UrlInfo urlInfo;
+
+ protected 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 = cl.getParent();
+ }
+
+ super.childFirstLookup = !parentFirst;
+ }
+
+
+ private HeirarchicalLoaderRepository3 getRepository()
+ {
+ //FIXME - Once Javassist > 3.3.0 is out use getClassLoader0() and get rid of try/catch
+ ClassLoader cl = null;
+ try
+ {
+ cl = getClassLoader();
+ }
+ catch (RuntimeException e)
+ {
+ //Ignore, the ScopedClassPoll throws an exception if pool is not associated with a cl
+ }
+ 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 (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(url);
+ return pool.get(classname);
+ }
+ catch (NotFoundException e)
+ {
+ }
+ return null;
+ }
+
+ private ClassPool getCorrectPoolForResource(URL url)
+ {
+ synchronized(AspectManager.getRegisteredCLs())
+ {
+ for(Iterator it = AspectManager.getRegisteredCLs().values().iterator() ; it.hasNext() ; )
+ {
+ AOPClassPool candidate = (AOPClassPool)it.next();
+ if (candidate.isUnloadedClassLoader())
+ {
+ AspectManager.instance().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();
+ String resource = url.toString();
+ for (int i = 0 ; i < urls.length ; i++)
+ {
+ if (resource.indexOf(urls[i].toString()) >= 0)
+ {
+ return candidate;
+ }
+ }
+ }
+ }
+ }
+
+ return AOPClassPool.createAOPClassPool(ClassPool.getDefault(), AOPClassPoolRepository.getInstance());
+ }
+}
More information about the jboss-cvs-commits
mailing list