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 = {