29#ifndef INCLUDE_OLA_WEB_JSONSCHEMA_H_
30#define INCLUDE_OLA_WEB_JSONSCHEMA_H_
51class SchemaDefinitions;
82 virtual void SetSchema(
const std::string &schema) = 0;
87 virtual void SetId(
const std::string &
id) = 0;
92 virtual void SetTitle(
const std::string &title) = 0;
131 virtual bool IsValid()
const {
return m_is_valid; }
137 virtual void Visit(
const JsonBool&) {
141 virtual void Visit(
const JsonNull&) {
145 virtual void Visit(
const JsonRawValue&) {
149 virtual void Visit(
const JsonObject&) {
153 virtual void Visit(
const JsonArray&) {
157 virtual void Visit(
const JsonUInt&) {
161 virtual void Visit(
const JsonUInt64&) {
165 virtual void Visit(
const JsonInt&) {
169 virtual void Visit(
const JsonInt64&) {
173 virtual void Visit(
const JsonDouble&) {
182 void SetSchema(
const std::string &schema);
187 void SetId(
const std::string &
id);
192 void SetTitle(
const std::string &title);
220 std::string m_schema;
223 std::string m_description;
224 std::auto_ptr<const JsonValue> m_default_value;
225 std::vector<const JsonValue*> m_enums;
227 bool CheckEnums(
const JsonValue &value);
230 virtual void ExtendSchema(JsonObject *schema)
const {
257 const std::string &schema);
269 void Visit(
const JsonInt &value);
275 void SetSchema(
const std::string &schema);
276 void SetId(
const std::string &
id);
277 void SetTitle(
const std::string &title);
284 const std::string m_schema;
287 template <
typename T>
288 void Validate(
const T &value);
302 unsigned int min_length;
317 const Options m_options;
332 void Visit(
const JsonBool &value) { m_is_valid = CheckEnums(value); }
346 void Visit(
const JsonNull &value) { m_is_valid = CheckEnums(value); }
361 virtual bool IsValid(
const JsonNumber &value) = 0;
363 virtual void ExtendSchema(
JsonObject *schema)
const = 0;
372 : m_multiple_of(value) {
380 schema->
AddValue(
"multipleOf", m_multiple_of->Clone());
384 std::auto_ptr<const JsonNumber> m_multiple_of;
399 m_has_exclusive(true),
400 m_is_exclusive(is_exclusive) {
409 m_has_exclusive(false),
410 m_is_exclusive(false) {
414 return (m_has_exclusive && m_is_exclusive) ? value < *m_limit
419 schema->
AddValue(
"maximum", m_limit->Clone());
420 if (m_has_exclusive) {
421 schema->
Add(
"exclusiveMaximum", m_is_exclusive);
426 std::auto_ptr<const JsonNumber> m_limit;
427 bool m_has_exclusive, m_is_exclusive;
442 m_has_exclusive(true),
443 m_is_exclusive(is_exclusive) {
452 m_has_exclusive(false),
453 m_is_exclusive(false) {
457 return (m_has_exclusive && m_is_exclusive) ? value > *m_limit
462 schema->
AddValue(
"minimum", m_limit->Clone());
463 if (m_has_exclusive) {
464 schema->
Add(
"exclusiveMinimum", m_is_exclusive);
469 std::auto_ptr<const JsonNumber> m_limit;
470 bool m_has_exclusive, m_is_exclusive;
499 std::vector<NumberConstraint*> m_constraints;
535 : max_properties(-1),
537 has_required_properties(
false),
538 has_allow_additional_properties(
false),
539 allow_additional_properties(
false) {
542 void SetRequiredProperties(
543 const std::set<std::string> &required_properties_arg) {
544 required_properties = required_properties_arg;
545 has_required_properties =
true;
548 void SetAdditionalProperties(
bool allow_additional) {
549 has_allow_additional_properties =
true;
550 allow_additional_properties = allow_additional;
554 unsigned int min_properties;
555 bool has_required_properties;
556 std::set<std::string> required_properties;
557 bool has_allow_additional_properties;
558 bool allow_additional_properties;
599 const std::set<std::string> &properties);
606 typedef std::set<std::string> StringSet;
607 typedef std::map<std::string, ValidatorInterface*> PropertyValidators;
608 typedef std::map<std::string, ValidatorInterface*> SchemaDependencies;
609 typedef std::map<std::string, StringSet> PropertyDependencies;
613 PropertyValidators m_property_validators;
614 std::auto_ptr<ValidatorInterface> m_additional_property_validator;
615 PropertyDependencies m_property_dependencies;
616 SchemaDependencies m_schema_dependencies;
618 StringSet m_seen_properties;
638 : m_validator(validator) {
643 m_validator_list(*validators) {
651 const ValidatorList& Validators()
const {
return m_validator_list; }
654 std::auto_ptr<ValidatorInterface> m_validator;
658 const Items &operator=(
const Items &) =
delete;
667 : m_allowed(allow_additional),
673 m_validator(validator) {
677 bool AllowAdditional()
const {
return m_allowed; }
681 std::auto_ptr<ValidatorInterface> m_validator;
691 unique_items(
false) {
695 unsigned int min_items;
714 typedef std::deque<ValidatorInterface*> ValidatorQueue;
716 const std::auto_ptr<Items> m_items;
717 const std::auto_ptr<AdditionalItems> m_additional_items;
721 std::auto_ptr<WildcardValidator> m_wildcard_validator;
741 ValidatorQueue m_item_validators;
744 template <
typename T>
745 void ValidateItem(
const T &item);
747 ArrayElementValidator(
const ArrayElementValidator &) =
delete;
748 const ArrayElementValidator &operator=(
const ArrayElementValidator &) =
delete;
752 ArrayElementValidator* ConstructElementValidator()
const;
806 void Visit(
const JsonInt &value) {
819 std::string m_keyword;
824 virtual void Validate(
const JsonValue &value) = 0;
902 m_validator(validator) {
937 void Visit(
const JsonInt &value) {
950 std::auto_ptr<ValidatorInterface> m_validator;
970 bool HasDefinitions()
const {
return !m_validators.empty(); }
973 typedef std::map<std::string, ValidatorInterface*> SchemaMap;
975 SchemaMap m_validators;
992 std::string SchemaURI()
const;
1009 std::string *error);
1012 std::string m_schema_uri;
1013 std::auto_ptr<ValidatorInterface> m_root_validator;
1014 std::auto_ptr<SchemaDefinitions> m_schema_defs;
Basic data types used to represent elements in a JSON document.
Enums used to identfy JSON types.
Helper functions for STL classes.
Definition Preferences.h:43
A validator which ensures all child validators pass (allOf).
Definition JsonSchema.h:830
AllOfValidator(ValidatorList *validators)
Definition JsonSchema.h:837
A validator which ensures at least one of the child validators pass (anyOf).
Definition JsonSchema.h:853
AnyOfValidator(ValidatorList *validators)
Definition JsonSchema.h:860
Definition JsonSchema.h:664
Definition JsonSchema.h:635
The validator for JsonArray.
Definition JsonSchema.h:629
ArrayValidator(Items *items, AdditionalItems *additional_items, const Options &options)
Validate all elements of the array against the given schema.
Definition JsonSchema.cpp:464
The base class for Json BaseValidators. All Visit methods return false.
Definition JsonSchema.h:121
void SetDescription(const std::string &title)
Set the description.
Definition JsonSchema.cpp:95
void SetDefaultValue(const JsonValue *value)
Set the default value for this validator.
Definition JsonSchema.cpp:99
void SetSchema(const std::string &schema)
Set the schema.
Definition JsonSchema.cpp:83
void SetTitle(const std::string &title)
Set the title.
Definition JsonSchema.cpp:91
virtual JsonObject * GetSchema() const
Returns the Schema as a JsonObject.
Definition JsonSchema.cpp:49
virtual bool IsValid() const
Check if the value was valid according to this validator.
Definition JsonSchema.h:131
void SetId(const std::string &id)
Set the id.
Definition JsonSchema.cpp:87
void AddEnumValue(const JsonValue *value)
Add a enum value to the list of allowed values.
Definition JsonSchema.cpp:107
const JsonValue * GetDefaultValue() const
Return the default value.
Definition JsonSchema.cpp:103
The validator for JsonBool.
Definition JsonSchema.h:328
The base class for validators that operate with a list of child validators (allOf,...
Definition JsonSchema.h:763
ConjunctionValidator(const std::string &keyword, ValidatorList *validators)
Definition JsonSchema.cpp:678
The validator for Json integers.
Definition JsonSchema.h:476
void AddConstraint(NumberConstraint *constraint)
Add a constraint to this validator.
Definition JsonSchema.cpp:243
An array of JSON values. Arrays in JSON can contain values of different types.
Definition Json.h:1043
A Bool value.
Definition Json.h:774
A double value.
Definition Json.h:654
A signed 64bit int value.
Definition Json.h:581
A signed 32bit int value.
Definition Json.h:447
The null value.
Definition Json.h:818
JsonNumber is the base class for various integer / number classes.
Definition Json.h:325
virtual bool MultipleOf(const JsonNumber &other) const =0
Checks if the remainder if non-0;.
A JSON object. JSON Objects are key : value mappings, similar to dictionaries in Python.
Definition Json.h:899
void AddValue(const std::string &key, JsonValue *value)
Set the key to the supplied JsonValue.
Definition Json.cpp:667
void Add(const std::string &key, const std::string &value)
Add a key to string mapping.
Definition Json.cpp:607
A class used to visit Json values within a JsonObject.
Definition Json.h:1226
A raw value, useful if you want to cheat.
Definition Json.h:850
A JsonHandlerInterface implementation that builds a parse tree.
Definition JsonSchema.h:985
const JsonObject * AsJson() const
Return the schema as Json.
Definition JsonSchema.cpp:800
static JsonSchema * FromString(const std::string &schema_string, std::string *error)
Parse a string and return a new schema.
Definition JsonSchema.cpp:809
bool IsValid(const JsonValue &value)
Validate a JsonValue against this schema.
Definition JsonSchema.cpp:795
A string value.
Definition Json.h:279
An unsigned 64bit int value.
Definition Json.h:513
An unsigned 32bit int value.
Definition Json.h:380
The const interface for the JsonValueVisitor class.
Definition Json.h:99
The base class for JSON values.
Definition Json.h:119
Enforces a maximum.
Definition JsonSchema.h:390
MaximumConstraint(const JsonNumber *limit, bool is_exclusive)
Create a new MaximumConstraint.
Definition JsonSchema.h:397
MaximumConstraint(const JsonNumber *limit)
Create a new MaximumConstraint.
Definition JsonSchema.h:407
Enforces a minimum.
Definition JsonSchema.h:433
MinimumConstraint(const JsonNumber *limit)
Create a new MaximumConstraint.
Definition JsonSchema.h:450
MinimumConstraint(const JsonNumber *limit, bool is_exclusive)
Create a new MaximumConstraint.
Definition JsonSchema.h:440
Confirms the valid is a multiple of the specified value.
Definition JsonSchema.h:369
A validator that inverts the result of the child (not).
Definition JsonSchema.h:898
The validator for JsonNull.
Definition JsonSchema.h:342
The base class for constraints that can be applies to the Json number type.
Definition JsonSchema.h:357
The validator for Json numbers.
Definition JsonSchema.h:513
The validator for JsonObject.
Definition JsonSchema.h:531
void VisitProperty(const std::string &property, const JsonValue &value)
Visit the value at the given property.
Definition JsonSchema.cpp:381
void SetAdditionalValidator(ValidatorInterface *validator)
Add the validator for additionalProperties.
Definition JsonSchema.cpp:306
void AddSchemaDependency(const std::string &property, ValidatorInterface *validator)
Add a schema dependency.
Definition JsonSchema.cpp:310
void AddValidator(const std::string &property, ValidatorInterface *validator)
Add a validator for a property.
Definition JsonSchema.cpp:301
void AddPropertyDependency(const std::string &property, const std::set< std::string > &properties)
Add a property dependency.
Definition JsonSchema.cpp:315
A validator which ensures at only one of the child validators pass (oneOf).
Definition JsonSchema.h:876
OneOfValidator(ValidatorList *validators)
Definition JsonSchema.h:883
A reference validator holds a pointer to another schema.
Definition JsonSchema.h:249
ReferenceValidator(const SchemaDefinitions *definitions, const std::string &schema)
Definition JsonSchema.cpp:126
const JsonValue * GetDefaultValue() const
Return the default value for this validator.
Definition JsonSchema.cpp:192
bool IsValid() const
Check if the value was valid according to this validator.
Definition JsonSchema.cpp:133
JsonObject * GetSchema() const
Returns the Schema as a JsonObject.
Definition JsonSchema.cpp:181
void SetSchema(const std::string &schema)
Set the $schema property for this validator.
Definition JsonSchema.cpp:187
void SetDescription(const std::string &title)
Set the description property for this validator.
Definition JsonSchema.cpp:190
void SetTitle(const std::string &title)
Set the title property for this validator.
Definition JsonSchema.cpp:189
void SetId(const std::string &id)
Set the id property for this validator.
Definition JsonSchema.cpp:188
void SetDefaultValue(const JsonValue *value)
Set the default value for this validator.
Definition JsonSchema.cpp:191
Definition JsonSchema.h:960
The validator for JsonString.
Definition JsonSchema.h:294
The interface Json Schema Validators.
Definition JsonSchema.h:56
virtual JsonObject * GetSchema() const =0
Returns the Schema as a JsonObject.
virtual void SetDescription(const std::string &title)=0
Set the description property for this validator.
virtual void SetSchema(const std::string &schema)=0
Set the $schema property for this validator.
virtual void SetDefaultValue(const JsonValue *value)=0
Set the default value for this validator.
virtual const JsonValue * GetDefaultValue() const =0
Return the default value for this validator.
virtual bool IsValid() const =0
Check if the value was valid according to this validator.
std::vector< ValidatorInterface * > ValidatorList
a list of Validators.
Definition JsonSchema.h:61
virtual void SetTitle(const std::string &title)=0
Set the title property for this validator.
virtual void SetId(const std::string &id)=0
Set the id property for this validator.
The wildcard validator matches everything. This corresponds to the empty schema, i....
Definition JsonSchema.h:239
bool IsValid() const
Check if the value was valid according to this validator.
Definition JsonSchema.h:243
void STLDeleteElements(T *sequence)
Delete the elements of a Sequence.
Definition STLUtils.h:99
JsonType
The type of JSON data element.
Definition JsonTypes.h:44
@ JSON_NUMBER
Definition JsonTypes.h:49
@ JSON_STRING
Definition JsonTypes.h:51
@ JSON_BOOLEAN
Definition JsonTypes.h:46
@ JSON_NULL
Definition JsonTypes.h:48
@ JSON_INTEGER
Definition JsonTypes.h:47
@ JSON_UNDEFINED
Definition JsonTypes.h:52
The namespace containing all OLA symbols.
Definition Credentials.cpp:44
Definition JsonSchema.h:687
Definition JsonSchema.h:533
Definition JsonSchema.h:296