Revision ea09b5be
Von Christian Ehringfeld vor etwa 9 Jahren hinzugefügt
src/entityinspector.cpp | ||
---|---|---|
if (!rel) {
|
||
ok = false;
|
||
} else {
|
||
this->checkRelationMappings(metaProperty, i.value(), ok,entity);
|
||
this->checkRelationMappings(metaProperty, i.value(), ok, entity);
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
}
|
||
}
|
||
|
||
void EntityInspector::checkNotMappedByAttributes(int foundMappedBy, bool &ok,
|
||
const QString &propertyName, const QString &foreignEntity) {
|
||
if (foundMappedBy == 0) {
|
||
this->logger->logMsg("Optional: The relation " + propertyName +
|
||
" is not mapped in foreign class " + foreignEntity +
|
||
". You could map it.\n", MsgType::INFO);
|
||
} else if (foundMappedBy > 1) {
|
||
this->logger->logMsg("The relation " + propertyName +
|
||
" is mapped several times (" +
|
||
QString::number(foundMappedBy) + ") by foreign class " + foreignEntity +
|
||
". You should map it only once!\n",
|
||
MsgType::WARNING);
|
||
ok = false;
|
||
}
|
||
}
|
||
|
||
void EntityInspector::checkRelationTypes(const Relation &r,
|
||
const Relation &foreign, bool &ok) {
|
||
if (r.getType() == RelationType::ONE_TO_ONE
|
||
&& foreign.getType() != RelationType::ONE_TO_ONE) {
|
||
ok = false;
|
||
this->logRelationTypeErrorMsg("ONE_TO_ONE", r, foreign);
|
||
|
||
} else if (r.getType() == RelationType::MANY_TO_MANY
|
||
&& foreign.getType() != RelationType::MANY_TO_MANY) {
|
||
this->logRelationTypeErrorMsg("MANY_TO_MANY", r, foreign);
|
||
ok = false;
|
||
} else if (r.getType() == RelationType::MANY_TO_ONE
|
||
&& foreign.getType() != RelationType::ONE_TO_MANY) {
|
||
this->logRelationTypeErrorMsg("ONE_TO_MANY", r, foreign);
|
||
ok = false;
|
||
}
|
||
}
|
||
|
||
void EntityInspector::logRelationTypeErrorMsg(const QString &type,
|
||
const Relation &r, const Relation &foreign) {
|
||
this->logger->logMsg("Relation type of foreign relation " +
|
||
foreign.getPropertyName() +
|
||
" must be of type " + type + "! Foreign property name is called " +
|
||
r.getPropertyName() + ".",
|
||
MsgType::CRITICAL);
|
||
}
|
||
|
||
void EntityInspector::analyzeForeignRelations(const Relation &r,
|
||
const Entity *const entity, const Entity *const foreignInstance, bool &ok,
|
||
int &foundMappedBy, bool &foundForeignMappedRelation, bool &bothSidedMappedBy) {
|
||
auto foreignRelations = EntityHelper::getRelationProperties(foreignInstance);
|
||
auto superClasses = EntityHelper::superClasses(entity, true);
|
||
QStringList classNames = QStringList {EntityHelper::getClassName(entity)};
|
||
for (int s = 0; s < superClasses.size(); ++s) {
|
||
classNames.append(superClasses.at(s)->className());
|
||
}
|
||
for (auto i = foreignRelations.constBegin(); i != foreignRelations.constEnd();
|
||
++i) {
|
||
if (r.getMappedBy().isEmpty()
|
||
&& i.key().getMappedBy() == r.getPropertyName()) {
|
||
for (int x = 0; x < classNames.size(); ++x) {
|
||
if (QString(i.value().typeName()).contains(classNames.at(x))) {
|
||
++foundMappedBy;
|
||
this->checkRelationTypes(r, i.key(), ok);
|
||
break;
|
||
}
|
||
}
|
||
} else if (!r.getMappedBy().isEmpty()
|
||
&& r.getMappedBy() == i.key().getPropertyName()) {
|
||
foundForeignMappedRelation = true;
|
||
this->checkRelationTypes(r, i.key(), ok);
|
||
if (r.getPropertyName() == i.key().getMappedBy()) {
|
||
bothSidedMappedBy = true;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void EntityInspector::checkRelationMappings(QMetaProperty &property,
|
||
const Relation &r, bool &ok, Entity *&entity) {
|
||
QString foreignEntityName = EntityInstanceFactory::extractEntityType(
|
||
property.typeName());
|
||
auto foreignInstance = EntityInstanceFactory::createInstance(foreignEntityName);
|
||
if (foreignInstance) {
|
||
auto foreignRelations = EntityHelper::getRelationProperties(foreignInstance);
|
||
int foundMappedBy = 0;
|
||
bool foundForeignMappedRelation = false;
|
||
auto superClasses = EntityHelper::superClasses(entity,true);
|
||
QStringList classNames = QStringList {EntityHelper::getClassName(entity)};
|
||
for (int s = 0; s < superClasses.size(); ++s) {
|
||
classNames.append(superClasses.at(s)->className());
|
||
}
|
||
for (auto i = foreignRelations.constBegin(); i != foreignRelations.constEnd();
|
||
++i) {
|
||
if (r.getMappedBy().isEmpty()
|
||
&& i.key().getMappedBy() == r.getPropertyName()) {
|
||
for (int x = 0; x < classNames.size(); ++x) {
|
||
if(QString(i.value().typeName()).contains(classNames.at(x))) {
|
||
++foundMappedBy;
|
||
break;
|
||
}
|
||
}
|
||
} else if (!r.getMappedBy().isEmpty()
|
||
&& r.getMappedBy() == i.key().getPropertyName()) {
|
||
foundForeignMappedRelation = true;
|
||
break;
|
||
}
|
||
}
|
||
bool foundForeignMappedRelation = false, bothSidedMappedBy = false;
|
||
this->analyzeForeignRelations(r, entity, foreignInstance, ok, foundMappedBy,
|
||
foundForeignMappedRelation, bothSidedMappedBy);
|
||
if (r.getMappedBy().isEmpty()) {
|
||
if (foundMappedBy == 0) {
|
||
this->logger->logMsg("Optional: The relation " + r.getPropertyName() +
|
||
" is not mapped in foreign class " + foreignEntityName +
|
||
". You could map it.\n", MsgType::INFO);
|
||
} else if (foundMappedBy > 1) {
|
||
this->logger->logMsg("The relation " + r.getPropertyName() +
|
||
" is mapped several times (" +
|
||
QString::number(foundMappedBy) + ") by foreign class " + foreignEntityName +
|
||
". You should map it only once!\n",
|
||
MsgType::WARNING);
|
||
ok = false;
|
||
}
|
||
this->checkNotMappedByAttributes(foundMappedBy, ok, r.getPropertyName(),
|
||
foreignEntityName);
|
||
} else if (!foundForeignMappedRelation) {
|
||
this->logger->logMsg("Relation " + r.getPropertyName() +
|
||
" with mappedBy attribute " +
|
||
r.getMappedBy() + " has no mapped relation in " + foreignEntityName +
|
||
" class!\n", MsgType::CRITICAL);
|
||
ok = false;
|
||
} else if (bothSidedMappedBy) {
|
||
this->logger->logMsg("Relation " + r.getPropertyName() +
|
||
" with mappedBy attribute " +
|
||
r.getMappedBy() + " is also mappedBy in " + foreignEntityName +
|
||
" class!\n", MsgType::CRITICAL);
|
||
ok = false;
|
||
}
|
||
delete foreignInstance;
|
||
foreignInstance = nullptr;
|
src/entityinspector.h | ||
---|---|---|
void verifyBlobAttributes(Entity *&entity);
|
||
void checkMetaProperties(QHash<QString, QMetaProperty> &metaProperties,
|
||
bool &ok, QHash<QString, Relation> &relations);
|
||
void checkNotMappedByAttributes(int foundMappedBy, bool &ok,
|
||
const QString &propertyName, const QString &foreignEntity);
|
||
void checkRelationTypes(const Relation &r, const Relation &foreign, bool &ok);
|
||
void logRelationTypeErrorMsg(const QString &type, const Relation &r,
|
||
const Relation &foreign);
|
||
void analyzeForeignRelations(const Relation &r, const Entity *const entity,
|
||
const Entity *const foreignInstance, bool &ok, int &foundMappedBy,
|
||
bool &foundForeignMappedRelation, bool &bothSidedMappedBy);
|
||
void initLogger(const MsgType msgType);
|
||
Logger *logger = nullptr;
|
||
};
|
src/relation.cpp | ||
---|---|---|
return type;
|
||
}
|
||
|
||
QString Relation::getTypeAsString() const {
|
||
QString r = "";
|
||
switch (this->type) {
|
||
case RelationType::ONE_TO_MANY:
|
||
r = "ONE_TO_MANY";
|
||
break;
|
||
case RelationType::MANY_TO_MANY:
|
||
r = "MANY_TO_MANY";
|
||
break;
|
||
case RelationType:: MANY_TO_ONE:
|
||
r = "MANY_TO_ONE";
|
||
break;
|
||
case RelationType::ONE_TO_ONE:
|
||
r = "ONE_TO_ONE";
|
||
break;
|
||
}
|
||
return r;
|
||
}
|
||
|
||
void Relation::setType(const RelationType &value) {
|
||
type = value;
|
||
}
|
src/relation.h | ||
---|---|---|
*/
|
||
explicit Relation(QString propertyName, RelationType type,
|
||
QString mappedBy = QString(),
|
||
QList<CascadeType> cascadeType = QList<CascadeType>{CascadeType::MERGE, CascadeType::PERSIST, CascadeType::REFRESH});
|
||
QList<CascadeType> cascadeType = QList<CascadeType> {CascadeType::MERGE, CascadeType::PERSIST, CascadeType::REFRESH});
|
||
~Relation();
|
||
RelationType getType() const;
|
||
QString getTypeAsString() const;
|
||
void setType(const RelationType &value);
|
||
|
||
QString getPropertyName() const;
|
Auch abrufbar als: Unified diff
some improvements in entity inspector