/*
 * 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.
 */

#ifndef _LOG4CXX_SPI_LOG_REPOSITORY_H
#define _LOG4CXX_SPI_LOG_REPOSITORY_H

#if defined(_MSC_VER)
    #pragma warning ( push )
    #pragma warning ( disable: 4231 4251 4275 4786 )
#endif


#include <log4cxx/appender.h>
#include <log4cxx/spi/loggerfactory.h>
#include <log4cxx/level.h>
#include <log4cxx/spi/hierarchyeventlistener.h>

namespace log4cxx
{
namespace spi
{

/**
A <code>LoggerRepository</code> is used to create and retrieve
<code>Loggers</code>. The relation between loggers in a repository
depends on the repository but typically loggers are arranged in a
named hierarchy.

<p>In addition to the creational methods, a
<code>LoggerRepository</code> can be queried for existing loggers,
can act as a point of registry for events related to loggers.
*/
class LOG4CXX_EXPORT LoggerRepository : public virtual helpers::Object
{
    public:
        DECLARE_ABSTRACT_LOG4CXX_OBJECT(LoggerRepository)
        virtual ~LoggerRepository() {}

        /**
        Add a {@link spi::HierarchyEventListener HierarchyEventListener}
                    event to the repository.
        */
        virtual void addHierarchyEventListener(const HierarchyEventListenerPtr&
                                               listener) = 0;
        /**
        Is the repository disabled for a given level? The answer depends
        on the repository threshold and the <code>level</code>
        parameter. See also #setThreshold method.  */
        virtual bool isDisabled(int level) const = 0;

        /**
        Set the repository-wide threshold. All logging requests below the
        threshold are immediately dropped. By default, the threshold is
        set to <code>Level::getAll()</code> which has the lowest possible rank.  */
        virtual void setThreshold(const LevelPtr& level) = 0;

        /**
        Another form of {@link #setThreshold(const LevelPtr&)
                    setThreshold} accepting a string
        parameter instead of a <code>Level</code>. */
        virtual void setThreshold(const LogString& val) = 0;

        virtual void emitNoAppenderWarning(const LoggerPtr& logger) = 0;

        /**
        Get the repository-wide threshold. See {@link
        #setThreshold(const LevelPtr&) setThreshold}
                    for an explanation. */
        virtual const LevelPtr& getThreshold() const = 0;

        virtual LoggerPtr getLogger(const LogString& name) = 0;

        virtual LoggerPtr getLogger(const LogString& name,
                                    const spi::LoggerFactoryPtr& factory) = 0;

        virtual LoggerPtr getRootLogger() const = 0;

        virtual LoggerPtr exists(const LogString& name) = 0;

        virtual void shutdown() = 0;

        virtual LoggerList getCurrentLoggers() const = 0;

        virtual void fireAddAppenderEvent(const LoggerPtr& logger,
                                          const AppenderPtr& appender) = 0;

        virtual void resetConfiguration() = 0;

        virtual bool isConfigured() = 0;
        virtual void setConfigured(bool configured) = 0;

}; // class LoggerRepository

}  // namespace spi
} // namespace log4cxx

#if defined(_MSC_VER)
    #pragma warning ( pop )
#endif


#endif //_LOG4CXX_SPI_LOG_REPOSITORY_H
