Ejemplo n.º 1
0
 public void clean() {
   try {
     for (; ; ) {
       Configuration[] configs =
           configurationAdmin.listConfigurations(
               "(|(service.factoryPid=org.fusesource.fabric.zookeeper.server)(service.pid=org.fusesource.fabric.zookeeper))");
       if (configs != null && configs.length > 0) {
         for (Configuration config : configs) {
           config.delete();
         }
         Thread.sleep(100);
       } else {
         break;
       }
     }
     File zkDir = new File("data/zookeeper");
     if (zkDir.isDirectory()) {
       File newZkDir = new File("data/zookeeper." + System.currentTimeMillis());
       if (!zkDir.renameTo(newZkDir)) {
         newZkDir = zkDir;
       }
       delete(newZkDir);
     }
   } catch (Exception e) {
     throw new FabricException("Unable to delete zookeeper configuration", e);
   }
 }
  @Test
  public void testConfigurationEventAdded() throws Exception {
    String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123";
    Configuration conf = EasyMock.createMock(Configuration.class);
    EasyMock.expect(conf.getPid()).andReturn(testPid).anyTimes();
    EasyMock.replay(conf);

    ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes();
    EasyMock.expect(cm.getConfiguration(testPid)).andReturn(conf).anyTimes();
    EasyMock.replay(cm);

    final List<String> generateCalled = new ArrayList<String>();
    SecuredCommandConfigTransformer scct =
        new SecuredCommandConfigTransformer() {
          @Override
          void generateServiceGuardConfig(Configuration config) throws IOException {
            generateCalled.add(config.getPid());
          }
        };
    scct.setConfigAdmin(cm);
    scct.init();

    @SuppressWarnings("unchecked")
    ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class);
    EasyMock.replay(cmRef);

    ConfigurationEvent event =
        new ConfigurationEvent(cmRef, ConfigurationEvent.CM_UPDATED, null, testPid);

    assertEquals("Precondition", 0, generateCalled.size());
    scct.configurationEvent(event);
    assertEquals(1, generateCalled.size());
    assertEquals(testPid, generateCalled.iterator().next());
  }
  @Test
  public void testConfigurationEventDeletedNonScope() throws Exception {
    String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "abc.def";

    ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes();
    EasyMock.replay(cm);

    SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer();
    scct.setConfigAdmin(cm);
    scct.init();

    @SuppressWarnings("unchecked")
    ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class);
    EasyMock.replay(cmRef);
    ConfigurationEvent event =
        new ConfigurationEvent(cmRef, ConfigurationEvent.CM_DELETED, null, testPid);

    EasyMock.reset(cm);
    // Do not expect any further calls to cm...
    EasyMock.replay(cm);

    scct.configurationEvent(event);
    EasyMock.verify(cm);
  }
Ejemplo n.º 4
0
 public static Configuration[] getConfigurationsFor(BundleContext bundleContext, String factoryPid)
     throws IOException, InvalidSyntaxException {
   ConfigurationAdmin configurationAdminService = getConfigurationAdminService(bundleContext);
   Configuration[] modeShapeRepositoryConfigurations =
       configurationAdminService.listConfigurations(
           "(" + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + factoryPid + ")");
   return modeShapeRepositoryConfigurations;
 }
 public void init() {
   synchronized (this.monitor) {
     try {
       for (Configuration configuration : configurationAdmin.listConfigurations(null)) {
         exportConfiguration(configuration.getPid());
       }
     } catch (Exception e) {
       logger.warn("Could not enumerate existing configurations");
     }
   }
 }
  @Test
  public void testConfigurationEventDeleted() throws Exception {
    String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123";

    ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes();
    EasyMock.replay(cm);

    SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer();
    scct.setConfigAdmin(cm);
    scct.init();

    @SuppressWarnings("unchecked")
    ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class);
    EasyMock.replay(cmRef);
    ConfigurationEvent event =
        new ConfigurationEvent(cmRef, ConfigurationEvent.CM_DELETED, null, testPid);

    Configuration c1 = EasyMock.createMock(Configuration.class);
    c1.delete();
    EasyMock.expectLastCall().once();
    EasyMock.replay(c1);
    Configuration c2 = EasyMock.createMock(Configuration.class);
    c2.delete();
    EasyMock.expectLastCall().once();
    EasyMock.replay(c2);

    EasyMock.reset(cm);
    EasyMock.expect(
            cm.listConfigurations("(service.pid=org.apache.karaf.service.acl.command.test123.*)"))
        .andReturn(new Configuration[] {c1, c2})
        .once();
    EasyMock.replay(cm);

    scct.configurationEvent(event);

    EasyMock.verify(cm);
    EasyMock.verify(c1);
    EasyMock.verify(c2);
  }
