Author: reto
Date: Thu Mar 17 15:55:07 2011
New Revision: 1082540

URL: http://svn.apache.org/viewvc?rev=1082540&view=rev
Log:
CLEREZZA-460: added classes to support new TypeRenderlet

Added:
    
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/SRenderlet.scala
    
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/XmlResult.scala

Added: 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/SRenderlet.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/SRenderlet.scala?rev=1082540&view=auto
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/SRenderlet.scala
 (added)
+++ 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/SRenderlet.scala
 Thu Mar 17 15:55:07 2011
@@ -0,0 +1,68 @@
+package org.apache.clerezza.platform.typerendering.scala
+
+import java.io.IOException
+import java.io.OutputStream
+import java.net.URI
+import javax.ws.rs.core.MediaType
+import 
org.apache.clerezza.platform.typerendering.TypeRenderlet.RequestProperties
+import org.apache.clerezza.platform.typerendering._
+import org.apache.clerezza.rdf.core.UriRef
+import org.apache.clerezza.rdf.utils.GraphNode
+import org.osgi.service.component.ComponentContext
+import org.apache.clerezza.rdf.ontologies._
+import org.apache.clerezza.rdf.core._
+import org.apache.clerezza.rdf.utils._
+import org.apache.clerezza.rdf.scala.utils.Preamble._
+
+/**
+ * A trait to simplify development of TypeRenderlets in Scala.
+ * <br/>
+ * Classes mixing in this class will define the method renderedPage(Arguments) 
to deliver
+ * the representation of the resource.
+ * <br/>
+ * There's typically only one instance of a AbstractRenderlet while a new 
instance
+ * of RenderedPage is generated for each request.
+ *
+ * An example of a subclass:
+ *
+ * class BookFormRenderlet extends SRenderlet {
+ *
+ *      override def renderedPage(arguments: RenderedPage.Arguments) = {
+ *             new XmlResult(arguments) {
+ *
+ *                     override def content = <div 
xmlns="http://www.w3.org/1999/xhtml";>
+ *                        ....
+ *                     </div>
+ *             }
+ *      }
+ * }
+ */
+trait SRenderlet extends TypeRenderlet {
+
+       def renderedPage(renderingArguments: XmlResult.Arguments): XmlResult
+
+       def ifx[T](con:  => Boolean)(f: => T) :  T = {
+               if (con) f else null.asInstanceOf[T]
+       }
+
+       val resultDocModifier = 
org.apache.clerezza.platform.typerendering.ResultDocModifier.getInstance();
+
+       @throws(classOf[IOException])
+       override def render(res: GraphNode, context: GraphNode,
+                                       sharedRenderingValues: 
java.util.Map[String, Object],
+                                       renderer: CallbackRenderer ,
+                                       requestProperties: RequestProperties,
+                                       os: OutputStream) = {
+                       if (os == null) {
+                               throw new IllegalArgumentException("Exception!")
+                       }
+                       val modeOption = if (requestProperties.getMode != null) 
{Some(requestProperties.getMode)} else {None}
+                       renderedPage(
+                               XmlResult.Arguments(res, context, 
sharedRenderingValues, renderer,
+                                                                  modeOption, 
+                                                                  
requestProperties.getMediaType, requestProperties, os));
+
+       }
+
+}
+

Added: 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/XmlResult.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/XmlResult.scala?rev=1082540&view=auto
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/XmlResult.scala
 (added)
+++ 
incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala/XmlResult.scala
 Thu Mar 17 15:55:07 2011
