1 package com.atlassian.dbexporter.exporter;
2
3 import com.atlassian.dbexporter.Column;
4 import com.atlassian.dbexporter.Context;
5 import com.atlassian.dbexporter.DatabaseInformation;
6 import com.atlassian.dbexporter.ForeignKey;
7 import com.atlassian.dbexporter.Table;
8 import com.atlassian.dbexporter.node.NodeCreator;
9 import com.atlassian.dbexporter.progress.ProgressMonitor;
10
11 import static com.atlassian.dbexporter.node.NodeBackup.ColumnDefinitionNode;
12 import static com.atlassian.dbexporter.node.NodeBackup.ForeignKeyDefinitionNode;
13 import static com.atlassian.dbexporter.node.NodeBackup.TableDefinitionNode;
14 import static com.atlassian.dbexporter.progress.ProgressMonitor.Task;
15 import static com.google.common.base.Preconditions.checkNotNull;
16 import static com.google.common.collect.Lists.newLinkedList;
17
18 public final class TableDefinitionExporter implements Exporter {
19 private final TableReader tableReader;
20
21 public TableDefinitionExporter(TableReader tableReader) {
22 this.tableReader = checkNotNull(tableReader);
23 }
24
25 @Override
26 public void export(NodeCreator node, ExportConfiguration configuration, Context context) {
27 final ProgressMonitor monitor = configuration.getProgressMonitor();
28 monitor.begin(Task.TABLE_DEFINITION);
29
30 int tableCount = 0;
31 final Iterable<Table> tables = tableReader.read(getDatabaseInformation(context), configuration.getEntityNameProcessor());
32 for (Table table : tables) {
33 export(node, table);
34 tableCount++;
35 }
36 monitor.end(Task.TABLE_DEFINITION);
37 monitor.totalNumberOfTables(tableCount);
38
39 context.putAll(newLinkedList(tables));
40 }
41
42 private DatabaseInformation getDatabaseInformation(Context context) {
43 return checkNotNull(context.get(DatabaseInformation.class));
44 }
45
46 private void export(NodeCreator node, Table table) {
47 TableDefinitionNode.add(node);
48 TableDefinitionNode.setName(node, table.getName());
49
50 for (Column column : table.getColumns()) {
51 export(node, column);
52 }
53
54 for (ForeignKey foreignKey : table.getForeignKeys()) {
55 export(node, foreignKey);
56 }
57
58 node.closeEntity();
59 }
60
61 private void export(NodeCreator node, Column column) {
62 ColumnDefinitionNode.add(node);
63 ColumnDefinitionNode.setName(node, column.getName());
64 ColumnDefinitionNode.setPrimaryKey(node, column.isPrimaryKey());
65 ColumnDefinitionNode.setAutoIncrement(node, column.isAutoIncrement());
66 ColumnDefinitionNode.setSqlType(node, column.getSqlType());
67 ColumnDefinitionNode.setPrecision(node, column.getPrecision());
68 ColumnDefinitionNode.setScale(node, column.getScale());
69 node.closeEntity();
70 }
71
72 private void export(NodeCreator node, ForeignKey foreignKey) {
73 ForeignKeyDefinitionNode.add(node);
74 ForeignKeyDefinitionNode.setFromTable(node, foreignKey.getFromTable());
75 ForeignKeyDefinitionNode.setFromColumn(node, foreignKey.getFromField());
76 ForeignKeyDefinitionNode.setToTable(node, foreignKey.getToTable());
77 ForeignKeyDefinitionNode.setToColumn(node, foreignKey.getToField());
78 node.closeEntity();
79 }
80 }