tcurdt 02/05/14 05:46:57
Modified: src/java/org/apache/cocoon/components/language
LanguageException.java
src/java/org/apache/cocoon/components/language/programming/java
JavaLanguage.java
Log:
The LanguageException now also carries a source code excerpt for each error
(+/- a few lines around that error). So one does not always have to look
into the repository if an XSP compilation fails
Revision Changes Path
1.6 +138 -4
xml-cocoon2/src/java/org/apache/cocoon/components/language/LanguageException.java
Index: LanguageException.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/LanguageException.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- LanguageException.java 22 Feb 2002 07:00:07 -0000 1.5
+++ LanguageException.java 14 May 2002 12:46:57 -0000 1.6
@@ -51,20 +51,31 @@
package org.apache.cocoon.components.language;
import org.apache.avalon.framework.CascadingException;
+import org.apache.cocoon.components.language.programming.CompilerError;
import java.io.PrintStream;
import java.io.PrintWriter;
+import java.io.File;
+import java.io.FileReader;
/**
* The language exception.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ricardo Rocha</a>
- * @version CVS $Id: LanguageException.java,v 1.5 2002/02/22 07:00:07 cziegeler Exp
$
+ * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a>
+ * @version CVS $Id: LanguageException.java,v 1.6 2002/05/14 12:46:57 tcurdt Exp $
*/
public class LanguageException extends CascadingException {
- /**
- * The default constructor.
- */
+
+ private CompilerError[] errors = null;
+ private String filename = null;
+
+ public LanguageException(String message, String filename, CompilerError[]
errors) {
+ super(message);
+ this.filename = filename;
+ this.errors = errors;
+ }
+
public LanguageException(String message) {
super(message);
}
@@ -73,6 +84,31 @@
super(message, t);
}
+ public String getMessage() {
+ if (errors != null) {
+ StringBuffer extendedMessage = new StringBuffer();
+ extendedMessage.append(super.getMessage());
+
+ if (errors != null && filename != null) {
+ extendedMessage.append(getSource(filename));
+ }
+
+ for (int i = 0; i < errors.length; i++) {
+ CompilerError error = errors[i];
+ if (i > 0) extendedMessage.append("\n");
+ extendedMessage.append("Line ");
+ extendedMessage.append(error.getStartLine());
+ extendedMessage.append(", column ");
+ extendedMessage.append(error.getStartColumn());
+ extendedMessage.append(": ");
+ extendedMessage.append(error.getMessage());
+ }
+ return (extendedMessage.toString());
+ }
+ else {
+ return(super.getMessage());
+ }
+ }
// Stolen from ProcessingException...
@@ -104,4 +140,102 @@
getCause().printStackTrace(s);
}
+ private final static int linesBefore = 3;
+ private final static int linesAfter = 3;
+
+
+ private final static String getString( char[] buffer, int start, int end) {
+ int currentLine = 1;
+ int currentPos = 0;
+
+ while(currentLine < start && currentPos < buffer.length) {
+ if (buffer[currentPos++] == '\n') {
+ currentLine++;
+ }
+ }
+ int startPos = currentPos;
+
+ while(currentLine < (end+1) && currentPos < buffer.length) {
+ if (buffer[currentPos++] == '\n') {
+ currentLine++;
+ }
+ }
+ int endPos = currentPos;
+
+ return( new String( buffer, startPos, endPos-startPos ));
+ }
+
+ private String getSource( String filename ) {
+ File file = new File(filename);
+ long fileSize = file.length();
+ if (file != null && file.exists() && file.isFile() && fileSize > 0) {
+ // paranoid checking: nothing larger than ints can handle or 10MB
+ if (fileSize < Integer.MAX_VALUE || fileSize < 10 * 1024 * 1024) {
+ char[] buffer = new char[(int) fileSize];
+ try {
+ FileReader fileReader = new FileReader(file);
+ fileReader.read(buffer, 0, (int) fileSize);
+
+ StringBuffer listing = new StringBuffer();
+
+ for (int i = 0; i < errors.length; i++) {
+ CompilerError error = errors[i];
+
+ int start = error.getStartLine();
+ int end = error.getEndLine();
+
+ if (start > 0 && end > 0) {
+ String before = getString(buffer, start - 1 -
linesBefore, start - 1);
+ String itself = getString(buffer, start, end);
+ String after = getString(buffer, end + 1, end + 1 +
linesAfter);
+
+ listing.append("ERROR ").append(i + 1).append("
(").append(error.getFile()).append("):\n");
+ listing.append("...\n");
+ listing.append(before);
+ listing.append("\n// start error (lines
").append(error.getStartLine()).append("-").append(error.getEndLine()).append(")
\"").append(error.getMessage()).append("\"\n");
+ listing.append(itself);
+ listing.append("\n// end error\n");
+ listing.append(after);
+ listing.append("\n...\n");
+ }
+ }
+
+ fileReader.close();
+
+ return (listing.toString());
+ }
+ catch (Exception e) {
+ }
+ }
+ }
+ return (null);
+ }
+
+ /*
+ public static void main(String[] args) {
+ String s =
+ "1 \n"+
+ "2 System.out.println(\n"+
+ "3 \n"+
+ "4 this.contentHandler.startDocument();\n"+
+ "5 AttributesImpl xspAttr = new AttributesImpl();\n"+
+ "6 \n";
+
+ char[] buffer = s.toCharArray();
+
+ int start = 2;
+ int end = 2;
+
+ String before = getString(buffer, start - 1 - linesBefore, start - 1);
+ String itself = getString(buffer, start, end);
+ String after = getString(buffer, end + 1, end + 1 + linesAfter);
+
+
+ System.out.print(before);
+ System.out.println("--");
+ System.out.print(itself);
+ System.out.println("--");
+ System.out.print(after);
+ }
+ */
}
1.11 +4 -13
xml-cocoon2/src/java/org/apache/cocoon/components/language/programming/java/JavaLanguage.java
Index: JavaLanguage.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/programming/java/JavaLanguage.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- JavaLanguage.java 8 Mar 2002 04:08:53 -0000 1.10
+++ JavaLanguage.java 14 May 2002 12:46:57 -0000 1.11
@@ -75,7 +75,7 @@
* The Java programming language processor
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ricardo Rocha</a>
- * @version CVS $Id: JavaLanguage.java,v 1.10 2002/03/08 04:08:53 vgritsenko Exp $
+ * @version CVS $Id: JavaLanguage.java,v 1.11 2002/05/14 12:46:57 tcurdt Exp $
*/
public class JavaLanguage extends CompiledProgrammingLanguage
implements Initializable, ThreadSafe, Composable, Disposable {
@@ -228,19 +228,10 @@
message.append(":\n");
List errors = compiler.getErrors();
- int count = errors.size();
- for (int i = 0; i < count; i++) {
- CompilerError error = (CompilerError) errors.get(i);
- if (i > 0) message.append("\n");
- message.append("Line ");
- message.append(error.getStartLine());
- message.append(", column ");
- message.append(error.getStartColumn());
- message.append(": ");
- message.append(error.getMessage());
- }
+ CompilerError[] compilerErrors = new CompilerError[errors.size()];
+ errors.toArray(compilerErrors);
- throw new LanguageException(message.toString());
+ throw new LanguageException(message.toString(), filename_abs,
compilerErrors);
}
} catch (InstantiationException e) {
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]