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/19 01:32:15 UTC
svn commit: r1083114 - in
/incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main:
java/org/apache/clerezza/platform/typerendering/scalaserverpages/
resources/org/apache/clerezza/platform/typerendering/scalaserverpages/
Author: reto
Date: Sat Mar 19 00:32:15 2011
New Revision: 1083114
URL: http://svn.apache.org/viewvc?rev=1083114&view=rev
Log:
CLEREZZA-460: added new ScalaServerPage to be used to register SSPs instead of via RenderletManager
Added:
incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesService.java
incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/SspTypeRenderlet.java
incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/typerenderlet-header.txt
Modified:
incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
Modified: incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java?rev=1083114&r1=1083113&r2=1083114&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java (original)
+++ incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java Sat Mar 19 00:32:15 2011
@@ -18,39 +18,29 @@
*/
package org.apache.clerezza.platform.typerendering.scalaserverpages;
-import java.io.CharArrayReader;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.io.OutputStream;
-import java.io.Reader;
+import org.apache.clerezza.platform.typerendering.*;
+import org.apache.clerezza.rdf.utils.GraphNode;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import java.io.*;
+import java.lang.reflect.Type;
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.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.clerezza.platform.typerendering.CallbackRenderer;
-import org.apache.clerezza.platform.typerendering.RenderingException;
-import org.apache.clerezza.platform.typerendering.Renderlet;
-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;
-import scala.collection.Seq;
+import java.util.Map;
/**
*
@@ -62,6 +52,7 @@ import scala.collection.Seq;
*/
@Component
@Service(Renderlet.class)
+@Deprecated
public class ScalaServerPagesRenderlet implements Renderlet {
final Charset UTF8 = Charset.forName("UTF-8");
Added: incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesService.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesService.java?rev=1083114&view=auto
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesService.java (added)
+++ incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesService.java Sat Mar 19 00:32:15 2011
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.typerendering.scalaserverpages;
+
+import org.apache.clerezza.platform.typerendering.TypeRenderlet;
+import org.apache.clerezza.rdf.core.UriRef;
+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;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+
+import javax.ws.rs.core.MediaType;
+import java.net.URL;
+
+/**
+ *
+ * A service to create and register TypeRenderlets from ScalaServerPages
+ *
+ * @author reto
+ *
+ *
+ */
+@Component
+@Service(ScalaServerPagesService.class)
+public class ScalaServerPagesService {
+
+
+ @Reference
+ private CompilerService scalaCompilerService;
+ private BundleContext bundleContext;
+
+ protected void activate(ComponentContext componentContext) {
+ bundleContext = componentContext.getBundleContext();
+ }
+
+ protected void deactivate(ComponentContext componentContext) {
+ bundleContext = null;
+ }
+
+ public ServiceRegistration registerScalaServerPage(URL location, UriRef rdfType,
+ String modePattern, MediaType mediaType) {
+ TypeRenderlet sspTypeRenderlet = new SspTypeRenderlet(location, rdfType,
+ modePattern, mediaType, scalaCompilerService);
+ return bundleContext.registerService(TypeRenderlet.class.getName(),
+ sspTypeRenderlet, null);
+ }
+
+
+}
Added: incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/SspTypeRenderlet.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/SspTypeRenderlet.java?rev=1083114&view=auto
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/SspTypeRenderlet.java (added)
+++ incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/SspTypeRenderlet.java Sat Mar 19 00:32:15 2011
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.typerendering.scalaserverpages;
+
+import java.util.logging.Level;
+import org.apache.clerezza.platform.typerendering.CallbackRenderer;
+import org.apache.clerezza.platform.typerendering.TypeRenderlet;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.utils.GraphNode;
+import org.apache.clerezza.scala.scripting.CompilerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.core.MediaType;
+import java.io.*;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * A TypeRenderlet delegating the actual renderlet to a compiled ScalaServerPage. On every request the
+ * ScalaServerPage is checked for changes and recompiled if needed.
+ */
+public class SspTypeRenderlet implements TypeRenderlet {
+
+
+ private static final Logger logger = LoggerFactory.getLogger(ScalaServerPagesRenderlet.class);
+ private static final Charset UTF8 = Charset.forName("UTF-8");
+ private static final char[] headerChars
+ = getChars(SspTypeRenderlet.class.getResource("typerenderlet-header.txt"));
+ private static final String lineSeparator = System.getProperty("line.separator");
+ private static final char[] footerChars = (";}" + lineSeparator + "}"
+ + lineSeparator + "}" + lineSeparator + "}" + lineSeparator).toCharArray();
+
+
+ private UriRef rdfType;
+ private String modePattern;
+ private MediaType mediaType;
+ private URL sspLocation;
+ private char[] lastCompiledChars;
+ private TypeRenderlet lastCompiledSsp = null;
+ private CompilerService scalaCompilerService;
+
+ SspTypeRenderlet(URL sspLocation, UriRef rdfType, String modePattern, MediaType mediaType,
+ CompilerService scalaCompilerService) {
+ this.sspLocation = sspLocation;
+ this.rdfType = rdfType;
+ this.modePattern = modePattern;
+ this.mediaType = mediaType;
+ this.scalaCompilerService = scalaCompilerService;
+ }
+
+ @Override
+ public UriRef getRdfType() {
+ return rdfType;
+ }
+
+ @Override
+ public String getModePattern() {
+ return modePattern;
+ }
+
+ @Override
+ public MediaType getMediaType() {
+ return mediaType;
+ }
+
+ @Override
+ public void render(GraphNode node, GraphNode context,
+ Map<String, Object> sharedRenderingValues, CallbackRenderer callbackRenderer,
+ RequestProperties requestProperties, OutputStream os) throws IOException {
+ TypeRenderlet compiledSsp = getCompiledSsp();
+ compiledSsp.render(node, context, sharedRenderingValues, callbackRenderer, requestProperties, os);
+ }
+
+ private synchronized TypeRenderlet getCompiledSsp() {
+ char[] scriptChars = getScriptChars(sspLocation);
+ if (Arrays.equals(scriptChars, lastCompiledChars)) {
+ return lastCompiledSsp;
+ }
+ final char[][] scripts = 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(scripts)[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);
+ }
+ TypeRenderlet compiledSsp;
+ try {
+ compiledSsp = (TypeRenderlet) renderletClass.newInstance();
+ } catch (InstantiationException ex) {
+ throw new RuntimeException(ex);
+ } catch (IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ }
+ lastCompiledSsp = compiledSsp;
+ lastCompiledChars = scriptChars;
+ return compiledSsp;
+ }
+
+ private static char[] getScriptChars(URL location) {
+ try {
+ final CharArrayWriter caos = new CharArrayWriter();
+ //Add the scriptHeader to the beginning of the script
+ caos.write(headerChars);
+ //add the content
+ caos.write(getChars(location));
+ caos.write(footerChars);
+ return caos.toCharArray();
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private static char[] getChars(URL location) {
+ try {
+ final Reader in = new InputStreamReader(location.openStream(), UTF8);
+ final CharArrayWriter caos = new CharArrayWriter();
+
+ final char[] buffer = new char[1024];
+ int charsRead;
+ while ((charsRead = in.read(buffer, 0, 1024)) != -1) {
+ caos.write(buffer, 0, charsRead);
+ }
+ logger.debug("getting bytes for: {}", location);
+ return caos.toCharArray();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
Added: incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/typerenderlet-header.txt
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/typerenderlet-header.txt?rev=1083114&view=auto
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/typerenderlet-header.txt (added)
+++ incubator/clerezza/trunk/parent/platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/typerenderlet-header.txt Sat Mar 19 00:32:15 2011
@@ -0,0 +1,16 @@
+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._
+import org.apache.clerezza.rdf.scala.utils.Preamble._
+import org.apache.clerezza.platform.typerendering.scala._
+import javax.ws.rs.core.UriInfo
+
+ class CompiledScalaServerPage extends SRenderlet {
+
+ def getMediaType = null
+ def getModePattern = null
+ def getRdfType = null
+ override def renderedPage(arguments: XmlResult.Arguments): XmlResult = {
+ new XmlResult(arguments) {
+ override def content = {