Ejemplo n.º 7
0
 private Configuration getLogConfiguration() throws IOException {
   Configuration logConfiguration = null;
   try {
     Configuration[] configs =
         configurationAdmin.listConfigurations("(" + LOGGER_KEY + "=" + LOGGER_VAL + ")");
     if (configs != null && configs.length > 0) {
       logConfiguration = configs[0];
     }
   } catch (InvalidSyntaxException e) {
     // ignore this as we'll create what we need
   }
   return logConfiguration;
 }
Ejemplo n.º 8
0
  public static void toJSON(ConfigurationAdmin admin, Writer osw, String filter) throws Exception {

    Configuration[] list = admin.listConfigurations(filter);
    Encoder encoder = codec.enc().to(osw);

    Protocol p = new Protocol();
    p.version = 1;
    p.date = new Date();
    p.size = list.length;
    encoder.put(p).append('\n');

    if (list != null)
      for (Configuration c : list) {
        Dictionary<String, Object> d = c.getProperties();
        Export export = new Export();
        export.values = new HashMap<String, Object>();
        export.factoryPid = c.getFactoryPid();
        export.pid = c.getPid();

        for (Enumeration<String> e = d.keys(); e.hasMoreElements(); ) {
          String k = e.nextElement();
          Object v = d.get(k);

          if (!(v instanceof String)) {

            if (export.types == null) export.types = new HashMap<String, Type>();

            Type type = new Type();

            Class<?> clazz = v.getClass();
            if (v instanceof Collection) {
              Collection<?> coll = (Collection<?>) v;
              clazz = String.class;
              if (coll.size() > 0) type.vectorOf = shortName(coll.iterator().next().getClass());
              else type.vectorOf = shortName(String.class);
            } else if (v.getClass().isArray()) {
              type.arrayOf = shortName(clazz.getComponentType());
            } else type.scalar = shortName(v.getClass());

            export.types.put(k, type);
          }
          export.values.put(k, v);
        }

        encoder.mark().put(export);
        // encoder.put(encoder.digest());
        encoder.append('\n');
      }
    osw.flush();
  }
  @Test
  public void testEmptyConfigurationsSource() throws IOException, InvalidSyntaxException {
    configureActionProvider();
    actionProvider.setConfigurationAdmin(configurationAdmin);
    Configuration[] configurations = new Configuration[0];

    when(source.getId()).thenReturn(SAMPLE_SOURCE_ID);
    when(configurationAdmin.listConfigurations(String.format("(id=%s)", SAMPLE_SOURCE_ID)))
        .thenReturn(configurations);

    List<Action> actions = actionProvider.getActions(source);

    assertThat(actions.size(), is(0));
  }
Ejemplo n.º 10
0
 protected void deleteFactoryConfigurations(String factoryPid) {
   ConfigurationAdmin ca = getConfigurationAdmin();
   try {
     final String filter = "(service.factoryPid=" + factoryPid + ")";
     Configuration[] configs = ca.listConfigurations(filter);
     if (configs != null) {
       for (Configuration configuration : configs) {
         configuration.delete();
       }
     }
   } catch (InvalidSyntaxException ise) {
     // unexpected
   } catch (IOException ioe) {
     TestCase.fail("Failed deleting configurations " + factoryPid + ": " + ioe.toString());
   }
 }
