commit e80fecccb3257b829fd59b3049c22358a90112c7
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Tue Aug 11 23:45:56 2015 +0200

    validator stuff

diff --git a/EntityManager.pro b/EntityManager.pro
index 746ddea..beeb2de 100644
--- a/EntityManager.pro
+++ b/EntityManager.pro
@@ -49,7 +49,8 @@ src/entity.h \
     src/validators/filevalidator.h \
     src/validators/imagevalidator.h \
     src/validators/uniquevalidator.h \
-    src/validators/patternvalidator.h
+    src/validators/patternvalidator.h \
+    src/validators/lengthvalidator.h
 
 SOURCES += \
 src/entity.cpp \
@@ -90,7 +91,8 @@ src/entity.cpp \
     src/validators/filevalidator.cpp \
     src/validators/imagevalidator.cpp \
     src/validators/uniquevalidator.cpp \
-    src/validators/patternvalidator.cpp
+    src/validators/patternvalidator.cpp \
+    src/validators/lengthvalidator.cpp
 
 CONFIG += c++14
 QMAKE_CXXFLAGS += -std=c++14
diff --git a/samples/validators/address.cpp b/samples/validators/address.cpp
index a5b937f..ce03b0e 100644
--- a/samples/validators/address.cpp
+++ b/samples/validators/address.cpp
@@ -10,8 +10,9 @@ Address::Address(QString label, QString street, QString postcode,
 
 QList<ValidationRule> Address::validationRules() const {
     QList<ValidationRule> rules = QList<ValidationRule>();
-    rules.append(ValidationRule("required", {"street", "postcode","label"}));
-    //rules.append(ValidationRule("required"));
+    rules.append(ValidationRule("required", {"street", "postcode", "city"}));
+    //German postcodes
+    rules.append(ValidationRule("number", "postcode", "min", 10000, "max", 99999));
     return rules;
 }
 
diff --git a/samples/validators/main.cpp b/samples/validators/main.cpp
index 7919943..7c19223 100644
--- a/samples/validators/main.cpp
+++ b/samples/validators/main.cpp
@@ -18,7 +18,7 @@ int main(int argc, char *argv[]) {
     e->createTable("Person");
     e->createTable("Address");
 
-    QSharedPointer<Entity> p1 = QSharedPointer<Person>(new Person("Thomas", "Berg",
+    QSharedPointer<Entity> p1 = QSharedPointer<Person>(new Person("Thomas", "B",
                                 Person::Gender::MALE, "", QString(), QString(), QDate(1971, 7, 13), 0));
     QSharedPointer<Entity>p2 = QSharedPointer<Person>(new Person("Teresa", "Conrad",
                                Person::Gender::FEMALE, "", QString(), QString(), QDate(1970, 7, 13), 0));
@@ -26,20 +26,20 @@ int main(int argc, char *argv[]) {
                                 Person::Gender::MALE, "", QString(), QString(), QDate(1972, 7, 13), 0));
 
     //validation takes also place before save/create/merge
-    qDebug() << "p1 valid:" << e->validate(p1);
-    qDebug() << "p2 valid:" << e->validate(p2);
-    qDebug() << "p3 valid:" << e->validate(p3);
+    qDebug() << "p1 valid:" << e->validate(p1) << p1->getErrorsAsString();
+    qDebug() << "p2 valid:" << e->validate(p2) << p2->getErrorsAsString();
+    qDebug() << "p3 valid:" << e->validate(p3) << p3->getErrorsAsString();
 
     QSharedPointer<Entity> a1 = QSharedPointer<Address>(new Address("",
                                 "Mentzelstraße 327",
                                 "33617", "Bielefeld"));
     QSharedPointer<Entity> a2 = QSharedPointer<Address>(new Address("Erzieher",
                                 "Bundesallee 252",
-                                "49082", "Osnabrück"));
-
-    qDebug() << "a1 valid:" << e->validate(a1);
-    qDebug() << "a2 valid:" << e->validate(a2);
+                                "4908", "Osnabrück"));
 
+    qDebug() << "a1 valid:" << e->validate(a1) << a1->getErrorsAsString();
+    qDebug() << "a2 valid:" << e->validate(a2) << a2->getErrorsAsString();
+qDebug() << a2->getErrors().size();
 
     return 0;
 }
