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 2007/11/03 12:59:55 UTC
svn commit: r591606 - in /incubator/sling/trunk/microsling/microsling-core:
./ src/main/java/org/apache/sling/microsling/scripting/
src/main/java/org/apache/sling/microsling/scripting/engines/ruby/
src/main/webapp/ src/test/java/org/apache/sling/micros...
Author: bdelacretaz
Date: Sat Nov 3 04:59:55 2007
New Revision: 591606
URL: http://svn.apache.org/viewvc?rev=591606&view=rev
Log:
SLING-90 - Ruby Erb templates support, contributed by Shawn Anderson, thanks!
Added:
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java (with props)
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html (with props)
incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test.erb
Modified:
incubator/sling/trunk/microsling/microsling-core/NOTICE
incubator/sling/trunk/microsling/microsling-core/pom.xml
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java
incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html
incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java
incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java
Modified: incubator/sling/trunk/microsling/microsling-core/NOTICE
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/NOTICE?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/NOTICE (original)
+++ incubator/sling/trunk/microsling/microsling-core/NOTICE Sat Nov 3 04:59:55 2007
@@ -5,10 +5,15 @@
The Apache Software Foundation (http://www.apache.org/).
FreeMarker templates support is provided by the FreeMarker
-libraries, which are open-source software licensed under
-a BSD-like license (http://freemarker.org/docs/app_license.html).
+libraries, which are licensed under a BSD-like license
+(http://freemarker.org/docs/app_license.html).
The original FreeMarker software can be downloaded at
http://freemarker.org/ .
+
+Ruby templates support is provided by the JRuby libraries,
+which are licensed under CPL 1.0 license.
+The original JRuby software can be downloaded at
+http://jruby.codehaus.org/ .
Server-side javascript support is provided by the Rhino
libraries, which are open-source software licensed under
Modified: incubator/sling/trunk/microsling/microsling-core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/pom.xml?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/pom.xml (original)
+++ incubator/sling/trunk/microsling/microsling-core/pom.xml Sat Nov 3 04:59:55 2007
@@ -56,6 +56,11 @@
<dependencies>
<dependency>
+ <groupId>org.jruby</groupId>
+ <artifactId>jruby-complete</artifactId>
+ <version>1.0RC3</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.sling</groupId>
<artifactId>sling-api</artifactId>
<version>2.0.0-incubator-SNAPSHOT</version>
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java Sat Nov 3 04:59:55 2007
@@ -42,6 +42,7 @@
import org.apache.sling.api.scripting.SlingScriptResolver;
import org.apache.sling.microsling.resource.JcrNodeResource;
import org.apache.sling.microsling.scripting.engines.freemarker.FreemarkerScriptEngine;
+import org.apache.sling.microsling.scripting.engines.ruby.ErbScriptEngine;
import org.apache.sling.microsling.scripting.engines.rhino.RhinoJavasSriptEngine;
import org.apache.sling.microsling.scripting.engines.velocity.VelocityTemplatesScriptEngine;
import org.apache.sling.microsling.scripting.helpers.ScriptFilenameBuilder;
@@ -80,6 +81,7 @@
addScriptEngine(new RhinoJavasSriptEngine());
addScriptEngine(new VelocityTemplatesScriptEngine());
addScriptEngine(new FreemarkerScriptEngine());
+ addScriptEngine(new ErbScriptEngine());
}
/**
Added: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java?rev=591606&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java Sat Nov 3 04:59:55 2007
@@ -0,0 +1,123 @@
+/*
+ * 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.microsling.scripting.engines.ruby;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.api.HttpStatusCodeException;
+import org.apache.sling.api.SlingException;
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.api.scripting.SlingScriptEngine;
+import org.jruby.Ruby;
+import org.jruby.RubyModule;
+import org.jruby.RubySymbol;
+import org.jruby.javasupport.JavaEmbedUtils;
+import org.jruby.runtime.builtin.IRubyObject;
+
+/**
+ * A ScriptEngine that uses ruby erb templates to render a Resource
+ */
+public class ErbScriptEngine implements SlingScriptEngine {
+
+ public static final String RUBY_SCRIPT_EXTENSION = "erb";
+ public Ruby runtime;
+ RubySymbol bindingSym;
+ RubyModule erbModule;
+
+ public ErbScriptEngine() throws SlingException {
+ runtime = Ruby.getDefaultInstance();
+
+ runtime.evalScript("require 'java';require 'erb';self.send :include, ERB::Util;class ERB;def get_binding;binding;end;attr_reader :props;def set_props(p);@props = p;"
+ + "for name,v in @props;instance_eval \"def #{name}; @props['#{name}'];end\";end;end;end;");
+
+ erbModule = runtime.getClassFromPath("ERB");
+ bindingSym = RubySymbol.newSymbol(runtime, "get_binding");
+ }
+
+ public String[] getExtensions() {
+ return new String[]{RUBY_SCRIPT_EXTENSION};
+ }
+
+ public String getEngineName() {
+ return "Ruby Erb Script Engine";
+ }
+
+ public String getEngineVersion() {
+ return "0.9";
+ }
+
+ public void eval(SlingScript script, Map<String, Object> props)
+ throws SlingException, IOException {
+ // ensure get method
+ HttpServletRequest request = (HttpServletRequest) props.get(REQUEST);
+ if(!"GET".equals(request.getMethod())) {
+ throw new HttpStatusCodeException(
+ HttpServletResponse.SC_METHOD_NOT_ALLOWED,
+ "Ruby templates only support GET requests");
+ }
+
+ try {
+ final Writer w = ((HttpServletResponse) props.get(RESPONSE)).getWriter();
+ PrintStream stream = new PrintStream(new OutputStream() {
+ public void write(int b) {
+ try {
+ w.write(b);
+ } catch(IOException ex) {
+ }
+ }
+ });
+
+ StringBuffer scriptString = new StringBuffer();
+ BufferedReader bufferedScript = (BufferedReader) script.getScriptReader();
+ String nextLine = bufferedScript.readLine();
+ while(nextLine != null) {
+ scriptString.append(nextLine);
+ scriptString.append("\n");
+ nextLine = bufferedScript.readLine();
+ }
+
+ IRubyObject scriptRubyString = JavaEmbedUtils.javaToRuby(runtime, scriptString.toString());
+ IRubyObject erb = (IRubyObject) JavaEmbedUtils
+ .invokeMethod(runtime, erbModule, "new", new Object[]{scriptRubyString}, IRubyObject.class);
+
+ JavaEmbedUtils.invokeMethod(runtime, erb, "set_props",
+ new Object[]{JavaEmbedUtils.javaToRuby(runtime, props)}, IRubyObject.class);
+
+ IRubyObject binding = (IRubyObject) JavaEmbedUtils
+ .invokeMethod(runtime, erb, "send", new Object[]{bindingSym}, IRubyObject.class);
+
+ String out = (String) JavaEmbedUtils.invokeMethod(runtime, erb, "result",
+ new Object[]{(Object) binding}, String.class);
+
+ stream.println(out);
+ stream.flush();
+
+ } catch(IOException ioe) {
+ throw ioe;
+ } catch(Throwable t) {
+ throw new SlingException("Failure running Ruby script ", t);
+ }
+ }
+}
Propchange: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/engines/ruby/ErbScriptEngine.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html?rev=591606&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html Sat Nov 3 04:59:55 2007
@@ -0,0 +1,39 @@
+<html>
+<head>
+ <title>microsling Ruby Erb templates</title>
+ <link rel="stylesheet" href="microsling.css"/>
+</head>
+<body>
+ <h1>microsling Ruby Erb templates</h1>
+
+ <div class="note">
+ <a href="../">back to homepage</a>
+ </div>
+ <p>
+ Scripts found by the <code>SlingScriptResolver</code> using the <code>.erb</code> extension are executed by
+ the <code>ErbScriptEngine</code>.
+ </p>
+ <p>
+ This works exactly like the <a href="velocity-scripts.html">Velocity templates</a>, except that
+ templates use the Erb syntax.
+ </p>
+ <p>
+ Here's an example HTML template. See the <a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/">Erb docs</a> website
+ more info about the syntax.
+ <pre>
+ <html>
+ <body>
+ <p><span>This is an example Erb template <%= Time.now %></span></p>
+ <p><span><%= resource.getItem().getProperty("text").getString() %></span></p>
+ <% unless props.nil? or props.empty? %>
+ <table>
+ <% for prop, val in props %>
+ <tr><td><b><%= prop %></b>:</td><td><%= val %></td></tr>
+ <% end %>
+ </table>
+ <% end %>
+ </body>
+ </html></pre>
+ </p>
+</body>
+</html>
Propchange: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/erb-scripts.html
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/webapp/index.html Sat Nov 3 04:59:55 2007
@@ -40,6 +40,11 @@
FreeMarker templates
</a>: explains how to use FreeMarker templates to render content.
</li>
+ <li>
+ <a href="erb-scripts.html">
+ Ruby Erb templates
+ </a>: explains how to use Ruby Erb templates to render content.
+ </li>
</ul>
<h2>Show me the code</h2>
@@ -144,4 +149,4 @@
</ul>
</p>
</body>
-</html>
\ No newline at end of file
+</html>
Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java Sat Nov 3 04:59:55 2007
@@ -119,4 +119,15 @@
testClient.delete(toDelete);
}
}
-}
\ No newline at end of file
+
+ public void testErbHtml() throws IOException {
+ final String toDelete = uploadTestScript("rendering-test.erb","html.erb");
+ try {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertTrue("Content includes Ruby marker",content.contains("Ruby template"));
+ assertTrue("Content contains formatted test text",content.contains("<p><span>" + testText + "</span></p>"));
+ } finally {
+ testClient.delete(toDelete);
+ }
+ }
+}
Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java?rev=591606&r1=591605&r2=591606&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java Sat Nov 3 04:59:55 2007
@@ -123,4 +123,15 @@
testClient.delete(toDelete);
}
}
+
+ public void testErbHtml() throws IOException {
+ final String toDelete = uploadTestScript("rendering-test.erb","html.erb");
+ try {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertTrue("Content includes Ruby marker",content.contains("Ruby template"));
+ assertTrue("Content contains formatted test text",content.contains("<p><span>" + testText + "</span></p>"));
+ } finally {
+ testClient.delete(toDelete);
+ }
+ }
}
Added: incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test.erb
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test.erb?rev=591606&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test.erb (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test.erb Sat Nov 3 04:59:55 2007
@@ -0,0 +1,15 @@
+!-- used by ScriptedRenderingTest -->
+<html>
+ <body>
+ <p><span>Ruby template <%= Time.now %></span></p>
+ <p><span><%= resource.getRawData().getProperty("text").getString() %></span></p>
+ <% unless props.nil? or props.empty? %>
+ <table>
+ <% for prop, val in props %>
+ <tr><td><b><%= prop %></b>:</td><td><%= val %></td></tr>
+ <% end %>
+ </table>
+ <% end %>
+ </body>
+</html>
+