commit 519b2fe31200e9a1e14c9c4e5e34e462ae3635bd
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Tue Aug 11 16:47:00 2015 +0200

    file, image and pattern validator

diff --git a/EntityManager.pro b/EntityManager.pro
index 1a75aaa..746ddea 100644
--- a/EntityManager.pro
+++ b/EntityManager.pro
@@ -1,5 +1,7 @@
 QT       += core
 QT       += sql
+#if you need Image Validation you must compile with += gui
+#QT       += gui
 QT       -= gui
 
 TARGET = CuteEntityManager
@@ -46,7 +48,8 @@ src/entity.h \
     src/validators/existvalidator.h \
     src/validators/filevalidator.h \
     src/validators/imagevalidator.h \
-    src/validators/uniquevalidator.h
+    src/validators/uniquevalidator.h \
+    src/validators/patternvalidator.h
 
 SOURCES += \
 src/entity.cpp \
@@ -86,7 +89,8 @@ src/entity.cpp \
     src/validators/existvalidator.cpp \
     src/validators/filevalidator.cpp \
     src/validators/imagevalidator.cpp \
-    src/validators/uniquevalidator.cpp
+    src/validators/uniquevalidator.cpp \
+    src/validators/patternvalidator.cpp
 
 CONFIG += c++14
 QMAKE_CXXFLAGS += -std=c++14
diff --git a/src/validators/filevalidator.cpp b/src/validators/filevalidator.cpp
index ae20d90..19edca6 100644
--- a/src/validators/filevalidator.cpp
+++ b/src/validators/filevalidator.cpp
@@ -1,11 +1,79 @@
 #include "filevalidator.h"
-
+#include <QFileInfo>
+#include <QMimeType>
+#include <QMimeDatabase>
 using namespace CuteEntityManager;
 FileValidator::FileValidator() : Validator() {
 
 }
 
+/**
+ * @brief FileValidator::validateParam
+ * @param value must be the absolute FilePath
+ * @param param
+ * @return
+ */
 ErrorMsg FileValidator::validateParam(QVariant value, Param param) const {
+    QFileInfo file = QFileInfo(value.toString());
+    if (param.getName() == "mimeTypes") {
+        return this->validateMIMEType(file, param);
+    } else if (param.getName() == "extensions") {
+        return this->validateExtension(file, param);
+    } else if (param.getName() == "minSize"
+               && file.size() < param.getValue().toLongLong()) {
+        return ErrorMsg(param.getName(),
+                        "The file <property> is too small. Its size cannot be smaller than " +
+                        param.getValue().toString() + " bytes.");
+
+    } else if (param.getName() == "maxSize") {
+        return ErrorMsg(param.getName(),
+                        "The file <property> is too big. Its size cannot exceed " +
+                        param.getValue().toString() + " bytes.");
+    }
+    return ErrorMsg();
+}
+
+ErrorMsg FileValidator::validateMIMEType(const QFileInfo &file,
+        const Param &param) const {
+    QMimeDatabase mimeDatabase;
+    QMimeType mimeType = mimeDatabase.mimeTypeForFile(file);
+    if (param.getValue().canConvert<QStringList>()) {
+        QStringList list = param.getValue().toStringList();
+        for (int i = 0; i < list.size(); ++i) {
+            if (mimeType.inherits(list.at(i))) {
+                return ErrorMsg();
+            }
+        }
+        return ErrorMsg(param.getName(),
+                        "Only files with these MIME types are allowed: " + list.join(", ") + ".");
+    } else {
+        if (!mimeType.inherits(param.getValue().toString())) {
+            return ErrorMsg(param.getName(),
+                            "Only files with this MIME type are allowed: " +
+                            param.getValue().toString() + ".");
+        }
+    }
+    return ErrorMsg();
+}
 
