You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2013/05/14 23:44:34 UTC

svn commit: r1482606 - in /sling/trunk/contrib/extensions/healthcheck: hc-core/src/main/java/org/apache/sling/hc/util/ hc-sling/src/main/java/org/apache/sling/hc/sling/api/ hc-sling/src/main/java/org/apache/sling/hc/sling/impl/ hc-sling/src/test/java/o...

Author: bdelacretaz
Date: Tue May 14 21:44:34 2013
New Revision: 1482606

URL: http://svn.apache.org/r1482606
Log:
SLING-2822 - Sling support for tagged rules, including demo content

Added:
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java   (with props)
Modified:
    sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/TaggedRuleFilter.java
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/api/RulesResourceParser.java
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/RulesResourceParserImpl.java
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/SlingHealthCheckServlet.java
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/MockResource.java
    sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/RulesResourceParserTest.java
    sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-foo.json
    sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-login.json
    sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/groovy-bundle.json
    sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/non-existent-bundle.json
    sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/sling-api-bundle.json

Modified: sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/TaggedRuleFilter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/TaggedRuleFilter.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/TaggedRuleFilter.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-core/src/main/java/org/apache/sling/hc/util/TaggedRuleFilter.java Tue May 14 21:44:34 2013
@@ -17,6 +17,8 @@
  */
 package org.apache.sling.hc.util;
 
+import java.util.Arrays;
+
 import org.apache.sling.hc.api.Rule;
 import org.apache.sling.hc.api.RuleFilter;
 
@@ -42,4 +44,9 @@ public class TaggedRuleFilter implements
         }
         return true;
     }
+    
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + ", tags=" + Arrays.asList(tags);
+    }
 }

Modified: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/api/RulesResourceParser.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/api/RulesResourceParser.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/api/RulesResourceParser.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/api/RulesResourceParser.java Tue May 14 21:44:34 2013
@@ -28,6 +28,7 @@ public interface RulesResourceParser {
     String RULE_NAME = "ruleName";
     String QUALIFIER = "qualifier";
     String EXPRESSION = "expression";
+    String TAGS = "tags";
     
     List<Rule> parseResource(Resource r);
 }

