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