Ejemplo n.º 11
0
  protected Configuration getConfiguration(final String pid) {
    final ConfigurationAdmin ca = getConfigurationAdmin();
    try {
      final String filter = "(" + Constants.SERVICE_PID + "=" + pid + ")";
      final Configuration[] configs = ca.listConfigurations(filter);
      if (configs != null && configs.length > 0) {
        return configs[0];
      }
    } catch (InvalidSyntaxException ise) {
      // unexpected
    } catch (IOException ioe) {
      TestCase.fail("Failed listing configurations " + pid + ": " + ioe.toString());
    }

    TestCase.fail("No Configuration " + pid + " found");
    return null;
  }
 private Configuration findExistingConfiguration(String pid, String instanceKey)
     throws IOException, InvalidSyntaxException {
   String filter =
       "(&("
           + ConfigurationAdmin.SERVICE_FACTORYPID
           + "="
           + pid
           + ")("
           + OSGI_PROPERTY_KEY_FACTORY_INSTANCE_KEY
           + "="
           + instanceKey
           + "))";
   Configuration[] configurations = configurationAdmin.listConfigurations(filter);
   if (configurations != null && configurations.length > 0) {
     return configurations[0];
   } else {
     return null;
   }
 }
  @Test
  public void testConfigurationEventAddedNonCommand() throws Exception {
    ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes();
    EasyMock.replay(cm);

    SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer();
    scct.setConfigAdmin(cm);
    scct.init();

    @SuppressWarnings("unchecked")
    ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class);
    EasyMock.replay(cmRef);
    ConfigurationEvent event =
        new ConfigurationEvent(cmRef, ConfigurationEvent.CM_UPDATED, null, "test123");

    scct.configurationEvent(event);
    EasyMock.verify(cm); // Ensure that this doesn't cause any unwanted calls on ConfigAdmin
  }
Ejemplo n.º 14
0
 public List<String> getEnsembleContainers() {
   try {
     Configuration[] configs =
         configurationAdmin.listConfigurations("(service.pid=org.fusesource.fabric.zookeeper)");
     if (configs == null || configs.length == 0) {
       return Collections.emptyList();
     }
     List<String> list = new ArrayList<String>();
     if (zooKeeper.exists(ZkPath.CONFIG_ENSEMBLES.getPath()) != null) {
       String clusterId =
           ZooKeeperRetriableUtils.get(zooKeeper, ZkPath.CONFIG_ENSEMBLES.getPath());
       String containers =
           ZooKeeperRetriableUtils.get(zooKeeper, ZkPath.CONFIG_ENSEMBLE.getPath(clusterId));
       Collections.addAll(list, containers.split(","));
     }
     return list;
   } catch (Exception e) {
     throw new FabricException("Unable to load zookeeper quorum containers", e);
   }
 }
Ejemplo n.º 15
0
  protected void cleanupConfigurationAdmin() throws IOException, InvalidSyntaxException {
    Configuration[] configurations = admin.listConfigurations(null);
    if (configurations != null) {
      for (Configuration conf : configurations) {
        if (!conf.getPid().contains("instantiated.at.boot")) {
          conf.delete();
        }
      }
    }

    await()
        .atMost(1, TimeUnit.MINUTES)
        .until(
            new Callable<Boolean>() {
              @Override
              public Boolean call() throws Exception {
                return osgi.getServiceObject(MyComponent.class) == null;
              }
            });
  }
  @Test
  public void testConfigurationLocationChangedEventNoEffect() throws Exception {
    String testPid = SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "test123";

    ConfigurationAdmin cm = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(cm.listConfigurations(EasyMock.isA(String.class))).andReturn(null).anyTimes();
    EasyMock.replay(cm);

    SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer();
    scct.setConfigAdmin(cm);
    scct.init();

    @SuppressWarnings("unchecked")
    ServiceReference<ConfigurationAdmin> cmRef = EasyMock.createMock(ServiceReference.class);
    EasyMock.replay(cmRef);
    ConfigurationEvent event =
        new ConfigurationEvent(cmRef, ConfigurationEvent.CM_LOCATION_CHANGED, null, testPid);

    scct.configurationEvent(event);
    EasyMock.verify(cm); // Ensure that this doesn't cause any unwanted calls on ConfigAdmin
  }
