You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by mi...@apache.org on 2010/02/22 12:31:27 UTC

svn commit: r912535 - in /incubator/clerezza/issues/CLEREZZA-128: org.apache.clerezza.platform.launcher.storageless.parent/ org.apache.clerezza.platform.typerendering.scalaserverpages/ org.apache.clerezza.platform.typerendering.scalaserverpages/src/mai...

Author: mir
Date: Mon Feb 22 11:31:27 2010
New Revision: 912535

URL: http://svn.apache.org/viewvc?rev=912535&view=rev
Log:
CLEREZZA-128: Shows now class of the Exception and stack trace in RenderingException in org.apache.clerezza.platform.typerendering. Line numbers in template classes are adjusted in org.apache.clerezza.scala

Added:
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/
      - copied from r912530, incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.launcher.storageless.parent/
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/
      - copied from r910456, incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering/
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/
      - copied from r910456, incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.typerendering.scalaserverpages/
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/
      - copied from r910456, incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.scala/
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingClassVisitor.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingUtil.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingingMethodVisitor.java
Modified:
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/pom.xml
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderingException.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/TypeRenderingExceptionMapper.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/resources/org/apache/clerezza/platform/typerendering/exception-template.ssp
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.ontologies/src/main/resources/org/apache/clerezza/platform/typerendering/ontologies/typerendering.rdf
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/pom.xml
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/service/ScalaServiceJava.java
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/BundleFS.scala
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/ScalaInterpreter.scala
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/CompiledScript.scala
    incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/ScalaService.scala

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/pom.xml?rev=912535&r1=912530&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/pom.xml (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.launcher.storageless.parent/pom.xml Mon Feb 22 11:31:27 2010
@@ -96,6 +96,11 @@
 			<artifactId>org.jruby</artifactId>
 			<scope>runtime</scope>
 		</dependency>
+		<dependency>
+			<groupId>asm</groupId>
+			<artifactId>asm-all</artifactId>
+			<scope>runtime</scope>
+		</dependency>
 
 		<!--
 			Clerezza Bundles

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/java/org/apache/clerezza/platform/typerendering/scalaserverpages/ScalaServerPagesRenderlet.java Mon Feb 22 11:31:27 2010
@@ -30,6 +30,7 @@
 import java.util.Map;
 import java.lang.reflect.Type;
 import java.util.HashMap;
+import javax.script.CompiledScript;
 import javax.script.ScriptException;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
@@ -62,6 +63,7 @@
 	 */
 	private ScalaService scalaService;
 	private static final Logger logger = LoggerFactory.getLogger(ScalaServerPagesRenderlet.class);
+	private int byteHeaderLines = 0;
 
 	/**
 	 * Default constructor as for usage as OSGi service
@@ -121,12 +123,11 @@
 			map.put("res", GraphNode.class);
 			map.put("context", GraphNode.class);
 			map.put("renderer", CallbackRenderer.class);
-			map.put("mode", String.class);
-			logger.debug("compiling script");
-			
+			map.put("mode", String.class);			
+			String scriptName = extractFileName(renderingSpecification);
+			logger.debug("compiling script: " + scriptName);
 			CompiledScript cs = scalaService.interpretScalaScript(
-					new String(baos.toByteArray(), "UTF-8"), map);
-			
+					new String(baos.toByteArray(), "UTF-8"), map, scriptName, getByteHeaderLines());			
 			logger.debug("compiled");
 			final Map<String, Object> values = new HashMap<String, Object>();
 			values.put("res", res);
@@ -148,22 +149,25 @@
 				throw new RenderingException(cause, renderingSpecification, res, context);
 			}
 			throw new RenderingspecificationException(ex.getMessage(), renderingSpecification,
-					ex.getLineNumber() - getLines(byteHeader), ex.getColumnNumber(), res, context);
+					ex.getLineNumber() - getByteHeaderLines(), ex.getColumnNumber(), res, context);
 		}
 	}
 
-	private int getLines(byte[] bytes) {
-		int count = 0;
-		LineNumberReader ln = new LineNumberReader(
-				new InputStreamReader(new ByteArrayInputStream(bytes)));
-		try {
-			while (ln.readLine() != null) {
-				count++;
+	private int getByteHeaderLines() {
+		if (byteHeaderLines == 0) {
+			int count = 0;
+			LineNumberReader ln = new LineNumberReader(
+					new InputStreamReader(new ByteArrayInputStream(byteHeader)));
+			try {
+				while (ln.readLine() != null) {
+					count++;
+				}
+			} catch (IOException ex) {
+				throw new RuntimeException(ex);
 			}
-		} catch (IOException ex) {
-			throw new RuntimeException(ex);
+			byteHeaderLines = count;
 		}
-		return count;
+		return byteHeaderLines;
 	}
 
 	private String toString(Object object) {
@@ -173,4 +177,9 @@
 			return object.toString();
 		}
 	}
+
+	private String extractFileName(URI renderingSpecification) {
+		String path = renderingSpecification.getPath();
+		return path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
+	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering.scalaserverpages/src/main/resources/org/apache/clerezza/platform/typerendering/scalaserverpages/implicit-header.txt Mon Feb 22 11:31:27 2010
@@ -5,7 +5,7 @@
 
 def render(resource : GraphNode, mode : String) = {
     def parseNodeSeq(string : String)  = {
-        scala.xml.XML.loadString("<elem>"+string+"</elem>").child
+        _root_.scala.xml.XML.loadString("<elem>"+string+"</elem>").child
     }
     val baos = new java.io.ByteArrayOutputStream
     renderer.render(resource, context, mode, baos)

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderingException.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderingException.java?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderingException.java (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderingException.java Mon Feb 22 11:31:27 2010
@@ -18,10 +18,12 @@
  */
 package org.apache.clerezza.platform.typerendering;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.net.URI;
 import org.apache.clerezza.platform.typerendering.ontologies.TYPERENDERING;
 import org.apache.clerezza.rdf.core.BNode;
-import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.PlainLiteral;
 import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.clerezza.rdf.core.impl.PlainLiteralImpl;
 import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
@@ -41,7 +43,9 @@
 
 	public RenderingException(Exception cause, URI renderingSpecification,
 			GraphNode renderNode, GraphNode context) {
-		super(cause.getMessage(), renderingSpecification, renderNode, context);
+		super(cause.getClass().getName() + ": " + cause.getMessage(), renderingSpecification,
+				renderNode, context);
+		this.cause = cause;
 		this.renderingSpecification = renderingSpecification;
 	}
 
@@ -49,10 +53,17 @@
 	public GraphNode getExceptionGraphNode() {
 		GraphNode result = new GraphNode(new BNode(), new SimpleMGraph());
 		result.addProperty(RDF.type, TYPERENDERING.Exception);
-		LiteralFactory factory = LiteralFactory.getInstance();
 		result.addProperty(TYPERENDERING.errorSource, new UriRef(renderingSpecification.toString()));
 		result.addProperty(TYPERENDERING.message, new PlainLiteralImpl(getMessage()));
+		result.addProperty(TYPERENDERING.stackTrace, getStackTraceLiteral());
 		return result;
 	}
 
+	private PlainLiteral getStackTraceLiteral() {
+		StringWriter sw = new StringWriter();
+		PrintWriter pw = new PrintWriter(sw);
+		cause.printStackTrace(pw);
+		pw.flush();
+		return new PlainLiteralImpl(sw.toString());
+	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/TypeRenderingExceptionMapper.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/TypeRenderingExceptionMapper.java?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/TypeRenderingExceptionMapper.java (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/TypeRenderingExceptionMapper.java Mon Feb 22 11:31:27 2010
@@ -61,6 +61,7 @@
 		ResponseBuilder rb = Response.serverError();
 		logger.info(exception.getMessage());
 		if (exception.getRenderNode().hasProperty(RDF.type, TYPERENDERING.Exception)) {
+			logger.error("Exception in template used for rendering exceptions ", exception);
 			rb.entity("There is an error in the template used for rendering" +
 					" exceptions. Please check the console output for further" +
 					" information. Thanks!").type(MediaType.TEXT_PLAIN_TYPE);

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/resources/org/apache/clerezza/platform/typerendering/exception-template.ssp
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/resources/org/apache/clerezza/platform/typerendering/exception-template.ssp?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/resources/org/apache/clerezza/platform/typerendering/exception-template.ssp (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.core/src/main/resources/org/apache/clerezza/platform/typerendering/exception-template.ssp Mon Feb 22 11:31:27 2010
@@ -23,6 +23,12 @@
 			}
 		</p>
 		<p>Description:</p>
-				<pre>{res/typerendering("message")*}</pre>
-	</body>
+				<pre>{res/typerendering("message")*}</pre>		
+		{
+			if ((res/typerendering("stackTrace")).length > 0) {
+				<p>Stack trace:</p>
+				<pre>{res/typerendering("stackTrace")*}</pre>
+			} else {""}
+		}
+		</body>
 </html>

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.ontologies/src/main/resources/org/apache/clerezza/platform/typerendering/ontologies/typerendering.rdf
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.ontologies/src/main/resources/org/apache/clerezza/platform/typerendering/ontologies/typerendering.rdf?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.ontologies/src/main/resources/org/apache/clerezza/platform/typerendering/ontologies/typerendering.rdf (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.platform.typerendering/org.apache.clerezza.platform.typerendering.ontologies/src/main/resources/org/apache/clerezza/platform/typerendering/ontologies/typerendering.rdf Mon Feb 22 11:31:27 2010
@@ -164,4 +164,14 @@
 	<rdfs:domain rdf:resource="http://clerezza.org/2009/04/typerendering#Exception" />
 	<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
 </rdf:Property>
+
+<rdf:Property rdf:about="http://clerezza.org/2009/04/typerendering#stackTrace">
+	<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty" />
+	<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty" />
+	<rdfs:label xml:lang="en">stack trace</rdfs:label>
+	<skos:definition xml:lang="en">Points to the the stack trace of the subject.</skos:definition>
+	<rdfs:isDefinedBy rdf:resource="http://clerezza.org/2009/04/typerendering#" />
+	<rdfs:domain rdf:resource="http://clerezza.org/2009/04/typerendering#Exception" />
+	<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
+</rdf:Property>
 </rdf:RDF>

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/pom.xml?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/pom.xml (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/pom.xml Mon Feb 22 11:31:27 2010
@@ -68,7 +68,10 @@
 			<groupId>org.apache.clerezza</groupId>
 			<artifactId>org.apache.clerezza.rdf.utils</artifactId>
 		</dependency>
-
+		<dependency>
+			<groupId>asm</groupId>
+			<artifactId>asm-all</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/service/ScalaServiceJava.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/service/ScalaServiceJava.java?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/service/ScalaServiceJava.java (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/service/ScalaServiceJava.java Mon Feb 22 11:31:27 2010
@@ -32,7 +32,8 @@
  * @author rbn, mkn, pmg
  */
 public class ScalaServiceJava extends ScalaService {
-	public void activate(ComponentContext context){
+
+	public void activate(ComponentContext context) {
 		super.activate(context);
 	}
 }

Added: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingClassVisitor.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingClassVisitor.java?rev=912535&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingClassVisitor.java (added)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingClassVisitor.java Mon Feb 22 11:31:27 2010
@@ -0,0 +1,43 @@
+/*
+ * 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.scala.util;
+
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ *
+ * @author mir
+ */
+public class LineNumbersAdjustingClassVisitor extends ClassAdapter {
+
+	private int lineOffset;
+
+	public LineNumbersAdjustingClassVisitor(ClassVisitor cv, int lineOffset) {
+		super(cv);
+		this.lineOffset = lineOffset;
+	}
+
+	@Override
+	public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+		MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
+		return new LineNumbersAdjustingingMethodVisitor(mv, lineOffset);
+	}
+}

Added: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingUtil.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingUtil.java?rev=912535&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingUtil.java (added)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingUtil.java Mon Feb 22 11:31:27 2010
@@ -0,0 +1,67 @@
+/*
+ * 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.scala.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.wymiwyg.commons.util.dirbrowser.FilePathNode;
+
+/**
+ * A util to adjust the line numbers in byte code.
+ *
+ * @author mir
+ */
+public class LineNumbersAdjustingUtil {
+
+	/**
+	 * Adjusts the line numbers of all classes at the specified path starting
+	 * with the specified fileName. The line numbers are adjusted about the
+	 * the specified lineOffset.
+	 *
+	 * @param path The path where the class files are located
+	 * @param fileName Filter string that determines which class files are to be
+	 *		adjusted. Only those starting with fileName are adjusted.
+	 * @param lineOffset The offset used for adjusting the line numbers.
+	 * @throws IOException
+	 */
+	public static void adjustAllFilesStartingWithFileName(String path, String fileName, int lineOffset) throws IOException {
+		FilePathNode pathNode = new FilePathNode(new File(path));
+		for (String string : pathNode.list()) {
+			if(string.startsWith(fileName)) {
+				byte[] transformedBytes = transform(pathNode.getSubPath(string).getInputStream(), lineOffset);
+				FileOutputStream fout = new FileOutputStream(pathNode.getPath() + "/" + string);
+				fout.write(transformedBytes);
+				fout.close();
+			}
+		}
+	}
+
+	private static byte[] transform(InputStream bytecodeInputStream, int lineOffset) throws IOException {
+		ClassWriter cw = new ClassWriter(0);
+		ClassVisitor lineNumberCorretingCV = new LineNumbersAdjustingClassVisitor(cw, lineOffset);
+		ClassReader cr = new ClassReader(bytecodeInputStream);
+		cr.accept(lineNumberCorretingCV, 0);
+		return cw.toByteArray();
+	}
+}

Added: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingingMethodVisitor.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingingMethodVisitor.java?rev=912535&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingingMethodVisitor.java (added)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/java/org/apache/clerezza/scala/util/LineNumbersAdjustingingMethodVisitor.java Mon Feb 22 11:31:27 2010
@@ -0,0 +1,44 @@
+/*
+ * 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.scala.util;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ *
+ * @author mir
+ */
+class LineNumbersAdjustingingMethodVisitor extends MethodAdapter {
+
+	private int lineOffset;
+
+	public LineNumbersAdjustingingMethodVisitor(MethodVisitor mv, int lineOffset) {
+		super(mv);
+		this.lineOffset = lineOffset;
+	}
+
+	@Override
+	public void visitLineNumber(int i, Label label) {
+		super.visitLineNumber(i + lineOffset, label);
+	}
+
+
+}

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/BundleFS.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/BundleFS.scala?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/BundleFS.scala (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/BundleFS.scala Mon Feb 22 11:31:27 2010
@@ -25,130 +25,132 @@
 
 package org.apache.clerezza.scala.interpreter {
 
-/**
- * Implementation of {@link AbstractFile} on top of a {@link org.osgi.framework.Bundle}
- */
-object BundleFS {
-
   /**
-   * Create a new {@link AbstractFile} instance representing an
-   * {@link org.osgi.framework.Bundle}
-   * @param bundle
+   * Implementation of {@link AbstractFile} on top of a {@link org.osgi.framework.Bundle}
    */
-  def create(bundle: Bundle): AbstractFile = {
-    require(bundle != null, "bundle must not be null")
+  object BundleFS {
 
-    abstract class BundleEntry(url: URL, parent: DirEntry) extends AbstractFile {
-      require(url != null, "url must not be null")
-      lazy val (path: String, name: String) = getPathAndName(url)
-      lazy val fullName: String = (path::name::Nil).filter(!_.isEmpty).mkString("/")
-
-      /**
-       * @return null
-       */
-      def file: File = null
-
-      /**
-       * @return last modification time or 0 if not known
-       */
-      def lastModified: Long =
-        try { url.openConnection.getLastModified }
+	/**
+	 * Create a new {@link AbstractFile} instance representing an
+	 * {@link org.osgi.framework.Bundle}
+	 * @param bundle
+	 */
+	def create(bundle: Bundle): AbstractFile = {
+	  require(bundle != null, "bundle must not be null")
+
+	  abstract class BundleEntry(url: URL, parent: DirEntry) extends AbstractFile {
+		require(url != null, "url must not be null")
+		lazy val (path: String, name: String) = getPathAndName(url)
+		lazy val fullName: String = (path::name::Nil).filter(!_.isEmpty).mkString("/")
+
+		/**
+		 * @return null
+		 */
+		def file: File = null
+
+		/**
+		 * @return last modification time or 0 if not known
+		 */
+		def lastModified: Long =
+		  try { url.openConnection.getLastModified }
         catch { case _ => 0 }
 
-      @throws(classOf[IOException])
-      def container: AbstractFile =
-        valueOrElse(parent) {
-          throw new IOException("No container")
-        }
-
-      @throws(classOf[IOException])
-      def input: InputStream = url.openStream()
-
-      /**
-       * Not supported. Always throws an IOException.
-       * @throws IOException
-       */
-      @throws(classOf[IOException])
-      def output = throw new IOException("not supported: output")
-
-      private def getPathAndName(url: URL): (String, String) = {
-        val u = url.getPath
-        var k = u.length
-        while( (k > 0) && (u(k - 1) == '/') )
-          k = k - 1
-
-        var j = k
-        while( (j > 0) && (u(j - 1) != '/') )
-          j = j - 1
-
-        (u.substring(if (j > 0) 1 else 0, if (j > 1) j - 1 else j), u.substring(j, k))
-      }
-
-      override def toString = fullName
-    }
-
-    class DirEntry(url: URL, parent: DirEntry) extends BundleEntry(url, parent) {
-
-      /**
-       * @return true
-       */
-      def isDirectory: Boolean = true
-
-      def elements: Iterator[AbstractFile] = {
-        new Iterator[AbstractFile]() {
-          val dirs = bundle.getEntryPaths(fullName)
-          def hasNext = dirs.hasMoreElements
-          def next = {
-            val entry = dirs.nextElement.asInstanceOf[String]
-            var entryUrl = bundle.getResource("/" + entry)
-
-            // Bundle.getResource seems to be inconsistent with respect to requiring
-            // a trailing slash
-            if (entryUrl == null) 
-              entryUrl = bundle.getResource("/" + removeTralingSlash(entry))
+		@throws(classOf[IOException])
+		def container: AbstractFile =
+		  valueOrElse(parent) {
+			throw new IOException("No container")
+		  }
+
+		@throws(classOf[IOException])
+		def input: InputStream = url.openStream()
+
+		/**
+		 * Not supported. Always throws an IOException.
+		 * @throws IOException
+		 */
+		@throws(classOf[IOException])
+		def output = throw new IOException("not supported: output")
+
+		private def getPathAndName(url: URL): (String, String) = {
+		  val u = url.getPath
+		  var k = u.length
+		  while( (k > 0) && (u(k - 1) == '/') )
+			k = k - 1
+
+		  var j = k
+		  while( (j > 0) && (u(j - 1) != '/') )
+			j = j - 1
+
+		  (u.substring(if (j > 0) 1 else 0, if (j > 1) j - 1 else j), u.substring(j, k))
+		}
+
+		override def toString = fullName
+	  }
+
+	  class DirEntry(url: URL, parent: DirEntry) extends BundleEntry(url, parent) {
+
+		/**
+		 * @return true
+		 */
+		def isDirectory: Boolean = true
+
+		def elements: Iterator[AbstractFile] = {
+		  new Iterator[AbstractFile]() {
+			val dirs = bundle.getEntryPaths(fullName)						
+			  def hasNext = if (dirs != null) { dirs.hasMoreElements} else {false}
+			  def next = {
+				val entry = dirs.nextElement.asInstanceOf[String]
+				var entryUrl = bundle.getResource("/" + entry)
+
+				// Bundle.getResource seems to be inconsistent with respect to requiring
+				// a trailing slash
+				if (entryUrl == null)
+				  entryUrl = bundle.getResource("/" + removeTralingSlash(entry))
             
-            if (entry.endsWith(".class"))
-              new FileEntry(entryUrl, DirEntry.this)
-            else
-              new DirEntry(entryUrl, DirEntry.this)
-          }
+				if (entry.endsWith(".class"))
+				  new FileEntry(entryUrl, DirEntry.this)
+				else
+				  new DirEntry(entryUrl, DirEntry.this)
+			  }
           
-          private def removeTralingSlash(s: String): String = 
-            if (s == null || s.length == 0)
-              s
-            else if (s.last == '/') 
-              removeTralingSlash(s.substring(0, s.length - 1))
-            else
-              s
-        }
-      }
-
-      def lookupName(name: String, directory: Boolean): AbstractFile = {
-        val entry = bundle.getEntry(fullName + "/" + name)
-        nullOrElse(entry) { entry =>
-          if (directory)
-            new DirEntry(entry, DirEntry.this)
-          else
-            new FileEntry(entry, DirEntry.this)
-        }
-      }
-
-    }
-
-    class FileEntry(url: URL, parent: DirEntry) extends BundleEntry(url, parent) {
-
-      /**
-       * @return false
-       */
-      def isDirectory: Boolean = false
-      override def sizeOption: Option[Int] = Some(bundle.getEntry(fullName).openConnection().getContentLength())
-      def elements: Iterator[AbstractFile] = Iterator.empty
-      def lookupName(name: String, directory: Boolean): AbstractFile = null
-    }
+			  private def removeTralingSlash(s: String): String = {
+				if (s == null || s.length == 0) {
+				  s
+				}else if (s.last == '/') {
+				  removeTralingSlash(s.substring(0, s.length - 1))
+				} else {
+				  s
+				}
+			  }
+		  }
+		}
+
+		def lookupName(name: String, directory: Boolean): AbstractFile = {
+		  val entry = bundle.getEntry(fullName + "/" + name)
+		  nullOrElse(entry) { entry =>
+			if (directory)
+			  new DirEntry(entry, DirEntry.this)
+			else
+			  new FileEntry(entry, DirEntry.this)
+		  }
+		}
+
+	  }
+
+	  class FileEntry(url: URL, parent: DirEntry) extends BundleEntry(url, parent) {
+
+		/**
+		 * @return false
+		 */
+		def isDirectory: Boolean = false
+		override def sizeOption: Option[Int] = Some(bundle.getEntry(fullName).openConnection().getContentLength())
+		def elements: Iterator[AbstractFile] = Iterator.empty
+		def lookupName(name: String, directory: Boolean): AbstractFile = null
+	  }
 
-    new DirEntry(bundle.getResource("/"), null)
-  }
+	  new DirEntry(bundle.getResource("/"), null)
+	}
 
-}
+  }
 
 }
\ No newline at end of file

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/ScalaInterpreter.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/ScalaInterpreter.scala?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/ScalaInterpreter.scala (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/interpreter/ScalaInterpreter.scala Mon Feb 22 11:31:27 2010
@@ -24,6 +24,7 @@
 import javax.script.ScriptException
 import java.security.{AccessController, PrivilegedAction}
 import java.lang.reflect.Method
+import org.apache.clerezza.scala.util.LineNumbersAdjustingUtil
 import scala.collection._
 import scala.tools.nsc.{Settings, Global}
 import scala.tools.nsc.interpreter.AbstractFileClassLoader
@@ -114,15 +115,13 @@
    * @return  a valid Scala source and the lines of headers that have been added before the actual code
    */
   protected def preProcess(name: String, code: String, bindings: Map[String, Type]): (String, Int) = {
-   
-    val compounds = packetize(name)
+
+	  val compounds = packetize(name)
 
     def packageDeclaration =
       if (compounds.size > 1) compounds.init.mkString("package ", ".", "") + NL
       else "" //to make sure the header always has the same length
-
     def className = compounds.last
-
     val header = packageDeclaration +
     "object " + className + " {" + NL +
     "  def main(bindings: Map[String, Any]," + NL +
@@ -149,8 +148,11 @@
      "val " + key + " =  bindings.get(\""+key+"\").get.asInstanceOf["+value.asInstanceOf[Class[AnyRef]].getName+"]"
    }).mkString(";"+NL)
   }
-  
-    
+
+  private def getName(filePath : String) : String = {
+	val compounds = packetize(filePath)
+	compounds.last
+  }    
 
   /**
    * Compiles a list of source files. No pre-processing takes place.
@@ -166,6 +168,9 @@
       reporter
     else {
       run.compileSources(sources)
+	  println(sources.first.path)
+	  LineNumbersAdjustingUtil.adjustAllFilesStartingWithFileName(
+		settings.outdir.value + "/", sources.first.path, -lineDeduction)
       reporter
     }
   }
@@ -187,9 +192,9 @@
    * @param bindings  variable bindings to pass to the script
    * @return  result of compilation
    */
-	def compile(name: String, code: String, bindings: Map[String, Type]) : Reporter = {
+	def compile(name: String, code: String, bindings: Map[String, Type], lineOffset : Int) : Reporter = {
 		val preprocessedScript = preProcess(name, code, bindings)
-    	compile(name, preprocessedScript._1, preprocessedScript._2)
+    	compile(getName(name), preprocessedScript._1, preprocessedScript._2 + lineOffset)
     }
 
   /**

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/CompiledScript.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/CompiledScript.scala?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/CompiledScript.scala (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/CompiledScript.scala Mon Feb 22 11:31:27 2010
@@ -39,18 +39,23 @@
 	 * @author rbn, mkn, pmg
 	 */
   
-	class CompiledScript (script : String , jTypeMap : Map[String, Type] , interpreter : ScalaInterpreter){
-		val name = createClassName()
+	class CompiledScript (script : String , jTypeMap : Map[String, Type] , interpreter : ScalaInterpreter,
+		  className : String, lineOffset : Int){
+		val name = if (className == null) {
+			createClassName("CompiledScalaScript");
+		} else {
+			createClassName(className.replaceAll("-", "_"));
+		}
+		
 		if (interpreter.getClassFile(name) == null) {
 			//prevents synchroneous compilation (even for different scripts)
 			CompiledScript.synchronized {
 				if (interpreter.getClassFile(name) == null) {
-					interpreter.compile(name, script, jTypeMap)
+					interpreter.compile(name, script, jTypeMap, lineOffset)
 				}
 			}
 		}
 
-
 		/**
 		 * Executes the Creates and stores a concept with the specified prefLabel into the
 		 * content graph if a concept with this prefLabel does not already exist in
@@ -73,7 +78,7 @@
 		 * 	Creates a name based on the hash value of the script
 		 * 	e.g. 54ec400cde5e65a27320d6c71e2a334d.class
 		 */
-		protected def createClassName() = {
+		protected def createClassName(className : String) = {
 			val encryptMsg : Array[Byte] =
 			try {
 				val md = MessageDigest.getInstance("MD5")
@@ -93,7 +98,7 @@
 				}
 				strBuf.append(swap); // appending swap to get complete hash-key
 			}
-			"CompiledScalaScript" + strBuf.toString()
+			className + strBuf.toString()
 		}
 	}
 

Modified: incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/ScalaService.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/ScalaService.scala?rev=912535&r1=910456&r2=912535&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/ScalaService.scala (original)
+++ incubator/clerezza/issues/CLEREZZA-128/org.apache.clerezza.scala/src/main/scala/org/apache/clerezza/scala/service/ScalaService.scala Mon Feb 22 11:31:27 2010
@@ -115,7 +115,7 @@
 				jTypeMap.put(entry._1, getAccessibleClass(entry._2.getClass))
 				valueMap.put(entry._1, entry._2)
 			}
-			interpretScalaScript(script, jTypeMap).execute(valueMap).asInstanceOf[Object]
+			interpretScalaScript(script, jTypeMap, null, 0).execute(valueMap).asInstanceOf[Object]
 		}
 		override def getFactory() = this
 		override def createBindings() : Bindings = new SimpleBindings
@@ -167,7 +167,8 @@
 		 *			the compiled scala script
 		 */
 		@throws(classOf[ScriptException])
-		def interpretScalaScript(script : String , jTypeMap : java.util.Map[String, java.lang.reflect.Type]) : CompiledScript = {
+		def interpretScalaScript(script : String , jTypeMap : java.util.Map[String, java.lang.reflect.Type],
+			  className : String, lineOffset : Int) : CompiledScript = {
 			val jHashMap = new java.util.HashMap[String, java.lang.reflect.Type]()
 			jHashMap.putAll(jTypeMap)
 			val map : immutable.Map[String, java.lang.reflect.Type] =
@@ -175,7 +176,7 @@
 			try {
 				val compileScript = AccessController.doPrivileged(new PrivilegedExceptionAction[CompiledScript] {
 						override def run(): CompiledScript = {
-							new CompiledScript(script, map, interpreter)
+							new CompiledScript(script, map, interpreter, className, lineOffset)
 						}
 				 })
 				return compileScript