29#ifndef INCLUDE_OLA_WEB_JSONSCHEMA_H_
30#define INCLUDE_OLA_WEB_JSONSCHEMA_H_
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;
123 explicit BaseValidator(
JsonType type)
129 virtual ~BaseValidator();
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 {
239class WildcardValidator :
public BaseValidator {
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);
294class StringValidator :
public BaseValidator {
302 unsigned int min_length;
309 explicit StringValidator(
const Options &options)
317 const Options m_options;
328class BoolValidator :
public BaseValidator {
332 void Visit(
const JsonBool &value) { m_is_valid = CheckEnums(value); }
335 BoolValidator(
const BoolValidator &) =
delete;
336 const BoolValidator &operator=(
const BoolValidator &) =
delete;
342class NullValidator :
public BaseValidator {
344 NullValidator() : BaseValidator(
JSON_NULL) {}
346 void Visit(
const JsonNull &value) { m_is_valid = CheckEnums(value); }
349 NullValidator(
const NullValidator &) =
delete;
350 const NullValidator &operator=(
const NullValidator &) =
delete;
361 virtual bool IsValid(
const JsonNumber &value) = 0;
363 virtual void ExtendSchema(
JsonObject *schema)
const = 0;
371 explicit MultipleOfConstraint(
const JsonNumber *value)
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;
476class IntegerValidator :
public BaseValidator {
479 virtual ~IntegerValidator();
494 explicit IntegerValidator(
JsonType type) : BaseValidator(type) {}
499 std::vector<NumberConstraint*> m_constraints;
503 IntegerValidator(
const IntegerValidator &) =
delete;
504 const IntegerValidator &operator=(
const IntegerValidator &) =
delete;
513class NumberValidator :
public IntegerValidator {
515 NumberValidator() : IntegerValidator(
JSON_NUMBER) {}
520 NumberValidator(
const NumberValidator &) =
delete;
521 const NumberValidator &operator=(
const NumberValidator &) =
delete;
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;
561 explicit ObjectValidator(
const Options &options);
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;
622 ObjectValidator(
const ObjectValidator &) =
delete;
623 const ObjectValidator &operator=(
const ObjectValidator &) =
delete;
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;
657 Items(
const Items &) =
delete;
658 const Items &operator=(
const Items &) =
delete;
664 class AdditionalItems {
666 explicit AdditionalItems(
bool allow_additional)
667 : m_allowed(allow_additional),
673 m_validator(validator) {
677 bool AllowAdditional()
const {
return m_allowed; }
681 std::auto_ptr<ValidatorInterface> m_validator;
683 AdditionalItems(
const AdditionalItems &) =
delete;
684 const AdditionalItems &operator=(
const AdditionalItems &) =
delete;
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;
723 class ArrayElementValidator :
public BaseValidator {
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;
898class NotValidator :
public BaseValidator {
902 m_validator(validator) {
937 void Visit(
const JsonInt &value) {
950 std::auto_ptr<ValidatorInterface> m_validator;
956 NotValidator(
const NotValidator &) =
delete;
957 const NotValidator &operator=(
const NotValidator &) =
delete;
960class SchemaDefinitions {
962 SchemaDefinitions() {}
963 ~SchemaDefinitions();
970 bool HasDefinitions()
const {
return !m_validators.empty(); }
973 typedef std::map<std::string, ValidatorInterface*> SchemaMap;
975 SchemaMap m_validators;
977 SchemaDefinitions(
const SchemaDefinitions &) =
delete;
978 const SchemaDefinitions &operator=(
const SchemaDefinitions &) =
delete;
992 std::string SchemaURI()
const;
1008 static JsonSchema*
FromString(
const std::string& schema_string,
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;
1016 JsonSchema(
const std::string &schema_url,
1020 JsonSchema(
const JsonSchema &) =
delete;
1021 const JsonSchema &operator=(
const JsonSchema &) =
delete;
Basic data types used to represent elements in a JSON document.
Enums used to identfy JSON types.
Helper functions for STL classes.
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
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
ConjunctionValidator(const std::string &keyword, ValidatorList *validators)
Definition JsonSchema.cpp:678
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
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
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
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
The base class for constraints that can be applies to the Json number type.
Definition JsonSchema.h:357
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
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.
std::vector< ValidatorInterface * > ValidatorList
a list of Validators.
Definition JsonSchema.h:61
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.
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.
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
Classes to deal with web services.
Definition Json.cpp:29
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