Ejemplo n.º 17
0
  /**
   * Constructor for configuration resource manager
   *
   * @param configAdmin {@code ConfigurationAdmin}
   */
  public ConfigAdminResourceManager(Object configAdmin) {
    super(CONFIG_PATH);
    this.m_configAdmin = (ConfigurationAdmin) configAdmin;
    this.m_configListener = new ConfigurationListenerHandler();
    setRelations(
        new DefaultRelation(
            getPath(),
            Action.CREATE,
            "create",
            new DefaultParameter()
                .name(BUNDLE_LOCATION)
                .description("bundle location")
                .type(String.class)
                .optional(false),
            new DefaultParameter()
                .name(PID)
                .description("Persistent id of configuration")
                .type(String.class)
                .optional(true),
            new DefaultParameter()
                .name(FACTORY_PID)
                .description("Persistent id of factory pid")
                .type(String.class)
                .optional(true)));

    try {
      Configuration[] configs = m_configAdmin.listConfigurations(null);
      if (configs != null) {
        for (Configuration cfg : configs) {
          m_configurationResourceMap.put(cfg.getPid(), new ConfigurationResource(cfg));
        }
      }
    } catch (IOException e) {
      // well, this may happen..
      throw new RuntimeException(e.getMessage());
    } catch (InvalidSyntaxException e) {
      // should never happen..
      throw new RuntimeException(e.getMessage());
    }
  }
Ejemplo n.º 18
0
 /**
  * Search the configuration admin for the specified factoryPid that refers to the provider.
  *
  * @param factoryPid
  * @param provider
  * @return
  * @throws java.io.IOException
  */
 private static Configuration findOrCreateFactoryConfiguration(
     ConfigurationAdmin configurationAdmin, String factoryPid, String provider)
     throws IOException {
   Configuration configuration = null;
   if (configurationAdmin != null) {
     try {
       Configuration[] configurations =
           configurationAdmin.listConfigurations(String.format(FACTORY_FILTER, factoryPid));
       if (configurations != null) {
         for (Configuration conf : configurations) {
           Dictionary dictionary = conf.getProperties();
           if (dictionary != null && provider.equals(dictionary.get("provider"))) {
             return conf;
           }
         }
       }
     } catch (Exception e) {
       LOGGER.warn("Failed to lookup configuration admin for existing cloud providers.", e);
     }
     LOGGER.debug("No configuration found with factoryPid org.jclouds.compute. Creating new one.");
     configuration = configurationAdmin.createFactoryConfiguration(factoryPid, null);
   }
   return configuration;
 }
  @Test
  public void testTransformation() throws Exception {
    Dictionary<String, Object> props = new Hashtable<String, Object>();
    props.put("foo", "a,b,c");
    props.put("bar[/.*[a]+*/]", "d");
    props.put("bar", "e");
    props.put("zar[/.*HiThere*/]", "f");
    props.put("service.pid", SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "abc");
    Configuration commandConfig = mockConfiguration(props);

    Dictionary<String, Object> props2 = new Hashtable<String, Object>();
    props2.put("xxx", "yyy");
    props2.put(
        "service.pid", SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX + "xyz.123");
    Configuration commandConfig2 = mockConfiguration(props2);

    Dictionary<String, Object> props3 = new Hashtable<String, Object>();
    props3.put("test", "toast");
    props3.put("service.pid", "xyz.123");
    Configuration otherConfig = mockConfiguration(props3);

    final Map<String, Configuration> configurations = new HashMap<String, Configuration>();

    ConfigurationAdmin ca = EasyMock.createMock(ConfigurationAdmin.class);
    EasyMock.expect(
            ca.listConfigurations(
                "(service.pid="
                    + SecuredCommandConfigTransformer.PROXY_COMMAND_ACL_PID_PREFIX
                    + "*)"))
        .andReturn(new Configuration[] {commandConfig, commandConfig2, otherConfig})
        .anyTimes();
    EasyMock.expect(ca.getConfiguration(EasyMock.isA(String.class)))
        .andAnswer(
            new IAnswer<Configuration>() {
              @Override
              public Configuration answer() throws Throwable {
                String pid = (String) EasyMock.getCurrentArguments()[0];
                Configuration c = configurations.get(pid);
                if (c == null) {
                  c = EasyMock.createMock(Configuration.class);

                  // Put some expectations in the various mocks
                  Dictionary<String, Object> m = new Hashtable<String, Object>();
                  if ("org.apache.karaf.service.acl.command.abc.foo".equals(pid)) {
                    m.put(
                        "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=foo))");
                    m.put("execute", "a,b,c");
                    m.put("foo", "a,b,c");
                  } else if ("org.apache.karaf.service.acl.command.abc.bar".equals(pid)) {
                    m.put(
                        "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=bar))");
                    m.put("execute[/.*/,/.*[a]+*/]", "d");
                    m.put("execute", "e");
                    m.put("bar[/.*[a]+*/]", "d");
                    m.put("bar", "e");
                  } else if ("org.apache.karaf.service.acl.command.abc.zar".equals(pid)) {
                    m.put(
                        "service.guard", "(&(osgi.command.scope=abc)(osgi.command.function=zar))");
                    m.put("execute[/.*/,/.*HiThere*/]", "f");
                    m.put("zar[/.*HiThere*/]", "f");
                  } else {
                    fail("Unexpected PID: " + pid);
                  }
                  m.put("*", "*");
                  c.update(m);
                  EasyMock.expectLastCall().once();

                  EasyMock.replay(c);
                  configurations.put(pid, c);
                }
                return c;
              }
            })
        .anyTimes();
    EasyMock.replay(ca);

    SecuredCommandConfigTransformer scct = new SecuredCommandConfigTransformer();
    scct.setConfigAdmin(ca);
    scct.init();

    assertEquals(3, configurations.size());

    boolean foundFoo = false;
    boolean foundBar = false;
    boolean foundZar = false;
    for (Map.Entry<String, Configuration> entry : configurations.entrySet()) {
      Configuration c = entry.getValue();
      EasyMock.verify(c);
      if ("org.apache.karaf.service.acl.command.abc.foo".equals(entry.getKey())) {
        foundFoo = true;
      } else if ("org.apache.karaf.service.acl.command.abc.bar".equals(entry.getKey())) {
        foundBar = true;
      } else if ("org.apache.karaf.service.acl.command.abc.zar".equals(entry.getKey())) {
        foundZar = true;
      }
    }

    assertTrue(foundFoo);
    assertTrue(foundBar);
    assertTrue(foundZar);
  }
