001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017package org.apache.logging.slf4j;
018
019import org.apache.logging.log4j.message.MessageFactory;
020import org.apache.logging.log4j.spi.ExtendedLogger;
021import org.apache.logging.log4j.spi.LoggerContext;
022import org.apache.logging.log4j.spi.LoggerRegistry;
023import org.slf4j.LoggerFactory;
024
025/**
026 *
027 */
028public class SLF4JLoggerContext implements LoggerContext {
029    private final LoggerRegistry<ExtendedLogger> loggerRegistry = new LoggerRegistry<>();
030
031    @Override
032    public Object getExternalContext() {
033        return null;
034    }
035
036    @Override
037    public ExtendedLogger getLogger(final String name) {
038        if (!loggerRegistry.hasLogger(name)) {
039            loggerRegistry.putIfAbsent(name, null, new SLF4JLogger(name, LoggerFactory.getLogger(name)));
040        }
041        return loggerRegistry.getLogger(name);
042    }
043
044    @Override
045    public ExtendedLogger getLogger(final String name, final MessageFactory messageFactory) {
046        // FIXME according to LOG4J2-1180, the below line should be:
047        // FIXME if (!loggerRegistry.hasLogger(name, messageFactory)) {
048        if (!loggerRegistry.hasLogger(name)) {
049            // FIXME: should be loggerRegistry.putIfAbsent(name, messageFactory,
050            loggerRegistry.putIfAbsent(name, null,
051                    new SLF4JLogger(name, messageFactory, LoggerFactory.getLogger(name)));
052        }
053        // FIXME should be return loggerRegistry.getLogger(name, messageFactory);
054        return loggerRegistry.getLogger(name);
055
056        // TODO applying the above fixes causes (log4j-to-slf4j) LoggerTest to fail
057    }
058
059    @Override
060    public boolean hasLogger(final String name) {
061        return loggerRegistry.hasLogger(name);
062    }
063
064    @Override
065    public boolean hasLogger(final String name, final MessageFactory messageFactory) {
066        return loggerRegistry.hasLogger(name, messageFactory);
067    }
068
069    @Override
070    public boolean hasLogger(final String name, final Class<? extends MessageFactory> messageFactoryClass) {
071        return loggerRegistry.hasLogger(name, messageFactoryClass);
072    }
073}