32 #ifndef LSST_PEX_POLICY_DICTIONARY_H 
   33 #define LSST_PEX_POLICY_DICTIONARY_H 
   37 #include <boost/regex.hpp> 
   92         WRONG_OCCURRENCE_COUNT = 30,
 
   95         VALUE_DISALLOWED = 32,
 
  101         VALUE_OUT_OF_RANGE = 64,
 
  113         BAD_DEFINITION = 256,
 
  122     static const std::string& getErrorMessageFor(ErrorType err) {
 
  123         if (_errmsgs.size() == 0) _loadMessages();
 
  124         MsgLookup::iterator it = _errmsgs.find(err);
 
  125         if (it != _errmsgs.end())
 
  135                 if (j->first != OK && (err & j->first) == j->first) {
 
  136                     os << (
first ? 
"" : 
"; ") << j->second;
 
  147     ValidationError(
std::string const& message) : 
lsst::
pex::exceptions::LogicError(message), _errors() {}
 
  153     ValidationError(
char const* ex_file, 
int ex_line, 
char const* ex_func)
 
  154             : 
lsst::
pex::exceptions::LogicError(ex_file, ex_line, ex_func,
 
  155                                                 "Policy has unknown validation errors"),
 
  159     virtual char const* getType(
void) 
const throw();
 
  164     ValidationError(
const ValidationError& that)
 
  165             : 
lsst::
pex::exceptions::LogicError(that), _errors(that._errors) {}
 
  167     ValidationError& operator=(
const ValidationError& that) {
 
  168         LogicError::operator=(that);
 
  169         _errors = that._errors;
 
  183     virtual ~ValidationError() throw();
 
  188     int getParamCount()
 const { 
return _errors.size(); }
 
  195         ParamLookup::const_iterator it;
 
  196         for (it = _errors.begin(); it != _errors.end(); it++) names.
push_back(it->first);
 
  209         ParamLookup::const_iterator it = _errors.find(
name);
 
  210         if (it != _errors.end())
 
  225     int getErrors()
 const {
 
  227         ParamLookup::const_iterator it;
 
  228         for (it = _errors.begin(); it != _errors.end(); it++) out |= it->second;
 
  242     virtual char const* what(
void) 
const throw();
 
  248     static MsgLookup _errmsgs;
 
  250     static void _loadMessages();
 
  266             : _type(Policy::UNDETERMINED), _name(paramName), _policy(), _wildcard(false) {
 
  267         _policy.reset(
new Policy());
 
  276             : _type(Policy::UNDETERMINED), _name(paramName), _policy(defn), _wildcard(false) {}
 
  283             : _type(Policy::UNDETERMINED), _name(), _policy(defn), _wildcard(false) {}
 
  288     Definition(
const Definition& that)
 
  289             : _type(Policy::UNDETERMINED), _name(that._name), _policy(that._policy), _wildcard(false) {}
 
  294     Definition& operator=(
const Definition& that) {
 
  297         _policy = that._policy;
 
  298         _prefix = that._prefix;
 
  299         _wildcard = that._wildcard;
 
  307     Definition& operator=(
const Policy::Ptr& defdata) {
 
  312     virtual ~Definition();
 
  317     const std::string& getName()
 const { 
return _name; }
 
  324     const std::string getPrefix()
 const { 
return _prefix; }
 
  333     const bool isChildDefinition()
 const { 
return _wildcard; }
 
  334     void setChildDefinition(
bool wildcard) { _wildcard = wildcard; }
 
  335     const bool isWildcard()
 const { 
return _wildcard; }
 
  336     void setWildcard(
bool wildcard) { _wildcard = wildcard; }
 
  343     void setName(
const std::string& newname) { _name = newname; }
 
  348     const Policy::Ptr& getData()
 const { 
return _policy; }
 
  375     std::string getDefault()
 const { 
return _policy->str(
"default"); }
 
  387     const int getMaxOccurs() 
const;
 
  393     const int getMinOccurs() 
const;
 
  401     void setDefaultIn(Policy& policy, ValidationError* errs = 0)
 const { setDefaultIn(policy, _name, errs); }
 
  408     void setDefaultIn(Policy& policy, 
const std::string& withName, ValidationError* errs = 0) 
const;
 
  413     template <
typename T>
 
  414     void setDefaultIn(Policy& policy, 
const std::string& withName, ValidationError* errs = 0) 
const;
 
  443     void validate(
const Policy& policy, ValidationError* errs = 0)
 const { 
validate(policy, _name, errs); }
 
  473                   ValidationError* errs = 0) 
const;
 
  475                   ValidationError* errs = 0) 
const;
 
  501                   ValidationError* errs = 0) 
const;
 
  523     template <
typename T>
 
  524     void validateBasic(
const std::string& 
name, 
const Policy& policy, ValidationError* errs = 0) 
const;
 
  536     template <
typename T>
 
  537     void validateBasic(
const std::string& 
name, 
const T& value, 
int curcount = -1,
 
  538                        ValidationError* errs = 0) 
const;
 
  539     template <
typename T>
 
  552                          ValidationError* errs) 
const;
 
  554     void validateRecurse(
const std::string& 
name, 
const Policy& value, ValidationError* errs) 
const;
 
  573     void validateCount(
const std::string& 
name, 
int count, ValidationError* errs) 
const;
 
  586     d.getData()->print(
os, d.getName());
 
  680 class Dictionary : 
public Policy {
 
  683     static const char* KW_DICT;
 
  684     static const char* KW_DICT_FILE;
 
  685     static const char* KW_TYPE;
 
  686     static const char* KW_DESCRIPTION;
 
  687     static const char* KW_DEFAULT;
 
  688     static const char* KW_DEFINITIONS;
 
  689     static const char* KW_CHILD_DEF;
 
  690     static const char* KW_ALLOWED;
 
  691     static const char* KW_MIN_OCCUR;
 
  692     static const char* KW_MAX_OCCUR;
 
  693     static const char* KW_MIN;
 
  694     static const char* KW_MAX;
 
  695     static const char* KW_VALUE;
 
  701     Dictionary() : Policy() {}
 
  709     Dictionary(
const Policy& pol)
 
  710             : Policy((pol.isPolicy(
"dictionary")) ? *(pol.getPolicy(
"dictionary")) : pol) {
 
  717     Dictionary(
const Dictionary& dict) : Policy(dict) { check(); }
 
  723     explicit Dictionary(
const char* filePath);
 
  725     explicit Dictionary(
const PolicyFile& filePath);
 
  732     Policy::ConstPtr getDefinitions()
 const { 
return getPolicy(
"definitions"); }
 
  733     Policy::Ptr getDefinitions() { 
return getPolicy(
"definitions"); }
 
  747         return getDefinitions()->names(names, 
true, 
append);
 
  753     StringArray definedNames()
 const { 
return getDefinitions()->names(
true); }
 
  760         Definition* def = makeDef(
name);
 
  761         Definition out(*def);
 
  815     void validate(
const Policy& pol, ValidationError* errs = 0) 
const;
 
  833     int loadPolicyFiles(
bool strict = 
true) { 
return loadPolicyFiles(boost::filesystem::path(), strict); }
 
  843     virtual int loadPolicyFiles(
const boost::filesystem::path& repository, 
bool strict = 
true);
 
  850     const std::string getPrefix()
 const { 
return _prefix; }
 
  855     static const boost::regex FIELDSEP_RE;
 
  861 template <
typename T>
 
  862 void Definition::validateBasic(
const std::string& 
name, 
const Policy& policy, ValidationError* errs)
 const {
 
  863     validateBasic(
name, policy.getValueArray<T>(
name), errs);
 
  866 template <
typename T>
 
  868                                ValidationError* errs)
 const {
 
  870     ValidationError* use = &ve;
 
  871     if (errs != 0) use = errs;
 
  873     validateCount(
name, value.
size(), use);
 
  876         validateBasic<T>(
name, *i, -1, use);
 
  878     if (errs == 0 && ve.getParamCount() > 0) 
throw ve;
 
  881 template <
typename T>
 
  882 void Definition::setDefaultIn(Policy& policy, 
const std::string& withName, ValidationError* errs)
 const {
 
  884     ValidationError* use = (errs == 0 ? &ve : errs);
 
  886     if (_policy->exists(
"default")) {
 
  888         validateBasic(withName, defs, use);
 
  889         if (use->getErrors(withName) == ValidationError::OK) {
 
  890             policy.remove(withName);
 
  892                 policy.addValue<T>(withName, *i);
 
  896     if (errs == 0 && ve.getParamCount() > 0) 
throw ve;
 
  903 #endif  // LSST_PEX_POLICY_POLICY_H