Author: justin
Date: Tue Aug 22 20:48:47 2017
New Revision: 1805830

URL: http://svn.apache.org/viewvc?rev=1805830&view=rev
Log:
SLING-7069 - provide option to combine tags with or

Modified:
    
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java
    
sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java

Modified: 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java?rev=1805830&r1=1805829&r2=1805830&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java
 (original)
+++ 
sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java
 Tue Aug 22 20:48:47 2017
@@ -18,6 +18,7 @@
 package org.apache.sling.hc.core.impl;
 
 import java.util.Arrays;
+import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -35,6 +36,7 @@ import org.apache.sling.commons.osgi.Pro
 import org.apache.sling.hc.api.HealthCheck;
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.Result.Status;
+import org.apache.sling.hc.api.execution.HealthCheckExecutionOptions;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
 import org.apache.sling.hc.api.execution.HealthCheckSelector;
@@ -76,12 +78,20 @@ public class CompositeHealthCheck implem
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    private static final boolean DEFAULT_COMBINE_TAGS_WITH_OR = false;
+
     @Property(unbounded=PropertyUnbounded.ARRAY,
               label="Filter Tags",
               description="Tags used to select which health checks the 
composite health check executes.")
     static final String PROP_FILTER_TAGS = "filter.tags";
     private String [] filterTags;
 
+    @Property(boolValue = DEFAULT_COMBINE_TAGS_WITH_OR,
+            label="Combine Tags With Or",
+            description="Tags used to select which health checks the composite 
health check executes.")
+    static final String PROP_COMBINE_TAGS_WITH_OR = "filter.combineTagsWithOr";
+    private boolean combineTagsWithOr;
+
 
     @Reference
     private HealthCheckExecutor healthCheckExecutor;
@@ -97,8 +107,10 @@ public class CompositeHealthCheck implem
         componentContext = ctx;
         healthCheckFilter = new HealthCheckFilter(bundleContext);
 
-        filterTags = 
PropertiesUtil.toStringArray(ctx.getProperties().get(PROP_FILTER_TAGS), new 
String[] {});
-        log.debug("Activated, will select HealthCheck having tags {}", 
Arrays.asList(filterTags));
+        final Dictionary properties = ctx.getProperties();
+        filterTags = 
PropertiesUtil.toStringArray(properties.get(PROP_FILTER_TAGS), new String[] {});
+        combineTagsWithOr = 
PropertiesUtil.toBoolean(properties.get(PROP_COMBINE_TAGS_WITH_OR), 
DEFAULT_COMBINE_TAGS_WITH_OR);
+        log.debug("Activated, will select HealthCheck having tags {} {}", 
Arrays.asList(filterTags), combineTagsWithOr ? "using OR" : "using AND");
     }
 
     @Deactivate
@@ -119,7 +131,9 @@ public class CompositeHealthCheck implem
         }
 
         FormattingResultLog resultLog = new FormattingResultLog();
-        List<HealthCheckExecutionResult> executionResults = 
healthCheckExecutor.execute(HealthCheckSelector.tags(filterTags));
+        HealthCheckExecutionOptions options = new 
HealthCheckExecutionOptions();
+        options.setCombineTagsWithOr(combineTagsWithOr);
+        List<HealthCheckExecutionResult> executionResults = 
healthCheckExecutor.execute(HealthCheckSelector.tags(filterTags), options);
         resultLog.debug("Executing {} HealthChecks selected by tags {}", 
executionResults.size(), Arrays.asList(filterTags));
         result = new CompositeResult(resultLog, executionResults);
 
@@ -156,7 +170,7 @@ public class CompositeHealthCheck implem
         }
 
         // check each sub composite check
