/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.easyant.core.ant.listerners;

import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.util.StringUtils;

public class DefaultEasyAntLogger extends DefaultLogger {

    private static final String WHERE_MSG = "* Where";
    private static final String DIAGNOSTIC_MSG = "* Dr Myrmex diagnostic";
    private static final String RECOMENDATION_MSG = "* Recomendation ...";
    private static final String RECOMENDATION_LONG_DESC = "Dr Myrmex suggest you to run easyant with -verbose or -debug option to get more details.";

    private long startTime = System.currentTimeMillis();

    protected static void throwableMessage(StringBuffer m, Throwable error,
            boolean verbose) {

        while (error !=null) {
            Throwable cause = error.getCause();
            if (cause == null) {
                break;
            }
            String msg1 = error.toString();
            String msg2 = cause.toString();
            if (msg1.endsWith(msg2)) {
                String messageException = msg1.substring(0, msg1.length()
                        - msg2.length());
                if (error instanceof BuildException) {
                    BuildException be = (BuildException) error;

                    // wipe location information
                    if (be.getLocation() != null) {
                        messageException = messageException.substring(be
                                .getLocation().toString().length());

                    }
                }
                m.append("Error : ").append(messageException);
                m.append(lSep);
                m.append("Cause : ");
                error = cause;
            } else {
                break;
            }
        }
        // if (verbose || !(error instanceof BuildException)) {
        if (verbose) {
            m.append(StringUtils.getStackTrace(error));
        } else {
            m.append(error.getMessage()).append(lSep);
        }
    }

    @Override
    public void buildFinished(BuildEvent event) {
        Throwable error = event.getException();
        StringBuffer message = new StringBuffer();
        if (error == null) {
            message.append(StringUtils.LINE_SEP);
            message.append(getBuildSuccessfulMessage());
        } else {
            message.append(StringUtils.LINE_SEP);
            message.append(getBuildFailedMessage());
            message.append(StringUtils.LINE_SEP);

            message.append("Dr Myrmex found an error when building ");
            message.append(extractProjectName(event));
            message.append(StringUtils.LINE_SEP);
            if (error instanceof BuildException) {
                BuildException be = (BuildException) error;
                if (be.getLocation().getFileName() != null) {
                    message.append(WHERE_MSG);
                    message.append(lSep).append(lSep);
                    message.append("File : ").append(
                            be.getLocation().getFileName()).append(lSep);
                    message.append("Line : ").append(
                            be.getLocation().getLineNumber());
                    message.append(" column : ").append(
                            be.getLocation().getColumnNumber()).append(lSep);
                }
                if (Project.MSG_DEBUG == msgOutputLevel) {
                    message.append(StringUtils.LINE_SEP);
                    message.append("Import stack :");
                    message.append(StringUtils.LINE_SEP);
                    ProjectHelper helper = (ProjectHelper) event
                            .getProject()
                            .getReference(ProjectHelper.PROJECTHELPER_REFERENCE);
                    for (int i = 0; i < helper.getImportStack().size(); i++) {
                        message.append(helper.getImportStack().get(i)
                                .toString());
                        message.append(StringUtils.LINE_SEP);

                    }
                }

            }
            message.append(StringUtils.LINE_SEP);
            message.append(DIAGNOSTIC_MSG);
            message.append(StringUtils.LINE_SEP);
            message.append(StringUtils.LINE_SEP);
            throwableMessage(message, error,
                    Project.MSG_VERBOSE <= msgOutputLevel);
            message.append(StringUtils.LINE_SEP);
            if (msgOutputLevel < Project.MSG_VERBOSE) {
                message.append(StringUtils.LINE_SEP);
                message.append(RECOMENDATION_MSG);
                message.append(StringUtils.LINE_SEP);
                message.append(StringUtils.LINE_SEP);
                message.append(RECOMENDATION_LONG_DESC);
            }
        }
        message.append(StringUtils.LINE_SEP);
        message.append(StringUtils.LINE_SEP);
        message.append("Total time: ");
        message.append(formatTime(System.currentTimeMillis() - startTime));

        String msg = message.toString();
        if (error == null) {
            printMessage(msg, out, Project.MSG_VERBOSE);
        } else {
            printMessage(msg, err, Project.MSG_ERR);
        }
        log(msg);

    }

    @Override
    public void buildStarted(BuildEvent event) {
        startTime = System.currentTimeMillis();
    }

}

@@ -971,23 +971,24 @@
 ols.ant.
-Default
+NoBanner
 Logger;%0A
@@ -1156,23 +1156,24 @@
 extends 
-Default
+NoBanner
 Logger %7B

Use NoBannerLogger instead of DefaultLogger as base class for DefaultEasyantLogger