File indexing completed on 2024-05-12 15:59:17

0001 /*
0002  *  SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include "kis_meta_data_validator.h"
0008 
0009 #include "kis_meta_data_store.h"
0010 #include "kis_meta_data_value.h"
0011 #include "kis_meta_data_entry.h"
0012 #include "kis_meta_data_schema.h"
0013 #include "kis_meta_data_type_info.h"
0014 
0015 using namespace KisMetaData;
0016 
0017 //------------------- Validator::Reason -------------------//
0018 
0019 struct Q_DECL_HIDDEN Validator::Reason::Private {
0020     Type type;
0021 };
0022 
0023 Validator::Reason::Reason(Type _type) : d(new Private)
0024 {
0025     d->type = _type;
0026 }
0027 
0028 Validator::Reason::Reason(const Validator::Reason& _rhs) : d(new Private(*_rhs.d))
0029 {
0030 }
0031 
0032 Validator::Reason& Validator::Reason::operator=(const Validator::Reason & _rhs)
0033 {
0034     *d = *_rhs.d;
0035     return *this;
0036 }
0037 
0038 Validator::Reason::~Reason()
0039 {
0040     delete d;
0041 }
0042 
0043 Validator::Reason::Type Validator::Reason::type() const
0044 {
0045     return d->type;
0046 }
0047 
0048 //------------------- Validator -------------------//
0049 
0050 struct Q_DECL_HIDDEN Validator::Private {
0051     Private() : countValidEntries(0) {
0052     }
0053     int countValidEntries;
0054     QMap<QString, Reason> invalidEntries;
0055     const Store* store;
0056 };
0057 
0058 Validator::Validator(const Store* store) : d(new Private)
0059 {
0060     d->store = store;
0061     revalidate();
0062 }
0063 
0064 Validator::~Validator()
0065 {
0066     delete d;
0067 }
0068 
0069 void Validator::revalidate()
0070 {
0071     QList<Entry> entries = d->store->entries();
0072     d->countValidEntries = 0;
0073     d->invalidEntries.clear();
0074     Q_FOREACH (const Entry& entry, entries) {
0075         const TypeInfo* typeInfo = entry.schema()->propertyType(entry.name());
0076         if (typeInfo) {
0077             if (typeInfo->hasCorrectType(entry.value())) {
0078                 if (typeInfo->hasCorrectValue(entry.value())) {
0079                     ++d->countValidEntries;
0080                 } else {
0081                     d->invalidEntries[entry.qualifiedName()] = Reason(Reason::INVALID_VALUE);
0082                 }
0083             } else {
0084                 d->invalidEntries[entry.qualifiedName()] = Reason(Reason::INVALID_TYPE);
0085             }
0086         } else {
0087             d->invalidEntries[entry.qualifiedName()] = Reason(Reason::UNKNOWN_ENTRY);
0088         }
0089     }
0090 }
0091 
0092 int Validator::countInvalidEntries() const
0093 {
0094     return d->invalidEntries.size();
0095 }
0096 int Validator::countValidEntries() const
0097 {
0098     return d->countValidEntries;
0099 }
0100 const QMap<QString, Validator::Reason>& Validator::invalidEntries() const
0101 {
0102     return d->invalidEntries;
0103 }
0104 
0105