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


Reply via email to