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 {