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    }