@@ -0,0 +1,128 @@
+package org.apache.clerezza.platform.typerendering.scala
+
+import java.io.OutputStream
+import java.io.PrintWriter
+import java.net.URI
+import javax.ws.rs.core.HttpHeaders
+import javax.ws.rs.core.MediaType
+import scala.xml._
+import org.apache.clerezza.platform.typerendering._
+import 
org.apache.clerezza.platform.typerendering.TypeRenderlet.RequestProperties
+import org.apache.clerezza.rdf.utils.GraphNode
+import org.apache.clerezza.rdf.ontologies._
+import org.apache.clerezza.rdf.core._
+import org.apache.clerezza.rdf.utils._
+import org.apache.clerezza.rdf.scala.utils.Preamble._
+import java.security.{PrivilegedAction, AccessController}
+import org.osgi.framework.{BundleContext, ServiceReference}
+import org.apache.clerezza.platform.users.{WebDescriptionProvider, Cache}
+import org.apache.clerezza.rdf.scala.utils.RichGraphNode
+
+/**
+ * PageRenderlet.renderedPage returns an instance of this class, implementing
+ * the content method to produce an XML Element suitable as response to the
+ * request yielding to the arguments passed to the constructor.
+ */
+abstract class XmlResult(arguments: XmlResult.Arguments) {
+
+       val XmlResult.Arguments(
+                                       res: GraphNode,
+                                       context: GraphNode,
+                                       sharedRenderingValues: 
java.util.Map[String, Object],
+                                       renderer: CallbackRenderer,
+                                       modeOption: Option[String],
+                                       mediaType: MediaType,
+                                       requestProperties: RequestProperties,
+                                       os: OutputStream) = arguments;
+       val mode = modeOption match {
+               case Some(x) => x
+               case None => null
+       }
+
+       val uriInfo = requestProperties.getUriInfo
+       val requestHeaders = requestProperties.getRequestHeaders
+       val responseHeaders = requestProperties.getResponseHeaders
+
+       def render(resource: GraphNode): Seq[Node] = {
+               modeOption match {
+                       case Some(m) => render(resource, m)
+                       case None => render(resource, "naked")
+               }
+       }
+
+       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
+               renderer.render(resource, context, mode, baos)
+               parseNodeSeq(new String(baos.toByteArray))
+       }
+
+       /**
+        * This is an object that allows one to use some nice shortcuts in 
scala based subclasses
+        * - $variable will get the value of the sharedRenderingValues hash
+        * - $variable = value allows one to update the sharedRenderingValues 
hash
+        * - $? not sure there...
+        */
+       object $ {
+               def apply(key: String) = sharedRenderingValues.get(key)
+
+               def update(key: String, value: Object) = 
sharedRenderingValues.put(key, value)
+
+               def apply[T](implicit m: Manifest[T]): T = {
+                       val clazz = m.erasure.asInstanceOf[Class[T]]
+                       requestProperties.getRenderingService(clazz)
+               }
+       }
+
+       def ifx[T](con: => Boolean)(f: => T): T = {
+               if (con) f else null.asInstanceOf[T]
+       }
+
+       val resultDocModifier = 
org.apache.clerezza.platform.typerendering.ResultDocModifier.getInstance();
+
+       val out = new PrintWriter(os)
+
+       out.print(
+               content match {
+                       case s: Seq[_] => s.mkString
+                       case o => o.toString
+               }
+       )
+       out.flush()
+
+       /**
+        * This is the main method/variable that needs to be implemented by 
subclasses
+        */
+       def content: AnyRef;
+
+
+}
+
+object XmlResult {
+
+       /**
+        * Class to encapsulate information sent to the rendering engine.
+        *
+        * @param res  RDF resource to be rendered with the template.
+        * @param context  RDF resource providing a rendering context.
+        * @param sharedRenderingValues a map that can be used for sharing 
values
+        * across the different Renderlets involved in a rendering process
+        * @param callbackRenderer  renderer for call backs.
+        * @param renderingSpecification  the rendering specification
+        * @param modeOption the mode this Renderlet was invoked with, this is 
mainly used
+        * so that the callbackRenderer can be claeed inheriting the mode.
+        * @param mediaType  the media type this media produces (a part of)
+        * @param requestProperties properties of the http request, may be null
+        * @param os  where the output will be written to.
+        */
+       case class Arguments(res: GraphNode,
+                                       context: GraphNode,
+                                       sharedRenderingValues: 
java.util.Map[String, Object],
+                                       renderer: CallbackRenderer,
+                                       modeOption: Option[String],
+                                       mediaType: MediaType,
+                                       requestProperties: RequestProperties,
+                                       os: OutputStream);
+}
\ No newline at end of file


Reply via email to