You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2021/04/27 09:05:37 UTC

svn commit: r1889232 - in /jackrabbit/oak/trunk/oak-jcr/src: main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java

Author: angela
Date: Tue Apr 27 09:05:37 2021
New Revision: 1889232

URL: http://svn.apache.org/viewvc?rev=1889232&view=rev
Log:
OAK-9417 : ClassCastException in ConsolidatedListenerMBeanImpl (patch provided by Carsten Ziegeler)

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java?rev=1889232&r1=1889231&r2=1889232&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java Tue Apr 27 09:05:37 2021
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.CompositeDataSupport;
@@ -186,7 +187,7 @@ public class ConsolidatedListenerMBeanIm
         List<BackgroundObserverMBean> observers = Lists.newArrayList();
 
         for (Map.Entry<ObjectName, BackgroundObserverMBean> o : bgObservers.entrySet()){
-           String listenerId = getListenerId(o.getKey());
+            String listenerId = getListenerId(o.getKey());
             if (listenerId == null){
                 observers.add(o.getValue());
             }
@@ -271,12 +272,12 @@ public class ConsolidatedListenerMBeanIm
 
     @SuppressWarnings("unused")
     protected void bindChangeProcessorMBean(ChangeProcessorMBean mbean, Map<String, ?> config){
-    	changeProcessors.put(getObjectName(config), mbean);
+        changeProcessors.put(getObjectName(config), mbean);
     }
 
     @SuppressWarnings("unused")
     protected void unbindChangeProcessorMBean(ChangeProcessorMBean mbean, Map<String, ?> config){
-    	changeProcessors.remove(getObjectName(config));
+        changeProcessors.remove(getObjectName(config));
     }
 
     @SuppressWarnings("unused")
@@ -299,9 +300,19 @@ public class ConsolidatedListenerMBeanIm
         filterConfigs.remove(getObjectName(config));
     }
 
-    private static ObjectName getObjectName(Map<String, ?> config){
-        return checkNotNull((ObjectName) config.get("jmx.objectname"),
-                "No 'jmx.objectname' property defined for MBean %s", config);
+    static ObjectName getObjectName(Map<String, ?> config) {
+        Object value = config.get("jmx.objectname");
+        ObjectName name = null;
+        if (value instanceof String) {
+            try {
+                name = new ObjectName((String) value);
+            } catch (MalformedObjectNameException e) {
+                // ignore name will be null in this case
+            }
+        } else if (value instanceof ObjectName) {
+            name = (ObjectName) value;
+        }
+        return checkNotNull(name, "No 'jmx.objectname' property defined for MBean %s", config);
     }
 
     private static String getListenerId(ObjectName name){

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java?rev=1889232&r1=1889231&r2=1889232&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanTest.java Tue Apr 27 09:05:37 2021
@@ -18,8 +18,11 @@
  */
 package org.apache.jackrabbit.oak.jcr.observation;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -50,6 +53,32 @@ public class ConsolidatedListenerMBeanTe
         assertNotNull(data);
     }
 
+    @Test(expected = NullPointerException.class)
+    public void testGetConfigNameNoValue() {
+        final Map<String, Object> properties = Collections.emptyMap();
+        ConsolidatedListenerMBeanImpl.getObjectName(properties);
+    }
+
+    @Test
+    public void testGetConfigNameObjectNameValue() throws MalformedObjectNameException {
+        final ObjectName name = new ObjectName("*:*");
+        final Map<String, Object> properties = Collections.singletonMap("jmx.objectname", name);
+        assertSame(name, ConsolidatedListenerMBeanImpl.getObjectName(properties));
+    }
+
+    @Test
+    public void testGetConfigNameStringValue() throws MalformedObjectNameException {
+        final String name = "*:*";
+        final Map<String, Object> properties = Collections.singletonMap("jmx.objectname", name);
+        assertEquals(new ObjectName(name), ConsolidatedListenerMBeanImpl.getObjectName(properties));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testGetConfigNameInvalidValue() {
+        final Map<String, Object> properties = Collections.singletonMap("jmx.objectname", Boolean.TRUE);
+        ConsolidatedListenerMBeanImpl.getObjectName(properties);
+    }
+
     private static class Listener implements EventListener {
         private final AtomicInteger eventCount;