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


Reply via email to