From 1270a56c471133b8f779a13d508b0e4136a01500 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 12 Feb 2013 15:03:01 +0000 Subject: [PATCH] Schema comparator: added optional level attribute to allow ignoring of table column ordering during schema validation. The above snippet will disable column order checking for tables. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@46517 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/schemacomp/db-schema.xsd | 1 + .../schemacomp/DbObjectXMLTransformer.java | 1 + .../DbObjectXMLTransformerTest.java | 45 +++++++- .../alfresco/util/schemacomp/ExportDb.java | 2 +- .../schemacomp/SchemaCompTestingUtils.java | 8 +- .../util/schemacomp/SchemaComparatorTest.java | 108 +++++++++++++++++- .../util/schemacomp/SchemaToXMLTest.java | 4 +- .../org/alfresco/util/schemacomp/XML.java | 1 + .../alfresco/util/schemacomp/XMLToSchema.java | 6 +- .../util/schemacomp/model/Column.java | 30 ++++- .../util/schemacomp/model/Schema.java | 14 ++- .../validator/SchemaVersionValidatorTest.java | 2 +- .../schemacomp/xml_to_schema_test.xml | 9 +- 13 files changed, 210 insertions(+), 21 deletions(-) diff --git a/config/alfresco/schemacomp/db-schema.xsd b/config/alfresco/schemacomp/db-schema.xsd index fa1276ad8d..2b87e68c70 100644 --- a/config/alfresco/schemacomp/db-schema.xsd +++ b/config/alfresco/schemacomp/db-schema.xsd @@ -24,6 +24,7 @@ + diff --git a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java index d347966808..f1b2b72bf6 100644 --- a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java +++ b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java @@ -142,6 +142,7 @@ public class DbObjectXMLTransformer Schema schema = (Schema) dbObject; attribs.addAttribute("", "", XML.ATTR_DB_PREFIX, "CDATA", schema.getDbPrefix()); attribs.addAttribute("", "", XML.ATTR_VERSION, "CDATA", Integer.toString(schema.getVersion())); + attribs.addAttribute("", "", XML.ATTR_TABLE_COLUMN_ORDER, "CDATA", Boolean.toString(schema.isCheckTableColumnOrder())); } else if (dbObject instanceof Index) { diff --git a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java index 7b85635f6b..589c71459f 100644 --- a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java +++ b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java @@ -182,7 +182,7 @@ public class DbObjectXMLTransformerTest } @Test - public void transformSchema() throws IOException + public void transformSchemaNoColumnOrderCheck() throws IOException { Collection columns = columns("one VARCHAR2(100)", "two NUMBER(10)"); PrimaryKey pk = new PrimaryKey(null, "pk_for_my_table", Arrays.asList("id"), Arrays.asList(1)); @@ -192,7 +192,7 @@ public class DbObjectXMLTransformerTest Table tableOne = new Table(null, "table_one", columns, pk, fks, indexes); Table tableTwo = new Table(null, "table_two", columns, pk, fks, indexes); - Schema schema = new Schema("my_schema", "alf_", 132); + Schema schema = new Schema("my_schema", "alf_", 132, false); schema.add(tableOne); schema.add(tableTwo); schema.add(new Sequence(null, "sequence_one")); @@ -209,7 +209,46 @@ public class DbObjectXMLTransformerTest "xmlns=\"http://www.alfresco.org/repo/db-schema\" " + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://www.alfresco.org/repo/db-schema db-schema.xsd\" " + - "name=\"my_schema\" dbprefix=\"alf_\" version=\"132\">", reader.readLine()); + "name=\"my_schema\" dbprefix=\"alf_\" version=\"132\" tablecolumnorder=\"false\">", reader.readLine()); + assertEquals(" ", reader.readLine()); + skipUntilEnd(" {table}", reader); + skipUntilEnd(" {table}", reader); + skipUntilEnd(" {sequence}", reader, true); + skipUntilEnd(" {sequence}", reader, true); + skipUntilEnd(" {sequence}", reader, true); + assertEquals(" ", reader.readLine()); + assertEquals("", reader.readLine()); + } + + @Test + public void transformSchemaWithColumnOrderCheck() throws IOException + { + Collection columns = columns("one VARCHAR2(100)", "two NUMBER(10)"); + PrimaryKey pk = new PrimaryKey(null, "pk_for_my_table", Arrays.asList("id"), Arrays.asList(1)); + Collection fks = fkeys(fk("fk_one", "lc", "tt", "tc"), fk("fk_two", "lc", "tt", "tc")); + Collection indexes = indexes("index_one col1 col2", "index_two col3 col4"); + + Table tableOne = new Table(null, "table_one", columns, pk, fks, indexes); + Table tableTwo = new Table(null, "table_two", columns, pk, fks, indexes); + + Schema schema = new Schema("my_schema", "alf_", 132, true); + schema.add(tableOne); + schema.add(tableTwo); + schema.add(new Sequence(null, "sequence_one")); + schema.add(new Sequence(null, "sequence_two")); + schema.add(new Sequence(null, "sequence_three")); + schema.setValidators(new ArrayList()); + + transformer.output(schema); + + BufferedReader reader = new BufferedReader(new StringReader(writer.toString())); + dumpOutput(); + assertHasPreamble(reader); + assertEquals("", reader.readLine()); assertEquals(" ", reader.readLine()); skipUntilEnd(" {table}", reader); skipUntilEnd(" {table}", reader); diff --git a/source/java/org/alfresco/util/schemacomp/ExportDb.java b/source/java/org/alfresco/util/schemacomp/ExportDb.java index cdfdad0f89..d7291844f3 100644 --- a/source/java/org/alfresco/util/schemacomp/ExportDb.java +++ b/source/java/org/alfresco/util/schemacomp/ExportDb.java @@ -201,7 +201,7 @@ public class ExportDb String schemaName = getSchemaName(dbmd); - schema = new Schema(schemaName, namePrefix, schemaVersion); + schema = new Schema(schemaName, namePrefix, schemaVersion, true); String[] prefixFilters = namePrefixFilters(dbmd); for (String filter : prefixFilters) diff --git a/source/java/org/alfresco/util/schemacomp/SchemaCompTestingUtils.java b/source/java/org/alfresco/util/schemacomp/SchemaCompTestingUtils.java index 1706d19a4c..c28cf3aa15 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaCompTestingUtils.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaCompTestingUtils.java @@ -76,7 +76,7 @@ public class SchemaCompTestingUtils return new Table(null, name, columns, primaryKey, foreignKeys, indexes); } - public static Collection columns(String... colDefs) + public static Collection columns(boolean compareColOrder, String... colDefs) { assertTrue("Tables must have columns", colDefs.length > 0); Column[] columns = new Column[colDefs.length]; @@ -86,10 +86,16 @@ public class SchemaCompTestingUtils String[] parts = colDefs[i].split(" "); columns[i] = new Column(null, parts[0], parts[1], false); columns[i].setOrder(i+1); + columns[i].setCompareOrder(compareColOrder); } return Arrays.asList(columns); } + public static Collection columns(String... colDefs) + { + return columns(true, colDefs); + } + public static PrimaryKey pk(String name, String... columnNames) { assertTrue("No columns specified", columnNames.length > 0); diff --git a/source/java/org/alfresco/util/schemacomp/SchemaComparatorTest.java b/source/java/org/alfresco/util/schemacomp/SchemaComparatorTest.java index 0162976c89..eccf007d34 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaComparatorTest.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaComparatorTest.java @@ -57,8 +57,8 @@ public class SchemaComparatorTest @Before public void setup() { - reference = new Schema("schema", "alf_", 590); - target = new Schema("schema", "alf_", 590); + reference = new Schema("schema", "alf_", 590, true); + target = new Schema("schema", "alf_", 590, true); dialect = new MySQL5InnoDBDialect(); } @@ -138,8 +138,8 @@ public class SchemaComparatorTest @Test public void pkOrderingComparedCorrectly() { - reference = new Schema("schema", "alf_", 590); - target = new Schema("schema", "alf_", 590); + reference = new Schema("schema", "alf_", 590, true); + target = new Schema("schema", "alf_", 590, true); // Reference schema's database objects. reference.add(new Table( @@ -196,8 +196,8 @@ public class SchemaComparatorTest @Test public void indexColumnOrderingComparedCorrectly() { - reference = new Schema("schema", "alf_", 590); - target = new Schema("schema", "alf_", 590); + reference = new Schema("schema", "alf_", 590, true); + target = new Schema("schema", "alf_", 590, true); // Reference schema's database objects. reference.add(new Table( @@ -249,4 +249,100 @@ public class SchemaComparatorTest assertFalse("There should be no more differences", it.hasNext()); } + + @Test + public void columnOrderingComparedCorrectlyWhenEnabled() + { + reference = new Schema("schema", "alf_", 590, true); + target = new Schema("schema", "alf_", 590, true); + + // Reference schema's database objects. + reference.add(new Table( + reference, + "table_name", + columns("id NUMBER(10)", "nodeRef VARCHAR2(200)", "name VARCHAR2(150)"), + new PrimaryKey(null, "my_pk_name", Arrays.asList("id", "nodeRef"), Arrays.asList(1, 2)), + fkeys(), + indexes())); + + // Target schema's database objects - note different column order + target.add(new Table( + target, + "table_name", + columns("id NUMBER(10)", "name VARCHAR2(150)", "nodeRef VARCHAR2(200)"), + new PrimaryKey(null, "my_pk_name", Arrays.asList("id", "nodeRef"), Arrays.asList(1, 2)), + fkeys(), + indexes())); + + + + + comparator = new SchemaComparator(reference, target, dialect); + comparator.validateAndCompare(); + + // See stdout for diagnostics dump... + dumpDiffs(comparator.getComparisonResults(), false); + dumpValidation(comparator.getComparisonResults()); + + Results results = comparator.getComparisonResults(); + Iterator it = results.iterator(); + + + Difference diff = (Difference) it.next(); + assertEquals(Where.IN_BOTH_BUT_DIFFERENCE, diff.getWhere()); + assertEquals("schema.table_name.nodeRef.order", diff.getLeft().getPath()); + assertEquals("order", diff.getLeft().getPropertyName()); + assertEquals(2, diff.getLeft().getPropertyValue()); + assertEquals("schema.table_name.nodeRef.order", diff.getRight().getPath()); + assertEquals("order", diff.getRight().getPropertyName()); + assertEquals(3, diff.getRight().getPropertyValue()); + + diff = (Difference) it.next(); + assertEquals(Where.IN_BOTH_BUT_DIFFERENCE, diff.getWhere()); + assertEquals("schema.table_name.name.order", diff.getLeft().getPath()); + assertEquals("order", diff.getLeft().getPropertyName()); + assertEquals(3, diff.getLeft().getPropertyValue()); + assertEquals("schema.table_name.name.order", diff.getRight().getPath()); + assertEquals("order", diff.getRight().getPropertyName()); + assertEquals(2, diff.getRight().getPropertyValue()); + + assertFalse("There should be no more differences", it.hasNext()); + } + + @Test + public void columnOrderingIgnoredWhenDisabled() + { + reference = new Schema("schema", "alf_", 590, false); + target = new Schema("schema", "alf_", 590, false); + + // Reference schema's database objects. + reference.add(new Table( + reference, + "table_name", + columns(false, "id NUMBER(10)", "nodeRef VARCHAR2(200)", "name VARCHAR2(150)"), + new PrimaryKey(null, "my_pk_name", Arrays.asList("id", "nodeRef"), Arrays.asList(1, 2)), + fkeys(), + indexes())); + + // Target schema's database objects - note different column order + target.add(new Table( + target, + "table_name", + columns(false, "id NUMBER(10)", "name VARCHAR2(150)", "nodeRef VARCHAR2(200)"), + new PrimaryKey(null, "my_pk_name", Arrays.asList("id", "nodeRef"), Arrays.asList(1, 2)), + fkeys(), + indexes())); + + comparator = new SchemaComparator(reference, target, dialect); + comparator.validateAndCompare(); + + // See stdout for diagnostics dump... + dumpDiffs(comparator.getComparisonResults(), false); + dumpValidation(comparator.getComparisonResults()); + + Results results = comparator.getComparisonResults(); + + // There are no logical differences + assertEquals(0, results.size()); + } } diff --git a/source/java/org/alfresco/util/schemacomp/SchemaToXMLTest.java b/source/java/org/alfresco/util/schemacomp/SchemaToXMLTest.java index f9c4372dce..ddf57c87b5 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaToXMLTest.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaToXMLTest.java @@ -57,7 +57,7 @@ public class SchemaToXMLTest Writer writer = new StringWriter(); StreamResult out = new StreamResult(writer); - Schema schema = new Schema("alfresco", "my-prefix", 501); + Schema schema = new Schema("alfresco", "my-prefix", 501, true); schema.add( table("node", @@ -84,7 +84,7 @@ public class SchemaToXMLTest "xmlns=\"http://www.alfresco.org/repo/db-schema\" " + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://www.alfresco.org/repo/db-schema db-schema.xsd\""; - assertEquals("", reader.readLine()); + assertEquals("", reader.readLine()); assertEquals(" ", reader.readLine()); } } diff --git a/source/java/org/alfresco/util/schemacomp/XML.java b/source/java/org/alfresco/util/schemacomp/XML.java index 8586ffeeba..3095e9f615 100644 --- a/source/java/org/alfresco/util/schemacomp/XML.java +++ b/source/java/org/alfresco/util/schemacomp/XML.java @@ -57,4 +57,5 @@ public abstract class XML public static final String ATTR_CLASS = "class"; public static final String ATTR_DB_PREFIX = "dbprefix"; public static final String ATTR_VERSION = "version"; + public static final String ATTR_TABLE_COLUMN_ORDER = "tablecolumnorder"; } diff --git a/source/java/org/alfresco/util/schemacomp/XMLToSchema.java b/source/java/org/alfresco/util/schemacomp/XMLToSchema.java index 0e7e8d9b47..95ae9ab302 100644 --- a/source/java/org/alfresco/util/schemacomp/XMLToSchema.java +++ b/source/java/org/alfresco/util/schemacomp/XMLToSchema.java @@ -212,7 +212,10 @@ public class XMLToSchema extends DefaultHandler String name = atts.getValue(XML.ATTR_NAME); String dbPrefix = atts.getValue(XML.ATTR_DB_PREFIX); int version = Integer.parseInt(atts.getValue(XML.ATTR_VERSION)); - schema = new Schema(name, dbPrefix, version); + String attrTableColumnOrder = atts.getValue(XML.ATTR_TABLE_COLUMN_ORDER); + // Should column order be checked for tables? + boolean compareTableColOrder = attrTableColumnOrder != null ? Boolean.parseBoolean(attrTableColumnOrder) : true; + schema = new Schema(name, dbPrefix, version, compareTableColOrder); stack.push(schema); } else if (qName.equals(XML.EL_TABLE)) @@ -227,6 +230,7 @@ public class XMLToSchema extends DefaultHandler int order = Integer.parseInt(atts.getValue(XML.ATTR_ORDER)); column.setOrder(order); } + column.setCompareOrder(schema.isCheckTableColumnOrder()); stack.push(column); } else if (qName.equals(XML.EL_COLUMN_NAME)) diff --git a/source/java/org/alfresco/util/schemacomp/model/Column.java b/source/java/org/alfresco/util/schemacomp/model/Column.java index 8439da885a..d90d1bf030 100644 --- a/source/java/org/alfresco/util/schemacomp/model/Column.java +++ b/source/java/org/alfresco/util/schemacomp/model/Column.java @@ -33,7 +33,7 @@ public class Column extends AbstractDbObject private boolean nullable; private boolean autoIncrement; private int order; - + private boolean compareOrder = true; public Column(String name) { @@ -122,12 +122,32 @@ public class Column extends AbstractDbObject } + /** + * @return the compareOrder + */ + public boolean isCompareOrder() + { + return this.compareOrder; + } + + /** + * @param compareOrder the compareOrder to set + */ + public void setCompareOrder(boolean compareOrder) + { + this.compareOrder = compareOrder; + } + + + + @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + (this.autoIncrement ? 1231 : 1237); + result = prime * result + (this.compareOrder ? 1231 : 1237); result = prime * result + (this.nullable ? 1231 : 1237); result = prime * result + this.order; result = prime * result + ((this.type == null) ? 0 : this.type.hashCode()); @@ -142,6 +162,7 @@ public class Column extends AbstractDbObject if (getClass() != obj.getClass()) return false; Column other = (Column) obj; if (this.autoIncrement != other.autoIncrement) return false; + if (this.compareOrder != other.compareOrder) return false; if (this.nullable != other.nullable) return false; if (this.order != other.order) return false; if (this.type == null) @@ -167,8 +188,11 @@ public class Column extends AbstractDbObject DbProperty thatAutoIncProp = new DbProperty(thatColumn, "autoIncrement"); comparisonUtils.compareSimple(thisTypeProp, thatTypeProp, ctx); - comparisonUtils.compareSimple(thisNullableProp, thatNullableProp, ctx); - comparisonUtils.compareSimple(thisOrderProp, thatOrderProp, ctx); + comparisonUtils.compareSimple(thisNullableProp, thatNullableProp, ctx); + if (compareOrder) + { + comparisonUtils.compareSimple(thisOrderProp, thatOrderProp, ctx); + } comparisonUtils.compareSimple(thisAutoIncProp, thatAutoIncProp, ctx); } diff --git a/source/java/org/alfresco/util/schemacomp/model/Schema.java b/source/java/org/alfresco/util/schemacomp/model/Schema.java index 485ad3c9d0..389e83c361 100644 --- a/source/java/org/alfresco/util/schemacomp/model/Schema.java +++ b/source/java/org/alfresco/util/schemacomp/model/Schema.java @@ -40,6 +40,7 @@ public class Schema extends AbstractDbObject implements Iterable protected final List objects = new ArrayList(); protected final String dbPrefix; protected final int version; + protected final boolean checkTableColumnOrder; /** * Construct a schema with the given name and no database prefix. @@ -48,7 +49,7 @@ public class Schema extends AbstractDbObject implements Iterable */ public Schema(String name) { - this(name, "", 0); + this(name, "", 0, true); } /** @@ -61,12 +62,13 @@ public class Schema extends AbstractDbObject implements Iterable * @param name * @param dbPrefix */ - public Schema(String name, String dbPrefix, int schemaVersion) + public Schema(String name, String dbPrefix, int schemaVersion, boolean checkTableColumnOrder) { super(null, name); ParameterCheck.mandatory("dbPrefix", dbPrefix); this.dbPrefix = dbPrefix; this.version = schemaVersion; + this.checkTableColumnOrder = checkTableColumnOrder; addDefaultValidators(); } @@ -129,6 +131,14 @@ public class Schema extends AbstractDbObject implements Iterable return this.version; } + /** + * @return the checkTableColumnOrder + */ + public boolean isCheckTableColumnOrder() + { + return this.checkTableColumnOrder; + } + @Override public int hashCode() { diff --git a/source/java/org/alfresco/util/schemacomp/validator/SchemaVersionValidatorTest.java b/source/java/org/alfresco/util/schemacomp/validator/SchemaVersionValidatorTest.java index 156e296ee1..b259d59b5f 100644 --- a/source/java/org/alfresco/util/schemacomp/validator/SchemaVersionValidatorTest.java +++ b/source/java/org/alfresco/util/schemacomp/validator/SchemaVersionValidatorTest.java @@ -107,6 +107,6 @@ public class SchemaVersionValidatorTest private DbObject schemaWithVersion(int version) { - return new Schema("", "", version); + return new Schema("", "", version, true); } } diff --git a/source/test-resources/schemacomp/xml_to_schema_test.xml b/source/test-resources/schemacomp/xml_to_schema_test.xml index ab4c3a0584..9a1fce1d59 100644 --- a/source/test-resources/schemacomp/xml_to_schema_test.xml +++ b/source/test-resources/schemacomp/xml_to_schema_test.xml @@ -2,7 +2,14 @@ - +