public static void checkEntities()

in framework/entity/src/main/java/org/apache/ofbiz/entity/model/ModelEntityChecker.java [43:289]


    public static void checkEntities(Delegator delegator, List<String> warningList) throws GenericEntityException {
        ModelReader reader = delegator.getModelReader();

        Set<String> reservedWords = new HashSet<>();
        if (Debug.infoOn()) {
            Debug.logInfo("[initReservedWords] array length = " + RW_ARRAY.length, MODULE);
        }
        for (int i = 0; i < RW_ARRAY.length; i++) {
            reservedWords.add(RW_ARRAY[i]);
        }

        Map<String, Set<String>> packages = new HashMap<>();
        Set<String> packageNames = new TreeSet<>();
        Set<String> tableNames = new HashSet<>();

        //put the entityNames TreeSets in a HashMap by packageName
        Collection<String> ec = reader.getEntityNames();
        Set<String> entityNames = new HashSet<>(ec);
        for (String eName: ec) {
            ModelEntity ent = reader.getModelEntity(eName);

            //make sure the table name is in the list of all table names, if
            // not null
            if (UtilValidate.isNotEmpty(ent.getPlainTableName())) {
                tableNames.add(ent.getPlainTableName());
            }

            Set<String> entities = packages.get(ent.getPackageName());
            if (entities == null) {
                entities = new TreeSet<>();
                packages.put(ent.getPackageName(), entities);
                packageNames.add(ent.getPackageName());
            }
            entities.add(eName);
        }

        Set<String> fkNames = new HashSet<>();
        Set<String> indexNames = new HashSet<>();

        for (String pName: packageNames) {
            Set<String> entities = packages.get(pName);
            for (String entityName: entities) {
                String helperName = delegator.getEntityHelperName(entityName);
                String groupName = delegator.getEntityGroupName(entityName);
                ModelEntity entity = reader.getModelEntity(entityName);
                if (helperName == null) {
                    //only show group name warning if helper name not found
                    if (UtilValidate.isEmpty(groupName)) {
                        warningList.add("[GroupNotFound] No Group Name found for entity " + entity.getEntityName() + ".");
                    } else {
                        warningList.add("[HelperNotFound] No Helper (DataSource) definition found for entity [" + entity.getEntityName()
                                + "] because there is no helper (datasource) configured for the entity group it is in: [" + groupName + "]");
                    }
                }
                if (entity.getPlainTableName() != null && entity.getPlainTableName().length() > 30) {
                    warningList.add("[TableNameGT30] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName()
                            + " is longer than 30 characters.");
                }
                if (entity.getPlainTableName() != null && reservedWords.contains(entity.getPlainTableName().toUpperCase(Locale.getDefault()))) {
                    warningList.add("[TableNameRW] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName()
                            + " is a reserved word.");
                }

                // don't check columns/relations/keys when never-check is set to "true"
                if (entity.getNeverCheck()) {
                    continue;
                }

                Set<String> ufields = new HashSet<>();
                Iterator<ModelField> fieldIter = entity.getFieldsIterator();
                while (fieldIter.hasNext()) {
                    ModelField field = fieldIter.next();
                    ModelFieldType type = delegator.getEntityFieldType(entity, field.getType());

                    if (ufields.contains(field.getName())) {
                        warningList.add("[FieldNotUnique] Field [" + field.getName() + " of entity " + entity.getEntityName()
                                + " is not unique for that entity.");
                    } else {
                        ufields.add(field.getName());
                    }
                    if (field.getColName().length() > 30 && !(entity instanceof ModelViewEntity)) {
                        warningList.add("[FieldNameGT30] Column name [" + field.getColName() + "] of entity " + entity.getEntityName()
                                + " is longer than 30 characters.");
                    }
                    if (field.getColName().length() == 0) {
                        warningList.add("[FieldNameEQ0] Column name for field name \"" + field.getName() + "\" of entity " + entity.getEntityName()
                                + " is empty (zero length).");
                    }
                    if (reservedWords.contains(field.getColName().toUpperCase(Locale.getDefault()))) {
                        warningList.add("[FieldNameRW] Column name " + field.getColName() + " of entity " + entity.getEntityName()
                                + " is a reserved word.");
                    }
                    if (type == null) {
                        StringBuilder warningMsg = new StringBuilder();
                        warningMsg.append("[FieldTypeNotFound] Field type " + field.getType() + " of entity " + entity.getEntityName()
                                + " not found in field type definitions");
                        if (helperName == null) {
                            warningMsg.append(" (no helper definition found)");
                        }
                        warningMsg.append(".");
                        warningList.add(warningMsg.toString());
                    }
                }
                if (entity.getRelationsSize() > 0) {
                    Iterator<ModelIndex> indexIter = entity.getIndexesIterator();
                    while (indexIter.hasNext()) {
                        ModelIndex index = indexIter.next();

                        if (indexNames.contains(index.getName())) {
                            warningList.add("[IndexDuplicateName] Index on entity "
                                            + entity.getEntityName() + " has a duplicate index-name \""
                                            + index.getName() + "\".");
                        } else {
                            indexNames.add(index.getName());
                        }

                        if (tableNames.contains(index.getName())) {
                            warningList.add("[IndexTableDupName] Index on entity "
                                            + entity.getEntityName() + " has an index-name \""
                                            + index.getName() + "\" that is also being used as a table name.");
                        }

                        if (fkNames.contains(index.getName())) {
                            warningList.add("[IndexFKDupName] Index on entity "
                                            + entity.getEntityName()
                                            + " has an index-name \""
                                            + index.getName()
                                            + "\" that is also being used as a Foreign Key name.");
                        }

                        // make sure all names are <= 18 characters
                        if (index.getName().length() > 18) {
                            warningList.add("[IndexNameGT18] The index name " + index.getName() + " (length:" + index.getName().length()
                                            + ") was greater than 18 characters in length for entity " + entity.getEntityName() + ".");
                        }
                    }

                    Set<String> relations = new HashSet<>();
                    for (int r = 0; r < entity.getRelationsSize(); r++) {
                        ModelRelation relation = entity.getRelation(r);

                        if (!entityNames.contains(relation.getRelEntityName())) {
                            warningList.add("[RelatedEntityNotFound] Related entity " + relation.getRelEntityName()
                                            + " of entity " + entity.getEntityName() + " not found.");
                        }
                        if (relations.contains(relation.getTitle() + relation.getRelEntityName())) {
                            warningList.add("[RelationNameNotUnique] Relation " + relation.getTitle() + relation.getRelEntityName()
                                            + " of entity " + entity.getEntityName() + " is not unique for that entity.");
                        } else {
                            relations.add(relation.getTitle() + relation.getRelEntityName());
                        }

                        if (relation.getFkName().length() > 0) {
                            if (fkNames.contains(relation.getFkName())) {
                                warningList.add("[RelationFkDuplicate] Relation to " + relation.getRelEntityName()
                                                + " from entity " + entity.getEntityName() + " has a duplicate fk-name \""
                                                + relation.getFkName() + "\".");
                            } else {
                                fkNames.add(relation.getFkName());
                            }
                            if (tableNames.contains(relation.getFkName())) {
                                warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity "
                                                + entity.getEntityName() + " has an fk-name \""
                                                + relation.getFkName() + "\" that is also being used as a table name.");
                            }
                            if (indexNames.contains(relation.getFkName())) {
                                warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity "
                                                + entity.getEntityName() + " has an fk-name \""
                                                + relation.getFkName() + "\" that is also being used as an index name.");
                            }
                        }

                        // make sure all FK names are <= 18 characters
                        if (relation.getFkName().length() > 18) {
                            warningList.add("[RelFKNameGT18] The foreign key named " + relation.getFkName()
                                    + " (length:" + relation.getFkName().length()
                                    + ") was greater than 18 characters in length for relation " + relation.getTitle() + relation.getRelEntityName()
                                    + " of entity " + entity.getEntityName() + ".");
                        }

                        ModelEntity relatedEntity = null;
                        try {
                            relatedEntity = reader.getModelEntity(relation.getRelEntityName());
                        } catch (GenericEntityException e) {
                            Debug.logInfo("Entity referred to in relation is not defined: " + relation.getRelEntityName(), MODULE);
                        }
                        if (relatedEntity != null) {
                            //if relation is of type one, make sure keyMaps
                            // match the PK of the relatedEntity
                            if ("one".equals(relation.getType()) || "one-nofk".equals(relation.getType())) {
                                if (relatedEntity.getPksSize() != relation.getKeyMaps().size()) {
                                    warningList.add("[RelatedOneKeyMapsWrongSize] The number of primary keys (" + relatedEntity.getPksSize()
                                            + ") of related entity " + relation.getRelEntityName()
                                            + " does not match the number of keymaps (" + relation.getKeyMaps().size()
                                            + ") for relation of type one \"" + relation.getTitle() + relation.getRelEntityName()
                                            + "\" of entity " + entity.getEntityName() + ".");
                                }
                                Iterator<ModelField> pksIter = relatedEntity.getPksIterator();
                                while (pksIter.hasNext()) {
                                    ModelField pk = pksIter.next();
                                    if (relation.findKeyMapByRelated(pk.getName()) == null) {
                                        warningList.add("[RelationOneRelatedPrimaryKeyMissing] The primary key \"" + pk.getName()
                                                + "\" of related entity " + relation.getRelEntityName()
                                                + " is missing in the keymaps for relation of type one " + relation.getTitle()
                                                + relation.getRelEntityName() + " of entity " + entity.getEntityName() + ".");
                                    }
                                }
                            }
                        }

                        //make sure all keyMap 'fieldName's match fields of
                        // this entity
                        //make sure all keyMap 'relFieldName's match fields of
                        // the relatedEntity
                        for (ModelKeyMap keyMap : relation.getKeyMaps()) {

                            ModelField field = entity.getField(keyMap.getFieldName());
                            ModelField rfield = null;
                            if (relatedEntity != null) {
                                rfield = relatedEntity.getField(keyMap.getRelFieldName());
                            }
                            if (rfield == null) {
                                warningList.add("[RelationRelatedFieldNotFound] The field \"" + keyMap.getRelFieldName()
                                        + "\" of related entity " + relation.getRelEntityName()
                                        + " was specified in the keymaps but is not found for relation " + relation.getTitle()
                                        + relation.getRelEntityName() + " of entity " + entity.getEntityName() + ".");
                            }
                            if (field == null) {
                                warningList.add("[RelationFieldNotFound] The field " + keyMap.getFieldName()
                                        + " was specified in the keymaps but is not found for relation " + relation.getTitle()
                                        + relation.getRelEntityName() + " of entity " + entity.getEntityName() + ".");
                            }
                            if (field != null && rfield != null) {
                                if (!field.getType().equals(rfield.getType())) {
                                    warningList.add("[RelationFieldTypesDifferent] The field type (" + field.getType()
                                            + ") of " + field.getName() + " of entity " + entity.getEntityName()
                                            + " is not the same as field type (" + rfield.getType() + ") of "
                                            + rfield.getName() + " of entity " + relation.getRelEntityName() + " for relation "
                                            + relation.getTitle() + relation.getRelEntityName() + ".");
                                }
                            }
                        }
                    }
                }
            }
        }
    }