From 0dbf67cbedf2e77a926121fedc506433ee43d21b Mon Sep 17 00:00:00 2001 From: Zoran Regvart Date: Tue, 3 Jan 2017 19:16:33 +0100 Subject: [PATCH] Support dynamic configuration from ConfigAdmin When adding configuration at runtime through ConfigurationAdmin#createFactoryConfiguration Apache Felix appends random UUID to the Configuration PID [1][2]. In order for those to be considered by `getRequiredRoles` that random UUID needs to be removed in comparison performed by `getGeneralPid`. [1] https://github.com/apache/felix/blob/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java#L397-L400 [2] https://github.com/apache/felix/blob/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java#L1093-L1137 --- .../management/KarafMBeanServerGuard.java | 5 +-- .../management/KarafMBeanServerGuardTest.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java b/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java index 831ab470290..38bcb18dbf1 100644 --- a/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java +++ b/management/server/src/main/java/org/apache/karaf/management/KarafMBeanServerGuard.java @@ -367,7 +367,8 @@ private String getGeneralPid(List allPids, String pid) { String[] pidStrArray = pid.split(Pattern.quote(".")); Set rets = new TreeSet(WILDCARD_PID_COMPARATOR); for (String id : allPids) { - String[] idStrArray = id.split(Pattern.quote(".")); + String idWithoutRandomSuffix = id.replaceFirst("\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", ""); + String[] idStrArray = idWithoutRandomSuffix.split(Pattern.quote(".")); if (idStrArray.length == pidStrArray.length) { boolean match = true; for (int i = 0; i < idStrArray.length; i++) { @@ -380,7 +381,7 @@ private String getGeneralPid(List allPids, String pid) { } } if (match) { - rets.add(idStrArray); + rets.add(id.split(Pattern.quote("."))); } } } diff --git a/management/server/src/test/java/org/apache/karaf/management/KarafMBeanServerGuardTest.java b/management/server/src/test/java/org/apache/karaf/management/KarafMBeanServerGuardTest.java index 3f69158b316..ff00dc6c7e9 100644 --- a/management/server/src/test/java/org/apache/karaf/management/KarafMBeanServerGuardTest.java +++ b/management/server/src/test/java/org/apache/karaf/management/KarafMBeanServerGuardTest.java @@ -431,6 +431,38 @@ public void testRequiredRolesMethodNameWildcardEmpty() throws Exception { guard.getRequiredRoles(on, "test", new Object[]{new Long(17)}, new String[]{"java.lang.Long"})); } + public void testRequiredRolesDynamic() throws Exception { + Dictionary configuration = new Hashtable(); + configuration.put("foo", "test"); + ConfigurationAdmin ca = getMockDynamicConfigAdmin(configuration); + + KarafMBeanServerGuard guard = new KarafMBeanServerGuard(); + guard.setConfigAdmin(ca); + + ObjectName on = ObjectName.getInstance("foo.bar:type=Test"); + assertEquals(Collections.singletonList("test"), + guard.getRequiredRoles(on, "foo", new Object[]{"a"}, new String[]{"java.lang.String"})); + } + + private ConfigurationAdmin getMockDynamicConfigAdmin(Dictionary configuration) throws IOException, InvalidSyntaxException { + configuration.put(Constants.SERVICE_PID, "jmx.acl.foo.bar.Test"); + + Configuration conf = EasyMock.createMock(Configuration.class); + EasyMock.expect(conf.getPid()).andReturn("jmx.acl.foo.bar.Test.631a5424-7f36-494c-9b59-999afdbfacb2").anyTimes(); + EasyMock.expect(conf.getProperties()).andReturn(configuration).anyTimes(); + EasyMock.replay(conf); + + ConfigurationAdmin ca = EasyMock.createMock(ConfigurationAdmin.class); + EasyMock.expect(ca.getConfiguration(conf.getPid(), null)).andReturn(conf).anyTimes(); + + EasyMock.expect(ca.listConfigurations(EasyMock.eq("(service.pid=jmx.acl*)"))).andReturn( + new Configuration[]{conf}).anyTimes(); + EasyMock.expect(ca.listConfigurations(EasyMock.eq("(service.pid=jmx.acl.whitelist)"))).andReturn( + new Configuration[]{conf}).anyTimes(); + EasyMock.replay(ca); + return ca; + } + @SuppressWarnings("unchecked") private ConfigurationAdmin getMockConfigAdmin(Dictionary configuration) throws IOException, InvalidSyntaxException { configuration.put(Constants.SERVICE_PID, "jmx.acl.foo.bar.Test");