+ErrorMsg FileValidator::validateExtension(const QFileInfo &file,
+        const Param &param) const {
+    if (param.getValue().canConvert<QStringList>()) {
+        QStringList list = param.getValue().toStringList();
+        for (int i = 0; i < list.size(); ++i) {
+            if (file.completeSuffix().contains(list.at(i))) {
+                return ErrorMsg();
+            }
+        }
+        return ErrorMsg(param.getName(),
+                        "Only files with these extension types are allowed: " + list.join(", "));
+    } else {
+        if (!file.completeSuffix().contains(param.getValue().toString())) {
+            return ErrorMsg(param.getName(),
+                            "Only files with this extension type are allowed: " +
+                            param.getValue().toString() + ".");
+        }
+    }
+    return ErrorMsg();
 }
 
diff --git a/src/validators/filevalidator.h b/src/validators/filevalidator.h
index a4e2603..a4391f3 100644
--- a/src/validators/filevalidator.h
+++ b/src/validators/filevalidator.h
@@ -1,12 +1,17 @@
 #ifndef FILEVALIDATOR_H
 #define FILEVALIDATOR_H
 #include "validator.h"
+#include <QFileInfo>
 namespace CuteEntityManager {
 class FileValidator : public Validator {
     Q_OBJECT
   public:
     FileValidator();
     virtual ErrorMsg validateParam(QVariant value, Param param) const override;
+    virtual ErrorMsg validateMIMEType(const QFileInfo &file,
+                                      const Param &param) const;
+    virtual ErrorMsg validateExtension(const QFileInfo &file,
+                                       const Param &param) const;
 };
 }
 #endif // FILEVALIDATOR_H
diff --git a/src/validators/imagevalidator.cpp b/src/validators/imagevalidator.cpp
index 2dee1cd..51b8ab6 100644
--- a/src/validators/imagevalidator.cpp
+++ b/src/validators/imagevalidator.cpp
@@ -1,10 +1,55 @@
 #include "imagevalidator.h"
-
+#ifdef QT_GUI_LIB
+#include <QImage>
+#endif
 using namespace CuteEntityManager;
 ImageValidator::ImageValidator() : FileValidator() {
-
 }
 
 ErrorMsg ImageValidator::validateParam(QVariant value, Param param) const {
+    ErrorMsg msg = FileValidator::validateParam(value, param);
+    if (msg.getErrorMsg().isEmpty()) {
+        msg = this->validateImage(value, param);
+    }
+    return msg;
+}
 
+ErrorMsg ImageValidator::validateImage(QVariant value, Param param) const {
+#ifdef QT_GUI_LIB
+    //isImage
+    QImage img = QImage(value.toString());
+    if (!img.isNull()) {
+        if (param.getName() == "minWidth"
+                && img.width() < param.getValue().toLongLong()) {
+            ErrorMsg(param.getName(),
+                     "The image " + value.toString() +
+                     " is too smal. The width cannot be smaller than " + param.getValue().toString()
+                     + ".");
+        } else if (param.getName() == "maxWidth"
+                   && img.width() > param.getValue().toLongLong()) {
+            ErrorMsg(param.getName(),
+                     "The image " + value.toString() +
+                     " is too smal. The width cannot be larger than " + param.getValue().toString() +
+                     ".");
+        } else if (param.getName() == "minHeight"
+                   && img.height() < param.getValue().toLongLong()) {
+            ErrorMsg(param.getName(),
+                     "The image " + value.toString() +
+                     " is too smal. The height cannot be smaller than " + param.getValue().toString()
+                     + ".");
+        } else if (param.getName() == "maxHeight"
+                   && img.height() > param.getValue().toLongLong()) {
+            ErrorMsg(param.getName(),
+                     "The image " + value.toString() +
+                     " is too smal. The height cannot be larger than " + param.getValue().toString()
+                     + ".");
+        }
+    } else {
+        return ErrorMsg("", "The file " + value.toString() + " is not a valid image.");
+    }
+#else
+    Q_UNUSED(value)
+    Q_UNUSED(param)
+#endif
+    return ErrorMsg();
 }
