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

    validator stuff

diff --git a/src/validators/lengthvalidator.cpp b/src/validators/lengthvalidator.cpp
new file mode 100644
index 0000000..a2975f0
--- /dev/null
+++ b/src/validators/lengthvalidator.cpp
@@ -0,0 +1,21 @@
+#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()) {
+        return ErrorMsg(param.getName(),
+                        "<property> must have more than " + param.getValue().toString() +
+                        " characters.");
+    } else if (param.getName() == "max"
+               && val.length() > param.getValue().toLongLong() ) {
+        return ErrorMsg(param.getName(),
+                        "<property> must have more than " + param.getValue().toString() +
+                        "characters.");
+    }
+    return ErrorMsg();
+}
diff --git a/src/validators/lengthvalidator.h b/src/validators/lengthvalidator.h
new file mode 100644
index 0000000..dc1b80e
--- /dev/null
+++ b/src/validators/lengthvalidator.h
@@ -0,0 +1,13 @@
+#ifndef LENGTHVALIDATOR_H
+#define LENGTHVALIDATOR_H
+#include "validator.h"
+namespace CuteEntityManager {
+class LengthValidator : public Validator {
+    Q_OBJECT
+  public:
+    LengthValidator();
+  protected:
+    ErrorMsg validateParam(QVariant value, Param param) const final override;
+};
+}
+#endif // LENGTHVALIDATOR_H
diff --git a/src/validators/requiredvalidator.cpp b/src/validators/requiredvalidator.cpp
index f417015..dfe7196 100644
--- a/src/validators/requiredvalidator.cpp
+++ b/src/validators/requiredvalidator.cpp
@@ -4,7 +4,7 @@ RequiredValidator::RequiredValidator(): Validator() {
 }
 
 ErrorMsg RequiredValidator::validateParam(QVariant value, Param param) const {
-    if (value.isNull()) {
+    if (value.isNull() || value.toString().isEmpty()) {
         return ErrorMsg(param.getName(), "Value is not set");
     }
     return ErrorMsg();
diff --git a/src/validators/validator.cpp b/src/validators/validator.cpp
index 16bae2f..3406e00 100644
--- a/src/validators/validator.cpp
+++ b/src/validators/validator.cpp
@@ -10,23 +10,27 @@ Validator::~Validator() {
 
 const QHash<QString, QString> Validator::builtInValidators() {
     QHash<QString, QString> hash = QHash<QString, QString>();
-    hash.insert("compare", "CompareValidator");
-    hash.insert("default", "DefaultValidator");
-    hash.insert("email", "EmailValidator");
-    hash.insert("exists", "ExistValidator");
-    hash.insert("file", "FileValidator");
-    hash.insert("image", "ImageValidator");
-    hash.insert("number", "NumberValidator");
-    hash.insert("date", "DateValidator");
-    hash.insert("required", "RequiredValidator");
-    hash.insert("unique", "UniqueValidator");
-    hash.insert("url", "UrlValidator");
-    hash.insert("pattern", "PatternValidator");
+    hash.insert("compare", "CuteEntityManager::CompareValidator");
+    hash.insert("default", "CuteEntityManager::DefaultValidator");
+    hash.insert("email", "CuteEntityManager::EmailValidator");
+    hash.insert("exists", "CuteEntityManager::ExistValidator");
+    hash.insert("file", "CuteEntityManager::FileValidator");
+    hash.insert("image", "CuteEntityManager::ImageValidator");
+    hash.insert("number", "CuteEntityManager::NumberValidator");
+    hash.insert("date", "CuteEntityManager::DateValidator");
+    hash.insert("required", "CuteEntityManager::RequiredValidator");
+    hash.insert("unique", "CuteEntityManager::UniqueValidator");
+    hash.insert("url", "CuteEntityManager::UrlValidator");
+    hash.insert("pattern", "CuteEntityManager::PatternValidator");
+    hash.insert("length", "CuteEntityManager::LengthValidator");
     return hash;
 }
 
 QList<ErrorMsg> Validator::validate(QVariant value, QList<Param> params) const {
     QList<ErrorMsg> msgs = QList<ErrorMsg>();
+    if (params.isEmpty()) {
+        params.append(Param(""));
+    }
     for (int i = 0; i < params.size(); ++i) {
         ErrorMsg msg = this->validateParam(value, params.at(i));
         if (!msg.getErrorMsg().isEmpty()) {
diff --git a/src/validators/validatorfactory.cpp b/src/validators/validatorfactory.cpp
index 259f981..bcb203b 100644
--- a/src/validators/validatorfactory.cpp
+++ b/src/validators/validatorfactory.cpp
@@ -12,6 +12,8 @@
 #include "urlvalidator.h"
 #include "uniquevalidator.h"
 #include "patternvalidator.h"
+#include "lengthvalidator.h"
+#include <QDebug>
 using namespace CuteEntityManager;
 
 ValidatorFactory::ValidatorFactory() {
@@ -37,12 +39,14 @@ Validator *ValidatorFactory::createObject(const QByteArray &className) {
     if ( constructor == nullptr ) {
         return nullptr;
     }
+
     return (*constructor)();
 }
 
 QSharedPointer<Validator> ValidatorFactory::getValidatorObject(
     const QString &shortname) {
     if (!ValidatorFactory::validatorInstances.contains(shortname)) {
+        ValidatorFactory::registerClasses();
         ValidatorFactory::validatorInstances.insert(shortname,
                 QSharedPointer<Validator>(ValidatorFactory::createValidator(shortname)));
     }
@@ -63,5 +67,6 @@ void ValidatorFactory::registerClasses() {
         ValidatorFactory::registerClass<PatternValidator>();
         ValidatorFactory::registerClass<UniqueValidator>();
         ValidatorFactory::registerClass<UrlValidator>();
+        ValidatorFactory::registerClass<LengthValidator>();
     }
 }
diff --git a/src/validators/validatorfactory.h b/src/validators/validatorfactory.h
index 28c1526..d7c3552 100644
--- a/src/validators/validatorfactory.h
+++ b/src/validators/validatorfactory.h
@@ -11,8 +11,7 @@ class ValidatorFactory {
     static Validator *createValidator(const QString &shortname);
     template<typename T>
     static void registerClass() {
-        if (!ValidatorFactory::instance.contains(
-                    T::staticMetaObject.className())) {
+        if (!ValidatorFactory::instance.contains(T::staticMetaObject.className())) {
             ValidatorFactory::instance.insert( T::staticMetaObject.className(),
                                                &constructorHelper<T> );
         }
