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 2011/03/17 16:55:07 UTC
svn commit: r1082540 - in
/incubator/clerezza/trunk/parent/platform.typerendering.scala/src/main/scala/org/apache/clerezza/platform/typerendering/scala:
SRenderlet.scala XmlResult.scala
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