|
@@ -32,11 +32,13 @@ template<typename T> class ObjectTypeFactory : public SimpleTypeFactory<T*>
|
|
|
{
|
|
{
|
|
|
protected:
|
|
protected:
|
|
|
mutable Framework::Validator::DataValidator* validator;
|
|
mutable Framework::Validator::DataValidator* validator;
|
|
|
|
|
+ mutable bool insideGetValidator;
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
ObjectTypeFactory()
|
|
ObjectTypeFactory()
|
|
|
: SimpleTypeFactory<T*>(),
|
|
: SimpleTypeFactory<T*>(),
|
|
|
- validator(0) {};
|
|
|
|
|
|
|
+ validator(0),
|
|
|
|
|
+ insideGetValidator(false) {};
|
|
|
|
|
|
|
|
~ObjectTypeFactory()
|
|
~ObjectTypeFactory()
|
|
|
{
|
|
{
|
|
@@ -60,17 +62,26 @@ public:
|
|
|
{
|
|
{
|
|
|
if (!this->validator)
|
|
if (!this->validator)
|
|
|
{
|
|
{
|
|
|
- this->validator = addToValidator(
|
|
|
|
|
- Framework::Validator::DataValidator::buildForObject())
|
|
|
|
|
- ->finishObject();
|
|
|
|
|
|
|
+ if (!insideGetValidator)
|
|
|
|
|
+ {
|
|
|
|
|
+ insideGetValidator = true;
|
|
|
|
|
+ this->validator = addToValidator(
|
|
|
|
|
+ Framework::Validator::DataValidator::buildForObject())
|
|
|
|
|
+ ->finishObject();
|
|
|
|
|
+ insideGetValidator = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ throw "recursive endless loop. a json object needs to contain "
|
|
|
|
|
+ "itself";
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return dynamic_cast<Framework::Validator::DataValidator*>(
|
|
return dynamic_cast<Framework::Validator::DataValidator*>(
|
|
|
this->validator->getThis());
|
|
this->validator->getThis());
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
virtual JSONObjectValidationBuilder* addToValidator(
|
|
virtual JSONObjectValidationBuilder* addToValidator(
|
|
|
- JSONObjectValidationBuilder* builder) const
|
|
|
|
|
- = 0;
|
|
|
|
|
|
|
+ JSONObjectValidationBuilder* builder) const = 0;
|
|
|
|
|
|
|
|
protected:
|
|
protected:
|
|
|
virtual T* fromJson(Framework::JSON::JSONObject* zJson) const = 0;
|
|
virtual T* fromJson(Framework::JSON::JSONObject* zJson) const = 0;
|
|
@@ -98,14 +109,32 @@ public:
|
|
|
{
|
|
{
|
|
|
Framework::Text referenceId = "_type_";
|
|
Framework::Text referenceId = "_type_";
|
|
|
referenceId.append() << typeid(T).name() << "_" << getTypeToken();
|
|
referenceId.append() << typeid(T).name() << "_" << getTypeToken();
|
|
|
- this->validator
|
|
|
|
|
- = this->addToValidator(
|
|
|
|
|
- Framework::Validator::DataValidator::buildForObject()
|
|
|
|
|
- ->withRequiredString("type")
|
|
|
|
|
- ->withExactMatch(getTypeToken())
|
|
|
|
|
- ->finishString()
|
|
|
|
|
- ->setReferenceId(referenceId))
|
|
|
|
|
- ->finishObject();
|
|
|
|
|
|
|
+ if (!this->insideGetValidator)
|
|
|
|
|
+ {
|
|
|
|
|
+ this->insideGetValidator = true;
|
|
|
|
|
+ auto result = this->addToValidator(
|
|
|
|
|
+ Framework::Validator::DataValidator::
|
|
|
|
|
+ buildForObject()
|
|
|
|
|
+ ->withRequiredString("type")
|
|
|
|
|
+ ->withExactMatch(getTypeToken())
|
|
|
|
|
+ ->finishString()
|
|
|
|
|
+ ->setReferenceId(referenceId))
|
|
|
|
|
+ ->finishObject();
|
|
|
|
|
+ if (this->validator)
|
|
|
|
|
+ {
|
|
|
|
|
+ // during a recursive call the validator could have ben
|
|
|
|
|
+ // initialized to a reference validator (else branch below)
|
|
|
|
|
+ this->validator->release();
|
|
|
|
|
+ }
|
|
|
|
|
+ this->validator = result;
|
|
|
|
|
+ this->insideGetValidator = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ this->validator
|
|
|
|
|
+ = Framework::Validator::DataValidator::buildForReference(
|
|
|
|
|
+ referenceId);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return dynamic_cast<Framework::Validator::DataValidator*>(
|
|
return dynamic_cast<Framework::Validator::DataValidator*>(
|
|
|
this->validator->getThis());
|
|
this->validator->getThis());
|
|
@@ -174,7 +203,6 @@ template<typename T> class PolymorphTypeFactory : public ObjectTypeFactory<T>
|
|
|
private:
|
|
private:
|
|
|
Framework::RCArray<SubTypeFactoryRef<T>> factories;
|
|
Framework::RCArray<SubTypeFactoryRef<T>> factories;
|
|
|
Framework::RCArray<Framework::Text> typeNames;
|
|
Framework::RCArray<Framework::Text> typeNames;
|
|
|
- static thread_local bool insideGetValidator;
|
|
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
PolymorphTypeFactory()
|
|
PolymorphTypeFactory()
|
|
@@ -234,9 +262,9 @@ public:
|
|
|
{
|
|
{
|
|
|
if (!this->validator)
|
|
if (!this->validator)
|
|
|
{
|
|
{
|
|
|
- if (!insideGetValidator)
|
|
|
|
|
|
|
+ if (!this->insideGetValidator)
|
|
|
{
|
|
{
|
|
|
- insideGetValidator = true;
|
|
|
|
|
|
|
+ this->insideGetValidator = true;
|
|
|
auto validator
|
|
auto validator
|
|
|
= Framework::Validator::DataValidator::buildForOneOf()
|
|
= Framework::Validator::DataValidator::buildForOneOf()
|
|
|
->typeSpecifiedByAttribute("type");
|
|
->typeSpecifiedByAttribute("type");
|
|
@@ -245,8 +273,14 @@ public:
|
|
|
validator
|
|
validator
|
|
|
= validator->addAcceptedType(factory->getValidator());
|
|
= validator->addAcceptedType(factory->getValidator());
|
|
|
}
|
|
}
|
|
|
|
|
+ if (this->validator)
|
|
|
|
|
+ {
|
|
|
|
|
+ // during a recursive call the validator could have ben
|
|
|
|
|
+ // initialized to a reference validator (else branch below)
|
|
|
|
|
+ this->validator->release();
|
|
|
|
|
+ }
|
|
|
this->validator = validator->finishOneOf();
|
|
this->validator = validator->finishOneOf();
|
|
|
- insideGetValidator = false;
|
|
|
|
|
|
|
+ this->insideGetValidator = false;
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -258,8 +292,7 @@ public:
|
|
|
validator = validator->addAcceptedType(
|
|
validator = validator->addAcceptedType(
|
|
|
Framework::Validator::DataValidator::buildForReference(
|
|
Framework::Validator::DataValidator::buildForReference(
|
|
|
((Framework::Text("_type_") += typeid(T).name())
|
|
((Framework::Text("_type_") += typeid(T).name())
|
|
|
- += "_")
|
|
|
|
|
- += factory->getTypeToken()));
|
|
|
|
|
|
|
+ += "_") += factory->getTypeToken()));
|
|
|
}
|
|
}
|
|
|
this->validator = validator->finishOneOf();
|
|
this->validator = validator->finishOneOf();
|
|
|
}
|
|
}
|
|
@@ -289,9 +322,6 @@ public:
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-template<typename T>
|
|
|
|
|
-thread_local bool PolymorphTypeFactory<T>::insideGetValidator = false;
|
|
|
|
|
-
|
|
|
|
|
class TypeFatoryRef : public Framework::ReferenceCounter
|
|
class TypeFatoryRef : public Framework::ReferenceCounter
|
|
|
{
|
|
{
|
|
|
private:
|
|
private:
|
|
@@ -375,7 +405,8 @@ public:
|
|
|
throw Framework::Text("Type not registered as Polymorphic type: ")
|
|
throw Framework::Text("Type not registered as Polymorphic type: ")
|
|
|
+ typeId;
|
|
+ typeId;
|
|
|
}
|
|
}
|
|
|
- polymorphFactory->template addFactory<S>(factory);
|
|
|
|
|
|
|
+ polymorphFactory->template addFactory<S>(
|
|
|
|
|
+ dynamic_cast<SubTypeFactory<T, S>*>(factory->getThis()));
|
|
|
Framework::Text typeIdS = typeid(S).name();
|
|
Framework::Text typeIdS = typeid(S).name();
|
|
|
parsableTypeNames.add(new Framework::Text(typeIdS));
|
|
parsableTypeNames.add(new Framework::Text(typeIdS));
|
|
|
registerType(factory);
|
|
registerType(factory);
|
|
@@ -477,6 +508,7 @@ public:
|
|
|
{
|
|
{
|
|
|
Framework::Logging::error() << invalidPart->getInvalidInfo();
|
|
Framework::Logging::error() << invalidPart->getInvalidInfo();
|
|
|
}
|
|
}
|
|
|
|
|
+ validator->release();
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|