001    package org.crsh.text.renderers;
002    
003    import org.crsh.text.Color;
004    import org.crsh.text.Decoration;
005    import org.crsh.text.LineRenderer;
006    import org.crsh.text.Renderer;
007    import org.crsh.text.ui.LabelElement;
008    import org.crsh.text.ui.Overflow;
009    import org.crsh.text.ui.RowElement;
010    import org.crsh.text.ui.TableElement;
011    import org.crsh.text.ui.TreeElement;
012    
013    import javax.management.Descriptor;
014    import javax.management.MBeanAttributeInfo;
015    import javax.management.MBeanInfo;
016    import javax.management.MBeanOperationInfo;
017    import javax.management.MBeanParameterInfo;
018    import java.util.ArrayList;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    /**
023     * @author Julien Viet
024     */
025    public class MBeanInfoRenderer extends Renderer<MBeanInfo> {
026    
027      @Override
028      public Class<MBeanInfo> getType() {
029        return MBeanInfo.class;
030      }
031    
032      @Override
033      public LineRenderer renderer(Iterator<MBeanInfo> stream) {
034    
035        List<LineRenderer> renderers = new ArrayList<LineRenderer>();
036    
037        while (stream.hasNext()) {
038          MBeanInfo info = stream.next();
039    
040          //
041          TreeElement root = new TreeElement(info.getClassName());
042    
043          // Descriptor
044          TableElement descriptor = new TableElement().
045              overflow(Overflow.HIDDEN).
046              rightCellPadding(1);
047          Descriptor descriptorInfo = info.getDescriptor();
048          if (descriptorInfo != null) {
049            for (String fieldName : descriptorInfo.getFieldNames()) {
050              String fieldValue = String.valueOf(descriptorInfo.getFieldValue(fieldName));
051              descriptor.row(fieldName, fieldValue);
052            }
053          }
054    
055          // Attributes
056          TableElement attributes = new TableElement().
057              overflow(Overflow.HIDDEN).
058              rightCellPadding(1).
059              add(new RowElement().style(Decoration.bold.fg(Color.black).bg(Color.white)).add("NAME", "TYPE", "DESCRIPTION"));
060          for (MBeanAttributeInfo attributeInfo : info.getAttributes()) {
061            attributes.row(attributeInfo.getName(), attributeInfo.getType(), attributeInfo.getDescription());
062          }
063    
064          // Operations
065          TreeElement operations = new TreeElement("Operations");
066          for (MBeanOperationInfo operationInfo : info.getOperations()) {
067            TableElement signature = new TableElement().
068                overflow(Overflow.HIDDEN).
069                rightCellPadding(1);
070            MBeanParameterInfo[] parameterInfos = operationInfo.getSignature();
071            for (MBeanParameterInfo parameterInfo : parameterInfos) {
072              signature.row(parameterInfo.getName(), parameterInfo.getType(), parameterInfo.getDescription());
073            }
074            TreeElement operation = new TreeElement(operationInfo.getName());
075            String impact;
076            switch (operationInfo.getImpact()) {
077              case MBeanOperationInfo.ACTION:
078                impact = "ACTION";
079                break;
080              case MBeanOperationInfo.INFO:
081                impact = "INFO";
082                break;
083              case MBeanOperationInfo.ACTION_INFO:
084                impact = "ACTION_INFO";
085                break;
086              default:
087                impact = "UNKNOWN";
088            }
089            operation.addChild(new TableElement().
090                add(
091                    new RowElement().add("Type: ", operationInfo.getReturnType()),
092                    new RowElement().add("Description: ", operationInfo.getDescription()),
093                    new RowElement().add("Impact: ", impact),
094                    new RowElement().add(new LabelElement("Signature: "), signature)
095                )
096            );
097    
098            operations.addChild(operation);
099          }
100    
101          //
102          root.addChild(
103            new TableElement().leftCellPadding(1).overflow(Overflow.HIDDEN).
104              row("ClassName", info.getClassName()).
105              row("Description", info.getDescription()
106            )
107          );
108          root.addChild(new TreeElement("Descriptor").addChild(descriptor));
109          root.addChild(new TreeElement("Attributes").addChild(attributes));
110          root.addChild(operations);
111    
112          //
113          renderers.add(root.renderer());
114        }
115    
116    
117    
118    
119        return LineRenderer.vertical(renderers);
120      }
121    }