diff options
Diffstat (limited to 'plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java')
-rw-r--r-- | plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java | 170 |
1 files changed, 145 insertions, 25 deletions
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java index 93defc4a6b..279694f3e0 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java @@ -10,9 +10,17 @@ */ package org.eclipse.net4j.internal.db.ddl.delta; +import org.eclipse.net4j.db.DBType; +import org.eclipse.net4j.db.ddl.IDBField; +import org.eclipse.net4j.db.ddl.IDBIndex; +import org.eclipse.net4j.db.ddl.IDBIndexField; import org.eclipse.net4j.db.ddl.IDBSchema; import org.eclipse.net4j.db.ddl.IDBTable; +import org.eclipse.net4j.db.ddl.delta.IDBDelta; import org.eclipse.net4j.db.ddl.delta.IDBDeltaVisitor; +import org.eclipse.net4j.db.ddl.delta.IDBFieldDelta; +import org.eclipse.net4j.db.ddl.delta.IDBIndexDelta; +import org.eclipse.net4j.db.ddl.delta.IDBIndexFieldDelta; import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta; import org.eclipse.net4j.db.ddl.delta.IDBTableDelta; import org.eclipse.net4j.internal.db.ddl.DBTable; @@ -22,6 +30,7 @@ import java.text.MessageFormat; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -49,7 +58,10 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta public void compare(IDBTable table, IDBTable oldTable) { DBTableDelta tableDelta = new DBTableDelta(DBSchemaDelta.this, (DBTable)table, (DBTable)oldTable); - addTableDelta(tableDelta); + if (!tableDelta.isEmpty()) + { + addTableDelta(tableDelta); + } } }); } @@ -61,50 +73,37 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta { } - public Map<String, IDBTableDelta> getTableDeltas() - { - return Collections.unmodifiableMap(tableDeltas); - } - - public boolean isEmpty() + public DeltaType getDeltaType() { - return tableDeltas.isEmpty(); + return DeltaType.SCHEMA; } - public DBTableDelta[] getElements() + public Map<String, IDBTableDelta> getTableDeltas() { - DBTableDelta[] elements = tableDeltas.values().toArray(new DBTableDelta[tableDeltas.size()]); - Arrays.sort(elements); - return elements; + return Collections.unmodifiableMap(tableDeltas); } - public int compareTo(IDBSchemaDelta o) + public IDBTableDelta[] getTableDeltasSortedByName() { - return getName().compareTo(o.getName()); + IDBTableDelta[] result = tableDeltas.values().toArray(new IDBTableDelta[tableDeltas.size()]); + Arrays.sort(result); + return result; } public void addTableDelta(IDBTableDelta tableDelta) { tableDeltas.put(tableDelta.getName(), tableDelta); + resetElements(); } - public void accept(IDBDeltaVisitor visitor) - { - visitor.visit(this); - for (DBTableDelta tableDelta : getElements()) - { - tableDelta.accept(visitor); - } - } - - public DBSchema getElement(IDBSchema schema) + public DBSchema getSchemaElement(IDBSchema schema) { return (DBSchema)schema; } public void applyTo(IDBSchema schema) { - IDBDeltaVisitor visitor = new IDBDeltaVisitor.Applier(schema); + IDBDeltaVisitor visitor = new DBSchemaDelta.Applier(schema); accept(visitor); } @@ -114,4 +113,125 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta return MessageFormat.format("DBSchemaDelta[name={0}, kind={1}, tableDeltas={2}]", getName(), getChangeKind(), tableDeltas.values()); } + + @Override + protected void doAccept(IDBDeltaVisitor visitor) + { + visitor.visit(this); + } + + @Override + protected void collectElements(List<IDBDelta> elements) + { + elements.addAll(tableDeltas.values()); + } + + /** + * @author Eike Stepper + */ + public static class Applier extends IDBDeltaVisitor.Default + { + private final IDBSchema schema; + + public Applier(IDBSchema schema) + { + this.schema = schema; + } + + public final IDBSchema getSchema() + { + return schema; + } + + @Override + public void added(IDBTableDelta delta) + { + String name = delta.getName(); + schema.addTable(name); + } + + @Override + public void removed(IDBTableDelta delta) + { + IDBTable table = delta.getSchemaElement(schema); + table.remove(); + } + + @Override + public void changed(IDBTableDelta delta) + { + } + + @Override + public void added(IDBFieldDelta delta) + { + String name = delta.getName(); + DBType type = delta.getPropertyValue(IDBFieldDelta.TYPE_PROPERTY); + int precision = delta.getPropertyValue(IDBFieldDelta.PRECISION_PROPERTY); + int scale = delta.getPropertyValue(IDBFieldDelta.SCALE_PROPERTY); + boolean notNull = delta.getPropertyValue(IDBFieldDelta.NOT_NULL_PROPERTY); + + IDBTable table = delta.getParent().getSchemaElement(schema); + table.addField(name, type, precision, scale, notNull); + } + + @Override + public void removed(IDBFieldDelta delta) + { + IDBField field = delta.getSchemaElement(schema); + field.remove(); + } + + @Override + public void changed(IDBFieldDelta delta) + { + } + + @Override + public void added(IDBIndexDelta delta) + { + String name = delta.getName(); + IDBIndex.Type type = delta.getPropertyValue(IDBIndexDelta.TYPE_PROPERTY); + + IDBTable table = delta.getParent().getSchemaElement(schema); + table.addIndex(name, type); + } + + @Override + public void removed(IDBIndexDelta delta) + { + IDBIndex index = delta.getSchemaElement(schema); + index.remove(); + } + + @Override + public void changed(IDBIndexDelta delta) + { + } + + @Override + public void added(IDBIndexFieldDelta delta) + { + IDBIndexDelta parent = delta.getParent(); + IDBTable table = parent.getParent().getSchemaElement(schema); + + String name = delta.getName(); + IDBField field = table.getField(name); + + IDBIndex index = parent.getSchemaElement(schema); + index.addIndexField(field); + } + + @Override + public void removed(IDBIndexFieldDelta delta) + { + IDBIndexField indexField = delta.getSchemaElement(schema); + indexField.remove(); + } + + @Override + public void changed(IDBIndexFieldDelta delta) + { + } + } } |