You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gh...@apache.org on 2019/02/08 14:22:10 UTC

svn commit: r1853222 - in /felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc: core/impl/util/HealthCheckFilter.java jmx/impl/HealthCheckMBeanCreator.java

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;
     }
 
 }