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 {