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() + ".");
}
}
}
}
}
}
}
}