/*
 * JBoss, the OpenSource J2EE webOS
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */

package test.compliance.standard;

import test.compliance.standard.support.Torture;

import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.ObjectInstance;
import javax.management.MalformedObjectNameException;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.NotCompliantMBeanException;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.ReflectionException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;

import junit.framework.Assert;

public class InfoUtil
{
   public static MBeanInfo getMBeanInfo(Object mbean, String name)
   {
      MBeanInfo info = null;

      try
      {
         MBeanServer server = MBeanServerFactory.newMBeanServer();

         ObjectName objectName = new ObjectName(name);
         ObjectInstance instance = server.registerMBean(mbean, objectName);
         info = server.getMBeanInfo(objectName);
      }
      catch (MalformedObjectNameException e)
      {
         Assert.fail("got spurious MalformedObjectNameException");
      }
      catch (InstanceAlreadyExistsException e)
      {
         Assert.fail("got spurious InstanceAlreadyExistsException");
      }
      catch (MBeanRegistrationException e)
      {
         Assert.fail("got spurious MBeanRegistrationException");
      }
      catch (NotCompliantMBeanException e)
      {
         Assert.fail("got spurious NotCompliantMBeanException");
      }
      catch (InstanceNotFoundException e)
      {
         Assert.fail("got spurious InstanceNotFoundException");
      }
      catch (IntrospectionException e)
      {
         Assert.fail("got spurious IntrospectionException");
      }
      catch (ReflectionException e)
      {
         Assert.fail("got spurious ReflectionException");
      }

      return info;
   }

   public static MBeanAttributeInfo findAttribute(MBeanAttributeInfo[] attributes, String name)
   {
      for (int i = 0; i < attributes.length; i++)
      {
         if (attributes[i].getName().equals(name))
         {
            return attributes[i];
         }
      }
      return null;
   }

   public static void dumpConstructors(MBeanConstructorInfo[] constructors)
   {
      System.out.println("");
      System.out.println("Constructors:");
      for (int i = 0; i < constructors.length; i++)
      {
         StringBuffer dump = new StringBuffer();
         MBeanConstructorInfo constructor = constructors[i];
         dump.append("name=").append(constructor.getName());
         dump.append(",signature=").append(makeSignatureString(constructor.getSignature()));

         System.out.println(dump);
      }
   }

   public static void dumpAttributes(MBeanAttributeInfo[] attributes)
   {
      System.out.println("");
      System.out.println("Attributes:");
      for (int i = 0; i < attributes.length; i++)
      {
         StringBuffer dump = new StringBuffer();
         MBeanAttributeInfo attribute = attributes[i];
         dump.append("name=").append(attribute.getName());
         dump.append(",type=").append(attribute.getType());
         dump.append(",readable=").append(attribute.isReadable());
         dump.append(",writable=").append(attribute.isWritable());
         dump.append(",isIS=").append(attribute.isIs());
         System.out.println(dump);
      }
   }

   public static void dumpOperations(MBeanOperationInfo[] operations)
   {
      System.out.println("");
      System.out.println("Operations:");
      for (int i = 0; i < operations.length; i++)
      {
         StringBuffer dump = new StringBuffer();
         MBeanOperationInfo operation = operations[i];
         dump.append("name=").append(operation.getName());
         dump.append(",impact=").append(decodeImpact(operation.getImpact()));
         dump.append(",returnType=").append(operation.getReturnType());
         dump.append(",signature=").append(makeSignatureString(operation.getSignature()));

         System.out.println(dump);
      }
   }

   public static String makeSignatureString(MBeanParameterInfo[] info)
   {
      String[] sig = new String[info.length];
      for (int i = 0; i < info.length; i++)
      {
         sig[i] = info[i].getType();
      }
      return makeSignatureString(sig);
   }

   public static String makeSignatureString(String[] sig)
   {
      StringBuffer buf = new StringBuffer("(");
      for (int i = 0; i < sig.length; i++)
      {
         buf.append(sig[i]);
         if (i != sig.length - 1)
         {
            buf.append(",");
         }
      }
      buf.append(")");
      return buf.toString();
   }

   public static String decodeImpact(int impact)
   {
      switch (impact)
      {
         case MBeanOperationInfo.ACTION:
            return "ACTION";
         case MBeanOperationInfo.ACTION_INFO:
            return "ACTION_INFO";
         case MBeanOperationInfo.INFO:
            return "INFO";
         case MBeanOperationInfo.UNKNOWN:
            return "UNKNOWN";
      }
      throw new IllegalArgumentException("unknown impact value:" + impact);
   }
}
