/*
 * 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.sling.discovery.oak;

import java.util.concurrent.atomic.AtomicReference;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.spi.LoggingEvent;

/**
 * Helper log4j appender that allows failing on log.error during a test
 */
public class Log4jErrorCatcher extends AppenderSkeleton {

    public static Log4jErrorCatcher installErrorCatcher(Class<?> clazz) {
        return installErrorCatcher(clazz.getName());
    }

    public static Log4jErrorCatcher installErrorCatcher(String className) {
        final Log4jErrorCatcher catcher = new Log4jErrorCatcher(className);
        LogManager.getLogger(className).addAppender(catcher);
        return catcher;

    }

    private final AtomicReference<String> lastErrorMsg = new AtomicReference<>();
    private final String className;

    public Log4jErrorCatcher(String className) {
        this.className = className;
    }

    @Override
    public void close() {

    }

    @Override
    protected void append(LoggingEvent event) {
        if (event.getLevel() == Level.ERROR) {
            lastErrorMsg.set(event.getRenderedMessage());
        }
    }

    @Override
    public boolean requiresLayout() {
        return false;
    }

    public String getLastErrorMsg() {
        return lastErrorMsg.get();
    }

    public void uninstall() {
        LogManager.getLogger(className).removeAppender(this);
    }
}