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;
153 ValidationError(
char const* ex_file,
int ex_line,
char const* ex_func)
155 "Policy has unknown validation errors"),
159 virtual char const* getType(
void)
const throw();
164 ValidationError(
const ValidationError& that)
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())
219 void addError(
const std::string& name, ErrorType e) { _errors[
name] |= e; }
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;
429 void validate(
const Policy& policy,
const std::string& name, ValidationError* errs = 0)
const;
443 void validate(
const Policy& policy, ValidationError* errs = 0)
const {
validate(policy, _name, errs); }
469 void validate(
const std::string& name,
bool value,
int curcount = -1, ValidationError* errs = 0)
const;
470 void validate(
const std::string& name,
int value,
int curcount = -1, ValidationError* errs = 0)
const;
471 void validate(
const std::string& name,
double value,
int curcount = -1, ValidationError* errs = 0)
const;
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);
774 Definition* makeDef(
const std::string& name)
const;
781 bool hasSubDictionary(
const std::string& name)
const {
795 DictPtr getSubDictionary(
const std::string& name)
const;
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 std::vector< int > IntArray
std::shared_ptr< Policy > Ptr
Provides consistent interface for LSST exceptions.
#define LSST_EXCEPT_HERE
For internal use; gathers the file, line, and function for a tracepoint.
std::shared_ptr< FrameSet > append(FrameSet const &first, FrameSet const &second)
Construct a FrameSet that performs two transformations in series.
static const char *const typeName[]
c-string forms for the supported value types.
std::ostream & operator<<(std::ostream &os, const Policy &p)
A base class for image defects.
std::vector< std::string > StringArray
Reports errors in the logical structure of the program.
std::vector< double > DoubleArray
std::vector< bool > BoolArray
std::shared_ptr< const Policy > ConstPtr
std::vector< ConstPtr > ConstPolicyPtrArray
ValueType
an enumeration for the supported policy types
definition of Policy-specific exceptions classes