You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2017/05/11 20:05:21 UTC

svn commit: r1794887 - in /sling/trunk/bundles/extensions/healthcheck: api/src/main/java/org/apache/sling/hc/api/execution/ api/src/main/java/org/apache/sling/hc/util/ api/src/test/java/org/apache/sling/hc/util/ core/src/main/java/org/apache/sling/hc/c...

Author: justin
Date: Thu May 11 20:05:21 2017
New Revision: 1794887

URL: http://svn.apache.org/viewvc?rev=1794887&view=rev
Log:
SLING-6804 - allow selecting health checks by name

Added:
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckSelector.java
    sling/trunk/bundles/extensions/healthcheck/api/src/test/java/org/apache/sling/hc/util/HealthCheckFilterTest.java
Modified:
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckExecutor.java
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/package-info.java
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/FormattingResultLog.java
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckFilter.java
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckMetadata.java
    sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/package-info.java
    sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/CompositeHealthCheck.java
    sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/AsyncHealthCheckExecutor.java
    sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckExecutorImpl.java
    sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServlet.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/CompositeHealthCheckTest.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServletTest.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/AsyncHealthCheckIT.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/ExtendedHealthCheckExecutorIT.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/HealthCheckFilterIT.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/JmxAdjustableStatusForTestingIT.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/U.java
    sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/jmx/impl/HealthCheckMBeanTest.java
    sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/SampleHealthChecksTest.java
    sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/U.java

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckExecutor.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckExecutor.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckExecutor.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckExecutor.java Thu May 11 20:05:21 2017
@@ -32,11 +32,33 @@ import org.osgi.annotation.versioning.Pr
 public interface HealthCheckExecutor {
 
     /**
+     * Executes all health checks matching the supplied filter options.
+     * If no options are supplied, all health checks are executed.
+     *
+     * @param selector filter selector
+     * @return List of results. The list might be empty.
+     */
+    List<HealthCheckExecutionResult> execute(HealthCheckSelector selector);
+
+    /**
+     * Executes all health checks with the supplied filter options.
+     * If no options are supplied, all health checks are executed.
+     *
+     * @param selector filter selector
+     * @param options options for controlling execution behavior
+     *
+     * @return List of results. The list might be empty.
+     */
+    List<HealthCheckExecutionResult> execute(HealthCheckSelector selector, HealthCheckExecutionOptions options);
+
+    /**
      * Executes all health checks with the supplied list of tags.
      * If no tags are supplied, all health checks are executed.
      *
      * @return List of results. The list might be empty.
+     * @deprecated use execute(HealthCheckFilter.Options)
      */
+    @Deprecated
     List<HealthCheckExecutionResult> execute(String... tags);
 
     /**
@@ -47,7 +69,9 @@ public interface HealthCheckExecutor {
      * @param tags tags to be executed
      *
      * @return List of results. The list might be empty.
+     * @deprecated use execute(HealthCheckFilter.Options, HealthCheckExecutionOptions)
      */
+    @Deprecated
     List<HealthCheckExecutionResult> execute(HealthCheckExecutionOptions options, String... tags);
 
 }
\ No newline at end of file

Added: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckSelector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckSelector.java?rev=1794887&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckSelector.java (added)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/HealthCheckSelector.java Thu May 11 20:05:21 2017
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.hc.api.execution;
+
+import org.apache.sling.hc.api.HealthCheck;
+import org.apache.sling.hc.util.HealthCheckFilter;
+import org.osgi.annotation.versioning.ProviderType;
+
+import java.util.Arrays;
+
+/**
+ * Parameter class to pass a set of tags and names to the filter.
+ */
+@ProviderType
+public final class HealthCheckSelector {
+
+    private String[] tags;
+    private String[] names;
+
+    public String[] tags() {
+        return tags;
+    }
+
+    public String[] names() {
+        return names;
+    }
+
+    private HealthCheckSelector() {}
+
+    /**
+     * Copy the specified names into the current tags array.
+     * @param tags the new tags. Specify null to clear the current tag array
+     * @return this
+     */
+    public HealthCheckSelector withTags(String... tags) {
+        if (this.tags == null) {
+            this.tags = tags;
+        } else if (tags != null) {
+            String[] copy = Arrays.copyOf(this.tags, this.tags.length + tags.length);
+            System.arraycopy(tags, 0, copy, this.tags.length, tags.length);
+            this.tags = copy;
+        } else {
+            this.tags = null;
+        }
+        return this;
+    }
+
+
+    /**
+     * Copy the specified names into the current names array.
+     * @param names the new names. Specify null to clear the current name array
+     * @return this
+     */
+    public HealthCheckSelector withNames(String... names) {
+        if (this.names == null) {
+            this.names = names;
+        } else if (names != null) {
+            String[] copy = Arrays.copyOf(this.names, this.names.length + names.length);
+            System.arraycopy(names, 0, copy, this.names.length, names.length);
+            this.names = copy;
+        } else {
+            this.names = null;
+        }
+        return this;
+    }
+
+
+    public static HealthCheckSelector empty() {
+        return  new HealthCheckSelector();
+    }
+
+    public static HealthCheckSelector tags(String... tags) {
+        HealthCheckSelector selector = new HealthCheckSelector();
+        selector.tags = tags;
+        return selector;
+    }
+
+    public static HealthCheckSelector names(String... names) {
+        HealthCheckSelector selector = new HealthCheckSelector();
+        selector.names = names;
+        return selector;
+    }
+
+    @Override
+    public String toString() {
+        return "HealthCheckSelector{" +
+                "tags=" + tags == null ? "*" : Arrays.toString(tags) +
+                ", names=" + names == null ? "*" : Arrays.toString(names) +
+                '}';
+    }
+}

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/package-info.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/package-info.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/api/execution/package-info.java Thu May 11 20:05:21 2017
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.1.0")
+@Version("1.2.0")
 package org.apache.sling.hc.api.execution;
 
 import org.osgi.annotation.versioning.Version;

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/FormattingResultLog.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/FormattingResultLog.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/FormattingResultLog.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/FormattingResultLog.java Thu May 11 20:05:21 2017
@@ -22,9 +22,11 @@ import java.util.Locale;
 
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.ResultLog;
+import org.osgi.annotation.versioning.ProviderType;
 import org.slf4j.helpers.MessageFormatter;
 
 /** Utility that provides a logging-like facade on a ResultLog */
