+ }
+ addDefaultValidators(theValidators);
+}
+
+void Model_ValidatorsFactory::validators(const std::string& theFeatureID, const std::string& theAttrID,
+ Validators& theValidators) const
+{
+ std::map<std::string, std::map<std::string, AttrValidators> >::const_iterator aFeatureIt =
+ myAttrs.find(theFeatureID);
+ if (aFeatureIt != myAttrs.cend()) {
+ std::map<std::string, AttrValidators>::const_iterator anAttrIt = aFeatureIt->second.find(theAttrID);
+ if (anAttrIt != aFeatureIt->second.end()) {
+ AttrValidators::const_iterator aValidatorsIt = anAttrIt->second.cbegin();
+ for (; aValidatorsIt != anAttrIt->second.cend(); aValidatorsIt++) {
+ if (!validator(aValidatorsIt->first)) {
+ Events_Error::send(std::string("Validator ") + aValidatorsIt->first + " was not registered");
+ } else {
+ theValidators.push_back(std::make_pair(aValidatorsIt->first, aValidatorsIt->second));
+ }
+ }
+ }
+ }
+ addDefaultAttributeValidators(theValidators);
+}
+
+Model_ValidatorsFactory::Model_ValidatorsFactory()
+ : ModelAPI_ValidatorsFactory()
+{
+ registerValidator("Model_FeatureValidator", new Model_FeatureValidator);
+ registerValidator("Model_AttributeValidator", new Model_AttributeValidator);
+}
+
+const ModelAPI_Validator* Model_ValidatorsFactory::validator(const std::string& theID) const
+{
+ std::map<std::string, ModelAPI_Validator*>::const_iterator aIt = myIDs.find(theID);
+ if (aIt != myIDs.end()) {
+ return aIt->second;
+ }
+ return NULL;
+}
+
+void Model_ValidatorsFactory::addDefaultValidators(Validators& theValidators) const
+{
+ const static std::string kDefaultId = "Model_FeatureValidator";
+ if (!validator(kDefaultId))
+ return;
+ theValidators.push_back(std::make_pair(kDefaultId, std::list<std::string>()));
+}
+
+void Model_ValidatorsFactory::addDefaultAttributeValidators(Validators& theValidators) const
+{
+ const static std::string kDefaultId = "Model_AttributeValidator";
+ if (!validator(kDefaultId))
+ return;
+ theValidators.push_back(std::make_pair(kDefaultId, std::list<std::string>()));
+}
+
+bool Model_ValidatorsFactory::validate(const std::shared_ptr<ModelAPI_Feature>& theFeature) const
+{
+ std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(theFeature->data());
+ if (aData.get() && aData->isValid()) {
+ if (aData->execState() == ModelAPI_StateDone)
+ aData->eraseErrorString(); // no error => erase the information string