00001 #if !defined(h_3e645482_ae6a_43e5_8f81_abbc4200212d)
00002 #define h_3e645482_ae6a_43e5_8f81_abbc4200212d
00003
00004 #include <map>
00005 #include <string>
00006 #include <sstream>
00007 #include <stdexcept>
00008 #include "Portability.hh"
00009
00010 namespace log4cpp
00011 {
00012 class FactoryParams;
00013 namespace details
00014 {
00015 class base_validator_data
00016 {
00017 public:
00018 base_validator_data(const char* tag, const FactoryParams* params) : tag_(tag), params_(params){}
00019
00020 protected:
00021 const char* tag_;
00022 const FactoryParams* params_;
00023
00024 template<typename T>
00025 void assign(const std::string& param_value, T& value) const
00026 {
00027 assign_impl(param_value, value);
00028 }
00029
00030 template<typename T>
00031 void assign_impl(const std::string& param_value, T& value) const
00032 {
00033 std::stringstream s;
00034 s << param_value;
00035 s >> value;
00036 }
00037
00038 void assign_impl(const std::string& param_value, std::string& value) const
00039 {
00040 value = param_value;
00041 }
00042
00043 void throw_error(const char* param_name) const
00044 {
00045 std::stringstream s;
00046 s << "Property '" << param_name << "' required to configure " << tag_;
00047 throw std::runtime_error(s.str());
00048 }
00049 };
00050
00051 class optional_params_validator;
00052 class required_params_validator : public base_validator_data
00053 {
00054 public:
00055 required_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
00056
00057 template<typename T>
00058 optional_params_validator optional(const char* param, T& value) const;
00059
00060 template<typename T>
00061 const required_params_validator& operator()(const char* param, T& value) const;
00062 };
00063
00064 class optional_params_validator : public base_validator_data
00065 {
00066 public:
00067 optional_params_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
00068
00069 template<typename T>
00070 required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
00071
00072 template<typename T>
00073 const optional_params_validator& operator()(const char* param, T& value) const;
00074 };
00075
00076 template<typename T>
00077 optional_params_validator required_params_validator::optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
00078
00079 class parameter_validator : public base_validator_data
00080 {
00081 public:
00082 parameter_validator(const char* tag, const FactoryParams* params) : base_validator_data(tag, params) {}
00083
00084 template<typename T>
00085 required_params_validator required(const char* param, T& value) const { required_params_validator v(tag_, params_); v(param, value); return v; }
00086
00087 template<typename T>
00088 optional_params_validator optional(const char* param, T& value) const { optional_params_validator v(tag_, params_); v(param, value); return v; }
00089 };
00090 }
00091
00092 class LOG4CPP_EXPORT FactoryParams
00093 {
00094 typedef std::map<std::string, std::string> storage_t;
00095
00096 storage_t storage_;
00097
00098 public:
00099 typedef storage_t::const_iterator const_iterator;
00100
00101 const std::string& operator[](const std::string& v) const;
00102 std::string& operator[](const std::string& v) { return storage_[v]; }
00103 details::parameter_validator get_for(const char* tag) const { return details::parameter_validator(tag, this); }
00104 const_iterator find(const std::string& t) const;
00105 const_iterator begin() const { return storage_.begin(); }
00106 const_iterator end() const { return storage_.end(); }
00107
00108 private:
00109
00110
00111
00112 };
00113
00114 namespace details
00115 {
00116 template<typename T>
00117 const required_params_validator& required_params_validator::operator()(const char* param, T& value) const
00118 {
00119 FactoryParams::const_iterator i = params_->find(param);
00120 if (i != params_->end())
00121 assign(i->second, value);
00122 else
00123 throw_error(param);
00124
00125 return *this;
00126 }
00127
00128 template<typename T>
00129 const optional_params_validator& optional_params_validator::operator()(const char* param, T& value) const
00130 {
00131 FactoryParams::const_iterator i = params_->find(param);
00132 if (i != params_->end())
00133 assign(i->second, value);
00134
00135 return *this;
00136 }
00137 }
00138 }
00139
00140 #endif // h_3e645482_ae6a_43e5_8f81_abbc4200212d