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]

Reply via email to