+@ProviderType
 public class FormattingResultLog extends ResultLog {
     
     private ResultLog.Entry createEntry(Result.Status status, String format, Object ... args) {

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckFilter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckFilter.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckFilter.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckFilter.java Thu May 11 20:05:21 2017
@@ -25,12 +25,17 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.sling.hc.api.HealthCheck;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
+import org.osgi.annotation.versioning.ProviderType;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.sling.hc.api.execution.HealthCheckSelector.tags;
+import static org.apache.sling.hc.api.execution.HealthCheckSelector.empty;
+
 /**
  * Select from available {@link HealthCheck} services.
  * Once this filter object and the returned health check services are no longer
@@ -40,6 +45,7 @@ import org.slf4j.LoggerFactory;
  * This class is not thread safe and instances shouldn't be used concurrently
  * from different threads.
  */
+@ProviderType
 public class HealthCheckFilter {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -57,13 +63,8 @@ public class HealthCheckFilter {
         bundleContext = bc;
     }
 
-    /**
-     * Get all health check services with one of the supplied tags.
-     * @return A list of services - might be the empty list if none matches
-     */
-    @SuppressWarnings("unchecked")
-    public List<HealthCheck> getTaggedHealthChecks(final String... tags) {
-        final ServiceReference [] refs = this.getTaggedHealthCheckServiceReferences(tags);
+    public List<HealthCheck> getHealthChecks(final HealthCheckSelector selector) {
+        final ServiceReference [] refs = this.getHealthCheckServiceReferences(selector);
         final List<HealthCheck> result = new ArrayList<HealthCheck>();
 
         if ( refs != null ) {
@@ -83,52 +84,14 @@ public class HealthCheckFilter {
         return result;
     }
 
-    /**
-     * Get all service references for health check services with one of the supplied tags. Uses logical "and" to combine tags.
-     * @return An array of service references - might be an empty error if none matches
-     */
-    public ServiceReference[] getTaggedHealthCheckServiceReferences(final String... tags) {
-        return getTaggedHealthCheckServiceReferences(false, tags);
+    public ServiceReference[] getHealthCheckServiceReferences(final HealthCheckSelector selector) {
+        return getHealthCheckServiceReferences(selector, false);
     }
 
-    /**
-     * Get all service references for health check services with one of the supplied tags.
-     * 
-     * @param combineWithOr If true will return all health checks that have at least one of the tags set. 
-     *        If false will return only health checks that have all given tags assigned.
-     * @param tags the tags to look for
-     * @return An array of service references - might be an empty error if none matches
-     */
-    public ServiceReference[] getTaggedHealthCheckServiceReferences(boolean combineWithOr, final String... tags) {
-        // Build service filter
-        final StringBuilder filterBuilder = new StringBuilder();
-        filterBuilder.append("(&(objectClass=").append(HealthCheck.class.getName()).append(")");
-        final int prefixLen = OMIT_PREFIX.length();
-        final StringBuilder filterBuilderForOrOperator = new StringBuilder(); // or filters
-        for(String tag : tags) {
-            tag = tag.trim();
-            if(tag.length() == 0) {
-                continue;
-            }
-            if(tag.startsWith(OMIT_PREFIX)) {
-                // ommit tags always have to be added as and-clause
-                filterBuilder.append("(!(").append(HealthCheck.TAGS).append("=").append(tag.substring(prefixLen)).append("))");
-            } else {
-                // add regular tags in the list either to outer and-clause or inner or-clause 
-                if (combineWithOr) {
-                    filterBuilderForOrOperator.append("(").append(HealthCheck.TAGS).append("=").append(tag).append(")");
-                } else {
-                    filterBuilder.append("(").append(HealthCheck.TAGS).append("=").append(tag).append(")");
-                }
-            }
-        }
-        // add "or" clause if we have accumulated any 
-        if (filterBuilderForOrOperator.length() > 0) {
-            filterBuilder.append("(|").append(filterBuilderForOrOperator).append(")");
-        }
-        filterBuilder.append(")");
+    public ServiceReference[] getHealthCheckServiceReferences(final HealthCheckSelector selector, boolean combineTagsWithOr) {
+        final CharSequence filterBuilder = selector != null ? getServiceFilter(selector, combineTagsWithOr) : getServiceFilter(empty(), combineTagsWithOr);
 
-        log.debug("OSGi service filter in getTaggedHealthCheckServiceReferences(): {}", filterBuilder);
+        log.debug("OSGi service filter in getHealthCheckServiceReferences(): {}", filterBuilder);
 
         try {
             final String filterString = filterBuilder.length() == 0 ? null : filterBuilder.toString();
@@ -149,6 +112,42 @@ public class HealthCheckFilter {
     }
 
     /**
+     * Get all health check services with one of the supplied tags.
+     * @return A list of services - might be the empty list if none matches
+     * @deprecated use getHealthChecks() instead
+     */
+    @Deprecated
+    public List<HealthCheck> getTaggedHealthChecks(final String... tags) {
+        final HealthCheckSelector selector = tags(tags);
+        return getHealthChecks(selector);
+    }
+
+    /**
+     * Get all service references for health check services with one of the supplied tags. Uses logical "and" to combine tags.
+     * @return An array of service references - might be an empty error if none matches
+     * @deprecated use getHealthCheckServiceReferences() instead
+     */
+    @Deprecated
+    public ServiceReference[] getTaggedHealthCheckServiceReferences(final String... tags) {
+        return getHealthCheckServiceReferences(tags(tags), false);
+    }
+
+    /**
+     * Get all service references for health check services with one of the supplied tags.
+     * 
+     * @param combineWithOr If true will return all health checks that have at least one of the tags set. 
+     *        If false will return only health checks that have all given tags assigned.
+     * @param tags the tags to look for
+     * @return An array of service references - might be an empty error if none matches
+     * @deprecated use getHealthCheckServiceReferences() instead
+     */
+    @Deprecated
+    public ServiceReference[] getTaggedHealthCheckServiceReferences(boolean combineWithOr, final String... tags) {
+        final HealthCheckSelector selector = tags(tags);
+        return getHealthCheckServiceReferences(selector, combineWithOr);
+    }
+
+    /**
      * Dispose all used service references
      */
     public void dispose() {
@@ -157,4 +156,66 @@ public class HealthCheckFilter {
         }
         this.usedReferences.clear();
     }
+
+    CharSequence getServiceFilter(HealthCheckSelector selector, boolean combineTagsWithOr) {
+        // Build service filter
+        final StringBuilder filterBuilder = new StringBuilder();
+        filterBuilder.append("(&(objectClass=").append(HealthCheck.class.getName()).append(")");
+        final int prefixLen = HealthCheckFilter.OMIT_PREFIX.length();
+        final StringBuilder filterBuilderForOrOperator = new StringBuilder(); // or filters
+        final StringBuilder tagsBuilder = new StringBuilder();
+        int tagsAndClauses = 0;
+        if (selector.tags() != null) {
+            for (String tag : selector.tags()) {
+                tag = tag.trim();
+                if (tag.length() == 0) {
+                    continue;
+                }
+                if (tag.startsWith(HealthCheckFilter.OMIT_PREFIX)) {
+                    // ommit tags always have to be added as and-clause
+                    filterBuilder.append("(!(").append(HealthCheck.TAGS).append("=").append(tag.substring(prefixLen)).append("))");
+                } else {
+                    // add regular tags in the list either to outer and-clause or inner or-clause
+                    if (combineTagsWithOr) {
+                        filterBuilderForOrOperator.append("(").append(HealthCheck.TAGS).append("=").append(tag).append(")");
+                    } else {
+                        tagsBuilder.append("(").append(HealthCheck.TAGS).append("=").append(tag).append(")");
+                        tagsAndClauses++;
+                    }
+                }
+            }
+        }
+        boolean addedNameToOrBuilder = false;
+        if (selector.names() != null) {
+            for (String name : selector.names()) {
+                name = name.trim();
+                if (name.length() == 0) {
+                    continue;
+                }
+                if (name.startsWith(HealthCheckFilter.OMIT_PREFIX)) {
+                    // ommit tags always have to be added as and-clause
+                    filterBuilder.append("(!(").append(HealthCheck.NAME).append("=").append(name.substring(prefixLen)).append("))");
+                } else {
+                    // names are always ORd
+                    filterBuilderForOrOperator.append("(").append(HealthCheck.NAME).append("=").append(name).append(")");
+                    addedNameToOrBuilder = true;
+                }
+            }
+        }
+        if (addedNameToOrBuilder) {
+            if (tagsAndClauses > 1) {
+                filterBuilderForOrOperator.append("(&").append(tagsBuilder).append(")");
+            } else {
+                filterBuilderForOrOperator.append(tagsBuilder);
+            }
+        } else {
+            filterBuilder.append(tagsBuilder);
+        }
+        // add "or" clause if we have accumulated any
+        if (filterBuilderForOrOperator.length() > 0) {
+            filterBuilder.append("(|").append(filterBuilderForOrOperator).append(")");
+        }
+        filterBuilder.append(")");
+        return filterBuilder;
+    }
 }

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckMetadata.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckMetadata.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckMetadata.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/HealthCheckMetadata.java Thu May 11 20:05:21 2017
@@ -22,6 +22,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.sling.hc.api.HealthCheck;
+import org.osgi.annotation.versioning.ProviderType;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
@@ -29,6 +30,7 @@ import org.osgi.framework.ServiceReferen
  * This class helps retrieving meta data information about a health check service.
  * @since 1.1
  */
+@ProviderType
 public class HealthCheckMetadata {
 
     private final String name;

Modified: sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/package-info.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/package-info.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/main/java/org/apache/sling/hc/util/package-info.java Thu May 11 20:05:21 2017
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.3.0")
+@Version("1.4.0")
 package org.apache.sling.hc.util;
 
 import org.osgi.annotation.versioning.Version;

Added: sling/trunk/bundles/extensions/healthcheck/api/src/test/java/org/apache/sling/hc/util/HealthCheckFilterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/api/src/test/java/org/apache/sling/hc/util/HealthCheckFilterTest.java?rev=1794887&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/api/src/test/java/org/apache/sling/hc/util/HealthCheckFilterTest.java (added)
+++ sling/trunk/bundles/extensions/healthcheck/api/src/test/java/org/apache/sling/hc/util/HealthCheckFilterTest.java Thu May 11 20:05:21 2017
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.hc.util;
+
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import static org.apache.sling.hc.api.execution.HealthCheckSelector.*;
+
+public class HealthCheckFilterTest {
+    
+    private HealthCheckFilter filter = new HealthCheckFilter(null);
+
+    private static void assertStrEquals(String expected, CharSequence actual) {
+        assertEquals(expected, actual.toString());
+    }
+
+    @Test
+    public void testEmptyOptions() {
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck))", filter.getServiceFilter(empty(), false));
+    }
+
+    @Test
+    public void testWithOneTag() {
+        HealthCheckSelector selector = tags("foo");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(hc.tags=foo))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTwoTags() {
+        HealthCheckSelector selector = tags("foo", "bar");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(hc.tags=foo)(hc.tags=bar))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTwoTagsOr() {
+        HealthCheckSelector selector = tags("foo", "bar");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.tags=foo)(hc.tags=bar)))", filter.getServiceFilter(selector, true));
+    }
+
+    @Test
+    public void testWithTwoTagsExcludeOne() {
+        HealthCheckSelector selector = tags("foo", "bar").withTags("-baz");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(!(hc.tags=baz))(hc.tags=foo)(hc.tags=bar))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithOneName() {
+        HealthCheckSelector selector = names("foo");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.name=foo)))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTwoNames() {
+        HealthCheckSelector selector = names("foo").withNames("bar");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.name=foo)(hc.name=bar)))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTwoNamesExcludingOne() {
+        HealthCheckSelector selector = names("foo", "bar", "-baz");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(!(hc.name=baz))(|(hc.name=foo)(hc.name=bar)))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTagAndName() {
+        HealthCheckSelector selector = empty().withTags("t1").withNames("foo");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.name=foo)(hc.tags=t1)))", filter.getServiceFilter(selector, false));
+    }
+
+    @Test
+    public void testWithTwoOrTagsAndTwoNames() {
+        HealthCheckSelector selector = empty().withNames("foo", "bar").withTags("t1", "t2");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.tags=t1)(hc.tags=t2)(hc.name=foo)(hc.name=bar)))", filter.getServiceFilter(selector, true));
+    }
+
+    @Test
+    public void testWithTwoAndTagsAndTwoNames() {
+        HealthCheckSelector selector = empty().withNames("foo", "bar").withTags("t1", "t2");
+        assertStrEquals("(&(objectClass=org.apache.sling.hc.api.HealthCheck)(|(hc.name=foo)(hc.name=bar)(&(hc.tags=t1)(hc.tags=t2))))", filter.getServiceFilter(selector, false));
+    }
+
+}

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=1794887&r1=1794886&r2=1794887&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 Thu May 11 20:05:21 2017
@@ -37,6 +37,7 @@ import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.Result.Status;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.util.FormattingResultLog;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.apache.sling.hc.util.HealthCheckMetadata;
@@ -118,7 +119,7 @@ public class CompositeHealthCheck implem
         }
 
         FormattingResultLog resultLog = new FormattingResultLog();