Modified: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/RulesResourceParserImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/RulesResourceParserImpl.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/RulesResourceParserImpl.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/RulesResourceParserImpl.java Tue May 14 21:44:34 2013
@@ -78,12 +78,22 @@ public class RulesResourceParserImpl imp
         final ValueMap props = r.adaptTo(ValueMap.class);
         if(props.containsKey(NAMESPACE) && props.containsKey(RULE_NAME)) {
             for(RuleBuilder b : healthcheck.getRuleBuilders()) {
+                // basic properties
                 final Rule rule = b.buildRule(
                     props.get(NAMESPACE, String.class), 
                     props.get(RULE_NAME, String.class), 
                     props.get(QUALIFIER, String.class), 
                     props.get(EXPRESSION, String.class)
                 );
+                
+                // tags, if any
+                if(rule != null && props.containsKey(TAGS)) {
+                    final String [] tags = props.get(TAGS, String[].class);
+                    if(tags != null && tags.length > 0) {
+                        rule.setTags(tags);
+                    }
+                }
+                
                 if(rule != null) {
                     return rule;
                 }

Modified: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/SlingHealthCheckServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/SlingHealthCheckServlet.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/SlingHealthCheckServlet.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/main/java/org/apache/sling/hc/sling/impl/SlingHealthCheckServlet.java Tue May 14 21:44:34 2013
@@ -18,6 +18,8 @@
 package org.apache.sling.hc.sling.impl;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.servlet.ServletException;
 
@@ -30,6 +32,9 @@ import org.apache.sling.hc.api.HealthChe
 import org.apache.sling.hc.api.RulesEngine;
 import org.apache.sling.hc.sling.api.JsonResultRenderer;
 import org.apache.sling.hc.sling.api.RulesResourceParser;
+import org.apache.sling.hc.util.TaggedRuleFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Sling Servlet that renders a Resource that contains health check rules 
  *  definitions, after evaluating the rules.
@@ -37,9 +42,17 @@ import org.apache.sling.hc.sling.api.Rul
  *  defines the output format. 
  */
 @SuppressWarnings("serial")
-@SlingServlet(extensions="json",resourceTypes="sling/healthcheck/rules",methods="GET",selectors="healthcheck")
+@SlingServlet(
+        extensions="json",
+        resourceTypes="sling/healthcheck/rules",
+        methods="GET",
+        selectors=SlingHealthCheckServlet.HC_SELECTOR)
 public class SlingHealthCheckServlet extends SlingSafeMethodsServlet {
 
+    public static final String HC_SELECTOR = "healthcheck";
+    
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
     @Reference
     private HealthCheckFacade healthcheck;
     
@@ -60,7 +73,20 @@ public class SlingHealthCheckServlet ext
         engine.addRules(parser.parseResource(request.getResource()));
         response.setContentType("application/json");
         response.setCharacterEncoding("UTF-8");
-        renderer.render(engine.evaluateRules(), response.getWriter());
+        final TaggedRuleFilter filter = new TaggedRuleFilter(getRuleTagsFromRequest(request));
+        log.info("Executing rules found under {} with {}", request.getResource().getPath(), filter);
+        renderer.render(engine.evaluateRules(filter), response.getWriter());
         response.getWriter().flush();
     }
+    
+    static String [] getRuleTagsFromRequest(SlingHttpServletRequest r) {
+        // Get request selectors and remove this servlet's selector
+        final List<String> result = new ArrayList<String>();
+        for(String tag : r.getRequestPathInfo().getSelectors()) {
+            if(!HC_SELECTOR.equals(tag)) {
+                result.add(tag);
+            }
+        }
+        return result.toArray(new String[] {});
+    }
 }

Modified: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/MockResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/MockResource.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/MockResource.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/MockResource.java Tue May 14 21:44:34 2013
@@ -14,6 +14,7 @@ import static org.apache.sling.hc.sling.
 import static org.apache.sling.hc.sling.api.RulesResourceParser.RULE_NAME;
 import static org.apache.sling.hc.sling.api.RulesResourceParser.QUALIFIER;
 import static org.apache.sling.hc.sling.api.RulesResourceParser.EXPRESSION;
+import static org.apache.sling.hc.sling.api.RulesResourceParser.TAGS;
 
 class MockResource implements Resource {
     private final ResourceResolver resolver;
@@ -29,7 +30,7 @@ class MockResource implements Resource {
         public <T> T get(String key, Class<T> type) {
             // we only need Strings in our tests
             final Object value = get(key);
-            return value == null ? null : (T)value.toString();
+            return value == null ? null : (T)value;
         }
 
         @SuppressWarnings("unchecked")
@@ -62,6 +63,10 @@ class MockResource implements Resource {
         this.scriptCode = scriptCode;
     }
     
+    void setTags(String [] tags) {
+        valueMap.put(TAGS, tags);
+    }
+    
     @SuppressWarnings("unchecked")
     @Override
     public <AdapterType> AdapterType adaptTo(Class<AdapterType> target) {

Modified: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/RulesResourceParserTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/RulesResourceParserTest.java?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/RulesResourceParserTest.java (original)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/RulesResourceParserTest.java Tue May 14 21:44:34 2013
@@ -92,6 +92,19 @@ public class RulesResourceParserTest {
     }
     
     @Test
+    public void testResourceWithTags() {
+        final MockResource r = new MockResource(resolver, "/", "test", "constant", "5", "> 3");
+        r.setTags(new String [] { "foo", "bar" });
+        final List<Rule> rules = parser.parseResource(r); 
+        assertEquals(1, rules.size());
+        final Rule rule = rules.get(0);
+        assertEquals("Rule: test:constant:5 > 3", rule.toString());
+        assertEquals(2, rule.getTags().size());
+        assertTrue(rule.hasTag("foo"));
+        assertTrue(rule.hasTag("bar"));
+    }
+    
+    @Test
     public void testScriptResource() {
         final Resource root = new MockResource(resolver, "/foo", "test", "constant", "5", "> 3");
         new MockResource(resolver, "/foo/script1", "some script");

Added: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java?rev=1482606&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java (added)
+++ sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java Tue May 14 21:44:34 2013
@@ -0,0 +1,77 @@
+/*
+ * 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 SF 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.sling.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestPathInfo;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ServletTagsSelectionTest {
+    
+    @Mock
+    private SlingHttpServletRequest request;
+    
+    @Mock
+    private RequestPathInfo requestPathInfo;
+    
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        Mockito.when(request.getRequestPathInfo()).thenReturn(requestPathInfo);
+    }
+
+    private void assertTags(String [] actual, String ... expected) {
+        assertEquals("Expecting " + expected.length + " tags", expected.length, actual.length);
+        final List<String> actualList = Arrays.asList(actual);
+        for(String tag : expected) {
+            assertTrue("Expecting " + actualList + " to contain " + tag, actualList.contains(tag));
+        }
+    }
+    
+    @Test
+    public void testNoSelectors() {
+        Mockito.when(requestPathInfo.getSelectors()).thenReturn(new String [] {});
+        assertTags(SlingHealthCheckServlet.getRuleTagsFromRequest(request), new String[] {});
+    }
+    
+    @Test
+    public void testNoHcSelector() {
+        final String [] selectors = new String [] { "foo", "bar" };
+        Mockito.when(requestPathInfo.getSelectors()).thenReturn(selectors);
+        assertTags(SlingHealthCheckServlet.getRuleTagsFromRequest(request), selectors);
+    }
+    
+    @Test
+    public void testWithHcSelector() {
+        final String [] selectors = new String [] { "foo", "bar", SlingHealthCheckServlet.HC_SELECTOR };
+        Mockito.when(requestPathInfo.getSelectors()).thenReturn(selectors);
+        final String [] expected = new String [] { "foo", "bar" };
+        assertTags(SlingHealthCheckServlet.getRuleTagsFromRequest(request), expected);
+    }
+    
+}

Propchange: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/extensions/healthcheck/hc-sling/src/test/java/org/apache/sling/hc/sling/impl/ServletTagsSelectionTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-foo.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-foo.json?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-foo.json (original)
+++ sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-foo.json Tue May 14 21:44:34 2013
@@ -3,5 +3,6 @@
   "ruleName": "loginfails",
   "namespace": "sling",
   "jcr:primaryType": "nt:unstructured",
-  "qualifier": "admin#foo"
+  "qualifier": "admin#foo",
+  "tags" : [ "admin", "security" ]
 }

Modified: sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-login.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-login.json?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-login.json (original)
+++ sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/admin-login.json Tue May 14 21:44:34 2013
@@ -3,5 +3,6 @@
   "ruleName": "loginfails",
   "namespace": "sling",
   "jcr:primaryType": "nt:unstructured",
-  "qualifier": "admin#admin"
+  "qualifier": "admin#admin",
+  "tags" : [ "admin", "security" ]
 }

Modified: sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/groovy-bundle.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/groovy-bundle.json?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/groovy-bundle.json (original)
+++ sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/groovy-bundle.json Tue May 14 21:44:34 2013
@@ -4,5 +4,6 @@
   "ruleName": "bundle.state",
   "namespace": "osgi",
   "jcr:primaryType": "nt:unstructured",
-  "qualifier": "groovy-all"
+  "qualifier": "groovy-all",
+  "tags" : ["groovy","bundles"]
 }

Modified: sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/non-existent-bundle.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/non-existent-bundle.json?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/non-existent-bundle.json (original)
+++ sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/non-existent-bundle.json Tue May 14 21:44:34 2013
@@ -4,5 +4,6 @@
   "ruleName": "bundle.state",
   "namespace": "osgi",
   "jcr:primaryType": "nt:unstructured",
-  "qualifier": "non.existent.bundle"
+  "qualifier": "non.existent.bundle",
+  "tags" : "bundles"
 }

Modified: sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/sling-api-bundle.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/sling-api-bundle.json?rev=1482606&r1=1482605&r2=1482606&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/sling-api-bundle.json (original)
+++ sling/trunk/contrib/extensions/healthcheck/sling-demo/src/main/resources/SLING-CONTENT/apps/hc/demo/sling-api-bundle.json Tue May 14 21:44:34 2013
@@ -4,5 +4,6 @@
   "ruleName": "bundle.state",
   "namespace": "osgi",
   "jcr:primaryType": "nt:unstructured",
-  "qualifier": "org.apache.sling.api"
+  "qualifier": "org.apache.sling.api",
+  "tags" : ["bundles","sling"]
 }