Author: ghenzler
Date: Fri Feb  8 14:22:10 2019
New Revision: 1853222

URL: http://svn.apache.org/viewvc?rev=1853222&view=rev
Log:
FELIX-6052 Ensure MBeans are registered for legacy checks as well and improved 
filter for MBeanCreator in general

Modified:
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java?rev=1853222&r1=1853221&r2=1853222&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
 Fri Feb  8 14:22:10 2019
@@ -32,12 +32,15 @@ import org.slf4j.LoggerFactory;
  *
  * This class is not thread safe and instances shouldn't be used concurrently 
from different threads. */
 public class HealthCheckFilter {
-    private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final BundleContext bundleContext;
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
+    // object class (supporting current interface and legacy)
+    public static final String HC_FILTER_OBJECT_CLASS = 
"(|(objectClass="+HealthCheck.class.getName()+")(objectClass=org.apache.sling.hc.api.HealthCheck))";
     public static final String OMIT_PREFIX = "-";
 
+    private final BundleContext bundleContext;
+
     /** Create a new filter object */
     public HealthCheckFilter(final BundleContext bc) {
         bundleContext = bc;
@@ -75,11 +78,8 @@ public class HealthCheckFilter {
     CharSequence getServiceFilter(HealthCheckSelector selector, boolean 
combineTagsWithOr) {
         // Build service filter
         final StringBuilder filterBuilder = new StringBuilder();
-        filterBuilder.append("(&"); // overall and
-
-        // object class (supporting current interface and legacy)
-        
filterBuilder.append("(|(objectClass=").append(HealthCheck.class.getName())
-                .append(")(objectClass=org.apache.sling.hc.api.HealthCheck))");
+        filterBuilder.append("(&"); 
+        filterBuilder.append(HC_FILTER_OBJECT_CLASS);
 
         final int prefixLen = HealthCheckFilter.OMIT_PREFIX.length();
         final StringBuilder filterBuilderForOrOperator = new StringBuilder(); 
// or filters

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java?rev=1853222&r1=1853221&r2=1853222&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java
 Fri Feb  8 14:22:10 2019
@@ -30,7 +30,10 @@ import javax.management.DynamicMBean;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.felix.hc.api.HealthCheck;
 import org.apache.felix.hc.core.impl.executor.ExtendedHealthCheckExecutor;
+import org.apache.felix.hc.core.impl.util.HealthCheckFilter;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
@@ -61,27 +64,14 @@ public class HealthCheckMBeanCreator {
 
     @Activate
     protected void activate(final BundleContext btx) {
-        this.hcTracker = new ServiceTracker<HealthCheck, Object>(btx, 
HealthCheck.class, null) {
-
-            @Override
-            public Object addingService(final ServiceReference<HealthCheck> 
reference) {
-                return registerHCMBean(btx, reference);
-            }
-
-            @Override
-            public void modifiedService(final ServiceReference<HealthCheck> 
reference,
-                    final Object service) {
-                unregisterHCMBean(btx, reference);
-                registerHCMBean(btx, reference);
-            }
-
-            @Override
-            public void removedService(final ServiceReference<HealthCheck> 
reference,
-                    final Object service) {
-                unregisterHCMBean(btx, reference);
-            }
-        };
-        this.hcTracker.open();
+        try {
+            Filter filter = 
btx.createFilter("(&"+HealthCheckFilter.HC_FILTER_OBJECT_CLASS+"("+HealthCheck.MBEAN_NAME+"=*))");
+            this.hcTracker = new HealthCheckServiceTracker(btx, filter);
+            this.hcTracker.open();
+        } catch (InvalidSyntaxException e) {
+            logger.warn("Could not create service tracker for filter 
"+HealthCheckFilter.HC_FILTER_OBJECT_CLASS, e);
+        }
+        
     }
 
     @Deactivate
@@ -142,6 +132,33 @@ public class HealthCheckMBeanCreator {
         }
     }
 
+    private final class HealthCheckServiceTracker extends 
ServiceTracker<HealthCheck, Object> {
+        private final BundleContext bundleContext;
+
+        private HealthCheckServiceTracker(BundleContext bundleContext, Filter 
filter) {
+            super(bundleContext, filter, null);
+            this.bundleContext = bundleContext;
+        }
+
+        @Override
+        public Object addingService(final ServiceReference<HealthCheck> 
reference) {
+            return registerHCMBean(bundleContext, reference);
+        }
+
+        @Override
+        public void modifiedService(final ServiceReference<HealthCheck> 
reference,
+                final Object service) {
+            unregisterHCMBean(bundleContext, reference);
+            registerHCMBean(bundleContext, reference);
+        }
+
+        @Override
+        public void removedService(final ServiceReference<HealthCheck> 
reference,
+                final Object service) {
+            unregisterHCMBean(bundleContext, reference);
+        }
+    }
+
     private final class Registration {
         private final String name;
         private final HealthCheckMBean mbean;
@@ -179,8 +196,10 @@ public class HealthCheckMBeanCreator {
         if (StringUtils.isNotBlank(hcMBeanName)) {
             final HealthCheckMBean mbean = new HealthCheckMBean(ref, executor);
             return new Registration(hcMBeanName.replace(',', '.'), mbean);
+        } else {
+            logger.warn("Service reference {} unexpectedly has property {} not 
set", ref, HealthCheck.MBEAN_NAME);
+            return null;
         }
-        return null;
     }
 
 }


Reply via email to