/*
 * 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.axis2.jaxws;

import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.utility.JavaUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Controls error logging of exceptions thrown by the WebService application (provider, impl, etc.)
 * 
 * This class logs errors for all non-checked exceptions.
 * This class logs extensive debug information for all exceptions.
 */
public class WebServiceExceptionLogger {
    private static final Log log = LogFactory.getLog(WebServiceExceptionLogger.class);
    
    /**
     * Logs an error if the exception thrown by @WebMethod m is not a checked exception.
     * If debug logging is enabled, all exceptions are logged.
     * @param method
     * @param throwable
     * @param logFully (if true then the exception is logged, otherwise only the class and stack is logged)
     * @param serviceImplClass class of service implementation
     * @param serviceInstance 
     * @param args Object[] arguments pass to method
     */
    public static void log(Method method, 
                           Throwable throwable, 
                           boolean logFully,
                           Class serviceImplClass,
                           Object serviceInstance,
                           Object[] args) {
        
        // Must have debug or error logging enabled
        if (!log.isDebugEnabled() && !log.isErrorEnabled()) {
            return;
        }
        
        // Get the root of the exception
        Throwable rootT = null;
        if (throwable instanceof InvocationTargetException) {
            rootT = ((InvocationTargetException) throwable).getTargetException();
        }
        
        
        String name = rootT.getClass().getName();
        String stack = stackToString(rootT);
        
        // Determine if this is a checked exception or non-checked exception
        Class checkedException = JavaUtils.getCheckedException(rootT, method);
        
        if (checkedException == null) {
            // Only log errors for non-checked exceptions
            if (log.isErrorEnabled()) {
                String text = "";
                if (logFully) {
                    text = Messages.getMessage("failureLogger", name, rootT.toString());
                   
                } else {
                    text = Messages.getMessage("failureLogger", name, stack);
                }
                log.error(text);
            }
            
        } 
        
        // Full logging if debug is enabled.
        if (log.isDebugEnabled()) {
            log.debug("Exception invoking a method of " + serviceImplClass.toString()
                    + " of instance " + serviceInstance.toString());
            log.debug("Exception type thrown: " + throwable.getClass().getName());
            if (rootT != null) {
                log.debug("Root Exception type thrown: " + rootT.getClass().getName());
            }
            if (checkedException != null) {
                log.debug("The exception is an instance of checked exception: " + 
                          checkedException.getName());
            }
            log.debug("Method = " + method.toGenericString());
            for (int i = 0; i < args.length; i++) {
                String value =
                        (args[i] == null) ? "null"
                                : args[i].getClass().toString();
                log.debug(" Argument[" + i + "] is " + value);
            }
        }
        return;
        
    }
    
    /**
     * Get a string containing the stack of the specified exception
     *
     * @param e
     * @return
     */
    private static String stackToString(Throwable e) {
        java.io.StringWriter sw = new java.io.StringWriter();
        java.io.BufferedWriter bw = new java.io.BufferedWriter(sw);
        java.io.PrintWriter pw = new java.io.PrintWriter(bw);
        e.printStackTrace(pw);
        pw.close();
        String text = sw.getBuffer().toString();
        // Jump past the throwable
        text = text.substring(text.indexOf("at"));
        return text;
    }
    
    
}