Ejemplo n.º 20
0
  /**
   * If we have access to {@link ConfigurationAdmin}, we can add RBAC information
   *
   * @param result
   */
  @Override
  @SuppressWarnings("unchecked")
  public void decorate(Map<String, Object> result) throws Exception {
    try {
      ServiceReference<ConfigurationAdmin> cmRef =
          bundleContext.getServiceReference(ConfigurationAdmin.class);
      ServiceReference<JMXSecurityMBean> jmxSecRef =
          bundleContext.getServiceReference(JMXSecurityMBean.class);
      if (cmRef != null && jmxSecRef != null) {
        ConfigurationAdmin configAdmin = bundleContext.getService(cmRef);
        JMXSecurityMBean jmxSec = bundleContext.getService(jmxSecRef);
        if (configAdmin != null && jmxSec != null) {
          // 1. each pair of MBean/operation has to be marked with RBAC flag (can/can't invoke)
          // 2. the information is provided by
          // org.apache.karaf.management.JMXSecurityMBean.canInvoke(java.util.Map)
          // 3. we'll peek into available configadmin jmx.acl* configs, to see which
          // MBeans/operations have to
          //    be examined and which will produce same results
          // 4. only then we'll prepare Map as parameter for canInvoke()

          Configuration[] configurations = configAdmin.listConfigurations("(service.pid=jmx.acl*)");
          List<String> allJmxAclPids = new LinkedList<>();
          for (Configuration cfg : configurations) {
            allJmxAclPids.add(cfg.getPid());
          }
          if (allJmxAclPids.size() == 0) {
            return;
          }

          Map<String, Map<String, Object>> domains =
              (Map<String, Map<String, Object>>) result.get("domains");

          // cache contains MBeanInfos for different MBeans/ObjectNames
          Map<String, Map<String, Object>> cache =
              (Map<String, Map<String, Object>>) result.get("cache");
          // new cache will contain MBeanInfos + RBAC info
          Map<String, Map<String, Object>> rbacCache = new HashMap<>();

          // the fact that some MBeans share JSON MBeanInfo doesn't mean that they can share RBAC
          // info
          // - each MBean's name may have RBAC information configured in different PIDs.

          // when iterating through all reapeating MBeans that share MBeanInfo (that doesn't have
          // RBAC info
          // yet), we have to decide if it'll use shared info after RBAC check or will switch to
          // dedicated
          // info. we have to be careful not to end with most MBeans *not* sharing MBeanInfo (in
          // case if
          // somehow the shared info will be "special case" from RBAC point of view)

          Map<String, List<String>> queryForMBeans = new HashMap<>();
          Map<String, List<String>> queryForMBeanOperations = new HashMap<>();

          for (String domain : domains.keySet()) {
            Map<String, Object> domainMBeansCheck = new HashMap<>(domains.get(domain));
            Map<String, Object> domainMBeans = domains.get(domain);
            for (String name : domainMBeansCheck.keySet()) {
              Object mBeanInfo = domainMBeansCheck.get(name);
              String fullName = domain + ":" + name;
              ObjectName n = new ObjectName(fullName);
              if (mBeanInfo instanceof Map) {
                // not shared JSONified MBeanInfo
                prepareKarafRbacInvocations(
                    fullName,
                    (Map<String, Object>) mBeanInfo,
                    queryForMBeans,
                    queryForMBeanOperations);
              } else /*if (mBeanInfo instanceof String)*/ {
                // shared JSONified MBeanInfo

                // shard mbeanNames sharing MBeanInfo by the hierarchy of jmx.acl* PIDs used to
                // check RBAC info
                String key = (String) mBeanInfo;
                String pidListKey = pidListKey(allJmxAclPids, n);
                if (!rbacCache.containsKey(key + ":" + pidListKey)) {
                  // shallow copy - we can share op/not/attr/desc, but we put specific
                  // canInvoke/opByString keys
                  HashMap<String, Object> sharedMBeanAndRbacInfo = new HashMap<>(cache.get(key));
                  rbacCache.put(key + ":" + pidListKey, sharedMBeanAndRbacInfo);
                  // we'll be checking RBAC only for single (first) MBean having this pidListKey
                  prepareKarafRbacInvocations(
                      fullName, sharedMBeanAndRbacInfo, queryForMBeans, queryForMBeanOperations);
                }
                // switch key from shared MBeanInfo-only to shared MBean+RbacInfo
                domainMBeans.put(name, key + ":" + pidListKey);
              }
            }
          }

          // RBAC per MBeans (can invoke *any* operation or attribute?)
          TabularData dataForMBeans = jmxSec.canInvoke(queryForMBeans);
          Collection<?> results = dataForMBeans.values();
          for (Object cd : results) {
            ObjectName objectName = new ObjectName((String) ((CompositeData) cd).get("ObjectName"));
            boolean canInvoke =
                ((CompositeData) cd).get("CanInvoke") != null
                    ? (Boolean) ((CompositeData) cd).get("CanInvoke")
                    : false;
            Object mBeanInfoOrKey =
                domains.get(objectName.getDomain()).get(objectName.getKeyPropertyListString());
            Map<String, Object> mBeanInfo;
            if (mBeanInfoOrKey instanceof Map) {
              mBeanInfo = (Map<String, Object>) mBeanInfoOrKey;
            } else /*if (mBeanInfoOrKey instanceof String) */ {
              mBeanInfo = rbacCache.get(mBeanInfoOrKey.toString());
            }
            if (mBeanInfo != null) {
              mBeanInfo.put("canInvoke", canInvoke);
            }
          }

          // RBAC per { MBean,operation } (can invoke status for each operation)
          TabularData dataForMBeanOperations = jmxSec.canInvoke(queryForMBeanOperations);
          results = dataForMBeanOperations.values();
          for (Object cd : results) {
            ObjectName objectName = new ObjectName((String) ((CompositeData) cd).get("ObjectName"));
            String method = (String) ((CompositeData) cd).get("Method");
            boolean canInvoke =
                ((CompositeData) cd).get("CanInvoke") != null
                    ? (Boolean) ((CompositeData) cd).get("CanInvoke")
                    : false;
            Object mBeanInfoOrKey =
                domains.get(objectName.getDomain()).get(objectName.getKeyPropertyListString());
            Map<String, Object> mBeanInfo;
            if (mBeanInfoOrKey instanceof Map) {
              mBeanInfo = (Map<String, Object>) mBeanInfoOrKey;
            } else /*if (mBeanInfoOrKey instanceof String) */ {
              mBeanInfo = rbacCache.get(mBeanInfoOrKey.toString());
            }
            if (mBeanInfo != null) {
              ((Map<String, Object>)
                      ((Map<String, Object>) mBeanInfo.get("opByString")).get(method))
                  .put("canInvoke", canInvoke);
            }
          }

          result.remove("cache");
          result.put("cache", rbacCache);
        }
      }
    } catch (Exception e) {
      LOG.error(e.getMessage(), e);
      // simply do not decorate
    }
  }