docs: @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;
      }