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]