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/16 22:16:11 UTC
svn commit: r1468595 - in /sling/trunk/contrib/extensions/muppet:
muppet-sling/ muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/
muppet-sling/src/test/java/org/apache/sling/muppet/sling/
muppet-sling/src/test/java/org/apache/sling/muppet/...
Author: bdelacretaz
Date: Tue Apr 16 20:16:11 2013
New Revision: 1468595
URL: http://svn.apache.org/r1468595
Log:
SLING-2822 - direct scripting support added, with two example scripts in sling-demo content
Added:
sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java (with props)
sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java (with props)
sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java (with props)
sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java (with props)
sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java (with props)
sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp (with props)
sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.esp
Modified:
sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml
sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java
sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java
sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java
Modified: 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=1468595&r1=1468594&r2=1468595&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml (original)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml Tue Apr 16 20:16:11 2013
@@ -99,6 +99,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.engine</artifactId>
+ <version>2.2.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
@@ -135,11 +141,17 @@
<version>4.8.1</version>
<scope>provided</scope>
</dependency>
- <dependency>
+ <dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.testing</artifactId>
<version>2.0.14</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java Tue Apr 16 20:16:11 2013
@@ -0,0 +1,265 @@
+/*
+ * 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.muppet.sling.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+/** Fake request used to acquire content from Sling.
+ * TODO we should really provide those in a Sling utility
+ * package to avoid reinventing them every time. */
+public class HttpRequest implements HttpServletRequest {
+
+ public static final String FAKE_URL_BASE = "http://example.com";
+ private final String path;
+ private final Map<String, Object> attributes;
+ private final Map<String, String> parameters;
+
+ HttpRequest(String path) {
+ this.path = path;
+ attributes = new HashMap<String, Object>();
+ parameters = new HashMap<String, String>();
+ }
+
+ public String getAuthType() {
+ return null;
+ }
+
+ public String getContextPath() {
+ return "";
+ }
+
+ public Cookie[] getCookies() {
+ return null;
+ }
+
+ public long getDateHeader(String name) {
+ return 0;
+ }
+
+ public String getHeader(String name) {
+ return null;
+ }
+
+ public Enumeration<?> getHeaderNames() {
+ return null;
+ }
+
+ public Enumeration<?> getHeaders(String name) {
+ return null;
+ }
+
+ public int getIntHeader(String name) {
+ return 0;
+ }
+
+ public String getMethod() {
+ return "GET";
+ }
+
+ public String getPathInfo() {
+ return null;
+ }
+
+ public String getPathTranslated() {
+ return null;
+ }
+
+ public String getQueryString() {
+ return null;
+ }
+
+ public String getRemoteUser() {
+ return null;
+ }
+
+ public String getRequestedSessionId() {
+ return null;
+ }
+
+ public String getRequestURI() {
+ return path;
+ }
+
+ public StringBuffer getRequestURL() {
+ return new StringBuffer(FAKE_URL_BASE + path);
+ }
+
+ public String getServletPath() {
+ return path;
+ }
+
+ public HttpSession getSession() {
+ return null;
+ }
+
+ public HttpSession getSession(boolean create) {
+ return null;
+ }
+
+ public Principal getUserPrincipal() {
+ return null;
+ }
+
+ public boolean isRequestedSessionIdFromCookie() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromUrl() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromURL() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdValid() {
+ return false;
+ }
+
+ public boolean isUserInRole(String role) {
+ return false;
+ }
+
+ public Object getAttribute(String name) {
+ return attributes.get(name);
+ }
+
+ public Enumeration<?> getAttributeNames() {
+ return null;
+ }
+
+ public String getCharacterEncoding() {
+ return null;
+ }
+
+ public int getContentLength() {
+ return 0;
+ }
+
+ public String getContentType() {
+ return null;
+ }
+
+ public ServletInputStream getInputStream() throws IOException {
+ return null;
+ }
+
+ public String getLocalAddr() {
+ return null;
+ }
+
+ public Locale getLocale() {
+ return null;
+ }
+
+ public Enumeration<?> getLocales() {
+ return null;
+ }
+
+ public String getLocalName() {
+ return null;
+ }
+
+ public int getLocalPort() {
+ return 0;
+ }
+
+ public String getParameter(String name) {
+ return null;
+ }
+
+ public Map<?,?> getParameterMap() {
+ return parameters;
+ }
+
+ public Enumeration<?> getParameterNames() {
+ return null;
+ }
+
+ public String[] getParameterValues(String name) {
+ return null;
+ }
+
+ public String getProtocol() {
+ return null;
+ }
+
+ public BufferedReader getReader() throws IOException {
+ return null;
+ }
+
+ public String getRealPath(String path) {
+ return null;
+ }
+
+ public String getRemoteAddr() {
+ return null;
+ }
+
+ public String getRemoteHost() {
+ return null;
+ }
+
+ public int getRemotePort() {
+ return 0;
+ }
+
+ public RequestDispatcher getRequestDispatcher(String path) {
+ return null;
+ }
+
+ public String getScheme() {
+ return "http";
+ }
+
+ public String getServerName() {
+ return null;
+ }
+
+ public int getServerPort() {
+ return 0;
+ }
+
+ public boolean isSecure() {
+ return false;
+ }
+
+ public void removeAttribute(String name) {
+ attributes.remove(name);
+ }
+
+ public void setAttribute(String name, Object o) {
+ attributes.put(name, o);
+ }
+
+ public void setCharacterEncoding(String env)
+ throws UnsupportedEncodingException {
+ }
+}
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java Tue Apr 16 20:16:11 2013
@@ -0,0 +1,170 @@
+package org.apache.sling.muppet.sling.impl;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.Locale;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+/** Fake response used to acquire content from Sling
+ * TODO we should really provide those in a Sling utility
+ * package to avoid reinventing them every time. */
+public class HttpResponse implements HttpServletResponse {
+
+ private int status = 200;
+ private String message;
+ private String encoding = "UTF-8";
+ private String contentType;
+ private final TestServletOutputStream outputStream;
+ private final PrintWriter writer;
+
+ HttpResponse() throws UnsupportedEncodingException {
+ outputStream = new TestServletOutputStream();
+ writer = new PrintWriter(new OutputStreamWriter(outputStream, encoding));
+ }
+
+ public void addCookie(Cookie cookie) {
+ }
+
+ public void addDateHeader(String name, long date) {
+ }
+
+ public void addHeader(String name, String value) {
+ }
+
+ public void addIntHeader(String name, int value) {
+ }
+
+ public boolean containsHeader(String name) {
+ return false;
+ }
+
+ public String encodeRedirectUrl(String url) {
+ return null;
+ }
+
+ public String encodeRedirectURL(String url) {
+ return null;
+ }
+
+ public String encodeUrl(String url) {
+ return null;
+ }
+
+ public String encodeURL(String url) {
+ return null;
+ }
+
+ public void sendError(int sc, String msg) throws IOException {
+ status = sc;
+ message = msg;
+ }
+
+ public void sendError(int sc) throws IOException {
+ status = sc;
+ }
+
+ public void sendRedirect(String location) throws IOException {
+ }
+
+ public void setDateHeader(String name, long date) {
+ }
+
+ public void setHeader(String name, String value) {
+ }
+
+ public void setIntHeader(String name, int value) {
+ }
+
+ public void setStatus(int sc, String sm) {
+ status = sc;
+ message = sm;
+ }
+
+ public void setStatus(int sc) {
+ status = sc;
+ }
+
+ public void flushBuffer() throws IOException {
+ }
+
+ public int getBufferSize() {
+ return 0;
+ }
+
+ public String getCharacterEncoding() {
+ return encoding;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public Locale getLocale() {
+ return null;
+ }
+
+ public ServletOutputStream getOutputStream() throws IOException {
+ return outputStream;
+ }
+
+ public PrintWriter getWriter() throws IOException {
+ return writer;
+ }
+
+ public boolean isCommitted() {
+ return false;
+ }
+
+ public void reset() {
+ }
+
+ public void resetBuffer() {
+ }
+
+ public void setBufferSize(int size) {
+ }
+
+ public void setCharacterEncoding(String charset) {
+ encoding = charset;
+ }
+
+ public void setContentLength(int len) {
+ }
+
+ public void setContentType(String type) {
+ contentType = type;
+ }
+
+ public void setLocale(Locale loc) {
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getEncoding() {
+ return encoding;
+ }
+
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public String getContent() {
+ writer.flush();
+ return outputStream.toString();
+ }
+}
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: 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=1468595&r1=1468594&r2=1468595&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java (original)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/RulesResourceParserImpl.java Tue Apr 16 20:16:11 2013
@@ -17,6 +17,7 @@
*/
package org.apache.sling.muppet.sling.impl;
+import org.apache.sling.engine.SlingRequestProcessor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -26,6 +27,7 @@ import org.apache.felix.scr.annotations.
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.api.scripting.SlingScript;
import org.apache.sling.muppet.api.MuppetFacade;
import org.apache.sling.muppet.api.Rule;
import org.apache.sling.muppet.api.RuleBuilder;
@@ -39,6 +41,9 @@ public class RulesResourceParserImpl imp
@Reference
private MuppetFacade muppet;
+ @Reference
+ private SlingRequestProcessor requestProcessor;
+
@Override
public List<Rule> parseResource(Resource r) {
final List<Rule> result = new ArrayList<Rule>();
@@ -47,6 +52,29 @@ public class RulesResourceParserImpl imp
}
private void recursivelyParseResource(List<Rule> list, Resource r) {
+
+ // Add Rule for r if available
+ final Rule rule = resourceToRule(r);
+ if(rule != null) {
+ list.add(rule);
+ }
+
+ // And recurse into r's children
+ final Iterator<Resource> it = r.getResourceResolver().listChildren(r);
+ while(it.hasNext()) {
+ recursivelyParseResource(list, it.next());
+ }
+ }
+
+ /** Convert r to a Rule if possible */
+ Rule resourceToRule(Resource r) {
+ // If r adapts to a Sling script, use it to evaluate our Rule
+ final SlingScript script = r.adaptTo(SlingScript.class);
+ if(script != null) {
+ return new Rule(new ScriptSystemAttribute(requestProcessor, script), ScriptSystemAttribute.SUCCESS_STRING);
+ }
+
+ // else convert using available RuleBuilders if suitable
final ValueMap props = r.adaptTo(ValueMap.class);
if(props.containsKey(NAMESPACE) && props.containsKey(RULE_NAME)) {
for(RuleBuilder b : muppet.getRuleBuilders()) {
@@ -57,15 +85,11 @@ public class RulesResourceParserImpl imp
props.get(EXPRESSION, String.class)
);
if(rule != null) {
- list.add(rule);
+ return rule;
}
}
}
- final Iterator<Resource> it = r.getResourceResolver().listChildren(r);
- while(it.hasNext()) {
- recursivelyParseResource(list, it.next());
- }
-
+ return null;
}
}
Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java Tue Apr 16 20:16:11 2013
@@ -0,0 +1,89 @@
+/*
+ * 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.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.engine.SlingRequestProcessor;
+import org.apache.sling.muppet.api.Rule;
+import org.apache.sling.muppet.api.SystemAttribute;
+
+/** Creates {@link Rule} that executes a Sling script and
+ * returns its output, filtered to omit comments and blank lines
+ */
+class ScriptSystemAttribute implements SystemAttribute {
+
+ /** A script must return only this line to be successful, any
+ * other lines besides hash-prefixed comments and empty lines
+ * are considered errors
+ */
+ public static final String SUCCESS_STRING = "TEST_PASSED";
+
+ private final SlingScript script;
+ private final SlingRequestProcessor requestProcessor;
+
+ ScriptSystemAttribute(SlingRequestProcessor processor, SlingScript script) {
+ this.script = script;
+ this.requestProcessor = processor;
+ }
+
+ @Override
+ public String toString() {
+ return script.getScriptResource().getPath();
+ }
+
+ @Override
+ public Object getValue() {
+ try {
+ final HttpRequest req = new HttpRequest(script.getScriptResource().getPath());
+ final HttpResponse resp = new HttpResponse();
+ requestProcessor.processRequest(req, resp, script.getScriptResource().getResourceResolver());
+ if(resp.getStatus() != HttpServletResponse.SC_OK) {
+ return "Unexpected requests status: " + resp.getStatus();
+ }
+ return filterContent(resp.getContent());
+ } catch(Exception e) {
+ return e.toString();
+ }
+ }
+
+ static String filterContent(String content) throws IOException {
+ final BufferedReader br = new BufferedReader(new StringReader(content));
+ String line = null;
+ final StringBuilder result = new StringBuilder();
+ while( (line = br.readLine()) != null) {
+ line = line.trim();
+ if(line.length() == 0) {
+ // ignore
+ } else if(line.startsWith("#")) {
+ // ignore
+ } else {
+ if(result.length() > 0) {
+ result.append('\n');
+ }
+ result.append(line);
+ }
+ }
+ return result.toString();
+ }
+}
\ No newline at end of file
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribute.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java Tue Apr 16 20:16:11 2013
@@ -0,0 +1,22 @@
+package org.apache.sling.muppet.sling.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.servlet.ServletOutputStream;
+
+/** Output stream for our fake HTTP response class */
+public class TestServletOutputStream extends ServletOutputStream {
+
+ private final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+ @Override
+ public String toString() {
+ return bos.toString();
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ bos.write(b);
+ }
+}
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputStream.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: 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=1468595&r1=1468594&r2=1468595&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java (original)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/MockResource.java Tue Apr 16 20:16:11 2013
@@ -6,6 +6,10 @@ import org.apache.sling.api.resource.Res
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.scripting.SlingScript;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
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;
@@ -15,6 +19,7 @@ class MockResource implements Resource {
private final ResourceResolver resolver;
private final ValueMap valueMap;
private final String path;
+ private String scriptCode;
@SuppressWarnings("serial")
static class PropertiesMap extends HashMap<String, Object> implements ValueMap {
@@ -48,6 +53,13 @@ class MockResource implements Resource {
valueMap.put(QUALIFIER, qualifier);
valueMap.put(EXPRESSION, expression);
resolver.addResource(this);
+
+ MockitoAnnotations.initMocks(this);
+ }
+
+ MockResource(MockResolver resolver, String path, String scriptCode) {
+ this(resolver, path, null, null, null, null);
+ this.scriptCode = scriptCode;
}
@SuppressWarnings("unchecked")
@@ -55,6 +67,10 @@ class MockResource implements Resource {
public <AdapterType> AdapterType adaptTo(Class<AdapterType> target) {
if(target == ValueMap.class) {
return (AdapterType)valueMap;
+ } else if(target == SlingScript.class && scriptCode != null) {
+ final SlingScript mockScript = Mockito.mock(SlingScript.class);
+ Mockito.doReturn(this).when(mockScript).getScriptResource();
+ return (AdapterType)mockScript;
}
return null;
}
Modified: 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=1468595&r1=1468594&r2=1468595&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java (original)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/RulesResourceParserTest.java Tue Apr 16 20:16:11 2013
@@ -91,6 +91,22 @@ public class RulesResourceParserTest {
}
@Test
+ public void testScriptResource() {
+ final Resource root = new MockResource(resolver, "/foo", "test", "constant", "5", "> 3");
+ new MockResource(resolver, "/foo/script1", "some script");
+ final List<Rule> rules = parser.parseResource(root);
+ assertEquals(2, rules.size());
+ final String [] expect = {
+ "Rule: test:constant:5 > 3",
+ "Rule: /foo/script1 TEST_PASSED"
+ };
+ final String allText = rules.toString();
+ for(String resText : expect) {
+ assertTrue("Expecting rules list (" + allText + ") to contain " + resText, allText.indexOf(resText) >= 0);
+ }
+ }
+
+ @Test
public void testResourceTree() {
final Resource root = new MockResource(resolver, "/foo", "test", "constant", "5", "> 3");
new MockResource(resolver, "/foo/1", "test", "constant", "12", "A");
Added: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java (added)
+++ sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java Tue Apr 16 20:16: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;
+
+import static org.apache.sling.muppet.api.EvaluationResult.Status.ERROR;
+import static org.apache.sling.muppet.api.EvaluationResult.Status.OK;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.engine.SlingRequestProcessor;
+import org.apache.sling.muppet.api.EvaluationResult;
+import org.apache.sling.muppet.api.Rule;
+import org.junit.Test;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class ScriptSystemAttributeTest {
+
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ private void assertResult(String info, final String scriptOutput, EvaluationResult.Status status) {
+ final Answer<?> answer = new Answer<Object>() {
+ @Override
+ public Object answer(InvocationOnMock invocation) throws Throwable {
+ final HttpServletResponse response = (HttpServletResponse)invocation.getArguments()[1];
+ response.getWriter().write(scriptOutput);
+ response.getWriter().flush();
+ return null;
+ }
+ };
+
+ final SlingRequestProcessor processor = Mockito.mock(SlingRequestProcessor.class);
+
+ try {
+ Mockito.doAnswer(answer).when(processor).processRequest(
+ Matchers.any(HttpServletRequest.class),
+ Matchers.any(HttpServletResponse.class),
+ Matchers.any(ResourceResolver.class));
+ } catch(Exception e) {
+ fail("Exception in processRequest: " + e);
+ }
+
+ final Resource resource = Mockito.mock(Resource.class);
+ final SlingScript script = Mockito.mock(SlingScript.class);
+ Mockito.when(script.getScriptResource()).thenReturn(resource);
+ final ScriptSystemAttribute a = new ScriptSystemAttribute(processor, script);
+
+ final Rule r = new Rule(a, ScriptSystemAttribute.SUCCESS_STRING);
+ assertEquals("Expecting " + status + " for " + info, status,r.evaluate());
+ }
+
+ @Test
+ public void testEmptyScripts() {
+ assertResult("Empty script -> error", "", ERROR);
+ }
+
+ @Test
+ public void testOkScript() {
+ assertResult("TEST_PASSED script -> ok", "TEST_PASSED", OK);
+ }
+
+ @Test
+ public void testComments() {
+ assertResult("TEST_PASSED script and blank line -> ok", "\n\nTEST_PASSED\n\n", OK);
+ assertResult("TEST_PASSED script and comments -> ok", "\n\n#comment\n\t # comment 2\nTEST_PASSED\n\n", OK);
+ }
+
+ @Test
+ public void testDoublePassed() {
+ assertResult("Double TEST_PASSED script -> error", "TEST_PASSED\nTEST_PASSED", ERROR);
+ }
+}
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp (added)
+++ sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp Tue Apr 16 20:16:11 2013
@@ -0,0 +1,4 @@
+# example script that fails as a Muppet rule
+Anything that the script outputs
+that is not TEST_PASSED, and empty line or a comment
+causes it to fail.
Propchange: sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.jsp
------------------------------------------------------------------------------
svn:eol-style = native
Added: sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.esp
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.esp?rev=1468595&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.esp (added)
+++ sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.esp Tue Apr 16 20:16:11 2013
@@ -0,0 +1,2 @@
+# example script that passes as a Muppet rule
+TEST_PASSED
Re: svn commit: r1468595 - in
/sling/trunk/contrib/extensions/muppet: muppet-sling/
muppet-sling/src/main/java/org/apache/sling/muppet/sling/impl/
muppet-sling/src/test/java/org/apache/sling/muppet/sling/
muppet-sling/src/test/java/org/apache/sling/mup...
Posted by Felix Meschberger <fm...@adobe.com>.
Hi,
I have the impression that RulesResourceParser looks like an
AdapterFactory to adapt resources to Rules.
Would it make sense to drop the RulesResourceParser interface (presumably
a public service interface, right ?) and have the parser be an
AdapterFactory ?
Regards
Felix
On 16.04.13 22:16, "bdelacretaz@apache.org" <bd...@apache.org> wrote:
>Author: bdelacretaz
>Date: Tue Apr 16 20:16:11 2013
>New Revision: 1468595
>
>URL: http://svn.apache.org/r1468595
>Log:
>SLING-2822 - direct scripting support added, with two example scripts in
>sling-demo content
>
>Added:
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java (with props)
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java (with props)
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java (with props)
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java (with props)
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java (with props)
>
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-fails.jsp (with props)
>
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-passes.esp
>Modified:
> sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/RulesResourceParserImpl.java
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/MockResource.java
>
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/RulesResourceParserTest.java
>
>Modified: 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=1468595&r1=1468594&r2=1468595&view=diff
>==========================================================================
>====
>--- sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml (original)
>+++ sling/trunk/contrib/extensions/muppet/muppet-sling/pom.xml Tue Apr 16
>20:16:11 2013
>@@ -99,6 +99,12 @@
> <scope>provided</scope>
> </dependency>
> <dependency>
>+ <groupId>org.apache.sling</groupId>
>+ <artifactId>org.apache.sling.engine</artifactId>
>+ <version>2.2.0</version>
>+ <scope>provided</scope>
>+ </dependency>
>+ <dependency>
> <groupId>javax.servlet</groupId>
> <artifactId>servlet-api</artifactId>
> <scope>provided</scope>
>@@ -135,11 +141,17 @@
> <version>4.8.1</version>
> <scope>provided</scope>
> </dependency>
>- <dependency>
>+ <dependency>
> <groupId>org.apache.sling</groupId>
> <artifactId>org.apache.sling.commons.testing</artifactId>
> <version>2.0.14</version>
> <scope>test</scope>
> </dependency>
>+ <dependency>
>+ <groupId>org.mockito</groupId>
>+ <artifactId>mockito-core</artifactId>
>+ <version>1.9.5</version>
>+ <scope>test</scope>
>+ </dependency>
> </dependencies>
> </project>
>
>Added:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-
>sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpRequest.java?re
>v=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java (added)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java Tue Apr 16 20:16:11 2013
>@@ -0,0 +1,265 @@
>+/*
>+ * 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.muppet.sling.impl;
>+
>+import java.io.BufferedReader;
>+import java.io.IOException;
>+import java.io.UnsupportedEncodingException;
>+import java.security.Principal;
>+import java.util.Enumeration;
>+import java.util.HashMap;
>+import java.util.Locale;
>+import java.util.Map;
>+
>+import javax.servlet.RequestDispatcher;
>+import javax.servlet.ServletInputStream;
>+import javax.servlet.http.Cookie;
>+import javax.servlet.http.HttpServletRequest;
>+import javax.servlet.http.HttpSession;
>+
>+/** Fake request used to acquire content from Sling.
>+ * TODO we should really provide those in a Sling utility
>+ * package to avoid reinventing them every time. */
>+public class HttpRequest implements HttpServletRequest {
>+
>+ public static final String FAKE_URL_BASE = "http://example.com";
>+ private final String path;
>+ private final Map<String, Object> attributes;
>+ private final Map<String, String> parameters;
>+
>+ HttpRequest(String path) {
>+ this.path = path;
>+ attributes = new HashMap<String, Object>();
>+ parameters = new HashMap<String, String>();
>+ }
>+
>+ public String getAuthType() {
>+ return null;
>+ }
>+
>+ public String getContextPath() {
>+ return "";
>+ }
>+
>+ public Cookie[] getCookies() {
>+ return null;
>+ }
>+
>+ public long getDateHeader(String name) {
>+ return 0;
>+ }
>+
>+ public String getHeader(String name) {
>+ return null;
>+ }
>+
>+ public Enumeration<?> getHeaderNames() {
>+ return null;
>+ }
>+
>+ public Enumeration<?> getHeaders(String name) {
>+ return null;
>+ }
>+
>+ public int getIntHeader(String name) {
>+ return 0;
>+ }
>+
>+ public String getMethod() {
>+ return "GET";
>+ }
>+
>+ public String getPathInfo() {
>+ return null;
>+ }
>+
>+ public String getPathTranslated() {
>+ return null;
>+ }
>+
>+ public String getQueryString() {
>+ return null;
>+ }
>+
>+ public String getRemoteUser() {
>+ return null;
>+ }
>+
>+ public String getRequestedSessionId() {
>+ return null;
>+ }
>+
>+ public String getRequestURI() {
>+ return path;
>+ }
>+
>+ public StringBuffer getRequestURL() {
>+ return new StringBuffer(FAKE_URL_BASE + path);
>+ }
>+
>+ public String getServletPath() {
>+ return path;
>+ }
>+
>+ public HttpSession getSession() {
>+ return null;
>+ }
>+
>+ public HttpSession getSession(boolean create) {
>+ return null;
>+ }
>+
>+ public Principal getUserPrincipal() {
>+ return null;
>+ }
>+
>+ public boolean isRequestedSessionIdFromCookie() {
>+ return false;
>+ }
>+
>+ public boolean isRequestedSessionIdFromUrl() {
>+ return false;
>+ }
>+
>+ public boolean isRequestedSessionIdFromURL() {
>+ return false;
>+ }
>+
>+ public boolean isRequestedSessionIdValid() {
>+ return false;
>+ }
>+
>+ public boolean isUserInRole(String role) {
>+ return false;
>+ }
>+
>+ public Object getAttribute(String name) {
>+ return attributes.get(name);
>+ }
>+
>+ public Enumeration<?> getAttributeNames() {
>+ return null;
>+ }
>+
>+ public String getCharacterEncoding() {
>+ return null;
>+ }
>+
>+ public int getContentLength() {
>+ return 0;
>+ }
>+
>+ public String getContentType() {
>+ return null;
>+ }
>+
>+ public ServletInputStream getInputStream() throws IOException {
>+ return null;
>+ }
>+
>+ public String getLocalAddr() {
>+ return null;
>+ }
>+
>+ public Locale getLocale() {
>+ return null;
>+ }
>+
>+ public Enumeration<?> getLocales() {
>+ return null;
>+ }
>+
>+ public String getLocalName() {
>+ return null;
>+ }
>+
>+ public int getLocalPort() {
>+ return 0;
>+ }
>+
>+ public String getParameter(String name) {
>+ return null;
>+ }
>+
>+ public Map<?,?> getParameterMap() {
>+ return parameters;
>+ }
>+
>+ public Enumeration<?> getParameterNames() {
>+ return null;
>+ }
>+
>+ public String[] getParameterValues(String name) {
>+ return null;
>+ }
>+
>+ public String getProtocol() {
>+ return null;
>+ }
>+
>+ public BufferedReader getReader() throws IOException {
>+ return null;
>+ }
>+
>+ public String getRealPath(String path) {
>+ return null;
>+ }
>+
>+ public String getRemoteAddr() {
>+ return null;
>+ }
>+
>+ public String getRemoteHost() {
>+ return null;
>+ }
>+
>+ public int getRemotePort() {
>+ return 0;
>+ }
>+
>+ public RequestDispatcher getRequestDispatcher(String path) {
>+ return null;
>+ }
>+
>+ public String getScheme() {
>+ return "http";
>+ }
>+
>+ public String getServerName() {
>+ return null;
>+ }
>+
>+ public int getServerPort() {
>+ return 0;
>+ }
>+
>+ public boolean isSecure() {
>+ return false;
>+ }
>+
>+ public void removeAttribute(String name) {
>+ attributes.remove(name);
>+ }
>+
>+ public void setAttribute(String name, Object o) {
>+ attributes.put(name, o);
>+ }
>+
>+ public void setCharacterEncoding(String env)
>+ throws UnsupportedEncodingException {
>+ }
>+}
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpRequest.java
>--------------------------------------------------------------------------
>----
> svn:keywords = Author Date Id Revision Rev URL
>
>Added:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-
>sling/src/main/java/org/apache/sling/muppet/sling/impl/HttpResponse.java?r
>ev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java (added)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java Tue Apr 16 20:16:11 2013
>@@ -0,0 +1,170 @@
>+package org.apache.sling.muppet.sling.impl;
>+
>+import java.io.IOException;
>+import java.io.OutputStreamWriter;
>+import java.io.PrintWriter;
>+import java.io.UnsupportedEncodingException;
>+import java.util.Locale;
>+
>+import javax.servlet.ServletOutputStream;
>+import javax.servlet.http.Cookie;
>+import javax.servlet.http.HttpServletResponse;
>+
>+/** Fake response used to acquire content from Sling
>+ * TODO we should really provide those in a Sling utility
>+ * package to avoid reinventing them every time. */
>+public class HttpResponse implements HttpServletResponse {
>+
>+ private int status = 200;
>+ private String message;
>+ private String encoding = "UTF-8";
>+ private String contentType;
>+ private final TestServletOutputStream outputStream;
>+ private final PrintWriter writer;
>+
>+ HttpResponse() throws UnsupportedEncodingException {
>+ outputStream = new TestServletOutputStream();
>+ writer = new PrintWriter(new OutputStreamWriter(outputStream,
>encoding));
>+ }
>+
>+ public void addCookie(Cookie cookie) {
>+ }
>+
>+ public void addDateHeader(String name, long date) {
>+ }
>+
>+ public void addHeader(String name, String value) {
>+ }
>+
>+ public void addIntHeader(String name, int value) {
>+ }
>+
>+ public boolean containsHeader(String name) {
>+ return false;
>+ }
>+
>+ public String encodeRedirectUrl(String url) {
>+ return null;
>+ }
>+
>+ public String encodeRedirectURL(String url) {
>+ return null;
>+ }
>+
>+ public String encodeUrl(String url) {
>+ return null;
>+ }
>+
>+ public String encodeURL(String url) {
>+ return null;
>+ }
>+
>+ public void sendError(int sc, String msg) throws IOException {
>+ status = sc;
>+ message = msg;
>+ }
>+
>+ public void sendError(int sc) throws IOException {
>+ status = sc;
>+ }
>+
>+ public void sendRedirect(String location) throws IOException {
>+ }
>+
>+ public void setDateHeader(String name, long date) {
>+ }
>+
>+ public void setHeader(String name, String value) {
>+ }
>+
>+ public void setIntHeader(String name, int value) {
>+ }
>+
>+ public void setStatus(int sc, String sm) {
>+ status = sc;
>+ message = sm;
>+ }
>+
>+ public void setStatus(int sc) {
>+ status = sc;
>+ }
>+
>+ public void flushBuffer() throws IOException {
>+ }
>+
>+ public int getBufferSize() {
>+ return 0;
>+ }
>+
>+ public String getCharacterEncoding() {
>+ return encoding;
>+ }
>+
>+ public String getContentType() {
>+ return contentType;
>+ }
>+
>+ public Locale getLocale() {
>+ return null;
>+ }
>+
>+ public ServletOutputStream getOutputStream() throws IOException {
>+ return outputStream;
>+ }
>+
>+ public PrintWriter getWriter() throws IOException {
>+ return writer;
>+ }
>+
>+ public boolean isCommitted() {
>+ return false;
>+ }
>+
>+ public void reset() {
>+ }
>+
>+ public void resetBuffer() {
>+ }
>+
>+ public void setBufferSize(int size) {
>+ }
>+
>+ public void setCharacterEncoding(String charset) {
>+ encoding = charset;
>+ }
>+
>+ public void setContentLength(int len) {
>+ }
>+
>+ public void setContentType(String type) {
>+ contentType = type;
>+ }
>+
>+ public void setLocale(Locale loc) {
>+ }
>+
>+ public String getMessage() {
>+ return message;
>+ }
>+
>+ public void setMessage(String message) {
>+ this.message = message;
>+ }
>+
>+ public String getEncoding() {
>+ return encoding;
>+ }
>+
>+ public void setEncoding(String encoding) {
>+ this.encoding = encoding;
>+ }
>+
>+ public int getStatus() {
>+ return status;
>+ }
>+
>+ public String getContent() {
>+ writer.flush();
>+ return outputStream.toString();
>+ }
>+}
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/HttpResponse.java
>--------------------------------------------------------------------------
>----
> svn:keywords = Author Date Id Revision Rev URL
>
>Modified:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/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/RulesResourceParser
>Impl.java?rev=1468595&r1=1468594&r2=1468595&view=diff
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/RulesResourceParserImpl.java (original)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/RulesResourceParserImpl.java Tue Apr 16
>20:16:11 2013
>@@ -17,6 +17,7 @@
> */
> package org.apache.sling.muppet.sling.impl;
>
>+import org.apache.sling.engine.SlingRequestProcessor;
> import java.util.ArrayList;
> import java.util.Iterator;
> import java.util.List;
>@@ -26,6 +27,7 @@ import org.apache.felix.scr.annotations.
> 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.api.scripting.SlingScript;
> import org.apache.sling.muppet.api.MuppetFacade;
> import org.apache.sling.muppet.api.Rule;
> import org.apache.sling.muppet.api.RuleBuilder;
>@@ -39,6 +41,9 @@ public class RulesResourceParserImpl imp
> @Reference
> private MuppetFacade muppet;
>
>+ @Reference
>+ private SlingRequestProcessor requestProcessor;
>+
> @Override
> public List<Rule> parseResource(Resource r) {
> final List<Rule> result = new ArrayList<Rule>();
>@@ -47,6 +52,29 @@ public class RulesResourceParserImpl imp
> }
>
> private void recursivelyParseResource(List<Rule> list, Resource r) {
>+
>+ // Add Rule for r if available
>+ final Rule rule = resourceToRule(r);
>+ if(rule != null) {
>+ list.add(rule);
>+ }
>+
>+ // And recurse into r's children
>+ final Iterator<Resource> it =
>r.getResourceResolver().listChildren(r);
>+ while(it.hasNext()) {
>+ recursivelyParseResource(list, it.next());
>+ }
>+ }
>+
>+ /** Convert r to a Rule if possible */
>+ Rule resourceToRule(Resource r) {
>+ // If r adapts to a Sling script, use it to evaluate our Rule
>+ final SlingScript script = r.adaptTo(SlingScript.class);
>+ if(script != null) {
>+ return new Rule(new ScriptSystemAttribute(requestProcessor,
>script), ScriptSystemAttribute.SUCCESS_STRING);
>+ }
>+
>+ // else convert using available RuleBuilders if suitable
> final ValueMap props = r.adaptTo(ValueMap.class);
> if(props.containsKey(NAMESPACE) && props.containsKey(RULE_NAME))
>{
> for(RuleBuilder b : muppet.getRuleBuilders()) {
>@@ -57,15 +85,11 @@ public class RulesResourceParserImpl imp
> props.get(EXPRESSION, String.class)
> );
> if(rule != null) {
>- list.add(rule);
>+ return rule;
> }
> }
> }
>
>- final Iterator<Resource> it =
>r.getResourceResolver().listChildren(r);
>- while(it.hasNext()) {
>- recursivelyParseResource(list, it.next());
>- }
>-
>+ return null;
> }
> }
>
>Added:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-
>sling/src/main/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribu
>te.java?rev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java (added)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java Tue Apr 16 20:16:11
>2013
>@@ -0,0 +1,89 @@
>+/*
>+ * 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.BufferedReader;
>+import java.io.IOException;
>+import java.io.StringReader;
>+
>+import javax.servlet.http.HttpServletResponse;
>+
>+import org.apache.sling.api.scripting.SlingScript;
>+import org.apache.sling.engine.SlingRequestProcessor;
>+import org.apache.sling.muppet.api.Rule;
>+import org.apache.sling.muppet.api.SystemAttribute;
>+
>+/** Creates {@link Rule} that executes a Sling script and
>+ * returns its output, filtered to omit comments and blank lines
>+ */
>+class ScriptSystemAttribute implements SystemAttribute {
>+
>+ /** A script must return only this line to be successful, any
>+ * other lines besides hash-prefixed comments and empty lines
>+ * are considered errors
>+ */
>+ public static final String SUCCESS_STRING = "TEST_PASSED";
>+
>+ private final SlingScript script;
>+ private final SlingRequestProcessor requestProcessor;
>+
>+ ScriptSystemAttribute(SlingRequestProcessor processor, SlingScript
>script) {
>+ this.script = script;
>+ this.requestProcessor = processor;
>+ }
>+
>+ @Override
>+ public String toString() {
>+ return script.getScriptResource().getPath();
>+ }
>+
>+ @Override
>+ public Object getValue() {
>+ try {
>+ final HttpRequest req = new
>HttpRequest(script.getScriptResource().getPath());
>+ final HttpResponse resp = new HttpResponse();
>+ requestProcessor.processRequest(req, resp,
>script.getScriptResource().getResourceResolver());
>+ if(resp.getStatus() != HttpServletResponse.SC_OK) {
>+ return "Unexpected requests status: " + resp.getStatus();
>+ }
>+ return filterContent(resp.getContent());
>+ } catch(Exception e) {
>+ return e.toString();
>+ }
>+ }
>+
>+ static String filterContent(String content) throws IOException {
>+ final BufferedReader br = new BufferedReader(new
>StringReader(content));
>+ String line = null;
>+ final StringBuilder result = new StringBuilder();
>+ while( (line = br.readLine()) != null) {
>+ line = line.trim();
>+ if(line.length() == 0) {
>+ // ignore
>+ } else if(line.startsWith("#")) {
>+ // ignore
>+ } else {
>+ if(result.length() > 0) {
>+ result.append('\n');
>+ }
>+ result.append(line);
>+ }
>+ }
>+ return result.toString();
>+ }
>+}
>\ No newline at end of file
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttribute.java
>--------------------------------------------------------------------------
>----
> svn:keywords = Author Date Id Revision Rev URL
>
>Added:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-
>sling/src/main/java/org/apache/sling/muppet/sling/impl/TestServletOutputSt
>ream.java?rev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java (added)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java Tue Apr 16
>20:16:11 2013
>@@ -0,0 +1,22 @@
>+package org.apache.sling.muppet.sling.impl;
>+
>+import java.io.ByteArrayOutputStream;
>+import java.io.IOException;
>+
>+import javax.servlet.ServletOutputStream;
>+
>+/** Output stream for our fake HTTP response class */
>+public class TestServletOutputStream extends ServletOutputStream {
>+
>+ private final ByteArrayOutputStream bos = new
>ByteArrayOutputStream();
>+
>+ @Override
>+ public String toString() {
>+ return bos.toString();
>+ }
>+
>+ @Override
>+ public void write(int b) throws IOException {
>+ bos.write(b);
>+ }
>+}
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/main/java/org/apach
>e/sling/muppet/sling/impl/TestServletOutputStream.java
>--------------------------------------------------------------------------
>----
> svn:keywords = Author Date Id Revision Rev URL
>
>Modified:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/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=14
>68595&r1=1468594&r2=1468595&view=diff
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/MockResource.java (original)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/MockResource.java Tue Apr 16 20:16:11 2013
>@@ -6,6 +6,10 @@ import org.apache.sling.api.resource.Res
> import org.apache.sling.api.resource.ResourceMetadata;
> import org.apache.sling.api.resource.ResourceResolver;
> import org.apache.sling.api.resource.ValueMap;
>+import org.apache.sling.api.scripting.SlingScript;
>+import org.mockito.Mockito;
>+import org.mockito.MockitoAnnotations;
>+
> 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;
>@@ -15,6 +19,7 @@ class MockResource implements Resource {
> private final ResourceResolver resolver;
> private final ValueMap valueMap;
> private final String path;
>+ private String scriptCode;
>
> @SuppressWarnings("serial")
> static class PropertiesMap extends HashMap<String, Object>
>implements ValueMap {
>@@ -48,6 +53,13 @@ class MockResource implements Resource {
> valueMap.put(QUALIFIER, qualifier);
> valueMap.put(EXPRESSION, expression);
> resolver.addResource(this);
>+
>+ MockitoAnnotations.initMocks(this);
>+ }
>+
>+ MockResource(MockResolver resolver, String path, String scriptCode) {
>+ this(resolver, path, null, null, null, null);
>+ this.scriptCode = scriptCode;
> }
>
> @SuppressWarnings("unchecked")
>@@ -55,6 +67,10 @@ class MockResource implements Resource {
> public <AdapterType> AdapterType adaptTo(Class<AdapterType> target) {
> if(target == ValueMap.class) {
> return (AdapterType)valueMap;
>+ } else if(target == SlingScript.class && scriptCode != null) {
>+ final SlingScript mockScript =
>Mockito.mock(SlingScript.class);
>+ Mockito.doReturn(this).when(mockScript).getScriptResource();
>+ return (AdapterType)mockScript;
> }
> return null;
> }
>
>Modified:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/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=1468595&r1=1468594&r2=1468595&view=diff
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/RulesResourceParserTest.java (original)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/RulesResourceParserTest.java Tue Apr 16 20:16:11 2013
>@@ -91,6 +91,22 @@ public class RulesResourceParserTest {
> }
>
> @Test
>+ public void testScriptResource() {
>+ final Resource root = new MockResource(resolver, "/foo", "test",
>"constant", "5", "> 3");
>+ new MockResource(resolver, "/foo/script1", "some script");
>+ final List<Rule> rules = parser.parseResource(root);
>+ assertEquals(2, rules.size());
>+ final String [] expect = {
>+ "Rule: test:constant:5 > 3",
>+ "Rule: /foo/script1 TEST_PASSED"
>+ };
>+ final String allText = rules.toString();
>+ for(String resText : expect) {
>+ assertTrue("Expecting rules list (" + allText + ") to
>contain " + resText, allText.indexOf(resText) >= 0);
>+ }
>+ }
>+
>+ @Test
> public void testResourceTree() {
> final Resource root = new MockResource(resolver, "/foo", "test",
>"constant", "5", "> 3");
> new MockResource(resolver, "/foo/1", "test", "constant", "12",
>"A");
>
>Added:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/muppet-
>sling/src/test/java/org/apache/sling/muppet/sling/impl/ScriptSystemAttribu
>teTest.java?rev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java (added)
>+++
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java Tue Apr 16
>20:16: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;
>+
>+import static org.apache.sling.muppet.api.EvaluationResult.Status.ERROR;
>+import static org.apache.sling.muppet.api.EvaluationResult.Status.OK;
>+import static org.junit.Assert.assertEquals;
>+import static org.junit.Assert.fail;
>+
>+import javax.servlet.http.HttpServletRequest;
>+import javax.servlet.http.HttpServletResponse;
>+
>+import org.apache.sling.api.resource.Resource;
>+import org.apache.sling.api.resource.ResourceResolver;
>+import org.apache.sling.api.scripting.SlingScript;
>+import org.apache.sling.engine.SlingRequestProcessor;
>+import org.apache.sling.muppet.api.EvaluationResult;
>+import org.apache.sling.muppet.api.Rule;
>+import org.junit.Test;
>+import org.mockito.Matchers;
>+import org.mockito.Mockito;
>+import org.mockito.MockitoAnnotations;
>+import org.mockito.invocation.InvocationOnMock;
>+import org.mockito.stubbing.Answer;
>+
>+public class ScriptSystemAttributeTest {
>+
>+ public void setup() {
>+ MockitoAnnotations.initMocks(this);
>+ }
>+
>+ private void assertResult(String info, final String scriptOutput,
>EvaluationResult.Status status) {
>+ final Answer<?> answer = new Answer<Object>() {
>+ @Override
>+ public Object answer(InvocationOnMock invocation) throws
>Throwable {
>+ final HttpServletResponse response =
>(HttpServletResponse)invocation.getArguments()[1];
>+ response.getWriter().write(scriptOutput);
>+ response.getWriter().flush();
>+ return null;
>+ }
>+ };
>+
>+ final SlingRequestProcessor processor =
>Mockito.mock(SlingRequestProcessor.class);
>+
>+ try {
>+ Mockito.doAnswer(answer).when(processor).processRequest(
>+ Matchers.any(HttpServletRequest.class),
>+ Matchers.any(HttpServletResponse.class),
>+ Matchers.any(ResourceResolver.class));
>+ } catch(Exception e) {
>+ fail("Exception in processRequest: " + e);
>+ }
>+
>+ final Resource resource = Mockito.mock(Resource.class);
>+ final SlingScript script = Mockito.mock(SlingScript.class);
>+ Mockito.when(script.getScriptResource()).thenReturn(resource);
>+ final ScriptSystemAttribute a = new
>ScriptSystemAttribute(processor, script);
>+
>+ final Rule r = new Rule(a, ScriptSystemAttribute.SUCCESS_STRING);
>+ assertEquals("Expecting " + status + " for " + info,
>status,r.evaluate());
>+ }
>+
>+ @Test
>+ public void testEmptyScripts() {
>+ assertResult("Empty script -> error", "", ERROR);
>+ }
>+
>+ @Test
>+ public void testOkScript() {
>+ assertResult("TEST_PASSED script -> ok", "TEST_PASSED", OK);
>+ }
>+
>+ @Test
>+ public void testComments() {
>+ assertResult("TEST_PASSED script and blank line -> ok",
>"\n\nTEST_PASSED\n\n", OK);
>+ assertResult("TEST_PASSED script and comments -> ok",
>"\n\n#comment\n\t # comment 2\nTEST_PASSED\n\n", OK);
>+ }
>+
>+ @Test
>+ public void testDoublePassed() {
>+ assertResult("Double TEST_PASSED script -> error",
>"TEST_PASSED\nTEST_PASSED", ERROR);
>+ }
>+}
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/muppet-sling/src/test/java/org/apach
>e/sling/muppet/sling/impl/ScriptSystemAttributeTest.java
>--------------------------------------------------------------------------
>----
> svn:keywords = Author Date Id Revision Rev URL
>
>Added:
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-fails.jsp
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/sling-d
>emo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-fails.js
>p?rev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-fails.jsp (added)
>+++
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-fails.jsp Tue Apr 16 20:16:11 2013
>@@ -0,0 +1,4 @@
>+# example script that fails as a Muppet rule
>+Anything that the script outputs
>+that is not TEST_PASSED, and empty line or a comment
>+causes it to fail.
>
>Propchange:
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-fails.jsp
>--------------------------------------------------------------------------
>----
> svn:eol-style = native
>
>Added:
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-passes.esp
>URL:
>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/muppet/sling-d
>emo/src/main/resources/SLING-CONTENT/apps/muppet/demo/script-that-passes.e
>sp?rev=1468595&view=auto
>==========================================================================
>====
>---
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-passes.esp (added)
>+++
>sling/trunk/contrib/extensions/muppet/sling-demo/src/main/resources/SLING-
>CONTENT/apps/muppet/demo/script-that-passes.esp Tue Apr 16 20:16:11 2013
>@@ -0,0 +1,2 @@
>+# example script that passes as a Muppet rule
>+TEST_PASSED
>
>