| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- // -*- C++ -*-
- // Module: Log4CPLUS
- // File: factory.h
- // Created: 2/2002
- // Author: Tad E. Smith
- //
- //
- // Copyright 2002-2015 Tad E. Smith
- //
- // Licensed 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.
- /** @file */
- #ifndef LOG4CPLUS_SPI_FACTORY_HEADER_
- #define LOG4CPLUS_SPI_FACTORY_HEADER_
- #include <log4cplus/config.hxx>
- #if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
- #pragma once
- #endif
- #include <log4cplus/appender.h>
- #include <log4cplus/layout.h>
- #include <log4cplus/tstring.h>
- #include <log4cplus/spi/filter.h>
- #include <log4cplus/spi/objectregistry.h>
- #include <memory>
- #include <vector>
- #include <locale>
- namespace log4cplus {
- namespace spi {
- /**
- * This is the base class for all factories.
- */
- class LOG4CPLUS_EXPORT BaseFactory {
- public:
- virtual ~BaseFactory() = 0;
- /**
- * Returns the typename of the objects this factory creates.
- */
- virtual log4cplus::tstring const & getTypeName() const = 0;
- };
- /**
- * This abstract class defines the "Factory" interface to create "Appender"
- * objects.
- */
- class LOG4CPLUS_EXPORT AppenderFactory : public BaseFactory {
- public:
- typedef Appender ProductType;
- typedef SharedAppenderPtr ProductPtr;
- AppenderFactory();
- virtual ~AppenderFactory() = 0;
- /**
- * Create an "Appender" object.
- */
- virtual SharedAppenderPtr createObject(const log4cplus::helpers::Properties& props) = 0;
- };
- /**
- * This abstract class defines the "Factory" interface to create "Layout"
- * objects.
- */
- class LOG4CPLUS_EXPORT LayoutFactory : public BaseFactory {
- public:
- typedef Layout ProductType;
- typedef std::auto_ptr<Layout> ProductPtr;
- LayoutFactory();
- virtual ~LayoutFactory() = 0;
- /**
- * Create a "Layout" object.
- */
- virtual std::auto_ptr<Layout> createObject(const log4cplus::helpers::Properties& props) = 0;
- };
- /**
- * This abstract class defines the "Factory" interface to create "Appender"
- * objects.
- */
- class LOG4CPLUS_EXPORT FilterFactory : public BaseFactory {
- public:
- typedef Filter ProductType;
- typedef FilterPtr ProductPtr;
- FilterFactory();
- virtual ~FilterFactory() = 0;
- /**
- * Create a "Filter" object.
- */
- virtual FilterPtr createObject(const log4cplus::helpers::Properties& props) = 0;
- };
- /**
- * This abstract class defines the "Factory" interface to
- * create std::locale instances.
- */
- class LOG4CPLUS_EXPORT LocaleFactory
- : public BaseFactory
- {
- public:
- typedef std::locale ProductType;
- typedef std::locale ProductPtr;
- LocaleFactory();
- virtual ~LocaleFactory() = 0;
- //! \returns std::locale instance
- virtual ProductPtr createObject (
- const log4cplus::helpers::Properties & props) = 0;
- };
- /**
- * This template class is used as a "Factory Registry". Objects are
- * "entered" into the registry with a "name" using the
- * <code>put()</code> method. (The registry then owns the object.)
- * These object can then be retrieved using the <code>get()</code>
- * method.
- *
- * <b>Note:</b> This class is Thread-safe.
- */
- template<class T>
- class LOG4CPLUS_EXPORT FactoryRegistry
- : public ObjectRegistryBase
- {
- public:
- typedef T product_type;
- virtual ~FactoryRegistry() {
- clear();
- }
- // public methods
- /**
- * Used to enter an object into the registry. (The registry now
- * owns <code>object</code>.)
- */
- bool put(std::auto_ptr<T> object) {
- bool putValResult = putVal(object->getTypeName(), object.get());
- object.release();
- return putValResult;
- }
- /**
- * Used to retrieve an object from the registry. (The registry
- * owns the returned pointer.)
- */
- T* get(const log4cplus::tstring& name) const {
- return static_cast<T*>(getVal(name));
- }
- protected:
- virtual void deleteObject(void *object) const {
- delete static_cast<T*>(object);
- }
- };
- typedef FactoryRegistry<AppenderFactory> AppenderFactoryRegistry;
- typedef FactoryRegistry<LayoutFactory> LayoutFactoryRegistry;
- typedef FactoryRegistry<FilterFactory> FilterFactoryRegistry;
- typedef FactoryRegistry<LocaleFactory> LocaleFactoryRegistry;
- /**
- * Returns the "singleton" <code>AppenderFactoryRegistry</code>.
- */
- LOG4CPLUS_EXPORT AppenderFactoryRegistry& getAppenderFactoryRegistry();
- /**
- * Returns the "singleton" <code>LayoutFactoryRegistry</code>.
- */
- LOG4CPLUS_EXPORT LayoutFactoryRegistry& getLayoutFactoryRegistry();
- /**
- * Returns the "singleton" <code>FilterFactoryRegistry</code>.
- */
- LOG4CPLUS_EXPORT FilterFactoryRegistry& getFilterFactoryRegistry();
- /**
- * Returns the "singleton" <code>LocaleFactoryRegistry</code>.
- */
- LOG4CPLUS_EXPORT LocaleFactoryRegistry& getLocaleFactoryRegistry();
- template <typename ProductFactoryBase>
- class LocalFactoryBase
- : public ProductFactoryBase
- {
- public:
- LocalFactoryBase (tchar const * n)
- : name (n)
- { }
- virtual log4cplus::tstring const & getTypeName() const
- {
- return name;
- }
- private:
- log4cplus::tstring name;
- };
- template <typename LocalProduct, typename ProductFactoryBase>
- class FactoryTempl
- : public LocalFactoryBase<ProductFactoryBase>
- {
- public:
- typedef typename ProductFactoryBase::ProductPtr ProductPtr;
- FactoryTempl (tchar const * n)
- : LocalFactoryBase<ProductFactoryBase> (n)
- { }
- virtual ProductPtr createObject (helpers::Properties const & props)
- {
- return ProductPtr (new LocalProduct (props));
- }
- };
- #define LOG4CPLUS_REG_PRODUCT(reg, productprefix, productname, productns, productfact) \
- reg.put ( \
- std::auto_ptr<productfact> ( \
- new log4cplus::spi::FactoryTempl<productns productname, productfact> ( \
- LOG4CPLUS_TEXT(productprefix) \
- LOG4CPLUS_TEXT(#productname))))
- #define LOG4CPLUS_REG_APPENDER(reg, appendername) \
- LOG4CPLUS_REG_PRODUCT (reg, "log4cplus::", appendername, log4cplus::, \
- log4cplus::spi::AppenderFactory)
- #define LOG4CPLUS_REG_LAYOUT(reg, layoutname) \
- LOG4CPLUS_REG_PRODUCT (reg, "log4cplus::", layoutname, log4cplus::, \
- log4cplus::spi::LayoutFactory)
- #define LOG4CPLUS_REG_FILTER(reg, filtername) \
- LOG4CPLUS_REG_PRODUCT (reg, "log4cplus::spi::", filtername, log4cplus::spi::, \
- log4cplus::spi::FilterFactory)
- #define LOG4CPLUS_REG_LOCALE(reg, name, factory) \
- reg.put (std::auto_ptr<log4cplus::spi::LocaleFactory> ( \
- new factory (name)))
- } // namespace spi
- }
- #endif // LOG4CPLUS_SPI_FACTORY_HEADER_
|