diff --git a/src/validators/imagevalidator.h b/src/validators/imagevalidator.h
index 52b8129..47f4068 100644
--- a/src/validators/imagevalidator.h
+++ b/src/validators/imagevalidator.h
@@ -1,7 +1,5 @@
 #ifndef IMAGEVALIDATOR_H
 #define IMAGEVALIDATOR_H
-
-
 #include "filevalidator.h"
 namespace CuteEntityManager {
 class ImageValidator : public FileValidator {
@@ -9,6 +7,7 @@ class ImageValidator : public FileValidator {
   public:
     ImageValidator();
     ErrorMsg validateParam(QVariant value, Param param) const final override;
+    virtual ErrorMsg validateImage(QVariant value, Param param) const;
 };
 }
 
diff --git a/src/validators/patternvalidator.cpp b/src/validators/patternvalidator.cpp
new file mode 100644
index 0000000..538d7ba
--- /dev/null
+++ b/src/validators/patternvalidator.cpp
@@ -0,0 +1,19 @@
+#include "patternvalidator.h"
+#include <QRegularExpression>
+using namespace CuteEntityManager;
+PatternValidator::PatternValidator() : Validator() {
+}
+
+ErrorMsg PatternValidator::validateParam(QVariant value, Param param) const {
+    QRegularExpression regExp = QRegularExpression();
+    if (param.getName().isEmpty()) {
+        regExp.setPattern(param.getValue().toString());
+    } else {
+        regExp.setPattern(param.getName());
+    }
+    if (regExp.match(value.toString()).hasMatch()) {
+        return ErrorMsg();
+    }
+    return ErrorMsg(param.getName(), "<property> not matches the pattern.");
+}
+
diff --git a/src/validators/patternvalidator.h b/src/validators/patternvalidator.h
new file mode 100644
index 0000000..6b1475a
--- /dev/null
+++ b/src/validators/patternvalidator.h
@@ -0,0 +1,12 @@
+#ifndef PATTERNVALIDATOR_H
+#define PATTERNVALIDATOR_H
+#include "validator.h"
+namespace CuteEntityManager {
+class PatternValidator : public Validator {
+    Q_OBJECT
+  public:
+    PatternValidator();
+    ErrorMsg validateParam(QVariant value, Param param) const final override;
+};
+}
+#endif // PATTERNVALIDATOR_H
diff --git a/src/validators/validator.cpp b/src/validators/validator.cpp
index c887ad0..16bae2f 100644
--- a/src/validators/validator.cpp
+++ b/src/validators/validator.cpp
@@ -21,6 +21,7 @@ const QHash<QString, QString> Validator::builtInValidators() {
     hash.insert("required", "RequiredValidator");
     hash.insert("unique", "UniqueValidator");
     hash.insert("url", "UrlValidator");
+    hash.insert("pattern", "PatternValidator");
     return hash;
 }
 
diff --git a/src/validators/validatorfactory.cpp b/src/validators/validatorfactory.cpp
index 51ddd1d..259f981 100644
--- a/src/validators/validatorfactory.cpp
+++ b/src/validators/validatorfactory.cpp
@@ -11,6 +11,7 @@
 #include "requiredvalidator.h"
 #include "urlvalidator.h"
 #include "uniquevalidator.h"
+#include "patternvalidator.h"
 using namespace CuteEntityManager;
 
 ValidatorFactory::ValidatorFactory() {
@@ -59,6 +60,7 @@ void ValidatorFactory::registerClasses() {
         ValidatorFactory::registerClass<NumberValidator>();
         ValidatorFactory::registerClass<DateValidator>();
         ValidatorFactory::registerClass<RequiredValidator>();
+        ValidatorFactory::registerClass<PatternValidator>();
         ValidatorFactory::registerClass<UniqueValidator>();
         ValidatorFactory::registerClass<UrlValidator>();
     }
