Hi Reto, first of all, thanks for sharing this 2011/3/27 Reto Bachmann-Gmuer <[email protected]>
> Hello > > I'd like to solicit feedback on the module platform.typerendering.gui. The > bundle provides a page to see the list of installed renderlets, this is > very > handy to find out which renderlet has to be modified or how a new renderlet > has to be specified to overwrite an existing one. > > I tried to implement this utility as easily as possible and now I'd like > some feedback about which compromises are acceptabled an which aren't. > > - No Declarative Services: Rather than DS the project is using an > activator with the Root-Resource as inline object. This saved me from > writing XML and bind/unbind methods. The disadvantage of not using DS is > that component aren't disabled when the services they require go down, > but > when a service is missing this can cause a runtime-exception > I have no problem with getting rid of DS and I see the advantage of not having to write (un)binding code but what doesn't fully convince me is the fact that components are maintained in memory while they're not needed, this can be a costly choice especially in those cases where there are lots of triples handled and primary memory is a bottleneck. So in the end I think it's ok but I wonder what amount of wasted resources this could lead to. > - Ad-Hoc ontology: the Uris for classes and properties are declared in > scala directly without writing an N3 file > this sounds good to me, I think there is no need of an ad-hoc ontology for this use case, maybe we just need to document in the module API what URI properties and classes mean. > - No dedicated page template: Template only for the individual renderlets > descriptions. The page as a whole is renderlet by the default :HeadedPage > and rdf:List templates > No problem for this, I don't see need of a dedicated page template for it. My 2 cents, Tommaso > > I'm not suggesting this as the default way to make new modules for > Clerezza, > but I'd like to discuss if the above compromises are acceptable for a > module > like this on which no other project depends, which is not essential for the > working of the platform and with an ontology specific to a very narrow > domain. > > Cheers, > reto > > > On Sun, Mar 27, 2011 at 1:11 PM, <[email protected]> wrote: > > Author: reto > > Date: Sun Mar 27 11:11:11 2011 > > New Revision: 1085912 > > > > URL: http://svn.apache.org/viewvc?rev=1085912&view=rev > > Log: > > CLEREZZA-460: minimalistic implementation of renderlet-manager gui > > > > Added: > > incubator/clerezza/trunk/parent/platform.typerendering.gui/ (with > props) > > incubator/clerezza/trunk/parent/platform.typerendering.gui/pom.xml > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/ > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/style.css > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/ > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Activator.scala > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Ontology.scala > > > > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/RenderletDescriptionRenderlet.scala > > > > Propchange: incubator/clerezza/trunk/parent/platform.typerendering.gui/ > > > > ------------------------------------------------------------------------------ > > --- svn:ignore (added) > > +++ svn:ignore Sun Mar 27 11:11:11 2011 > > @@ -0,0 +1 @@ > > +target > > > > Added: incubator/clerezza/trunk/parent/platform.typerendering.gui/pom.xml > > URL: > > http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.gui/pom.xml?rev=1085912&view=auto > > > > ============================================================================== > > --- incubator/clerezza/trunk/parent/platform.typerendering.gui/pom.xml > (added) > > +++ incubator/clerezza/trunk/parent/platform.typerendering.gui/pom.xml > Sun > Mar 27 11:11:11 2011 > > @@ -0,0 +1,97 @@ > > +<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns=" > http://maven.apache.org/POM/4.0.0" xmlns:xsi=" > http://www.w3.org/2001/XMLSchema-instance"> > > + <modelVersion>4.0.0</modelVersion> > > + <parent> > > + <groupId>org.apache.clerezza</groupId> > > + <artifactId>parent</artifactId> > > + <version>0.2-incubating-SNAPSHOT</version> > > + </parent> > > + <artifactId>platform.typerendering.gui</artifactId> > > + <version>0.1-incubating-SNAPSHOT</version> > > + <packaging>bundle</packaging> > > + <name>Clerezza - Platform Typerendering GUI</name> > > + <dependencies> > > + <dependency> > > + <groupId>org.osgi</groupId> > > + <artifactId>org.osgi.compendium</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.osgi</groupId> > > + <artifactId>org.osgi.core</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + > <artifactId>platform.typerendering.core</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + > <artifactId>platform.typerendering.scala</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + <artifactId>rdf.ontologies</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + <artifactId>rdf.utils</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + <artifactId>rdf.scala.utils</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.apache.clerezza</groupId> > > + <artifactId>osgi.services</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>org.scala-lang</groupId> > > + <artifactId>scala-library</artifactId> > > + </dependency> > > + <dependency> > > + <groupId>javax.ws.rs</groupId> > > + <artifactId>jsr311-api</artifactId> > > + </dependency> > > + </dependencies> > > + <build> > > + <sourceDirectory>src/main/scala</sourceDirectory> > > + <testSourceDirectory>src/test/scala</testSourceDirectory> > > + <plugins> > > + <plugin> > > + <groupId>org.apache.felix</groupId> > > + > <artifactId>maven-bundle-plugin</artifactId> > > + <configuration> > > + <instructions> > > + > <Bundle-activator>skeleton.Activator</Bundle-activator> > > + > <Export-Package>skeleton</Export-Package> > > + > > <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> > > + </instructions> > > + </configuration> > > + </plugin> > > + <plugin> > > + > <groupId>org.apache.maven.plugins</groupId> > > + > <artifactId>maven-eclipse-plugin</artifactId> > > + <configuration> > > + > <downloadSources>true</downloadSources> > > + > <downloadJavadocs>true</downloadJavadocs> > > + <buildcommands> > > + > <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand> > > + </buildcommands> > > + <additionalProjectnatures> > > + > <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature> > > + </additionalProjectnatures> > > + <classpathContainers> > > + > <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER > > + </classpathContainer> > > + > <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER > > + </classpathContainer> > > + </classpathContainers> > > + </configuration> > > + </plugin> > > + <plugin> > > + <groupId>org.scala-tools</groupId> > > + > <artifactId>maven-scala-plugin</artifactId> > > + </plugin> > > + </plugins> > > + </build> > > +</project> > > + > > + > > > > Added: > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/style.css > > URL: > > http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/style.css?rev=1085912&view=auto > > > > ============================================================================== > > --- > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/style.css > (added) > > +++ > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/resources/CLEREZZA-INF/web-resources/styles/renderlets/style.css > Sun Mar 27 11:11:11 2011 > > @@ -0,0 +1,17 @@ > > +.renderlet { > > + background-color: lightgray; > > + border: darkgrey; > > + border-width: 1px; > > + border-style: solid; > > + with: 90%; > > + vertical-align: middle; > > + margin-left: 1em; > > + margin-right: 1em > > +} > > +.entry { > > + padding-bottom: 1em; > > +} > > +.renderlet .value { > > + color: darkgreen; > > +} > > + > > > > Added: > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Activator.scala > > URL: > > http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Activator.scala?rev=1085912&view=auto > > > > ============================================================================== > > --- > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Activator.scala > (added) > > +++ > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Activator.scala > Sun Mar 27 11:11:11 2011 > > @@ -0,0 +1,92 @@ > > +package org.apache.clerezza.platform.typerendering.gui > > + > > +import org.apache.clerezza.rdf.core.BNode > > +import org.apache.clerezza.rdf.core.impl.SimpleMGraph > > +import org.osgi.framework.{BundleActivator, BundleContext, > ServiceRegistration} > > +import scala.collection.JavaConversions._ > > +import org.apache.clerezza.platform.dashboard.GlobalMenuItem > > +import org.apache.clerezza.platform.dashboard.GlobalMenuItemsProvider > > +import org.apache.clerezza.platform.typerendering.{TypeRenderlet, > RenderletManager} > > +import java.util.HashSet > > +import javax.ws.rs._ > > +import org.apache.clerezza.rdf.ontologies.{DC, RDF, PLATFORM} > > +import org.apache.clerezza.rdf.utils.GraphNode; > > +import org.apache.clerezza.rdf.scala.utils._ > > + > > +/** > > + * Activator for a bundle using Apache Clerezza. > > + */ > > +class Activator extends BundleActivator { > > + > > + private var renderletsOverview: ServiceRegistration = null > > + private var renderletRegistration, menuProviderRegistration: > ServiceRegistration = null > > + private var bundleContext: BundleContext = null > > + > > + > > + final val path = "admin/renderlets/overview" > > + @Path(path) > > + object RenderletsOverview { > > + @GET def get() = { > > + val resultMGraph = new SimpleMGraph(); > > + val preamble = new Preamble(resultMGraph) > > + import preamble._ > > + val resultNode = new GraphNode(new BNode(), > resultMGraph); > > + resultNode.addProperty(RDF.`type` , > Ontology.RenderletOverviewPage); > > + resultNode.addProperty(RDF.`type` , > PLATFORM.HeadedPage); > > + resultNode.addProperty(RDF.`type` , RDF.List); > > + val renderletList = resultNode.asList; > > + for (sr <- > bundleContext.getServiceReferences(classOf[TypeRenderlet].getName, null)) { > > + val renderlet = > bundleContext.getService(sr).asInstanceOf[TypeRenderlet] > > + val rendRes = new BNode() > > + rendRes.addProperty(RDF.`type`, > Ontology.Renderlet); > > + > rendRes.addPropertyValue(Ontology.mediaType, > > + > renderlet.getMediaType.toString) > > + if (renderlet.getModePattern != null) > rendRes.addPropertyValue(Ontology.modePattern, > > + > renderlet.getModePattern) > > + rendRes.addProperty(Ontology.rdfType, > > + > renderlet.getRdfType) > > + > rendRes.addPropertyValue(Ontology.stringRepresentation, > > + > renderlet.toString) > > + > rendRes.addPropertyValue(Ontology.providingBundle, > > + > sr.getBundle.getLocation) > > + renderletList.add(rendRes) > > + } > > + resultNode; > > + } > > + } > > + > > + object MenuProvider extends GlobalMenuItemsProvider { > > + override def getMenuItems = { > > + val result = new HashSet[GlobalMenuItem](); > > + result.add(new > GlobalMenuItem("/"+path,"renderlet-overview", "Renderlet Overview", -999, > "Administration")) > > + result > > + } > > + } > > + > > + /** > > + * called when the bundle is started, this method initializes the > provided service > > + */ > > + def start(context: BundleContext) { > > + this.bundleContext = context > > + val args = scala.collection.mutable.Map("javax.ws.rs" -> > true) > > + renderletsOverview = > context.registerService(classOf[Object].getName, > > + > RenderletsOverview, args) > > + val renderlet = new RenderletDescriptionRenderlet > > + val serviceReference = > context.getServiceReference(classOf[RenderletManager].getName) > > + renderletRegistration = > context.registerService(classOf[TypeRenderlet].getName, > > + > renderlet, null) > > + menuProviderRegistration = > context.registerService(classOf[GlobalMenuItemsProvider].getName, > > + > MenuProvider, null) > > + } > > + > > + /** > > + * called when the bundle is stopped, this method unregisters the > provided service > > + */ > > + def stop(context: BundleContext) { > > + renderletsOverview.unregister() > > + renderletRegistration.unregister() > > + menuProviderRegistration.unregister() > > + this.bundleContext = null > > + } > > + > > +} > > > > Added: > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Ontology.scala > > URL: > > http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Ontology.scala?rev=1085912&view=auto > > > > ============================================================================== > > --- > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Ontology.scala > (added) > > +++ > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/Ontology.scala > Sun Mar 27 11:11:11 2011 > > @@ -0,0 +1,18 @@ > > +package org.apache.clerezza.platform.typerendering.gui > > + > > +import org.apache.clerezza.rdf.core.UriRef > > + > > +object Ontology { > > + > > + private def p(s: String) = new UriRef(" > http://clerezza.org/2011/25/renderletgui#"+s) > > + > > + val RenderletOverviewPage = p("RenderletOverviewPage") > > + val Renderlet = p("Renderlet") > > + val renderlet = p("renderlet") > > + val modePattern = p("modePattern") > > + val mediaType = p("mediaType") > > + val rdfType = p("renderedType") > > + val providingBundle = p("providingBundle") > > + val stringRepresentation = p("stringRepresentation") > > + > > +} > > > > Added: > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/RenderletDescriptionRenderlet.scala > > URL: > > http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/RenderletDescriptionRenderlet.scala?rev=1085912&view=auto > > > > ============================================================================== > > --- > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/RenderletDescriptionRenderlet.scala > (added) > > +++ > > incubator/clerezza/trunk/parent/platform.typerendering.gui/src/main/scala/RenderletDescriptionRenderlet.scala > Sun Mar 27 11:11:11 2011 > > @@ -0,0 +1,39 @@ > > +package org.apache.clerezza.platform.typerendering.gui > > + > > +import javax.ws.rs.core.MediaType > > +import org.apache.clerezza.platform.typerendering._ > > +import org.apache.clerezza.rdf.core.UriRef > > +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 org.apache.clerezza.platform.typerendering.scala._ > > +import org.apache.clerezza.rdf.ontologies.DC > > + > > +/** > > + * A Renderlet for the descriptions of RenderletDescription > > + */ > > +class RenderletDescriptionRenderlet extends SRenderlet { > > + > > + val getRdfType = Ontology.Renderlet > > + > > + override def getModePattern = "naked" > > + > > + override def renderedPage(arguments: XmlResult.Arguments) = { > > + new XmlResult(arguments) { > > + override def content = { > > + resultDocModifier.setTitle("Renderlet > Overview") > > + > resultDocModifier.addStyleSheet("/styles/renderlets/style.css") > > + <div class="renderlet"> > > + <div>Renderlet: <span > class="value">{res/Ontology.stringRepresentation*}</span></div> > > + <div>For type: <span > class="value">{res/Ontology.rdfType*}</span></div> > > + <div>Producing: <span > class="value">{res/Ontology.mediaType*}</span></div> > > + {if > ((res/Ontology.modePattern).size > 0) <div>Mode pattern: <span > class="value">{res/Ontology.modePattern*}</span></div>} > > + <div>Provided by: <span > class="value">{res/Ontology.providingBundle*}</span></div> > > + </div> > > + } > > + } > > + } > > + > > +} > > > > > > >
