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 @@
-
+