-        ServiceReference[] hcRefsOfCompositeCheck = 
healthCheckFilter.getHealthCheckServiceReferences(HealthCheckSelector.tags(tagsForIncludedChecksArr));
+        ServiceReference[] hcRefsOfCompositeCheck = 
healthCheckFilter.getHealthCheckServiceReferences(HealthCheckSelector.tags(tagsForIncludedChecksArr),
 combineTagsWithOr);
         for (ServiceReference hcRefOfCompositeCheck : hcRefsOfCompositeCheck) {
             if 
(CompositeHealthCheck.class.getName().equals(hcRefOfCompositeCheck.getProperty(ComponentConstants.COMPONENT_NAME)))
 {
                 log.debug("Checking sub composite HC {}, {}", 
hcRefOfCompositeCheck, 
hcRefOfCompositeCheck.getProperty(ComponentConstants.COMPONENT_NAME));
@@ -182,6 +196,10 @@ public class CompositeHealthCheck implem
         this.filterTags = filterTags;
     }
 
+    void setCombineTagsWithOr(boolean combineTagsWithOr) {
+        this.combineTagsWithOr = combineTagsWithOr;
+    }
+
     void setHealthCheckExecutor(HealthCheckExecutor healthCheckExecutor) {
         this.healthCheckExecutor = healthCheckExecutor;
     }

Modified: 
sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java?rev=1805830&r1=1805829&r2=1805830&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java
 Tue Aug 22 20:48:47 2017
@@ -33,6 +33,7 @@ import java.util.Set;
 
 import org.apache.sling.hc.api.HealthCheck;
 import org.apache.sling.hc.api.Result;
+import org.apache.sling.hc.api.execution.HealthCheckExecutionOptions;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
 import org.apache.sling.hc.api.execution.HealthCheckSelector;
@@ -44,6 +45,7 @@ import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentMatcher;
 import org.mockito.Matchers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -84,11 +86,11 @@ public class CompositeHealthCheckTest {
         executionResults.add(createExecutionResult("Check 1", testTags, new 
Result(Result.Status.INFO, "Good")));
         executionResults.add(createExecutionResult("Check 2", testTags, new 
Result(Result.Status.CRITICAL, "Bad")));
 
-        
when(healthCheckExecutor.execute(any(HealthCheckSelector.class))).thenReturn(executionResults);
+        when(healthCheckExecutor.execute(any(HealthCheckSelector.class), 
any(HealthCheckExecutionOptions.class))).thenReturn(executionResults);
 
         Result result = compositeHealthCheck.execute();
 
-        verify(healthCheckExecutor, 
times(1)).execute(argThat(selectorWithTags(testTags)));
+        verify(healthCheckExecutor, 
times(1)).execute(argThat(selectorWithTags(testTags)), argThat(andOptions));
 
         assertEquals(Result.Status.CRITICAL, result.getStatus());
 
@@ -163,7 +165,7 @@ public class CompositeHealthCheckTest {
         compositeHealthCheck.setHealthCheckFilter(new HealthCheckFilter(null) {
 
             @Override
-            public ServiceReference[] 
getHealthCheckServiceReferences(HealthCheckSelector selector) {
+            public ServiceReference[] 
getHealthCheckServiceReferences(HealthCheckSelector selector, boolean 
combineTagsWithOr) {
                 String[] tags = selector.tags();
                 ServiceReference[] result = new ServiceReference[] {};
                 if (tags.length > 0) {
@@ -187,6 +189,42 @@ public class CompositeHealthCheckTest {
         assertEquals(Result.Status.HEALTH_CHECK_ERROR, result.getStatus());
     }
 
+    @Test
+    public void testCombineWithOr() {
+
+        // composite check referencing itself
+        final String[] filterTags = new String[] { "check1" };
+        compositeHealthCheck.setFilterTags(filterTags);
+        compositeHealthCheck.setCombineTagsWithOr(true);
+
+        compositeHealthCheck.execute();
+
+        verify(healthCheckExecutor, 
times(1)).execute(argThat(selectorWithTags(filterTags)), argThat(orOptions));
+    }
+
+    private Matcher<HealthCheckExecutionOptions> orOptions = new 
TypeSafeMatcher<HealthCheckExecutionOptions>() {
+        @Override
+        protected boolean matchesSafely(HealthCheckExecutionOptions options) {
+            return options.isCombineTagsWithOr();
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendText("options combining tags with or.");
+        }
+    };
+
+    private Matcher<HealthCheckExecutionOptions> andOptions = new 
TypeSafeMatcher<HealthCheckExecutionOptions>() {
+        @Override
+        protected boolean matchesSafely(HealthCheckExecutionOptions options) {
+            return !options.isCombineTagsWithOr();
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendText("options combining tags with and.");
+        }
+    };
 
     private static class DummyHcServiceReference implements ServiceReference {
 


Reply via email to