-        List<HealthCheckExecutionResult> executionResults = healthCheckExecutor.execute(filterTags);
+        List<HealthCheckExecutionResult> executionResults = healthCheckExecutor.execute(HealthCheckSelector.tags(filterTags));
         resultLog.debug("Executing {} HealthChecks selected by tags {}", executionResults.size(), Arrays.asList(filterTags));
         result = new CompositeResult(resultLog, executionResults);
 
@@ -155,7 +156,7 @@ public class CompositeHealthCheck implem
         }
 
         // check each sub composite check
-        ServiceReference[] hcRefsOfCompositeCheck = healthCheckFilter.getTaggedHealthCheckServiceReferences(tagsForIncludedChecksArr);
+        ServiceReference[] hcRefsOfCompositeCheck = healthCheckFilter.getHealthCheckServiceReferences(HealthCheckSelector.tags(tagsForIncludedChecksArr));
         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));

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/AsyncHealthCheckExecutor.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/AsyncHealthCheckExecutor.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/AsyncHealthCheckExecutor.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/AsyncHealthCheckExecutor.java Thu May 11 20:05:21 2017
@@ -37,6 +37,7 @@ import org.apache.sling.commons.schedule
 import org.apache.sling.hc.api.HealthCheck;
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.core.impl.executor.HealthCheckFuture.Callback;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.apache.sling.hc.util.HealthCheckMetadata;
@@ -77,7 +78,7 @@ public class AsyncHealthCheckExecutor im
 
         int count = 0;
         HealthCheckFilter healthCheckFilter = new HealthCheckFilter(bundleContext);
