Development Class Java

// Copyright 2007 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.logging.Logger;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.ReflectionException;
/**
 * Non-instantiable class that provides jmx utility methods.
 */
public class Utilities {
  /**
   * Prints info about a bean to a {@link VarOutputSink}.
   * 
   * @param sink The {@link VarOutputSink} to which info will be sent
   * @param mbs The {@link MBeanServer} with respect to which the
   *          {@code objectName} is accessed
   * @param objectName The {@link ObjectName} that identifies this bean
   */
  public static void printMBeanInfo(VarOutputSink sink, MBeanServer mbs,
      ObjectName objectName) {
    MBeanInfo info = getMBeanInfoSafely(sink, mbs, objectName);
    if (info == null) { return; }
    sink.echo("\nCLASSNAME: \t" + info.getClassName());
    sink.echo("\nDESCRIPTION: \t" + info.getDescription());
    sink.echo("\nATTRIBUTES");
    MBeanAttributeInfo[] attrInfo = info.getAttributes();
    sink.printVariable("attrcount", Integer.toString(attrInfo.length));
    if (attrInfo.length > 0) {
      for (int i = 0; i < attrInfo.length; i++) {
        sink.echo(" ** NAME: \t" + attrInfo[i].getName());
        sink.echo("    DESCR: \t" + attrInfo[i].getDescription());
        sink
            .echo("    TYPE: \t" + attrInfo[i].getType() + "\tREAD: "
                + attrInfo[i].isReadable() + "\tWRITE: "
                + attrInfo[i].isWritable());
      }
    } else sink.echo(" ** No attributes **");
    sink.echo("\nCONSTRUCTORS");
    MBeanConstructorInfo[] constrInfo = info.getConstructors();
    for (int i = 0; i < constrInfo.length; i++) {
      sink.echo(" ** NAME: \t" + constrInfo[i].getName());
      sink.echo("    DESCR: \t" + constrInfo[i].getDescription());
      sink.echo("    PARAM: \t" + constrInfo[i].getSignature().length
          + " parameter(s)");
    }
    sink.echo("\nOPERATIONS");
    MBeanOperationInfo[] opInfo = info.getOperations();
    if (opInfo.length > 0) {
      for (int i = 0; i < opInfo.length; i++) {
        sink.echo(" ** NAME: \t" + opInfo[i].getName());
        sink.echo("    DESCR: \t" + opInfo[i].getDescription());
        sink.echo("    PARAM: \t" + opInfo[i].getSignature().length
            + " parameter(s)");
      }
    } else sink.echo(" ** No operations ** ");
    sink.echo("\nNOTIFICATIONS");
    MBeanNotificationInfo[] notifInfo = info.getNotifications();
    if (notifInfo.length > 0) {
      for (int i = 0; i < notifInfo.length; i++) {
        sink.echo(" ** NAME: \t" + notifInfo[i].getName());
        sink.echo("    DESCR: \t" + notifInfo[i].getDescription());
        String notifTypes[] = notifInfo[i].getNotifTypes();
        for (int j = 0; j < notifTypes.length; j++) {
          sink.echo("    TYPE: \t" + notifTypes[j]);
        }
      }
    } else sink.echo(" ** No notifications **");
  }
  private static MBeanInfo getMBeanInfoSafely(VarOutputSink sink,
      MBeanServer mbs, ObjectName objectName) {
    MBeanInfo info = null;
    try {
      info = mbs.getMBeanInfo(objectName);
    } catch (InstanceNotFoundException e) {
      sink.printVariable("ObjectName", "Not found");
    } catch (IntrospectionException e) {
      sink.printVariable("ObjectName", "IntrospectionException");
    } catch (ReflectionException e) {
      sink.printVariable("ObjectName", "ReflectionException");
    }
    return info;
  }
  /**
   * Prints bean attributes to a {@link VarOutputSink}.
   * 
   * @param sink The {@link VarOutputSink} to which attributes will be sent
   * @param mbs The {@link MBeanServer} with respect to which the
   *          {@code objectName} is accessed
   * @param objectName The {@link ObjectName} that identifies this bean
   */
  public static void printMBeanAttributes(VarOutputSink sink, MBeanServer mbs,
      ObjectName objectName) {
    MBeanInfo info = getMBeanInfoSafely(sink, mbs, objectName);
    if (info == null) {
      sink.printVariable(objectName.getCanonicalName(), "can't fetch info");
      return;
    }
    MBeanAttributeInfo[] attrInfo = info.getAttributes();
    if (attrInfo.length > 0) {
      for (int i = 0; i < attrInfo.length; i++) {
        String attrName = attrInfo[i].getName();
        Object attrValue = null;
        String attrValueString = null;
        try {
          attrValue = mbs.getAttribute(objectName, attrName);
        } catch (AttributeNotFoundException e) {
          attrValueString = "AttributeNotFoundException";
        } catch (InstanceNotFoundException e) {
          attrValueString = "InstanceNotFoundException";
        } catch (MBeanException e) {
          attrValueString = "MBeanException";
        } catch (ReflectionException e) {
          attrValueString = "ReflectionException";
        }
        if (attrValueString == null) {
          attrValueString = attrValue.toString();
        }
        sink.printVariable(attrName, attrValueString);
      }
    }
  }
  /**
   * Helper interface defining output sinks used with
   * {@link Utilities#printMBeanInfo(com.google.enterprise.util.jmx.Utils.VarOutputSink, MBeanServer, ObjectName)}
   * and
   * {@link Utilities#printMBeanAttributes(com.google.enterprise.util.jmx.Utils.VarOutputSink, MBeanServer, ObjectName)}
   */
  public interface VarOutputSink {
    public void printVariable(String name, String value);
    public void echo(String string);
  }
  /**
   * Static {@link VarOutputSink} that uses {@link System#out}
   */
  public static final VarOutputSink SYSTEM_OUT_SINK = new PrintStreamVarOutputSink(
      System.out);
  public static class LoggerVarOutputSink implements VarOutputSink {
    private final Logger logger;
    public LoggerVarOutputSink(Logger logger) {
      this.logger = logger;
    }
    public void printVariable(String name, String value) {
      logger.info(name + " " + value);
    }
    public void echo(String string) {
      logger.info(string);
    }
  }
  public static class PrintWriterVarOutputSink implements VarOutputSink {
    private final PrintWriter printWriter;
    public PrintWriterVarOutputSink(PrintWriter printWriter) {
      this.printWriter = printWriter;
    }
    public void printVariable(String name, String value) {
      printWriter.print("  ");
      printWriter.print(name);
      printWriter.print("
 ");
      printWriter.print(value);
      printWriter.println("
");
    }
    public void echo(String string) {
      printWriter.print(string);
    }
  }
  public static class PrintStreamVarOutputSink implements VarOutputSink {
    private final PrintStream printStream;
    public PrintStreamVarOutputSink(PrintStream printStream) {
      this.printStream = printStream;
    }
    public void printVariable(String name, String value) {
      printStream.print("  ");
      printStream.print(name);
      printStream.print("
 ");
      printStream.print(value);
      printStream.println("
");
    }
    public void echo(String string) {
      printStream.print(string);
    }
  }
}