001 package org.nanocontainer.script.groovy;
002
003 import java.util.Collections;
004 import java.util.List;
005
006 import org.codehaus.groovy.control.CompilationFailedException;
007 import org.codehaus.groovy.control.ErrorCollector;
008 import org.codehaus.groovy.control.ProcessingUnit;
009 import org.codehaus.groovy.control.messages.ExceptionMessage;
010 import org.nanocontainer.script.NanoContainerMarkupException;
011
012 /**
013 * @author Paul Hammant
014 * @version $Revision: 3144 $
015 */
016 public class GroovyCompilationException extends NanoContainerMarkupException {
017 private CompilationFailedException compilationFailedException;
018
019 public GroovyCompilationException(String message, CompilationFailedException e) {
020 super(message,e);
021 this.compilationFailedException = e;
022 }
023
024 public String getMessage() {
025 StringBuffer sb = new StringBuffer();
026 sb.append(super.getMessage() + "\n");
027 List errors = getErrors(compilationFailedException);
028 for (int i = 0; i < errors.size(); i++) {
029 Object o = errors.get(i);
030 if (o instanceof ExceptionMessage) {
031 ExceptionMessage em = (ExceptionMessage) o;
032 sb.append(em.getCause().getMessage() + "\n");
033 }
034 }
035 return sb.toString();
036 }
037
038 /**
039 * Extract errors from groovy exception, coding defensively against
040 * possible null values.
041 * @param e the CompilationFailedException
042 * @return A List of errors
043 */
044 private List getErrors(CompilationFailedException e) {
045 ProcessingUnit unit = e.getUnit();
046 if ( unit != null ){
047 ErrorCollector collector = unit.getErrorCollector();
048 if ( collector != null ){
049 List errors = collector.getErrors();
050 if ( errors != null ){
051 return errors;
052 }
053 }
054 }
055 return Collections.EMPTY_LIST;
056 }
057 }