-        final ServiceReference[] healthCheckReferences = healthCheckFilter.getTaggedHealthCheckServiceReferences(new String[0]);
+        final ServiceReference[] healthCheckReferences = healthCheckFilter.getHealthCheckServiceReferences(HealthCheckSelector.empty());
         for (ServiceReference serviceReference : healthCheckReferences) {
             HealthCheckMetadata healthCheckMetadata = new HealthCheckMetadata(serviceReference);
             if (isAsync(healthCheckMetadata)) {

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckExecutorImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckExecutorImpl.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckExecutorImpl.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/executor/HealthCheckExecutorImpl.java Thu May 11 20:05:21 2017
@@ -52,6 +52,7 @@ import org.apache.sling.hc.api.ResultLog
 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;
 import org.apache.sling.hc.util.FormattingResultLog;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.apache.sling.hc.util.HealthCheckMetadata;
@@ -171,9 +172,29 @@ public class HealthCheckExecutorImpl imp
         }
     }
 
+    @Override
+    public List<HealthCheckExecutionResult> execute(HealthCheckSelector selector) {
+        return execute(selector, new HealthCheckExecutionOptions());
+    }
+
+    @Override
+    public List<HealthCheckExecutionResult> execute(HealthCheckSelector selector, HealthCheckExecutionOptions options) {
+        logger.debug("Starting executing checks for filter selector {} and execution options {}", selector, options);
+
+        final HealthCheckFilter filter = new HealthCheckFilter(this.bundleContext);
+        try {
+            final ServiceReference[] healthCheckReferences = filter.getHealthCheckServiceReferences(selector, options.isCombineTagsWithOr());
+
+            return this.execute(healthCheckReferences, options);
+        } finally {
+            filter.dispose();
+        }
+    }
+
     /**
      * @see org.apache.sling.hc.api.execution.HealthCheckExecutor#execute(String[])
      */
