@SuppressWarnings("unchecked")
    private Map<String,Object> jsonifyMBeanInfo(MBeanInfo mBeanInfo) {
        Map<String, Object> result = new LinkedHashMap<>();

        // desc
        result.put("desc", mBeanInfo.getDescription());

        // attr
        Map<String, Object> attrMap = new LinkedHashMap<>();
        result.put("attr", attrMap);
        for (MBeanAttributeInfo attrInfo : mBeanInfo.getAttributes()) {
            if (attrInfo == null) {
                continue;
            }
            Map<String, Object> attr = new HashMap<>();
            attr.put("type", attrInfo.getType());
            attr.put("desc", attrInfo.getDescription());
            attr.put("rw", attrInfo.isWritable() && attrInfo.isReadable());
            attrMap.put(attrInfo.getName(), attr);
        }

        // op
        Map<String, Object> opMap = new LinkedHashMap<>();
        result.put("op", opMap);
        for (MBeanOperationInfo opInfo : mBeanInfo.getOperations()) {
            Map<String, Object> map = new HashMap<>();
            List<Map<String, String>> argList = new ArrayList<>(opInfo.getSignature().length);
            for (MBeanParameterInfo paramInfo : opInfo.getSignature()) {
                Map<String, String> args = new HashMap<>();
                args.put("desc", paramInfo.getDescription());
                args.put("name", paramInfo.getName());
                args.put("type", paramInfo.getType());
                argList.add(args);
            }
            map.put("args", argList);
            map.put("ret", opInfo.getReturnType());
            map.put("desc", opInfo.getDescription());
            Object ops = opMap.get(opInfo.getName());
            if (ops != null) {
                if (ops instanceof List) {
                    // If it is already a list, simply add it to the end
                    ((List) ops).add(map);
                } else if (ops instanceof Map) {
                    // If it is a map, add a list with two elements
                    // (the old one and the new one)
                    List<Object> opList = new LinkedList<>();
                    opList.add(ops);
                    opList.add(map);
                    opMap.put(opInfo.getName(), opList);
                }
            } else {
                // No value set yet, simply add the map as plain value
                opMap.put(opInfo.getName(), map);
            }
        }

        // not
        Map<String, Object> notMap = new LinkedHashMap<>();
        result.put("not", notMap);
        for (MBeanNotificationInfo notInfo : mBeanInfo.getNotifications()) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", notInfo.getName());
            map.put("desc", notInfo.getDescription());
            String[] types = notInfo.getNotifTypes();
            List<String> tList = new ArrayList<>(types.length);
            Collections.addAll(tList, types);
            map.put("types", tList);
            notMap.put(notInfo.getName(), map);
        }

        // this is default - in case we won't find RBACDecorator (possible in hawtio-wildfly for example)
        result.put("canInvoke", true);

        return result;
    }
@ SuppressWarnings ( "unchecked" ) private Map < String , Object > jsonifyMBeanInfo ( MBeanInfo mBeanInfo ) { Map < String , Object > result = new LinkedHashMap < > ( ) ; result . put ( "desc" , mBeanInfo . getDescription ( ) ) ; Map < String , Object > attrMap = new LinkedHashMap < > ( ) ; result . put ( "attr" , attrMap ) ; for ( MBeanAttributeInfo attrInfo : mBeanInfo . getAttributes ( ) ) { if ( attrInfo == null ) { continue ; } Map < String , Object > attr = new HashMap < > ( ) ; attr . put ( "type" , attrInfo . getType ( ) ) ; attr . put ( "desc" , attrInfo . getDescription ( ) ) ; attr . put ( "rw" , attrInfo . isWritable ( ) && attrInfo . isReadable ( ) ) ; attrMap . put ( attrInfo . getName ( ) , attr ) ; } Map < String , Object > opMap = new LinkedHashMap < > ( ) ; result . put ( "op" , opMap ) ; for ( MBeanOperationInfo opInfo : mBeanInfo . getOperations ( ) ) { Map < String , Object > map = new HashMap < > ( ) ; List < Map < String , String > > argList = new ArrayList < > ( opInfo . getSignature ( ) . length ) ; for ( MBeanParameterInfo paramInfo : opInfo . getSignature ( ) ) { Map < String , String > args = new HashMap < > ( ) ; args . put ( "desc" , paramInfo . getDescription ( ) ) ; args . put ( "name" , paramInfo . getName ( ) ) ; args . put ( "type" , paramInfo . getType ( ) ) ; argList . add ( args ) ; } map . put ( "args" , argList ) ; map . put ( "ret" , opInfo . getReturnType ( ) ) ; map . put ( "desc" , opInfo . getDescription ( ) ) ; Object ops = opMap . get ( opInfo . getName ( ) ) ; if ( ops != null ) { if ( ops instanceof List ) { ( ( List ) ops ) . add ( map ) ; } else if ( ops instanceof Map ) { List < Object > opList = new LinkedList < > ( ) ; opList . add ( ops ) ; opList . add ( map ) ; opMap . put ( opInfo . getName ( ) , opList ) ; } } else { opMap . put ( opInfo . getName ( ) , map ) ; } } Map < String , Object > notMap = new LinkedHashMap < > ( ) ; result . put ( "not" , notMap ) ; for ( MBeanNotificationInfo notInfo : mBeanInfo . getNotifications ( ) ) { Map < String , Object > map = new HashMap < > ( ) ; map . put ( "name" , notInfo . getName ( ) ) ; map . put ( "desc" , notInfo . getDescription ( ) ) ; String [ ] types = notInfo . getNotifTypes ( ) ; List < String > tList = new ArrayList < > ( types . length ) ; Collections . addAll ( tList , types ) ; map . put ( "types" , tList ) ; notMap . put ( notInfo . getName ( ) , map ) ; } result . put ( "canInvoke" , true ) ; return result ; }
This method duplicates what Jolokia does in List Handler in order to convert {@link MBeanInfo} to JSON.
@param mBeanInfo
@return