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/04/15 11:52:13 UTC

svn commit: r1467919 [2/2] - in /sling/trunk/contrib/extensions/muppet: ./ it/ it/src/ it/src/test/ it/src/test/java/ it/src/test/java/org/ it/src/test/java/org/apache/ it/src/test/java/org/apache/sling/ it/src/test/java/org/apache/sling/muppet/ it/src...

Added: sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/Activator.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/Activator.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/Activator.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,47 @@
+/*
+ * 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.muppet.rules.osgi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.rules.jmx.JmxBeansRuleBuilder;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+/** Register our {@link RuleBuilder} for OSGi */
+public class Activator implements BundleActivator {
+    private List<ServiceRegistration> regs;
+
+    public void start(BundleContext ctx) throws Exception {
+        regs = new ArrayList<ServiceRegistration>();
+        regs.add(ctx.registerService(RuleBuilder.class.getName(), new BundlesRuleBuilder(ctx), null));
+        regs.add(ctx.registerService(RuleBuilder.class.getName(), new JmxBeansRuleBuilder(), null));
+    }
+
+    public void stop(BundleContext ctx) throws Exception {
+        if(regs != null) {
+            for(ServiceRegistration reg : regs) {
+                reg.unregister();
+            }
+        }
+        regs = null;
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/BundlesRuleBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/BundlesRuleBuilder.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/BundlesRuleBuilder.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-rules/src/main/java/org/apache/sling/muppet/rules/osgi/BundlesRuleBuilder.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,113 @@
+/*
+ * 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.muppet.rules.osgi;
+
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.api.SystemAttribute;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/** RuleBuilder about OSGi bundles */
+public class BundlesRuleBuilder implements RuleBuilder {
+
+    public static final String NAMESPACE = "osgi";
+    public static final String BUNDLE_STATE_RULE = "bundle.state";
+    public static final String BUNDLE_NOT_FOUND = "BUNDLE_NOT_FOUND";
+    private final BundleContext bundleContext;
+    
+    static class BundleAttribute implements SystemAttribute {
+        private final SystemAttribute attr;
+        private final String name;
+        
+        BundleAttribute(String name, SystemAttribute attr) {
+            this.name = name;
+            this.attr = attr;
+        }
+        
+        @Override
+        public String toString() {
+            return name;
+        }
+        
+        @Override
+        public Object getValue() {
+            return attr.getValue();
+        }
+    }
+    
+    BundlesRuleBuilder(BundleContext ctx) {
+        bundleContext = ctx;
+    }
+    
+    private Bundle findBundle(String symbolicName) {
+        for(Bundle b : bundleContext.getBundles()) {
+            if(symbolicName.equals(b.getSymbolicName())) {
+                return b;
+            }
+        }
+        return null;
+    }
+    
+    private String bundleStateToString(int state) {
+        // TODO this must exist somewhere already...
+        if(state == Bundle.ACTIVE) {
+            return "active";
+        } else if(state == Bundle.RESOLVED) {
+            return "resolved";
+        } else if(state == Bundle.INSTALLED) {
+            return "installed";
+        } else if(state == Bundle.STOPPING) {
+            return "stopping";
+        } else if(state == Bundle.UNINSTALLED) {
+            return "uninstalled";
+        } else {
+            return String.valueOf(state);
+        }
+    }
+    
+    @Override
+    public Rule buildRule(String namespace, String ruleName, final String qualifier, String expression) {
+        if(!NAMESPACE.equals(namespace)) {
+            return null;
+        }
+        
+        SystemAttribute attr = null;
+        
+        if(BUNDLE_STATE_RULE.equals(ruleName) && qualifier != null) {
+            // Get the state of a bundle
+            attr = new BundleAttribute(ruleName + ":" + qualifier, new SystemAttribute() {
+                @Override
+                public Object getValue() {
+                    Bundle b = findBundle(qualifier);
+                    if(b == null) {
+                        return BUNDLE_NOT_FOUND;
+                    } else {
+                        return bundleStateToString(b.getState());
+                    }
+                }
+            });
+        }
+        
+        if(attr != null) {
+            return new Rule(attr, expression);
+        }
+        
+        return null;
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-rules/src/test/java/org/apache/sling/muppet/rules/impl/JmxBeansRuleBuilderTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-rules/src/test/java/org/apache/sling/muppet/rules/impl/JmxBeansRuleBuilderTest.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-rules/src/test/java/org/apache/sling/muppet/rules/impl/JmxBeansRuleBuilderTest.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-rules/src/test/java/org/apache/sling/muppet/rules/impl/JmxBeansRuleBuilderTest.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,52 @@
+/*
+ * 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.muppet.rules.impl;
+
+import org.apache.sling.muppet.api.EvaluationResult;
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.rules.jmx.JmxBeansRuleBuilder;
+import org.junit.Test;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+public class JmxBeansRuleBuilderTest {
+    private final RuleBuilder jmxRuleBuilder = new JmxBeansRuleBuilder();
+    
+    @Test
+    public void testBasicJvmBean() {
+        // Assuming this attribute is present in all JVMs that we use to run tests...
+        final Rule r = jmxRuleBuilder.buildRule("jmxbeans", "java.lang:type=ClassLoading", "LoadedClassCount", "> 100");
+        assertNotNull("Expecting to get a jmxbean Rule", r);
+        assertEquals(EvaluationResult.Status.OK, r.execute());
+    }
+    
+    @Test
+    public void testHashSeparatorInBeanName() {
+        final Rule r = jmxRuleBuilder.buildRule("jmxbeans", "java.lang#type=ClassLoading", "LoadedClassCount", "> 100");
+        assertNotNull("Expecting to get a jmxbean Rule", r);
+        assertEquals(EvaluationResult.Status.OK, r.execute());
+    }
+    
+    @Test
+    public void testNonExistentBean() {
+        final Rule r = jmxRuleBuilder.buildRule("jmxbeans", "java.lang:type=DoesNotExist", "LoadedClassCount", "5");
+        assertNotNull("Expecting to get a jmxbean Rule", r);
+        assertEquals(EvaluationResult.Status.ERROR, r.execute());
+    }
+}

Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Apr 15 09:52:11 2013
@@ -0,0 +1,13 @@
+target
+bin
+*.iml
+*.ipr
+*.iws
+.settings
+.project
+.classpath
+.externalToolBuilders
+maven-eclipse.xml
+
+
+

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml Mon Apr 15 09:52:11 2013
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project 
+    xmlns="http://maven.apache.org/POM/4.0.0" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.sling</groupId>
+        <artifactId>sling</artifactId>
+        <version>15</version>
+        <relativePath>15</relativePath>
+    </parent>
+
+    <groupId>org.apache.sling</groupId>
+    <artifactId>org.apache.sling.muppet.sling</artifactId>
+    <packaging>bundle</packaging>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <name>Sling-specific Muppet Components</name>
+    <inceptionYear>2013</inceptionYear>
+    
+    <description>
+        Muppet servlet and rules for Sling
+    </description>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.sling.muppet.sling.api
+                        </Export-Package>
+                        <Private-Package>
+                            org.apache.sling.muppet.sling.impl.*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.muppet.core</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.api</artifactId>
+            <version>2.0.6</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.jcr.api</artifactId>
+            <version>2.0.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.jcr</groupId>
+            <artifactId>jcr</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.json</artifactId>
+            <version>2.0.6</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.6.2</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <version>1.6.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+     </dependencies>
+</project>

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/JsonResultRenderer.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/JsonResultRenderer.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/JsonResultRenderer.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/JsonResultRenderer.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,29 @@
+/*
+ * 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.muppet.sling.api;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+
+import org.apache.sling.muppet.api.EvaluationResult;
+
+/** Renders a List of EvaluationResult in JSON */
+public interface JsonResultRenderer {
+    void render(List<EvaluationResult> results, Writer output) throws IOException;
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/RulesResourceParser.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/RulesResourceParser.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/RulesResourceParser.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/api/RulesResourceParser.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,33 @@
+/*
+ * 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.muppet.sling.api;
+
+import java.util.List;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.muppet.api.Rule;
+
+/** Parses a Sling Resource into Muppet Rules */
+public interface RulesResourceParser {
+    String NAMESPACE = "namespace";
+    String RULE_NAME = "ruleName";
+    String QUALIFIER = "qualifier";
+    String EXPRESSION = "expression";
+    
+    List<Rule> parseResource(Resource r);
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/JsonResultRendererImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/JsonResultRendererImpl.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/JsonResultRendererImpl.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/JsonResultRendererImpl.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,55 @@
+/*
+ * 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.muppet.sling.impl;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.muppet.api.EvaluationResult;
+import org.apache.sling.muppet.sling.api.JsonResultRenderer;
+
+/** Renders a List of EvaluationResult in JSON. See unit tests
+ *  for details.
+ */
+@Component
+@Service(value=JsonResultRenderer.class)
+public class JsonResultRendererImpl implements JsonResultRenderer {
+    
+    @Override
+    public void render(List<EvaluationResult> results, Writer output) throws IOException {
+        // TODO not JSON yet...trouble with animalsniffer and JSON dependency
+        for(EvaluationResult r : results) {
+            output.write(r.getStatus().toString());
+            output.write(" ");
+            output.write(r.getRule().toString());
+            output.write("\n");
+        }
+        /*
+        final JSONWriter w = new JSONWriter(output);
+        try {
+            w.object();
+            w.endObject();
+        } catch (JSONException e) {
+            throw new IOException(e.getClass().getSimpleName(), e);
+        }
+        */
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/MuppetSlingServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/MuppetSlingServlet.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/MuppetSlingServlet.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/MuppetSlingServlet.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,66 @@
+/*
+ * 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.muppet.sling.impl;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.sling.SlingServlet;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+import org.apache.sling.muppet.api.MuppetFacade;
+import org.apache.sling.muppet.api.RulesEngine;
+import org.apache.sling.muppet.sling.api.JsonResultRenderer;
+import org.apache.sling.muppet.sling.api.RulesResourceParser;
+
+/** Sling Servlet that renders a Resource that contains Muppet rules definitions,
+ *  after evaluating the rules.
+ *  {@link RulesResourceParser} defines the resource format, and {@link JsonResultRenderer}
+ *  defines the output format. 
+ */
+@SuppressWarnings("serial")
+@SlingServlet(extensions="json",resourceTypes="sling/muppet.rules",methods="GET",selectors="muppet")
+public class MuppetSlingServlet extends SlingSafeMethodsServlet {
+
+    @Reference
+    private MuppetFacade muppet;
+    
+    @Reference
+    private RulesResourceParser parser;
+    
+    @Reference
+    private JsonResultRenderer renderer;
+    
+    @Override
+    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) 
+            throws ServletException,IOException {
+        
+        // TODO restrict execution to admin?
+        
+        // TODO we could cache the engine + rules, not sure if it's worth it...
+        final RulesEngine engine = muppet.getNewRulesEngine();
+        engine.addRules(parser.parseResource(request.getResource()));
+        response.setContentType("application/json");
+        response.setCharacterEncoding("UTF-8");
+        renderer.render(engine.evaluateRules(), response.getWriter());
+        response.getWriter().flush();
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,71 @@
+/*
+ * 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.muppet.sling.impl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.muppet.api.MuppetFacade;
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.sling.api.RulesResourceParser;
+
+/** Parses a Resource into a list of Rule. See unit tests for details */
+@Component
+@Service(value=RulesResourceParser.class)
+public class RulesResourceParserImpl implements RulesResourceParser {
+    
+    @Reference
+    private MuppetFacade muppet;
+    
+    @Override
+    public List<Rule> parseResource(Resource r) {
+        final List<Rule> result = new ArrayList<Rule>();
+        recursivelyParseResource(result, r);
+        return result;
+    }
+    
+    private void recursivelyParseResource(List<Rule> list, Resource r) {
+        final ValueMap props = r.adaptTo(ValueMap.class);
+        if(props.containsKey(NAMESPACE) && props.containsKey(RULE_NAME)) {
+            for(RuleBuilder b : muppet.getRuleBuilders()) {
+                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)
+                );
+                if(rule != null) {
+                    list.add(rule);
+                }
+            }
+        }
+        
+        final Iterator<Resource> it = r.getResourceResolver().listChildren(r);
+        while(it.hasNext()) {
+            recursivelyParseResource(list, it.next());
+        }
+        
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/rules/LoginRuleBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/rules/LoginRuleBuilder.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/rules/LoginRuleBuilder.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/rules/LoginRuleBuilder.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,98 @@
+/*
+ * 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.muppet.sling.impl.rules;
+
+import javax.jcr.Credentials;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.api.SystemAttribute;
+
+/** Creates {@link Rule} to check if specific credentials allow for
+ *  logging in to a {@link SlingRepository}. Can be used to verify 
+ *  that default passwords have been disabled on production systems.
+ *  Checking for failed logins is the only realistic use case, as
+ *  by the credentials will be exposed in plain text in the repository,
+ *  which is only ok for default demo passwords of course.   
+ */
+@Component
+@Service(value=RuleBuilder.class)
+public class LoginRuleBuilder implements RuleBuilder {
+
+    public static final String NAMESPACE = "sling";
+    public static final String RULE_NAME = "login";
+    
+    @Reference
+    private SlingRepository repository;
+    
+    private class LoginResultSystemAttribute implements SystemAttribute {
+
+        private final String username;
+        private final String password;
+        
+        LoginResultSystemAttribute(String username, String password) {
+            this.username= username;
+            this.password = password;
+        }
+        
+        @Override
+        public Object getValue() {
+            String result = "???";
+            final Credentials creds = new SimpleCredentials(username, password.toCharArray());
+            Session s = null;
+            try {
+                s = repository.login(creds);
+                result = "LOGIN_OK";
+            } catch(RepositoryException rex) {
+                result = "LOGIN_FAILED";
+            } finally {
+                if(s != null) {
+                    s.logout();
+                }
+            }
+            return result;
+        }
+        
+        @Override
+        public String toString() {
+            return "Attempt to login as user " + username;
+        }
+    }
+    
+    @Override
+    public Rule buildRule(String namespace, String ruleName, String qualifier, String expression) {
+        if(!NAMESPACE.equals(namespace) || !RULE_NAME.equals(ruleName) || qualifier == null) {
+            return null;
+        }
+        
+        // Qualifier must be username#password
+        final String [] creds = qualifier.split("#");
+        if(creds.length != 2) {
+            return null;
+        }
+        
+        return new Rule(new LoginResultSystemAttribute(creds[0], creds[1]), expression);
+    }
+}
\ No newline at end of file

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResolver.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResolver.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResolver.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,104 @@
+/*
+ * 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.muppet.sling;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+
+class MockResolver implements ResourceResolver {
+
+    private final List<MockResource> resources = new ArrayList<MockResource>();
+
+    void addResource(MockResource r) {
+        resources.add(r);
+    }
+    
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> arg0) {
+        return null;
+    }
+
+    @Override
+    public Iterator<Resource> findResources(String arg0, String arg1) {
+        return null;
+    }
+
+    @Override
+    public Resource getResource(Resource arg0, String arg1) {
+        return null;
+    }
+
+    @Override
+    public Resource getResource(String arg0) {
+        return null;
+    }
+
+    @Override
+    public String[] getSearchPath() {
+        return null;
+    }
+
+    @Override
+    public Iterator<Resource> listChildren(Resource r) {
+        final List<Resource> kids = new ArrayList<Resource>();
+        for(Resource kid : resources) {
+            if(kid.getPath().startsWith(r.getPath()) && kid.getPath().length() > r.getPath().length()) {
+                kids.add(kid);
+            }
+        }
+        return kids.iterator();
+    }
+
+    @Override
+    public String map(HttpServletRequest arg0, String arg1) {
+        return null;
+    }
+
+    @Override
+    public String map(String arg0) {
+        return null;
+    }
+
+    @Override
+    public Iterator<Map<String, Object>> queryResources(String arg0, String arg1) {
+        return null;
+    }
+
+    @Override
+    public Resource resolve(HttpServletRequest arg0, String arg1) {
+        return null;
+    }
+
+    @Override
+    @Deprecated
+    public Resource resolve(HttpServletRequest arg0) {
+        return null;
+    }
+
+    @Override
+    public Resource resolve(String arg0) {
+        return null;
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,86 @@
+package org.apache.sling.muppet.sling;
+
+import java.util.HashMap;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import static org.apache.sling.muppet.sling.api.RulesResourceParser.NAMESPACE;
+import static org.apache.sling.muppet.sling.api.RulesResourceParser.RULE_NAME;
+import static org.apache.sling.muppet.sling.api.RulesResourceParser.QUALIFIER;
+import static org.apache.sling.muppet.sling.api.RulesResourceParser.EXPRESSION;
+
+class MockResource implements Resource {
+    private final ResourceResolver resolver;
+    private final ValueMap valueMap;
+    private final String path;
+    
+    @SuppressWarnings("serial")
+    static class PropertiesMap extends HashMap<String, Object> implements ValueMap {
+
+        @SuppressWarnings("unchecked")
+        @Override
+        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();
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T get(String key, T defaultValue) {
+            final Object value = get(key);
+            if(value == null) {
+                return defaultValue;
+            }
+            return (T)value;
+        }
+        
+    };
+    
+    MockResource(MockResolver resolver, String path, String namespace, String ruleName, String qualifier, String expression) {
+        this.resolver = resolver;
+        this.path = path;
+        this.valueMap = new PropertiesMap();
+        valueMap.put(NAMESPACE, namespace);
+        valueMap.put(RULE_NAME, ruleName);
+        valueMap.put(QUALIFIER, qualifier);
+        valueMap.put(EXPRESSION, expression);
+        resolver.addResource(this);
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> target) {
+        if(target == ValueMap.class) {
+            return (AdapterType)valueMap;
+        }
+        return null;
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+
+    @Override
+    public ResourceMetadata getResourceMetadata() {
+        return null;
+    }
+
+    @Override
+    public ResourceResolver getResourceResolver() {
+        return resolver;
+    }
+
+    @Override
+    public String getResourceSuperType() {
+        return null;
+    }
+
+    @Override
+    public String getResourceType() {
+        return null;
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java Mon Apr 15 09:52:11 2013
@@ -0,0 +1,116 @@
+/*
+ * 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.muppet.sling;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.muppet.api.MuppetFacade;
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.RuleBuilder;
+import org.apache.sling.muppet.api.RulesEngine;
+import org.apache.sling.muppet.api.SystemAttribute;
+import org.apache.sling.muppet.sling.impl.RulesResourceParserImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RulesResourceParserTest {
+    private final RulesResourceParserImpl parser = new RulesResourceParserImpl();
+    private MockResolver resolver;
+    private final List<RuleBuilder> builders = new ArrayList<RuleBuilder>();
+    
+    private final MuppetFacade facade = new MuppetFacade() {
+        public RulesEngine getNewRulesEngine() { return null; }
+        public List<Rule> parseSimpleTextRules(Reader textRules) throws IOException { return null; }
+        public List<RuleBuilder> getRuleBuilders() { return builders; }
+    };
+    
+    @Before
+    public void setup() throws Exception {
+        resolver = new MockResolver();
+        
+        builders.add(new RuleBuilder() {
+            @Override
+            public Rule buildRule(final String namespace, final String ruleName, final String qualifier, final String expression) {
+                if("test".equals(namespace)) {
+                    final SystemAttribute a = new SystemAttribute() {
+                        @Override
+                        public String toString() {
+                            return namespace + ":" + ruleName + ":" + qualifier;
+                        }
+                        @Override
+                        public Object getValue() {
+                            return toString();
+                        }
+                    };
+                    return new Rule(a, expression);
+                }
+                return null;
+            }
+        });
+        
+        final Field f = parser.getClass().getDeclaredField("muppet");
+        f.setAccessible(true);
+        f.set(parser, facade);
+    }
+    
+    @Test
+    public void testEmptyResource() {
+        final Resource r = new MockResource(resolver, "/", null, null, null, null);
+        assertEquals(0, parser.parseResource(r).size());
+    }
+    
+    @Test
+    public void testSingleResource() {
+        final Resource r = new MockResource(resolver, "/", "test", "constant", "5", "> 3");
+        final List<Rule> rules = parser.parseResource(r); 
+        assertEquals(1, rules.size());
+        assertEquals("Rule: test:constant:5 > 3", rules.get(0).toString());
+    }
+    
+    @Test
+    public void testResourceTree() {
+        final Resource root = new MockResource(resolver, "/foo", "test", "constant", "5", "> 3");
+        new MockResource(resolver, "/foo/1", "test", "constant", "12", "A");
+        new MockResource(resolver, "/foo/2", "test", "constant", "12", "B");
+        new MockResource(resolver, "/foo/3", "SHOULD_BE_IGNORED", "constant", "12", "A");
+        new MockResource(resolver, "/foo/4", "null", "ignored as well", "12", "A");
+        new MockResource(resolver, "/foo/some/path/to/me", "test", "deep", "43", "C");
+        
+        final List<Rule> rules = parser.parseResource(root); 
+        assertEquals(4, rules.size());
+
+        final String [] expect = {
+            "Rule: test:constant:5 > 3",
+            "Rule: test:constant:12 A",
+            "Rule: test:constant:12 B",
+            "Rule: test:deep:43 C"
+        };
+        final String allText = rules.toString();
+        for(String resText : expect) {
+            assertTrue("Expecting rules list (" + allText + ") to contain " + resText, allText.indexOf(resText) >= 0);
+        }
+    }
+}

Added: sling/trunk/contrib/extensions/muppet/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/pom.xml?rev=1467919&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/pom.xml (added)
+++ sling/trunk/contrib/extensions/muppet/pom.xml Mon Apr 15 09:52:11 2013
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project 
+    xmlns="http://maven.apache.org/POM/4.0.0" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>10</version>
+        <relativePath />
+    </parent>
+
+    <groupId>org.apache.sling</groupId>
+    <artifactId>org.apache.sling.muppet.reactor</artifactId>
+    <packaging>pom</packaging>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <name>Muppet Reactor POM</name>
+    <inceptionYear>2011</inceptionYear>
+
+    <prerequisites>
+        <maven>3.0.4</maven>
+    </prerequisites>
+    
+    <modules>
+        <module>muppet-core</module>
+        <module>muppet-rules</module>
+        <module>muppet-sling</module>
+        <module>it</module>
+    </modules>
+</project>