+    @SuppressWarnings("deprecation")
     @Override
     public List<HealthCheckExecutionResult> execute(final String... tags) {
         return execute(/*default options*/new HealthCheckExecutionOptions(), tags);
@@ -182,18 +203,10 @@ public class HealthCheckExecutorImpl imp
     /**
      * @see org.apache.sling.hc.api.execution.HealthCheckExecutor#execute(HealthCheckExecutionOptions, String...)
      */
+    @SuppressWarnings("deprecation")
     @Override
     public List<HealthCheckExecutionResult> execute(HealthCheckExecutionOptions options, final String... tags) {
-        logger.debug("Starting executing checks for tags {} and execution options {}", tags == null ? "*" : tags, options);
-
-        final HealthCheckFilter filter = new HealthCheckFilter(this.bundleContext);
-        try {
-            final ServiceReference[] healthCheckReferences = filter.getTaggedHealthCheckServiceReferences(options.isCombineTagsWithOr(), tags);
-
-            return this.execute(healthCheckReferences, options);
-        } finally {
-            filter.dispose();
-        }
+        return execute(HealthCheckSelector.tags(tags), options);
     }
 
     /**

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServlet.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServlet.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServlet.java Thu May 11 20:05:21 2017
@@ -19,6 +19,8 @@ package org.apache.sling.hc.core.impl.se
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -44,6 +46,7 @@ import org.apache.sling.hc.api.Result.St
 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;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.http.HttpService;
 import org.slf4j.Logger;
@@ -73,6 +76,7 @@ public class HealthCheckExecutorServlet
     private static final long serialVersionUID = 8013511523994541848L;
 
     private static final Logger LOG = LoggerFactory.getLogger(HealthCheckExecutorServlet.class);
+    public static final String PARAM_SPLIT_REGEX = "[,;]+";
 
     static class Param {
         final String name;
@@ -84,7 +88,7 @@ public class HealthCheckExecutorServlet
     }
 
     static final Param PARAM_TAGS = new Param("tags",
-            "Comma-separated list of health checks tags to select - can also be specified via path, e.g. /system/health/tag1,tag2.json");
+            "Comma-separated list of health checks tags to select - can also be specified via path, e.g. /system/health/tag1,tag2.json. Exclusions can be done by prepending '-' to the tag name");
     static final Param PARAM_FORMAT = new Param("format", "Output format, html|json|jsonp|txt - an extension in the URL overrides this");
     static final Param PARAM_HTTP_STATUS = new Param("httpStatus", "Specify HTTP result code, for example"
             + " CRITICAL:503 (status 503 if result >= CRITICAL)"
@@ -98,10 +102,12 @@ public class HealthCheckExecutorServlet
 
     static final Param PARAM_INCLUDE_DEBUG = new Param("hcDebug", "Include the DEBUG output of the Health Checks");
 
+    static final Param PARAM_NAMES = new Param("names", "Comma-separated list of health check names to select. Exclusions can be done by prepending '-' to the health check name");
+
     static final String JSONP_CALLBACK_DEFAULT = "processHealthCheckResults";
     static final Param PARAM_JSONP_CALLBACK = new Param("callback", "name of the JSONP callback function to use, defaults to " + JSONP_CALLBACK_DEFAULT);
 
-    static final Param [] PARAM_LIST = { PARAM_TAGS, PARAM_FORMAT, PARAM_HTTP_STATUS, PARAM_COMBINE_TAGS_WITH_OR,
+    static final Param [] PARAM_LIST = { PARAM_TAGS, PARAM_NAMES, PARAM_FORMAT, PARAM_HTTP_STATUS, PARAM_COMBINE_TAGS_WITH_OR,
         PARAM_FORCE_INSTANT_EXECUTION, PARAM_OVERRIDE_GLOBAL_TIMEOUT, PARAM_INCLUDE_DEBUG, PARAM_JSONP_CALLBACK};
 
     static final String FORMAT_HTML = "html";
@@ -200,27 +206,49 @@ public class HealthCheckExecutorServlet
     }
 
     protected void doGet(final HttpServletRequest request, final HttpServletResponse response, final String format) throws ServletException, IOException {
+        HealthCheckSelector selector = HealthCheckSelector.empty();
         String pathInfo = request.getPathInfo();
-        String tagsStr = StringUtils.removeStart(splitFormat(pathInfo)[0], "/");
-        if (StringUtils.isBlank(tagsStr)) {
+        String pathTokensStr = StringUtils.removeStart(splitFormat(pathInfo)[0], "/");
+
+        List<String> tags = new ArrayList<String>();
+        List<String> names = new ArrayList<String>();
+
+        if (StringUtils.isNotBlank(pathTokensStr)) {
+            String[] pathTokens = pathTokensStr.split(PARAM_SPLIT_REGEX);
+            for (String pathToken : pathTokens) {
+                if (pathToken.indexOf(' ') >= 0) {
+                    // token contains space. assume it is a name
+                    names.add(pathToken);
+                } else {
+                    tags.add(pathToken);
+                }
+            }
+        }
+        if (tags.size() == 0) {
+            // if not provided via path use parameter or default
+            tags = Arrays.asList(StringUtils.defaultIfEmpty(request.getParameter(PARAM_TAGS.name), "").split(PARAM_SPLIT_REGEX));
+        }
+        selector.withTags(tags.toArray(new String[0]));
+
+        if (names.size() == 0) {
             // if not provided via path use parameter or default
-            tagsStr = StringUtils.defaultIfEmpty(request.getParameter(PARAM_TAGS.name), "");
+            names = Arrays.asList(StringUtils.defaultIfEmpty(request.getParameter(PARAM_NAMES.name), "").split(PARAM_SPLIT_REGEX));
         }
-        final String[] tags = tagsStr.split("[,;]+");
+        selector.withNames(names.toArray(new String[0]));
 
         final Boolean includeDebug = Boolean.valueOf(request.getParameter(PARAM_INCLUDE_DEBUG.name));
         final Map<Result.Status, Integer> statusMapping = request.getParameter(PARAM_HTTP_STATUS.name) != null ? getStatusMapping(request
                 .getParameter(PARAM_HTTP_STATUS.name)) : null;
 
-        HealthCheckExecutionOptions options = new HealthCheckExecutionOptions();
-        options.setCombineTagsWithOr(Boolean.valueOf(StringUtils.defaultString(request.getParameter(PARAM_COMBINE_TAGS_WITH_OR.name), "true")));
-        options.setForceInstantExecution(Boolean.valueOf(request.getParameter(PARAM_FORCE_INSTANT_EXECUTION.name)));
+        HealthCheckExecutionOptions executionOptions = new HealthCheckExecutionOptions();
+        executionOptions.setCombineTagsWithOr(Boolean.valueOf(StringUtils.defaultString(request.getParameter(PARAM_COMBINE_TAGS_WITH_OR.name), "true")));
+        executionOptions.setForceInstantExecution(Boolean.valueOf(request.getParameter(PARAM_FORCE_INSTANT_EXECUTION.name)));
         String overrideGlobalTimeoutVal = request.getParameter(PARAM_OVERRIDE_GLOBAL_TIMEOUT.name);
         if (StringUtils.isNumeric(overrideGlobalTimeoutVal)) {
-            options.setOverrideGlobalTimeout(Integer.valueOf(overrideGlobalTimeoutVal));
+            executionOptions.setOverrideGlobalTimeout(Integer.valueOf(overrideGlobalTimeoutVal));
         }
 
-        List<HealthCheckExecutionResult> executionResults = this.healthCheckExecutor.execute(options, tags);
+        List<HealthCheckExecutionResult> executionResults = this.healthCheckExecutor.execute(selector, executionOptions);
 
         Result.Status mostSevereStatus = Result.Status.DEBUG;
         for (HealthCheckExecutionResult executionResult : executionResults) {

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=1794887&r1=1794886&r2=1794887&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 Thu May 11 20:05:21 2017
@@ -18,12 +18,15 @@
 package org.apache.sling.hc.core.impl;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.argThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -32,9 +35,13 @@ import org.apache.sling.hc.api.HealthChe
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.core.impl.executor.ExecutionResult;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.apache.sling.hc.util.HealthCheckMetadata;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Matchers;
@@ -77,16 +84,30 @@ 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(testTags)).thenReturn(executionResults);
+        when(healthCheckExecutor.execute(any(HealthCheckSelector.class))).thenReturn(executionResults);
 
         Result result = compositeHealthCheck.execute();
 
-        verify(healthCheckExecutor, times(1)).execute(testTags);
+        verify(healthCheckExecutor, times(1)).execute(argThat(selectorWithTags(testTags)));
 
         assertEquals(Result.Status.CRITICAL, result.getStatus());
 
     }
 
+    private Matcher<HealthCheckSelector> selectorWithTags(final String[] tags) {
+        return new TypeSafeMatcher<HealthCheckSelector>() {
+            @Override
+            protected boolean matchesSafely(HealthCheckSelector healthCheckSelector) {
+                return Arrays.equals(healthCheckSelector.tags(), tags) && healthCheckSelector.names() == null;
+            }
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("a select with tags (" + Arrays.toString(tags) +") and no names.");
+            }
+        };
+    }
+
     private HealthCheckExecutionResult createExecutionResult(String name, String[] testTags, Result result) {
         HealthCheckExecutionResult healthCheckExecutionResult = new ExecutionResult(new HealthCheckMetadata(new DummyHcServiceReference(name, testTags,
                 new String[0])), result, 0L);
@@ -104,10 +125,11 @@ public class CompositeHealthCheckTest {
         doReturn(hcRef).when(componentContext).getServiceReference();
         compositeHealthCheck.setFilterTags(filterTags);
 
-        compositeHealthCheck.setHealthCheckFilter(new HealthCheckFilter(null) { // not using @Spy because varargs matcher does not work with spies
+        compositeHealthCheck.setHealthCheckFilter(new HealthCheckFilter(null) {
 
             @Override
-            public ServiceReference[] getTaggedHealthCheckServiceReferences(String... tags) {
+            public ServiceReference[] getHealthCheckServiceReferences(HealthCheckSelector selector) {
+                String[] tags = selector.tags();
                 ServiceReference[] result = new ServiceReference[] {};
                 if (tags.length > 0) {
                     if (tags[0].equals(filterTags[0])) {
@@ -121,7 +143,7 @@ public class CompositeHealthCheckTest {
 
         Result result = compositeHealthCheck.execute();
 
-        verify(healthCheckExecutor, never()).execute(Matchers.any(String[].class));
+        verify(healthCheckExecutor, never()).execute(any(HealthCheckSelector.class));
         assertEquals(Result.Status.HEALTH_CHECK_ERROR, result.getStatus());
     }
 
@@ -141,7 +163,8 @@ public class CompositeHealthCheckTest {
         compositeHealthCheck.setHealthCheckFilter(new HealthCheckFilter(null) {
 
             @Override
-            public ServiceReference[] getTaggedHealthCheckServiceReferences(String... tags) { // not using @Spy because varargs matcher does not work with spies
+            public ServiceReference[] getHealthCheckServiceReferences(HealthCheckSelector selector) {
+                String[] tags = selector.tags();
                 ServiceReference[] result = new ServiceReference[] {};
                 if (tags.length > 0) {
                     if (tags[0].equals(filterTags[0])) {
@@ -160,7 +183,7 @@ public class CompositeHealthCheckTest {
 
         Result result = compositeHealthCheck.execute();
 
-        verify(healthCheckExecutor, never()).execute(Matchers.any(String[].class));
+        verify(healthCheckExecutor, never()).execute(any(HealthCheckSelector.class));
         assertEquals(Result.Status.HEALTH_CHECK_ERROR, result.getStatus());
     }
 

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServletTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServletTest.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServletTest.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/impl/servlet/HealthCheckExecutorServletTest.java Thu May 11 20:05:21 2017
@@ -24,6 +24,7 @@ import static org.mockito.Matchers.conta
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.MockitoAnnotations.initMocks;
@@ -31,6 +32,7 @@ import static org.mockito.MockitoAnnotat
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -43,6 +45,7 @@ import org.apache.sling.hc.api.Result.St
 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;
 import org.apache.sling.hc.core.impl.executor.ExecutionResult;
 import org.apache.sling.hc.util.HealthCheckMetadata;
 import org.hamcrest.Description;
@@ -51,8 +54,6 @@ import org.junit.Test;
 import org.mockito.ArgumentMatcher;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
@@ -99,11 +100,11 @@ public class HealthCheckExecutorServletT
     @Test
     public void testDoGetHtml() throws ServletException, IOException {
 
-        String testTag = "testTag";
+        final String testTag = "testTag";
         doReturn(testTag).when(request).getParameter(HealthCheckExecutorServlet.PARAM_TAGS.name);
         doReturn("false").when(request).getParameter(HealthCheckExecutorServlet.PARAM_COMBINE_TAGS_WITH_OR.name);
-        List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.CRITICAL);
-        doReturn(executionResults).when(healthCheckExecutor).execute(new HealthCheckExecutionOptions(), testTag);
+        final List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.CRITICAL);
+        doReturn(executionResults).when(healthCheckExecutor).execute(selector(new String[] { testTag }, new String[0]), eq(new HealthCheckExecutionOptions()));
         
         healthCheckExecutorServlet.doGet(request, response);
 
@@ -115,18 +116,40 @@ public class HealthCheckExecutorServletT
     }
 
     @Test
+    public void testDoGetNameAndTagInPath() throws ServletException, IOException {
+
+        final String testTag = "testTag";
+        final String testName = "test name";
+
+        doReturn(testTag + "," + testName).when(request).getPathInfo();
+        doReturn("false").when(request).getParameter(HealthCheckExecutorServlet.PARAM_COMBINE_TAGS_WITH_OR.name);
+        final List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.CRITICAL);
+        doReturn(executionResults).when(healthCheckExecutor).execute(selector(new String[] { testTag }, new String[] { testName }), eq(new HealthCheckExecutionOptions()));
+
+        healthCheckExecutorServlet.doGet(request, response);
+
+        verify(request, never()).getParameter(HealthCheckExecutorServlet.PARAM_TAGS.name);
+        verify(request, never()).getParameter(HealthCheckExecutorServlet.PARAM_NAMES.name);
+        verifyZeroInteractions(jsonSerializer);
+        verifyZeroInteractions(txtSerializer);
+        verifyZeroInteractions(verboseTxtSerializer);
+        verify(htmlSerializer)
+                .serialize(resultEquals(new Result(Result.Status.CRITICAL, "Overall Status CRITICAL")), eq(executionResults), contains("Supported URL parameters"), eq(false));
+    }
+
+    @Test
     public void testDoGetJson() throws ServletException, IOException {
 
-        String testTag = "testTag";
+        final String testTag = "testTag";
         doReturn("true").when(request).getParameter(HealthCheckExecutorServlet.PARAM_COMBINE_TAGS_WITH_OR.name);
         int timeout = 5000;
         doReturn(timeout + "").when(request).getParameter(HealthCheckExecutorServlet.PARAM_OVERRIDE_GLOBAL_TIMEOUT.name);
         doReturn("/" + testTag + ".json").when(request).getPathInfo();
-        List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.WARN);
+        final List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.WARN);
         HealthCheckExecutionOptions options = new HealthCheckExecutionOptions();
         options.setCombineTagsWithOr(true);
         options.setOverrideGlobalTimeout(timeout);
-        doReturn(executionResults).when(healthCheckExecutor).execute(options, testTag);
+        doReturn(executionResults).when(healthCheckExecutor).execute(selector(new String[] { testTag }, new String[0]), eq(options));
 
         healthCheckExecutorServlet.doGet(request, response);
 
@@ -141,17 +164,18 @@ public class HealthCheckExecutorServletT
     @Test
     public void testDoGetTxt() throws ServletException, IOException {
 
-        String testTag = "testTag";
+        final String testTag = "testTag";
         doReturn(testTag).when(request).getParameter(HealthCheckExecutorServlet.PARAM_TAGS.name);
         doReturn(HealthCheckExecutorServlet.FORMAT_TXT).when(request).getParameter(HealthCheckExecutorServlet.PARAM_FORMAT.name);
         doReturn("true").when(request).getParameter(HealthCheckExecutorServlet.PARAM_COMBINE_TAGS_WITH_OR.name);
         int timeout = 5000;
         doReturn(timeout + "").when(request).getParameter(HealthCheckExecutorServlet.PARAM_OVERRIDE_GLOBAL_TIMEOUT.name);
-        List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.WARN);
+        final List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.WARN);
         HealthCheckExecutionOptions options = new HealthCheckExecutionOptions();
         options.setCombineTagsWithOr(true);
         options.setOverrideGlobalTimeout(timeout);
-        doReturn(executionResults).when(healthCheckExecutor).execute(options, testTag);
+
+        doReturn(executionResults).when(healthCheckExecutor).execute(selector(new String[] { testTag }, new String[0]), eq(options));
 
         healthCheckExecutorServlet.doGet(request, response);
 
@@ -170,7 +194,7 @@ public class HealthCheckExecutorServletT
         doReturn(HealthCheckExecutorServlet.FORMAT_VERBOSE_TXT).when(request).getParameter(HealthCheckExecutorServlet.PARAM_FORMAT.name);
 
         List<HealthCheckExecutionResult> executionResults = getExecutionResults(Result.Status.WARN);
-        doReturn(executionResults).when(healthCheckExecutor).execute(any(HealthCheckExecutionOptions.class), eq(testTag));
+        doReturn(executionResults).when(healthCheckExecutor).execute(selector(new String[] { testTag }, new String[0]), any(HealthCheckExecutionOptions.class));
 
         healthCheckExecutorServlet.doGet(request, response);
 
@@ -256,5 +280,20 @@ public class HealthCheckExecutorServletT
         }
     }
 
+    HealthCheckSelector selector(final String[] tags, final String[] names) {
+        return argThat(new ArgumentMatcher<HealthCheckSelector>() {
+            @Override
+            public boolean matches(Object actual) {
+                if (actual instanceof HealthCheckSelector) {
+                    HealthCheckSelector actualSelector = (HealthCheckSelector) actual;
+                    return Arrays.equals(actualSelector.tags(), tags.length == 0 ? new String[] { "" } : tags) &&
+                            Arrays.equals(actualSelector.names(), names.length == 0 ? new String[] { "" } : names);
+                } else {
+                    return false;
+                }
+            }
+        });
+    }
+
 
 }

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/AsyncHealthCheckIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/AsyncHealthCheckIT.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/AsyncHealthCheckIT.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/AsyncHealthCheckIT.java Thu May 11 20:05:21 2017
@@ -29,6 +29,7 @@ import javax.inject.Inject;
 import org.apache.sling.hc.api.HealthCheck;
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -91,14 +92,14 @@ public class AsyncHealthCheckIT {
             }
             
             // Verify that we get the right log
-            final String msg = executor.execute(id).get(0).getHealthCheckResult().iterator().next().getMessage();
+            final String msg = executor.execute(HealthCheckSelector.tags(id)).get(0).getHealthCheckResult().iterator().next().getMessage();
             assertTrue("Expecting the right message: " + msg, msg.contains("counter is now"));
             
             // And verify that calling executor lots of times doesn't increment as much
             final int previous = counter.get();
             final int n = 100;
             for(int i=0; i < n; i++) {
-                executor.execute(id);
+                executor.execute(HealthCheckSelector.tags(id));
             }
             assertTrue("Expecting counter to increment asynchronously", counter.get() < previous + n);
         } finally {

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/ExtendedHealthCheckExecutorIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/ExtendedHealthCheckExecutorIT.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/ExtendedHealthCheckExecutorIT.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/ExtendedHealthCheckExecutorIT.java Thu May 11 20:05:21 2017
@@ -33,6 +33,7 @@ import org.apache.sling.hc.api.HealthChe
 import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.junit.After;
 import org.junit.Before;
@@ -99,7 +100,7 @@ public class ExtendedHealthCheckExecutor
     @Test
     public void testSingleExecution() throws Exception {
         final HealthCheckFilter filter = new HealthCheckFilter(bundleContext);
-        final ServiceReference [] refs = filter.getTaggedHealthCheckServiceReferences(testTag);
+        final ServiceReference [] refs = filter.getHealthCheckServiceReferences(HealthCheckSelector.tags(testTag));
         assertNotNull(refs);
         assertEquals(1, refs.length);
         

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/HealthCheckFilterIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/HealthCheckFilterIT.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/HealthCheckFilterIT.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/HealthCheckFilterIT.java Thu May 11 20:05:21 2017
@@ -32,6 +32,7 @@ import javax.inject.Inject;
 
 import org.apache.sling.hc.api.HealthCheck;
 import org.apache.sling.hc.api.Result;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.util.HealthCheckFilter;
 import org.junit.After;
 import org.junit.Before;
@@ -58,29 +59,50 @@ public class HealthCheckFilterIT {
     private List<TestHealthCheck> testServices = new ArrayList<TestHealthCheck>();
     private static int instanceCounter = 0;
 
-    class TestHealthCheck implements HealthCheck {
+    class TestHealthCheckBuilder {
 
-        private final int id;
-        private final ServiceRegistration reg;
-        final String[] tags;
+        String[] tags;
+        String name;
 
-        TestHealthCheck(String... tags) {
-            id = instanceCounter++;
+        TestHealthCheckBuilder withTags(String... tags) {
             this.tags = tags;
+            return this;
+        }
+
+        TestHealthCheckBuilder withName(String name) {
+            this.name = name;
+            return this;
+        }
+
+        TestHealthCheck build() {
             final Dictionary<String, Object> props = new Hashtable<String, Object>();
             if (tags != null) {
                 props.put(HealthCheck.TAGS, tags);
             }
-            props.put(HealthCheck.TAGS, tags);
+            if (name != null) {
+                props.put(HealthCheck.NAME, name);
+            }
+
+            return new TestHealthCheck(props);
+
+        }
+    }
+
+    class TestHealthCheck implements HealthCheck {
+
+        private final int id;
+        private final ServiceRegistration reg;
+
+        TestHealthCheck(Dictionary<String, Object> props) {
+            id = instanceCounter++;
             reg = bundleContext.registerService(HealthCheck.class.getName(),
                     this, props);
-            log.info("Registered {} with {}={}", new Object[] { this,
-                    HealthCheck.TAGS, props.get(HealthCheck.TAGS) });
+            log.info("Registered {} with name {} and tags {}", new Object[] { this, props.get(HealthCheck.NAME), Arrays.toString((String[]) props.get(HealthCheck.TAGS)) });
         }
 
         @Override
         public String toString() {
-            return Arrays.asList(tags).toString();
+            return "TestHealthCheck#" + id;
         }
 
         @Override
@@ -104,6 +126,10 @@ public class HealthCheckFilterIT {
         }
     }
 
+    private TestHealthCheckBuilder builder() {
+        return new TestHealthCheckBuilder();
+    }
+
     @Configuration
     public Option[] config() {
         return U.config();
@@ -111,11 +137,11 @@ public class HealthCheckFilterIT {
 
     @Before
     public void setup() {
-        testServices.add(new TestHealthCheck("foo"));
-        testServices.add(new TestHealthCheck("bar"));
-        testServices.add(new TestHealthCheck("foo", "bar"));
-        testServices.add(new TestHealthCheck("other", "thing"));
-        testServices.add(new TestHealthCheck());
+        testServices.add(builder().withTags("foo").withName("test1").build());
+        testServices.add(builder().withTags("bar").withName("test2").build());
+        testServices.add(builder().withTags("foo", "bar").withName("test3").build());
+        testServices.add(builder().withTags("other", "thing").withName("test4").build());
+        testServices.add(builder().withName("test5").build());
         filter = new HealthCheckFilter(bundleContext);
     }
 
@@ -152,70 +178,94 @@ public class HealthCheckFilterIT {
 
     @Test
     public void testAllServices() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks();
+        final List<HealthCheck> s = filter.getHealthChecks(null);
         assertServices(s, true, true, true, true, true);
     }
 
     @Test
     public void testEmptyTags() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("", "", "");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("", "", ""));
         assertServices(s, true, true, true, true, true);
     }
 
     @Test
     public void testFooTag() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("foo");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("foo"));
         assertServices(s, true, false, true, false, false);
     }
 
     @Test
     public void testBarTag() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("bar");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("bar"));
         assertServices(s, false, true, true, false, false);
     }
 
     @Test
     public void testFooAndBar() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("foo", "bar");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("foo", "bar"));
         assertServices(s, false, false, true, false, false);
     }
 
     @Test
     public void testFooMinusBar() {
         final List<HealthCheck> s = filter
-                .getTaggedHealthChecks("foo", "-bar");
+                .getHealthChecks(HealthCheckSelector.tags("foo", "-bar"));
         assertServices(s, true, false, false, false, false);
     }
 
     @Test
     public void testWhitespace() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks(
-                "\t \n\r foo  \t", "", " \t-bar\n", "");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags(
+                "\t \n\r foo  \t", "", " \t-bar\n", ""));
         assertServices(s, true, false, false, false, false);
     }
 
     @Test
     public void testOther() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("other");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("other"));
         assertServices(s, false, false, false, true, false);
     }
 
     @Test
     public void testMinusOther() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("-other");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("-other"));
         assertServices(s, true, true, true, false, true);
     }
 
     @Test
     public void testMinusOtherFoo() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("-other",
-                "-foo");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("-other",
+                "-foo"));
         assertServices(s, false, true, false, false, true);
     }
 
     @Test
     public void testNoResults() {
-        final List<HealthCheck> s = filter.getTaggedHealthChecks("NOT A TAG");
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("NOT A TAG"));
         assertTrue("Expecting no services", s.isEmpty());
     }
+
+    @Test
+    public void testSingleName() {
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.names("test1"));
+        assertServices(s, true, false, false, false, false);
+    }
+
+    @Test
+    public void testMultipleNames() {
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.names("test1", "test3"));
+        assertServices(s, true, false, true, false, false);
+    }
+
+    @Test
+    public void testExcludeName() {
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("foo").withNames("-test1"));
+        assertServices(s, false, false, true, false, false);
+    }
+
+    @Test
+    public void testNameOrTag() {
+        final List<HealthCheck> s = filter.getHealthChecks(HealthCheckSelector.tags("foo").withNames("test4"));
+        assertServices(s, true, false, true, true, false);
+    }
 }

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/JmxAdjustableStatusForTestingIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/JmxAdjustableStatusForTestingIT.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/JmxAdjustableStatusForTestingIT.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/JmxAdjustableStatusForTestingIT.java Thu May 11 20:05:21 2017
@@ -33,6 +33,7 @@ import org.apache.sling.hc.api.ResultLog
 import org.apache.sling.hc.api.ResultLog.Entry;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.util.FormattingResultLog;
 import org.junit.After;
 import org.junit.Before;
@@ -66,7 +67,7 @@ public class JmxAdjustableStatusForTesti
 	}
 	
 	private void assertResult(String tag, Result.Status expected) {
-        final Result result = getOverallResult(executor.execute(tag));
+        final Result result = getOverallResult(executor.execute(HealthCheckSelector.tags(tag)));
         assertEquals("Expected status " + expected + " for tag " + tag, expected, result.getStatus());
 	}
 

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/U.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/U.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/U.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/core/it/U.java Thu May 11 20:05:21 2017
@@ -33,6 +33,7 @@ import java.util.List;
 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;
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
 
@@ -52,7 +53,7 @@ public class U {
         final long timeout = System.currentTimeMillis() + 10000L;
         int count = 0;
         while(System.currentTimeMillis() < timeout) {
-            final List<HealthCheckExecutionResult> results = executor.execute(options, tags);
+            final List<HealthCheckExecutionResult> results = executor.execute(HealthCheckSelector.tags(tags), options);
             count = results.size();
             if(count== howMany) {
                 return;

Modified: sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/jmx/impl/HealthCheckMBeanTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/jmx/impl/HealthCheckMBeanTest.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/jmx/impl/HealthCheckMBeanTest.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/core/src/test/java/org/apache/sling/hc/jmx/impl/HealthCheckMBeanTest.java Thu May 11 20:05:21 2017
@@ -32,6 +32,7 @@ import org.apache.sling.hc.api.Result;
 import org.apache.sling.hc.api.ResultLog;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionOptions;
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.apache.sling.hc.core.impl.executor.ExtendedHealthCheckExecutor;
 import org.apache.sling.hc.util.HealthCheckMetadata;
 import org.apache.sling.hc.util.SimpleConstraintChecker;
@@ -105,6 +106,7 @@ public class HealthCheckMBeanTest {
         };
         final HealthCheckMBean mbean = new HealthCheckMBean(ref, new ExtendedHealthCheckExecutor() {
 
+            @SuppressWarnings("deprecation")
             @Override
             public List<HealthCheckExecutionResult> execute(String... tags) {
                 return null;
@@ -147,10 +149,21 @@ public class HealthCheckMBeanTest {
                 };
             }
 
+            @SuppressWarnings("deprecation")
             @Override
             public List<HealthCheckExecutionResult> execute(HealthCheckExecutionOptions options, String... tags) {
                 return null;
             }
+
+            @Override
+            public List<HealthCheckExecutionResult> execute(HealthCheckSelector selector) {
+                return null;
+            }
+
+            @Override
+            public List<HealthCheckExecutionResult> execute(HealthCheckSelector selector, HealthCheckExecutionOptions options) {
+                return null;
+            }
         });
         final ObjectName name = new ObjectName(OBJECT_NAME);
         jmxServer.registerMBean(mbean, name);

Modified: sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/SampleHealthChecksTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/SampleHealthChecksTest.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/SampleHealthChecksTest.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/SampleHealthChecksTest.java Thu May 11 20:05:21 2017
@@ -28,6 +28,7 @@ import javax.management.DynamicMBean;
 
 import org.apache.sling.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.sling.hc.api.execution.HealthCheckExecutor;
+import org.apache.sling.hc.api.execution.HealthCheckSelector;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -53,7 +54,7 @@ public class SampleHealthChecksTest {
     
     @Test
     public void testAnnotatedHC() {
-        final List<HealthCheckExecutionResult> results = executor.execute("annotation","sample");
+        final List<HealthCheckExecutionResult> results = executor.execute(HealthCheckSelector.tags("annotation","sample"));
         assertNotNull("Expecting non-null results");
         assertEquals("Expecting a single result", 1, results.size());
         final HealthCheckExecutionResult r = results.get(0);

Modified: sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/U.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/U.java?rev=1794887&r1=1794886&r2=1794887&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/U.java (original)
+++ sling/trunk/bundles/extensions/healthcheck/it/src/test/java/org/apache/sling/hc/it/core/U.java Thu May 11 20:05:21 2017
@@ -32,6 +32,7 @@ import java.util.List;
 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;
 import org.ops4j.pax.exam.Option;
 
 /** Test utilities */
@@ -47,7 +48,7 @@ public class U {
         final long timeout = System.currentTimeMillis() + 10000L;
         int count = 0;
         while(System.currentTimeMillis() < timeout) {
-            final List<HealthCheckExecutionResult> results = executor.execute(options, tags);
+            final List<HealthCheckExecutionResult> results = executor.execute(HealthCheckSelector.tags(tags), options);
             count = results.size();
             if(count== howMany) {
                 return;