/*
 * 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.logging.log4j.appserver.jetty;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;
import org.eclipse.jetty.util.log.AbstractLogger;
import org.eclipse.jetty.util.log.Logger;

/**
 * Provides a native Apache Log4j 2 logger for Eclipse Jetty logging.
 * 
 * <p>
 * To direct Jetty to use this class, set the system property {{org.eclipse.jetty.util.log.class}} to this class name.
 * </p>
 *
 * <p>
 * From the command line with:
 * </p>
 * <pre>-Dorg.eclipse.jetty.util.log.class = org.apache.logging.log4j.appserver.jetty.Log4j2Logger</pre>
 *
 * <p>
 * Programmatically with:
 * </p>
 * <pre>System.setProperty("org.eclipse.jetty.util.log.class", "org.apache.logging.log4j.appserver.jetty.Log4j2Logger");</pre>
 *
 * @since Apache Log4j 2.10.0
 */
public class Log4j2Logger extends AbstractLogger {

    private static final String PARENT_FQCN = AbstractLogger.class.getName();
    /**
     * Internal LogManager. Applications call AbstractLogger's getLogger() method so that class must be used
     * as the parent to locate the caller's ClassLoader.
     */
    private static class PrivateManager extends LogManager {

        public static LoggerContext getContext() {
            final ClassLoader cl = AbstractLogger.class.getClassLoader();
            return getContext(PARENT_FQCN, cl, false);
        }

        public static ExtendedLogger getLogger(final String name) {
            return getContext().getLogger(name);
        }
    }

    static final String FQCN = Log4j2Logger.class.getName();
    private final ExtendedLogger logger;

    private final String name;

    public Log4j2Logger() {
        this("");
    }

    public Log4j2Logger(final String name) {
        super();
        this.name = name;
        this.logger = PrivateManager.getLogger(name);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#debug(java.lang.String, java.lang.Object[])
     */
    @Override
    public void debug(final String msg, final Object... args) {
        logger.logIfEnabled(FQCN, Level.DEBUG, null, msg, args);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#debug(java.lang.String, java.lang.Throwable)
     */
    @Override
    public void debug(final String msg, final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.DEBUG, null, msg, thrown);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#debug(java.lang.Throwable)
     */
    @Override
    public void debug(final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.DEBUG, null, (Object) null, thrown);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#getName()
     */
    @Override
    public String getName() {
        return name;
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#ignore(java.lang.Throwable)
     */
    @Override
    public void ignore(final Throwable ignored) {
        // Really do nothing
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#info(java.lang.String, java.lang.Object[])
     */
    @Override
    public void info(final String msg, final Object... args) {
        logger.logIfEnabled(FQCN, Level.INFO, null, msg, args);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#info(java.lang.String, java.lang.Throwable)
     */
    @Override
    public void info(final String msg, final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.INFO, null, msg, thrown);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#info(java.lang.Throwable)
     */
    @Override
    public void info(final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.INFO, null, (Object) null, thrown);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#isDebugEnabled()
     */
    @Override
    public boolean isDebugEnabled() {
        return logger.isDebugEnabled();
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.AbstractLogger#newLogger(java.lang.String)
     */
    @Override
    protected Logger newLogger(final String fullname) {
        return new Log4j2Logger(fullname);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#setDebugEnabled(boolean)
     */
    @Override
    public void setDebugEnabled(final boolean enabled) {
        warn("setDebugEnabled not implemented");
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#warn(java.lang.String, java.lang.Object[])
     */
    @Override
    public void warn(final String msg, final Object... args) {
        logger.logIfEnabled(FQCN, Level.WARN, null, msg, args);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#warn(java.lang.String, java.lang.Throwable)
     */
    @Override
    public void warn(final String msg, final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.WARN, null, msg, thrown);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jetty.util.log.Logger#warn(java.lang.Throwable)
     */
    @Override
    public void warn(final Throwable thrown) {
        logger.logIfEnabled(FQCN, Level.WARN, null, (Object) null, thrown);
    }

}