diff --git a/samples/validators/person.cpp b/samples/validators/person.cpp
index bb49405..63a26e1 100644
--- a/samples/validators/person.cpp
+++ b/samples/validators/person.cpp
@@ -24,7 +24,9 @@ const QHash<QString, CuteEntityManager::Relation> Person::getRelations() const {
 }
 
 QList<ValidationRule> Person::validationRules() const {
-    return Entity::validationRules();
+    QList<ValidationRule> rules = QList<ValidationRule>();
+    rules.append(ValidationRule("length", {"firstName", "familyName"}, "min", 2));
+    return rules;
 }
 
 QString Person::fullName(NameOrder nameOrder) const {
diff --git a/src/entity.cpp b/src/entity.cpp
index 59872b9..e7914cc 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -61,8 +61,24 @@ QList<ErrorMsg> Entity::getErrors() const {
     return errors;
 }
 
+QString Entity::getErrorsAsString() const {
+    QList<ErrorMsg> errors = this->getErrors();
+    bool first = true;
+    QString r = "";
+    for (int i = 0; i < errors.size(); ++i) {
+        ErrorMsg msg = errors.at(i);
+        if (first) {
+            first = false;
+        } else {
+            r += ";";
+        }
+        r += msg.getErrorMsg();
+    }
+    return r;
+}
+
 void Entity::setErrors(const QList<ErrorMsg> &value) {
-    errors = value;
+    this->errors = value;
 }
 
 Entity::~Entity() {
diff --git a/src/entity.h b/src/entity.h
index 8edfd97..9d9975a 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -63,6 +63,7 @@ class Entity : public QObject {
     bool hasErrors() const;
 
     QList<ErrorMsg> getErrors() const;
+    QString getErrorsAsString() const;
     void setErrors(const QList<ErrorMsg> &value);
 
 protected:
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index 41c0c28..1b1925e 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -173,11 +173,17 @@ bool EntityManager::validate(QSharedPointer<Entity> &entity) {
         ValidationRule rule = rules.at(i);
         QSharedPointer<Validator> validator = ValidatorFactory::getValidatorObject(
                 rule.getValidatorName());
-        qDebug() << "VALIDATOR" << validator;
         if (validator) {
             for (int var = 0; var < rule.getAttributes().size(); ++var) {
                 QString attr = rule.getAttributes().at(var);
-                list.append(validator->validate(entity->getProperty(attr), rule.getParams()));
+                QList<ErrorMsg> msgs = validator->validate(entity->getProperty(attr),
+                                       rule.getParams());
+                for (int i = 0; i < msgs.size(); ++i) {
+                    QString emsg = msgs.at(i).getErrorMsg().replace("<property>", attr);
+                    ErrorMsg m = msgs.at(i);
+                    m.setErrorMsg(emsg);
+                    list.append(m);
+                }
             }
         }
     }
diff --git a/src/validators/lengthvalidator.cpp b/src/validators/lengthvalidator.cpp
index a2975f0..75dc44c 100644
--- a/src/validators/lengthvalidator.cpp
+++ b/src/validators/lengthvalidator.cpp
@@ -1,10 +1,8 @@
 #include "lengthvalidator.h"
 using namespace CuteEntityManager;
 LengthValidator::LengthValidator() : Validator() {
-
 }
 
-
 ErrorMsg LengthValidator::validateParam(QVariant value, Param param) const {
     QString val = value.toString();
     if (param.getName() == "min" && val.length() < param.getValue().toLongLong()) {
diff --git a/src/validators/validator.cpp b/src/validators/validator.cpp
index 3406e00..8ac96cc 100644
--- a/src/validators/validator.cpp
+++ b/src/validators/validator.cpp
@@ -1,5 +1,6 @@
 #include "validator.h"
 #include "validatorfactory.h"
+#include <QDebug>
 using namespace CuteEntityManager;
 Validator::Validator() : QObject() {
     ValidatorFactory::registerClasses();
