You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/11/20 20:06:53 UTC
svn commit: r1037303 - in
/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages:
./ src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/
src/main/resources/org/apache/cler...
Author: reto
Date: Sat Nov 20 19:06:53 2010
New Revision: 1037303
URL: http://svn.apache.org/viewvc?rev=1037303&view=rev
Log:
CLEREZZA-362: modified to user rendering utilities for scala and compile classes rather than compiledscript
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/ (props changed)
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/pom.xml
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt
Propchange: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sat Nov 20 19:06:53 2010
@@ -2,3 +2,4 @@
.settings
target
.project
+.externalToolBuilders
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/pom.xml?rev=1037303&r1=1037302&r2=1037303&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/pom.xml (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/pom.xml Sat Nov 20 19:06:53 2010
@@ -26,6 +26,10 @@
<artifactId>org.apache.clerezza.platform.typerendering.core</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.clerezza.scala</groupId>
+ <artifactId>script-engine</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</dependency>
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java?rev=1037303&r1=1037302&r2=1037303&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java Sat Nov 20 19:06:53 2010
@@ -18,27 +18,23 @@
*/
package org.apache.clerezza.platform.typerendering.scalaserverpages;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
import java.io.IOException;
-import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
+import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.Map;
import java.lang.reflect.Type;
+import java.nio.charset.Charset;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
import java.util.HashMap;
-import javax.script.Compilable;
-import javax.script.CompiledScript;
-import javax.script.ScriptEngineFactory;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
@@ -49,6 +45,8 @@ import org.apache.clerezza.platform.type
import org.apache.clerezza.rdf.utils.GraphNode;
import org.apache.clerezza.platform.typerendering.RenderingspecificationException;
import org.apache.clerezza.platform.typerendering.TypeRenderingException;
+import org.apache.clerezza.scala.scripting.CompileErrorsException;
+import org.apache.clerezza.scala.scripting.CompilerService;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
@@ -66,8 +64,10 @@ import scala.collection.Seq;
@Service(Renderlet.class)
public class ScalaServerPagesRenderlet implements Renderlet {
- @Reference(target = "(javax.script.language=scala)")
- private ScriptEngineFactory scalaScriptEngineFactory;
+ final Charset UTF8 = Charset.forName("UTF-8");
+
+ @Reference
+ private CompilerService scalaCompilerService;
private static final Logger logger = LoggerFactory.getLogger(ScalaServerPagesRenderlet.class);
private int byteHeaderLines = 0;
private Type multiStringObjectMapType;
@@ -86,14 +86,15 @@ public class ScalaServerPagesRenderlet i
public ScalaServerPagesRenderlet() {
}
private final String lineSeparator = System.getProperty("line.separator");
- private final byte[] byteHeader;
+ private final char[] headerChars;
{
- final InputStream in = ScalaServerPagesRenderlet.class.getResourceAsStream("implicit-header.txt");
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final Reader in = new InputStreamReader(ScalaServerPagesRenderlet.class.getResourceAsStream("implicit-header.txt"),
+ UTF8);
+ final CharArrayWriter caos = new CharArrayWriter();
try {
for (int ch = in.read(); ch != -1; ch = in.read()) {
- baos.write(ch);
+ caos.write(ch);
}
} catch (IOException e) {
throw new RuntimeException(e);
@@ -104,11 +105,13 @@ public class ScalaServerPagesRenderlet i
throw new RuntimeException(e);
}
}
- byteHeader = baos.toByteArray();
+ headerChars = caos.toCharArray();
}
- private final byte[] byteCloser = (";}" + lineSeparator).getBytes();
+ private final char[] footerChars = (";}" + lineSeparator + "}"
+ + lineSeparator + "}" + lineSeparator + "}" + lineSeparator).toCharArray();
//TODO a map with SoftReferences as keys
- private Map<String, CompiledScript> compiledScripts = new HashMap<String, CompiledScript>();
+ private Map<String, Renderlet> compiledRenderlet = Collections.synchronizedMap(
+ new HashMap<String, Renderlet>());
@Override
public void render(GraphNode res, GraphNode context, Map<String, Object> sharedRenderingValues,
@@ -117,32 +120,16 @@ public class ScalaServerPagesRenderlet i
RequestProperties requestProperties, OutputStream os) throws IOException {
try {
logger.debug("ScalaServerPagesRenderlet rendering");
- final byte[] scriptBytes = getScriptBytes(renderingSpecification);
- final SimpleBindings values = new SimpleBindings();
- values.put("res", res);
- values.put("context", context);
- values.put("renderer", callbackRenderer);
- values.put("mode", mode);
- values.put("sharedRenderingValues", sharedRenderingValues);
- if (requestProperties != null) {
- values.put("uriInfo", requestProperties.getUriInfo());
- //values.put("httpHeaders", requestProperties.getHttpHeaders());
- }
- Object execResult = exec(scriptBytes, values);
- if (execResult != null) {
- String sspResult = toString(execResult);
- if (logger.isDebugEnabled()) {
- String scriptName = extractFileName(renderingSpecification);
- logger.debug("executed ssp, result: {} (for {})", sspResult, scriptName);
- }
- os.write(sspResult.getBytes("UTF-8"));
- }
+ final char[] scriptBytes = getScriptChars(renderingSpecification);
- os.flush();
- logger.debug("flushed");
+ final Renderlet cs = getCompiledRenderlet(scriptBytes);
+ cs.render(res, context, sharedRenderingValues, callbackRenderer,
+ renderingSpecification, mode, mediaType, requestProperties, os);
+ //os.flush();
+ //logger.debug("flushed");
} catch (MalformedURLException ex) {
throw new WebApplicationException(ex);
- } catch (ScriptException ex) {
+ } catch (CompileErrorsException ex) {
logger.debug("ScriptException rendering ScalaServerPage: ", ex);
Exception cause = (Exception) ex.getCause();
if (cause != null) {
@@ -152,7 +139,7 @@ public class ScalaServerPagesRenderlet i
throw new RenderingException(cause, renderingSpecification, res, context);
}
throw new RenderingspecificationException(ex.getMessage(), renderingSpecification,
- ex.getLineNumber(), ex.getColumnNumber(), res, context);
+ 0,0, res, context);
}
}
@@ -160,7 +147,7 @@ public class ScalaServerPagesRenderlet i
if (byteHeaderLines == 0) {
int count = 0;
LineNumberReader ln = new LineNumberReader(
- new InputStreamReader(new ByteArrayInputStream(byteHeader)));
+ new CharArrayReader(headerChars));
try {
while (ln.readLine() != null) {
count++;
@@ -173,54 +160,71 @@ public class ScalaServerPagesRenderlet i
return byteHeaderLines;
}
- private static String toString(Object object) {
- if (object instanceof Seq) {
- return ((Seq) object).mkString();
- } else {
- return object.toString();
- }
- }
private String extractFileName(URI renderingSpecification) {
String path = renderingSpecification.getPath();
return path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
}
- private CompiledScript getCompiledScript(byte[] scriptBytes) throws ScriptException {
- String scriptString;
- try {
- scriptString = new String(scriptBytes, "UTF-8");
- } catch (UnsupportedEncodingException ex) {
- throw new RuntimeException(ex);
- }
- CompiledScript cs = compiledScripts.get(scriptString);
- if (cs == null) {
- cs = ((Compilable) scalaScriptEngineFactory.getScriptEngine()).compile(scriptString);
- compiledScripts.put(scriptString, cs);
+ private Renderlet getCompiledRenderlet(char[] scriptChars) throws CompileErrorsException {
+ String scriptString = new String(scriptChars);
+ Renderlet renderlet = compiledRenderlet.get(scriptString);
+ if (renderlet == null) {
+ final char[][] scipts = new char[][]{scriptChars};
+ Class renderletClass;
+ try {
+ //doing as priviledged so that no COmpilePermission is needed
+ renderletClass = AccessController.doPrivileged(new PrivilegedExceptionAction<Class>() {
+ @Override
+ public Class run() {
+ return scalaCompilerService.compile(scipts)[0];
+ }
+ });
+
+ } catch (PrivilegedActionException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ }
+ if (cause instanceof CompileErrorsException) {
+ throw (CompileErrorsException) cause;
+ }
+ throw new RuntimeException(e);
+ }
+ try {
+ renderlet = (Renderlet) renderletClass.newInstance();
+ } catch (InstantiationException ex) {
+ throw new RuntimeException(ex);
+ } catch (IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ }
+ compiledRenderlet.put(scriptString, renderlet);
}
- return cs;
+ return renderlet;
}
- private byte[] getScriptBytes(URI renderingSpecification) throws IOException {
- final InputStream in = renderingSpecification.toURL().openStream();
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ private char[] getScriptChars(URI renderingSpecification) throws IOException {
+ final Reader in = new InputStreamReader(renderingSpecification.toURL().openStream(), UTF8);
+ final CharArrayWriter caos = new CharArrayWriter();
//Add the scriptHeader to the beginning of the script
- baos.write(byteHeader);
+ caos.write(headerChars);
//add the content
- final byte[] buffer = new byte[1024];
- int bytesRead;
- while ((bytesRead = in.read(buffer, 0, 1024)) != -1) {
- baos.write(buffer, 0, bytesRead);
+ final char[] buffer = new char[1024];
+
+
+ int charsRead;
+ while ((charsRead = in.read(buffer, 0, 1024)) != -1) {
+ caos.write(buffer, 0, charsRead);
+
+
}
//add the closing ";"
- baos.write(byteCloser);
+ caos.write(footerChars);
String scriptName = extractFileName(renderingSpecification);
logger.debug("getting CompiledScript for: {}", scriptName);
- return baos.toByteArray();
- }
- private Object exec(byte[] scriptBytes, final SimpleBindings values) throws ScriptException {
- final CompiledScript cs = getCompiledScript(scriptBytes);
- return cs.eval(values);
+
+ return caos.toCharArray();
+
}
}
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt?rev=1037303&r1=1037302&r2=1037303&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt Sat Nov 20 19:06:53 2010
@@ -3,42 +3,11 @@ import org.apache.clerezza.rdf.core._
import org.apache.clerezza.rdf.utils._
import org.apache.clerezza.rdf.scala.utils._
import org.apache.clerezza.rdf.scala.utils.Preamble._
-import org.apache.clerezza.platform.typerendering.CallbackRenderer
-import java.io.{PrintWriter, OutputStreamWriter}
+import org.apache.clerezza.platform.typerendering.scala._
import javax.ws.rs.core.UriInfo
-val renderer = $("renderer").asInstanceOf[CallbackRenderer]
-val res = $("res").asInstanceOf[GraphNode]
-val context = $("context").asInstanceOf[GraphNode]
-val mode = $("mode").asInstanceOf[String]
-val uriInfo = $("uriInfo").asInstanceOf[UriInfo]
-val sharedRenderingValues = $("sharedRenderingValues").asInstanceOf[java.util.Map[String, Object]]
+ class CompilesScalaServerPage extends AbstractRenderlet {
-{
- object $ {
- def apply(key: String) = sharedRenderingValues.get(key)
- def update(key: String, value: Object) = sharedRenderingValues.put(key, value)
- }
-
- def render(resource : GraphNode, mode : String) = {
- def parseNodeSeq(string : String) = {
- _root_.scala.xml.XML.loadString("<elem>"+string+"</elem>").child
- }
- val baos = new java.io.ByteArrayOutputStream
- try {
- renderer.render(resource, context, mode, baos)
- } catch {
- case e: Exception => {
- val exWriter = new java.io.StringWriter
- val pw = new PrintWriter(exWriter)
- e.printStackTrace(pw)
- pw.flush()
- baos.write(<div class="exception">{exWriter.toString}</div>.toString.getBytes)
- }
- }
- parseNodeSeq(new String(baos.toByteArray, "utf-8"))
- }
- def ifx[T](con: => Boolean)(f: => T) : T = {
- if (con) f else null.asInstanceOf[T]
- }
- val resultDocModifier = org.apache.clerezza.platform.typerendering.ResultDocModifier.getInstance();
+ override def renderedPage(arguments: RenderedPage.Arguments): RenderedPage = {
+ new RenderedPage(arguments) {
+ override def content = {