/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.console.plugins; import gnu.trove.TLongObjectHashMap; import org.jboss.aop.Advisor; import org.jboss.aop.AspectManager; import org.jboss.aop.CallerConstructorInfo; import org.jboss.aop.CallerMethodInfo; import org.jboss.aop.ConstructorInfo; import org.jboss.aop.ClassAdvisor; import org.jboss.aop.FieldInfo; import org.jboss.aop.MethodInfo; import org.jboss.aop.advice.AdviceBinding; import org.jboss.aop.advice.Interceptor; import org.jboss.aop.advice.AbstractAdvice; import org.jboss.aop.advice.CFlowInterceptor; import org.jboss.aop.introduction.InterfaceIntroduction; import org.jboss.aop.standalone.Package; import org.jboss.console.manager.interfaces.ManageableResource; import org.jboss.console.manager.interfaces.TreeNode; import org.jboss.console.plugins.helpers.AbstractPluginWrapper; import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletConfig; /** * As the number of MBeans is very big, we use a real Java class which is far * faster than beanshell * * @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>. * @version $Revision: 84116 $ * * <p><b>Revisions:</b> * * <p><b>2 janv. 2003 Sacha Labourey:</b> * <ul> * <li> First implementation </li> * </ul> */ public class AOPLister extends AbstractPluginWrapper { Thread refreshPoller; public AOPLister() { super(); } TreeNode[] createMetaDataTree(org.jboss.aop.metadata.SimpleMetaData metaData, String description, String baseUrl) throws Exception { HashSet groups = metaData.tags(); if (groups.size() == 0) { return null; } TreeNode[] nodes = new TreeNode[groups.size()]; Iterator it = groups.iterator(); for (int i = 0; it.hasNext(); i++) { String group = (String) it.next(); nodes[i] = createTreeNode( group, // name description, "images/database.gif", // Icon URL baseUrl + "&group=" + group, null, // menu null, // sub nodes null // Sub-Resources ); } return nodes; } TreeNode[] loadDefaultMetaData(Advisor advisor, String classname) throws Exception { org.jboss.aop.metadata.SimpleMetaData metaData = advisor.getDefaultMetaData(); return createMetaDataTree(metaData, "Default metadata for " + classname, "AOPDefaultMetaData.jsp?classname=" + classname); } TreeNode[] loadClassMetaData(Advisor advisor, String classname) throws Exception { org.jboss.aop.metadata.SimpleMetaData metaData = advisor.getClassMetaData(); return createMetaDataTree(metaData, "Class metadata for " + classname, "AOPClassMetaData.jsp?classname=" + classname); } TreeNode[] loadMethodMetaData(Advisor advisor, String classname) throws Exception { org.jboss.aop.metadata.MethodMetaData metaData = advisor.getMethodMetaData(); Iterator it = metaData.getMethods(); if (!it.hasNext()) return null; ArrayList methods = new ArrayList(); while (it.hasNext()) { String method = (String) it.next(); org.jboss.aop.metadata.SimpleMetaData methodData = metaData.getMethodMetaData(method); TreeNode[] methodNodes = createMetaDataTree(methodData, "Metadata for method " + method, "AOPMethodMetaData.jsp?classname=" + classname + "&method=" + java.net.URLEncoder.encode(method)); methods.add(createTreeNode( method, // name "Metadata for method " + method, "images/starfolder.gif", // Icon URL null, null, // menu methodNodes, // sub nodes null // Sub-Resources )); } return (TreeNode[]) methods.toArray(new TreeNode[methods.size()]); } TreeNode[] loadFieldMetaData(Advisor advisor, String classname) throws Exception { org.jboss.aop.metadata.FieldMetaData metaData = advisor.getFieldMetaData(); Iterator it = metaData.getFields(); if (!it.hasNext()) return null; ArrayList fields = new ArrayList(); while (it.hasNext()) { String field = (String) it.next(); org.jboss.aop.metadata.SimpleMetaData fieldData = metaData.getFieldMetaData(field); TreeNode[] fieldNodes = createMetaDataTree(fieldData, "Metadata for field " + field, "AOPFieldMetaData.jsp?classname=" + classname + "&field=" + field); fields.add(createTreeNode( field, // name "Metadata for field " + field, "images/starfolder.gif", // Icon URL null, null, // menu fieldNodes, // sub nodes null // Sub-Resources )); } return (TreeNode[]) fields.toArray(new TreeNode[fields.size()]); } TreeNode[] loadConstructorMetaData(Advisor advisor, String classname) throws Exception { org.jboss.aop.metadata.ConstructorMetaData metaData = advisor.getConstructorMetaData(); Iterator it = metaData.getConstructors(); if (!it.hasNext()) return null; ArrayList constructors = new ArrayList(); while (it.hasNext()) { String signature = (String)it.next(); org.jboss.aop.metadata.SimpleMetaData constructorData = metaData.getConstructorMetaData(signature); TreeNode[] constructorNodes = createMetaDataTree(constructorData, "Metadata for constructor", "AOPConstructorMetaData.jsp?classname=" + classname + "&constructor=" + java.net.URLEncoder.encode(signature)); constructors.add(createTreeNode( signature, // name "Metaata for constructor " + signature, "images/starfolder.gif", // Icon URL null, null, // menu constructorNodes, // sub nodes null // Sub-Resources )); } return (TreeNode[]) constructors.toArray(new TreeNode[constructors.size()]); } TreeNode getMetaData(Advisor advisor) throws Exception { ArrayList nodes = new ArrayList(); String classname = advisor.getClazz().getName(); TreeNode[] defaultMetaData = loadDefaultMetaData(advisor, classname); if (defaultMetaData != null) { nodes.add(createTreeNode( "Default", "Default metadata for for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu defaultMetaData, // sub nodes null // Sub-Resources )); } TreeNode[] classMetaData = loadClassMetaData(advisor, classname); if (classMetaData != null) { nodes.add(createTreeNode( "Class", "Class metadata for for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu classMetaData, // sub nodes null // Sub-Resources )); } TreeNode[] methodMetaData = loadMethodMetaData(advisor, classname); if (methodMetaData != null) { nodes.add(createTreeNode( "Methods", "Method metadata for for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu methodMetaData, // sub nodes null // Sub-Resources )); } TreeNode[] fieldMetaData = loadFieldMetaData(advisor, classname); if (fieldMetaData != null) { nodes.add(createTreeNode( "Fields", "Field metadata for for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu fieldMetaData, // sub nodes null // Sub-Resources )); } TreeNode[] constructorMetaData = loadConstructorMetaData(advisor, classname); if (constructorMetaData != null) { nodes.add(createTreeNode( "Constructors", "Constructor metadata for for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu constructorMetaData, // sub nodes null // Sub-Resources )); } if (nodes.size() == 0) return null; TreeNode[] subnodes = (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); return createTreeNode( "Metadata", // name "Metadata for " + classname, // description "images/starfolder.gif", // Icon URL null, null, // menu subnodes, // sub nodes null // Sub-Resources ); } TreeNode[] getIntroductions(Advisor advisor) throws Exception { ArrayList introductions = advisor.getInterfaceIntroductions(); if (introductions == null || introductions.size() == 0) return null; TreeNode[] nodes = new TreeNode[introductions.size()]; for (int i = 0; i < introductions.size(); i++) { InterfaceIntroduction introduction = (InterfaceIntroduction) introductions.get(i); nodes[i] = createTreeNode( "Introduction " + i, // name "Introduction for " + advisor.getName(), // description "images/service.gif", // Icon URL "AOPIntroductionPointcut.jsp?pointcut=" + java.net.URLEncoder.encode(introduction.getName()), // Default URL null, // menu null, // sub nodes null // Sub-Resources ); } return nodes; } public static String shortenMethod(String classname, Method method) { return method.toString().replaceAll(classname + "." + method.getName(), method.getName()); } public static String shortenConstructor(String classname, Constructor constructor) { String base = classname.substring(classname.lastIndexOf('.') + 1); return constructor.toString().replaceAll(classname, base); } public static String shortenField(String classname, Field field) { return field.toString().replaceAll(classname + "." + field.getName(), field.getName()); } public TreeNode[] createAdvisorNodes(Advisor advisor) throws Exception { ArrayList nodes = new ArrayList(); if(advisor != null) { populateIntroductions(advisor, nodes); if(advisor instanceof ClassAdvisor) { populateConstructors((ClassAdvisor) advisor, nodes); populateMethods((ClassAdvisor) advisor, nodes); } if(advisor instanceof ClassAdvisor) populateFields((ClassAdvisor) advisor, nodes); TreeNode metadata = getMetaData(advisor); if (metadata != null) nodes.add(metadata); } return (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } private void populateFields(ClassAdvisor advisor, ArrayList nodes) throws Exception { if (advisor.getAdvisedFields() == null) return; ArrayList fieldWriteNodes = new ArrayList(); ArrayList fieldReadNodes = new ArrayList(); for (int i = 0; i < advisor.getAdvisedFields().length; i++) { Field f = advisor.getAdvisedFields()[i]; FieldInfo[] chain = advisor.getFieldWriteInfos(); if (chain != null && chain.length > 0) { fieldWriteNodes.add(createTreeNode( shortenField(advisor.getName(), f), "Field write interceptor chain", "images/service.gif", // Icon URL "AOPFieldChain.jsp?classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&field=" + i + "&mode=write", null, // menu null, // sub nodes null // Sub-Resources )); } chain = advisor.getFieldReadInfos(); if (chain != null && chain.length > 0) { fieldReadNodes.add(createTreeNode( shortenField(advisor.getName(), f), "Field read interceptor chain", "images/service.gif", // Icon URL "AOPFieldChain.jsp?classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&field=" + i + "&mode=read", null, // menu null, // sub nodes null // Sub-Resources )); } } if (fieldWriteNodes.size() > 0 && fieldWriteNodes.size() > 0) { ArrayList fieldReadWriteNodes = new ArrayList(); if (fieldWriteNodes.size() > 0) { TreeNode[] cnodes = (TreeNode[]) fieldWriteNodes.toArray(new TreeNode[fieldWriteNodes.size()]); fieldReadWriteNodes.add(createTreeNode( "write interceptors", // name "field write info", // description "images/starfolder.gif", // Icon URL null, null, // menu cnodes, // sub nodes null // Sub-Resources )); } if (fieldReadNodes.size() > 0) { TreeNode[] cnodes = (TreeNode[]) fieldReadNodes.toArray(new TreeNode[fieldReadNodes.size()]); fieldReadWriteNodes.add(createTreeNode( "read interceptors", // name "field read info", // description "images/starfolder.gif", // Icon URL null, null, // menu cnodes, // sub nodes null // Sub-Resources )); } TreeNode[] fieldRwNodes = (TreeNode[]) fieldReadWriteNodes.toArray(new TreeNode[fieldReadWriteNodes.size()]); nodes.add(createTreeNode( "Fields", //name "field info", //description "images/starfolder.gif", // Icon URL null, null, // menu fieldRwNodes, // sub nodes null // Sub-Resources )); } } private void populateConstructors(ClassAdvisor advisor, ArrayList nodes) throws Exception { if (advisor.getConstructors() == null) return; if (advisor.getConstructorInterceptors() == null) return; if (advisor.getMethodCalledByConInterceptors() == null) return; ArrayList constructorNodes = new ArrayList(); for (int i = 0; i < advisor.getConstructors().length; i++) { Constructor con = advisor.getConstructors()[i]; ConstructorInfo[] chain = advisor.getConstructorInfos(); HashMap methodCallers = advisor.getMethodCalledByConInterceptors()[i]; HashMap conCallers = advisor.getConCalledByConInterceptors()[i]; if ((chain != null && chain.length > 0) || methodCallers != null || conCallers != null) { ArrayList conNodes = new ArrayList(); if (chain != null && chain.length > 0) { conNodes.add(createTreeNode( "Interceptors", "Execution Interceptors", "images/service.gif", // Icon URL "AOPConstructorChain.jsp?classname=" + java.net.URLEncoder.encode(con.getDeclaringClass().getName()) + "&constructor=" + i, null, // menu null, // sub nodes null // Sub-Resources )); } if (conCallers != null) { conNodes.add(createTreeNode( "constructor callers", "constructor caller interceptions", "images/starfolder.gif", // Icon URL null, null, // menu createConstructorConstructorCallers(i, advisor, conCallers), // sub nodes null // Sub-Resources )); } if (methodCallers != null) { conNodes.add(createTreeNode( "method callers", "method caller interceptions", "images/starfolder.gif", // Icon URL null, null, // menu createConstructorMethodCallers(i, advisor, methodCallers), // sub nodes null // Sub-Resources )); } TreeNode[] cnodes = (TreeNode[]) conNodes.toArray(new TreeNode[conNodes.size()]); constructorNodes.add(createTreeNode( shortenConstructor(advisor.getName(), con), // name "constructor info", // description "images/starfolder.gif", // Icon URL null, null, // menu cnodes, // sub nodes null // Sub-Resources )); } } if (constructorNodes.size() > 0) { TreeNode[] cnodes = (TreeNode[]) constructorNodes.toArray(new TreeNode[constructorNodes.size()]); nodes.add(createTreeNode( "Constructors", // name "constructor info", // description "images/starfolder.gif", // Icon URL null, null, // menu cnodes, // sub nodes null // Sub-Resources )); } } private void populateMethods(ClassAdvisor advisor, ArrayList nodes) throws Exception { if (advisor.getMethodInterceptors() == null) return; ArrayList methodNodes = new ArrayList(); long[] keys = advisor.getMethodInterceptors().keys(); for (int i = 0; i < keys.length; i++) { long key = keys[i]; MethodInfo method = (MethodInfo) advisor.getMethodInfo(key); HashMap methodCallers = (HashMap) advisor.getMethodCalledByMethodInterceptors().get(key); HashMap conCallers = (HashMap) advisor.getConCalledByMethodInterceptors().get(key); if (method == null && methodCallers == null) continue; if (method != null && methodCallers == null && (method.getInterceptors() == null || method.getInterceptors().length < 1)) continue; ArrayList mNodes = new ArrayList(); if (method.getInterceptors() != null && method.getInterceptors().length > 0 || methodCallers != null || conCallers != null) { mNodes.add(createTreeNode( "Interceptors", "Execution Interceptors", "images/service.gif", // Icon URL "AOPMethodChain.jsp?classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&method=" + keys[i], null, // menu null, // sub nodes null // Sub-Resources )); } if (conCallers != null) { mNodes.add(createTreeNode( "constructor callers", "constructor caller interceptions", "images/starfolder.gif", // Icon URL null, null, // menu createMethodConstructorCallers(key, advisor, conCallers), // sub nodes null // Sub-Resources )); } if (methodCallers != null) { mNodes.add(createTreeNode( "method callers", "method caller interceptions", "images/starfolder.gif", // Icon URL null, null, // menu createMethodMethodCallers(key, advisor, methodCallers), // sub nodes null // Sub-Resources )); } TreeNode[] mnodes = (TreeNode[]) mNodes.toArray(new TreeNode[mNodes.size()]); methodNodes.add(createTreeNode( shortenMethod(advisor.getName(), method.getAdvisedMethod()), // name "method info", // description "images/starfolder.gif", // Icon URL null, null, // menu mnodes, // sub nodes null // Sub-Resources )); } if (methodNodes.size() > 0) { TreeNode[] cnodes = (TreeNode[]) methodNodes.toArray(new TreeNode[methodNodes.size()]); nodes.add(createTreeNode( "Methods", // name "method info", // description "images/starfolder.gif", // Icon URL null, null, // menu cnodes, // sub nodes null // Sub-Resources )); } } private void populateIntroductions(Advisor advisor, ArrayList nodes) throws Exception { ArrayList introductions = advisor.getInterfaceIntroductions(); if (introductions != null && introductions.size() > 0) { TreeNode[] introductionNodes = getIntroductions(advisor); TreeNode introductionsNode = createTreeNode( "Introductions", // name "Introductions for " + advisor.getName(), // description "images/starfolder.gif", // Icon URL null, null, // menu introductionNodes, // sub nodes null // Sub-Resources ); nodes.add(introductionsNode); } } public TreeNode[] createConstructorMethodCallers(int index, ClassAdvisor advisor, HashMap called) throws Exception { ArrayList nodes = new ArrayList(); Iterator it = called.keySet().iterator(); while (it.hasNext()) { String calledClass = (String) it.next(); TLongObjectHashMap map = (TLongObjectHashMap) called.get(calledClass); Object[] values = map.getValues(); long[] keys = map.keys(); for (int i = 0; i < values.length; i++) { CallerMethodInfo caller = (CallerMethodInfo) values[i]; nodes.add(createTreeNode( caller.getMethod().toString(), "caller interceptions", "images/service.gif", // Icon URL "AOPConstructorMethodCallerChain.jsp?index=" + index + "&hash=" + java.net.URLEncoder.encode(Long.toString(keys[i])) + "&classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&calledclassname=" + java.net.URLEncoder.encode(calledClass), null, // menu null, // sub nodes null // Sub-Resources )); } } return (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } public TreeNode[] createConstructorConstructorCallers(int index, ClassAdvisor advisor, HashMap called) throws Exception { ArrayList nodes = new ArrayList(); Iterator it = called.keySet().iterator(); while (it.hasNext()) { String calledClass = (String) it.next(); TLongObjectHashMap map = (TLongObjectHashMap) called.get(calledClass); Object[] values = map.getValues(); long[] keys = map.keys(); for (int i = 0; i < values.length; i++) { CallerConstructorInfo caller = (CallerConstructorInfo) values[i]; nodes.add(createTreeNode( caller.getConstructor().toString(), "caller interceptions", "images/service.gif", // Icon URL "AOPConstructorConstructorCallerChain.jsp?index=" + index + "&hash=" + java.net.URLEncoder.encode(Long.toString(keys[i])) + "&classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&calledclassname=" + java.net.URLEncoder.encode(calledClass), null, // menu null, // sub nodes null // Sub-Resources )); } } return (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } public TreeNode[] createMethodMethodCallers(long callingHash, ClassAdvisor advisor, HashMap called) throws Exception { ArrayList nodes = new ArrayList(); Iterator it = called.keySet().iterator(); while (it.hasNext()) { String calledClass = (String) it.next(); TLongObjectHashMap map = (TLongObjectHashMap) called.get(calledClass); Object[] values = map.getValues(); long[] keys = map.keys(); for (int i = 0; i < values.length; i++) { CallerMethodInfo caller = (CallerMethodInfo) values[i]; nodes.add(createTreeNode( caller.getMethod().toString(), "caller interceptions", "images/service.gif", // Icon URL "AOPMethodMethodCallerChain.jsp?callinghash=" + callingHash + "&hash=" + java.net.URLEncoder.encode(Long.toString(keys[i])) + "&classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&calledclassname=" + java.net.URLEncoder.encode(calledClass), null, // menu null, // sub nodes null // Sub-Resources )); } } return (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } public TreeNode[] createMethodConstructorCallers(long callingHash, ClassAdvisor advisor, HashMap called) throws Exception { ArrayList nodes = new ArrayList(); Iterator it = called.keySet().iterator(); while (it.hasNext()) { String calledClass = (String) it.next(); TLongObjectHashMap map = (TLongObjectHashMap) called.get(calledClass); Object[] values = map.getValues(); long[] keys = map.keys(); for (int i = 0; i < values.length; i++) { CallerConstructorInfo caller = (CallerConstructorInfo) values[i]; nodes.add(createTreeNode( caller.getConstructor().toString(), "caller interceptions", "images/service.gif", // Icon URL "AOPMethodConstructorCallerChain.jsp?callinghash=" + callingHash + "&hash=" + java.net.URLEncoder.encode(Long.toString(keys[i])) + "&classname=" + java.net.URLEncoder.encode(advisor.getName()) + "&calledclassname=" + java.net.URLEncoder.encode(calledClass), null, // menu null, // sub nodes null // Sub-Resources )); } } return (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } public TreeNode[] getUnboundBindings() throws Exception { ArrayList unbounded = new ArrayList(); Iterator it = AspectManager.instance().getBindings().values().iterator(); while (it.hasNext()) { AdviceBinding binding = (AdviceBinding) it.next(); if (!binding.hasAdvisors()) { unbounded.add(createTreeNode( binding.getName(), "Unbounded Binding", "images/service.gif", // Icon URL "AOPBinding.jsp?binding=" + java.net.URLEncoder.encode(binding.getName()), null, // menu null, // sub nodes null // Sub-Resources )); } } if (unbounded.size() == 0) return null; return (TreeNode[])unbounded.toArray(new TreeNode[unbounded.size()]); } TreeNode[] createAOPNodes(Package root) throws Exception { ArrayList nodes = new ArrayList(); Iterator it = root.packages.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String pkgName = (String) entry.getKey(); Package p = (Package) entry.getValue(); nodes.add(createTreeNode( pkgName, // name "Package " + pkgName, // description "images/starfolder.gif", // Icon URL null, // Default URL null, // menu createAOPNodes(p), // sub nodes null // Sub-Resources )); } it = root.advisors.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String classname = (String) entry.getKey(); Advisor advisor = (Advisor) entry.getValue(); nodes.add(createTreeNode( classname, // name "Class " + classname, // description "images/serviceset.gif", // Icon URL null, null, // menu createAdvisorNodes(advisor), // sub nodes null // Sub-Resources ) ); } TreeNode[] result; if (nodes.size() == 0) { result = null; } else { result = (TreeNode[]) nodes.toArray(new TreeNode[nodes.size()]); } return result; } protected TreeNode getTreeForResource(String profile, ManageableResource resource) { try { TreeNode[] unbounded = getUnboundBindings(); TreeNode[] children = new TreeNode[2]; children[0] = createTreeNode( "Classes", // name "Display all Classes", // description "images/serviceset.gif", // Icon URL null, // Default URL null, createAOPNodes(Package.aopClassMap()), // sub nodes null // Sub-Resources ); children[1] = createTreeNode( "Unbound Bindings", // name "Unbound Bindings", // description "images/serviceset.gif", // Icon URL null, // Default URL null, unbounded, // sub nodes null // Sub-Resources ); return createTreeNode ( "AOP", // name "AOP Management", // description "images/spirale32.gif", // Icon URL null, // Default URL null, children, null); } catch (Exception e) { e.printStackTrace(); return null; } } public static String outputChain(Interceptor[] chain) { String output = ""; for (int i = 0; i < chain.length; i++) { output += "<tr>"; if (chain[i] instanceof AbstractAdvice) { output +="<td><font size=\"1\">advice</font></td><td><font size=\"1\">" + chain[i].getName() + "</font></td>"; } else if (chain[i] instanceof CFlowInterceptor) { output +="<td><font size=\"1\">cflow</font></td><td><font size=\"1\">" + ((CFlowInterceptor) chain[i]).getCFlowString() + "</font></td>"; } else { output +="<td><font size=\"1\">interceptor</font></td><td><font size=\"1\">" + chain[i].getClass().getName() + "</font></td>"; } output += "</tr>"; } return output; } // org.jboss.console.plugins.helpers.PluginWrapper overrides ----------------------- public void init(ServletConfig servletConfig) throws Exception { super.init(servletConfig); refreshPoller = new RefreshPoller(); refreshPoller.start(); } class RefreshPoller extends Thread { final static int REFRESH_RATE = 20 * 1000; RefreshPoller() { setName("AOPListner"); setDaemon(true); } public void run() { try { int advisorCount = 0; while (!isInterrupted()) { int count = AspectManager.instance().getAdvisors().size(); if (count != advisorCount) { pm.regenerateAdminTree(); } advisorCount = count; Thread.sleep(REFRESH_RATE); } } catch (InterruptedException e) { return; } } } public void destroy() { super.destroy(); try { refreshPoller.interrupt(); refreshPoller.join(); } catch (Exception e) { } } /** * For jsp pages to get hold of the advisor given a classname, since * AspectManager.getAdvisor(String classname) has been deprecated. * (I attempted to load the class from the class name and then to * call AspectManager.findAdvisor(), which worked on first deploy, * but returned null on subsequent deploys) * @param classname * @return */ public static ClassAdvisor findAdvisor(String classname) { return AdvisorFinder.getAdvisor(classname); } /** * Helper class For jsp pages to get hold of the advisor given a classname, since * AspectManager.getAdvisor(String classname) has been deprecated. */ static class AdvisorFinder { public static ClassAdvisor getAdvisor(String classname) { String[] name = classname.split("\\."); Package root = Package.aopClassMap(); if (!root.name.equals("classes"))throw new RuntimeException("Did not get expected root 'classes'"); for (Iterator it = root.packages.entrySet().iterator() ; it.hasNext() ; ) { Map.Entry entry = (Map.Entry) it.next(); Package pkg = (Package) entry.getValue(); ClassAdvisor advisor = findAdvisor(pkg, classname, name, 0); if (advisor != null) { return advisor; } } return null; } private static ClassAdvisor findAdvisor(Package pkg, String classname, String[] name, int depth) { if (depth >= name.length || !pkg.name.equals(name[depth])) { return null; } for (Iterator it = pkg.packages.entrySet().iterator() ; it.hasNext() ; ) { Map.Entry entry = (Map.Entry) it.next(); Package p = (Package) entry.getValue(); ClassAdvisor advisor = findAdvisor(p, classname, name, depth + 1); if (advisor != null) { return advisor; } } for (Iterator it = pkg.advisors.entrySet().iterator(); it.hasNext() ; ) { Map.Entry entry = (Map.Entry) it.next(); ClassAdvisor advisor = (ClassAdvisor) entry.getValue(); if (advisor.getClazz().getName().equals(classname)) { return advisor; } } return null; } } }