From 3fab4ea0d66985d82ef2a9f4c660b830030b676f Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 30 Nov 2011 17:57:02 +0000 Subject: [PATCH] ALF-7260: schema comparator - improved language of reporting. The differences and validation messages are hopefully improved, e.g: Difference: missing sequence from database, expected at path: .alf_acl_member_seq Difference: missing table from database, expected at path: .alf_acl_change_set Validation: index alfresco.some_table.idx_table_id.name="idx_table_id" fails to match rule: value must be 'xyz' I'm sure there's still room for improvement but this should give a decent starting point. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@32420 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/system-messages.properties | 10 ++++----- .../alfresco/util/schemacomp/Difference.java | 6 +++--- .../util/schemacomp/DifferenceTest.java | 21 ++++++++++--------- .../schemacomp/RedundantDbObjectTest.java | 2 +- .../util/schemacomp/ValidationResult.java | 1 + .../util/schemacomp/ValidationResultTest.java | 9 +++++--- .../schemacomp/model/AbstractDbObject.java | 7 +++++++ .../util/schemacomp/model/DbObject.java | 7 +++++++ .../util/schemacomp/model/ForeignKey.java | 8 ++++++- .../util/schemacomp/model/PrimaryKey.java | 6 ++++++ 10 files changed, 54 insertions(+), 23 deletions(-) diff --git a/config/alfresco/messages/system-messages.properties b/config/alfresco/messages/system-messages.properties index 906fbe8bdd..d2c8821837 100644 --- a/config/alfresco/messages/system-messages.properties +++ b/config/alfresco/messages/system-messages.properties @@ -24,12 +24,12 @@ system.schema_comp.debug.time_taken=Schema validation took {0} ms system.schema_comp.info.all_ok=Compared database schema with reference schema (all OK): {0} system.schema_comp.warn.problems_found=Schema validation found {0} potential problems, results written to: {1} # Generic differencing, validation and redundancy messages... -system.schema_comp.diff=Difference: {0}, reference path:{1} (value: {2}), target path:{3} (value: {4}) -system.schema_comp.diff.ref_only=Difference: {0}, reference path:{1} (value: {2}) -system.schema_comp.diff.target_only=Difference: {0}, target path:{1} (value: {2}) -system.schema_comp.redundant_obj={0} redundant items? reference: {1}, matches: {2} +system.schema_comp.diff=Difference: expected {0} {1}="{2}", but was {3}="{4}" +system.schema_comp.diff.ref_only=Difference: missing {0} from database, expected at path: {1} +system.schema_comp.diff.target_only=Difference: unexpected {0} found in database with path: {1} +system.schema_comp.redundant_obj=Redundancy: {0} items matching {1}, matches: {2} system.schema_comp.redundant_obj.many_matches={0} redundant items? reference: {1}, matches: {2} and {3} more... -system.schema_comp.validation=Validation: target path:{0} (value: {1}, rule: {2}) +system.schema_comp.validation=Validation: {0} {1}="{2}" fails to match rule: {3} # Specific validator (implementations) messages... system.schema_comp.name_validator=name must match pattern ''{0}'' diff --git a/source/java/org/alfresco/util/schemacomp/Difference.java b/source/java/org/alfresco/util/schemacomp/Difference.java index 40e59e969f..47fd428dbc 100644 --- a/source/java/org/alfresco/util/schemacomp/Difference.java +++ b/source/java/org/alfresco/util/schemacomp/Difference.java @@ -88,7 +88,7 @@ public final class Difference extends Result { return I18NUtil.getMessage( "system.schema_comp.diff.target_only", - getWhere(), + getRight().getDbObject().getTypeName(), getRight().getPath(), getRight().getPropertyValue()); } @@ -96,14 +96,14 @@ public final class Difference extends Result { return I18NUtil.getMessage( "system.schema_comp.diff.ref_only", - getWhere(), + getLeft().getDbObject().getTypeName(), getLeft().getPath(), getLeft().getPropertyValue()); } return I18NUtil.getMessage( "system.schema_comp.diff", - getWhere(), + getLeft().getDbObject().getTypeName(), getLeft().getPath(), getLeft().getPropertyValue(), getRight().getPath(), diff --git a/source/java/org/alfresco/util/schemacomp/DifferenceTest.java b/source/java/org/alfresco/util/schemacomp/DifferenceTest.java index b9583397c0..2ba37f10f1 100644 --- a/source/java/org/alfresco/util/schemacomp/DifferenceTest.java +++ b/source/java/org/alfresco/util/schemacomp/DifferenceTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.alfresco.util.schemacomp.Difference.Where; +import org.alfresco.util.schemacomp.model.Column; import org.junit.Before; import org.junit.Test; import org.springframework.extensions.surf.util.I18NUtil; @@ -47,15 +48,17 @@ public class DifferenceTest DbProperty refDbProp = mock(DbProperty.class); when(refDbProp.getPath()).thenReturn("alfresco.some_table.some_column.name"); + when(refDbProp.getDbObject()).thenReturn(new Column("some_column")); when(refDbProp.getPropertyValue()).thenReturn("node_ref"); DbProperty targetDbProp = mock(DbProperty.class); when(targetDbProp.getPath()).thenReturn("alfresco.some_table.some_column.name"); + when(targetDbProp.getDbObject()).thenReturn(new Column("some_column")); when(targetDbProp.getPropertyValue()).thenReturn("nood_ref"); Difference diff = new Difference(Where.IN_BOTH_BUT_DIFFERENCE, refDbProp, targetDbProp); - assertEquals("Difference: IN_BOTH_BUT_DIFFERENCE, reference path:alfresco.some_table.some_column.name " + - "(value: node_ref), target path:alfresco.some_table.some_column.name (value: nood_ref)", + assertEquals("Difference: expected column alfresco.some_table.some_column.name=\"node_ref\"" + + ", but was alfresco.some_table.some_column.name=\"nood_ref\"", diff.describe()); } @@ -63,13 +66,12 @@ public class DifferenceTest public void describeRefOnly() { DbProperty refDbProp = mock(DbProperty.class); - when(refDbProp.getPath()).thenReturn("alfresco.some_table.some_column.name"); - when(refDbProp.getPropertyValue()).thenReturn("node_ref"); + when(refDbProp.getPath()).thenReturn("alfresco.some_table.some_column"); + when(refDbProp.getDbObject()).thenReturn(new Column("some_column")); Difference diff = new Difference(Where.ONLY_IN_REFERENCE, refDbProp, null); - assertEquals("Difference: ONLY_IN_REFERENCE, reference path:alfresco.some_table.some_column.name " + - "(value: node_ref)", + assertEquals("Difference: missing column from database, expected at path: alfresco.some_table.some_column", diff.describe()); } @@ -77,13 +79,12 @@ public class DifferenceTest public void describeTargetOnly() { DbProperty targetDbProp = mock(DbProperty.class); - when(targetDbProp.getPath()).thenReturn("alfresco.some_table.some_column.name"); - when(targetDbProp.getPropertyValue()).thenReturn("node_ref"); + when(targetDbProp.getPath()).thenReturn("alfresco.some_table.some_column"); + when(targetDbProp.getDbObject()).thenReturn(new Column("some_column")); Difference diff = new Difference(Where.ONLY_IN_TARGET, null, targetDbProp); - assertEquals("Difference: ONLY_IN_TARGET, target path:alfresco.some_table.some_column.name " + - "(value: node_ref)", + assertEquals("Difference: unexpected column found in database with path: alfresco.some_table.some_column", diff.describe()); } } diff --git a/source/java/org/alfresco/util/schemacomp/RedundantDbObjectTest.java b/source/java/org/alfresco/util/schemacomp/RedundantDbObjectTest.java index 4063639fad..c228490d0c 100644 --- a/source/java/org/alfresco/util/schemacomp/RedundantDbObjectTest.java +++ b/source/java/org/alfresco/util/schemacomp/RedundantDbObjectTest.java @@ -51,7 +51,7 @@ public class RedundantDbObjectTest RedundantDbObject redundantDBO = new RedundantDbObject(reference, matches); - assertEquals("3 redundant items? reference: MyDbObject[name=reference], " + + assertEquals("Redundancy: 3 items matching MyDbObject[name=reference], " + "matches: MyDbObject[name=match1], MyDbObject[name=match2], MyDbObject[name=match3]", redundantDBO.describe()); } diff --git a/source/java/org/alfresco/util/schemacomp/ValidationResult.java b/source/java/org/alfresco/util/schemacomp/ValidationResult.java index e900c81c65..5cdc81c5b8 100644 --- a/source/java/org/alfresco/util/schemacomp/ValidationResult.java +++ b/source/java/org/alfresco/util/schemacomp/ValidationResult.java @@ -66,6 +66,7 @@ public class ValidationResult extends Result { return I18NUtil.getMessage( "system.schema_comp.validation", + getDbProperty().getDbObject().getTypeName(), getDbProperty().getPath(), getValue(), message); diff --git a/source/java/org/alfresco/util/schemacomp/ValidationResultTest.java b/source/java/org/alfresco/util/schemacomp/ValidationResultTest.java index 7f4d57daa1..9a68ee5c88 100644 --- a/source/java/org/alfresco/util/schemacomp/ValidationResultTest.java +++ b/source/java/org/alfresco/util/schemacomp/ValidationResultTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.alfresco.util.schemacomp.model.Index; import org.junit.Before; import org.junit.Test; import org.springframework.extensions.surf.util.I18NUtil; @@ -45,12 +46,14 @@ public class ValidationResultTest public void describe() { DbProperty targetDbProp = mock(DbProperty.class); - when(targetDbProp.getPath()).thenReturn("alfresco.some_table.some_index.name"); - when(targetDbProp.getPropertyValue()).thenReturn("ibx_my_index"); + when(targetDbProp.getPath()).thenReturn("alfresco.some_table.idx_table_id.name"); + when(targetDbProp.getPropertyValue()).thenReturn("idx_table_id"); + when(targetDbProp.getDbObject()).thenReturn(new Index("")); ValidationResult validation = new ValidationResult(targetDbProp, "value must be 'xyz'"); - assertEquals("Validation: target path:alfresco.some_table.some_index.name (value: ibx_my_index, rule: value must be 'xyz')", + assertEquals("Validation: index alfresco.some_table.idx_table_id.name=\"idx_table_id\" fails to " + + "match rule: value must be 'xyz'", validation.describe()); } } diff --git a/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java b/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java index a02d691350..8c2ae45207 100644 --- a/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java +++ b/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java @@ -252,4 +252,11 @@ public abstract class AbstractDbObject implements DbObject this.validators = validators; } } + + + @Override + public String getTypeName() + { + return getClass().getSimpleName().toLowerCase(); + } } diff --git a/source/java/org/alfresco/util/schemacomp/model/DbObject.java b/source/java/org/alfresco/util/schemacomp/model/DbObject.java index 26d723800e..0a84777e9b 100644 --- a/source/java/org/alfresco/util/schemacomp/model/DbObject.java +++ b/source/java/org/alfresco/util/schemacomp/model/DbObject.java @@ -105,4 +105,11 @@ public interface DbObject * @param validators */ void setValidators(List validators); + + /** + * Type name, e.g. "column", "foreign key" + * + * @return String + */ + String getTypeName(); } diff --git a/source/java/org/alfresco/util/schemacomp/model/ForeignKey.java b/source/java/org/alfresco/util/schemacomp/model/ForeignKey.java index d17756e706..d1c378a37c 100644 --- a/source/java/org/alfresco/util/schemacomp/model/ForeignKey.java +++ b/source/java/org/alfresco/util/schemacomp/model/ForeignKey.java @@ -166,5 +166,11 @@ public class ForeignKey extends AbstractDbObject public void accept(DbObjectVisitor visitor) { visitor.visit(this); - } + } + + @Override + public String getTypeName() + { + return "foreign key"; + } } diff --git a/source/java/org/alfresco/util/schemacomp/model/PrimaryKey.java b/source/java/org/alfresco/util/schemacomp/model/PrimaryKey.java index 3a1d5ea8cf..a7db08cabb 100644 --- a/source/java/org/alfresco/util/schemacomp/model/PrimaryKey.java +++ b/source/java/org/alfresco/util/schemacomp/model/PrimaryKey.java @@ -155,4 +155,10 @@ public class PrimaryKey extends AbstractDbObject checkColumnOrders(); visitor.visit(this); } + + @Override + public String getTypeName() + { + return "primary key"; + } }