Package org.jboss.console.plugins

Source Code of org.jboss.console.plugins.AOPLister$RefreshPoller

/*
* 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 > || 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;
      }
   }
  

     
}
TOP

Related Classes of org.jboss.console.plugins.AOPLister$RefreshPoller

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.