protected void compareForeignKeyDescription( TableDescription xmlTableDescription, TableDescription databaseTableDescription) { // todo onDeleteRule not yet hard checked! String tableName = xmlTableDescription.getTableName(); List<ForeignKeyDescription> unCheckedDatabaseFKs = new ArrayList<ForeignKeyDescription>(); if (databaseTableDescription.getForeignKeys() != null) { unCheckedDatabaseFKs.addAll(databaseTableDescription.getForeignKeys()); } List<ForeignKeyDescription> unnamedFKs = new ArrayList<ForeignKeyDescription>(xmlTableDescription.getForeignKeySize()); for (int i = 0; i < xmlTableDescription.getForeignKeySize(); i++) { ForeignKeyDescription xmlForeignKeyDescription = xmlTableDescription.getForeignKey(i); if (xmlForeignKeyDescription.getConstraintName() == null || xmlForeignKeyDescription.getConstraintName().length() == 0) { unnamedFKs.add(xmlForeignKeyDescription); // check later... continue; } ForeignKeyDescription databaseForeignKeyDescription = databaseTableDescription.getForeignKey(xmlForeignKeyDescription.getConstraintName()); unCheckedDatabaseFKs.remove(databaseForeignKeyDescription); if (databaseForeignKeyDescription != null) { compareForeignKey(tableName, xmlForeignKeyDescription, databaseForeignKeyDescription); } else assertTrue( "Table: " + tableName + "... ConstraintName not found! Expected ConstraintName: " + xmlForeignKeyDescription.getConstraintName(), false); } for (ForeignKeyDescription unnamedFK : unnamedFKs) { ForeignKeyDescription dbFk = databaseTableDescription.findForeignKeyLike(unnamedFK); if (dbFk != null) { unCheckedDatabaseFKs.remove(dbFk); if (!StringUtils.equalsIgnoreCase(dbFk.getOnDeleteRule(), unnamedFK.getOnDeleteRule())) { log( "Table: " + tableName + "... Different onDelete rules (found " + dbFk.getOnDeleteRule() + ", expected " + unnamedFK.getOnDeleteRule() + ") between foreign key on " + dbFk.getColumns()); } } else { assertTrue( "Table: " + tableName + "... Missing unnamed foreign key on " + unnamedFK.getColumns() + " referencing " + unnamedFK.getRefTableName() + "." + unnamedFK.getRefColumns(), false); } } for (ForeignKeyDescription uncheckedFK : unCheckedDatabaseFKs) { assertTrue( "Table: " + tableName + " contains unexpected foreign key named '" + uncheckedFK + " on columns " + uncheckedFK.getColumns() + "' referencing table '" + uncheckedFK.getRefTableName() + "'." + uncheckedFK.getRefColumns(), false); } }