Skip to content

Commit

Permalink
refactor the xml data reader for dbimport to support the creation of …
Browse files Browse the repository at this point in the history
…tables
  • Loading branch information
chenson42 committed Nov 21, 2012
1 parent 287df7c commit ad82b3b
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 121 deletions.
Expand Up @@ -29,7 +29,6 @@

import javax.sql.DataSource;

import org.jumpmind.db.model.Database;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.JdbcDatabasePlatformFactory;
Expand Down Expand Up @@ -158,10 +157,14 @@ protected Conflict buildConflictSettings() {

protected DatabaseWriterSettings buildDatabaseWriterSettings() {
DatabaseWriterSettings settings = new DatabaseWriterSettings();
settings.setMaxRowsBeforeCommit(commitRate);
settings.setMaxRowsBeforeCommit(commitRate);
settings.setDefaultConflictSetting(buildConflictSettings());
settings.setUsePrimaryKeysFromSource(false);
settings.setAlterTable(alterTables);
settings.setCreateTableDropFirst(dropIfExists);
settings.setCreateTableFailOnError(!forceImport);
settings.setDatabaseWriterFilters(databaseWriterFilters);
settings.setCreateTableAlterCaseToMatchDatabaseDefault(alterCaseToMatchDatabaseDefaultCase);
if (forceImport) {
settings.addErrorHandler(new DatabaseWriterErrorIgnorer());
}
Expand All @@ -181,24 +184,7 @@ protected void importTablesFromCsv(InputStream in, String tableName) {
dataProcessor.process();
}

protected void importTablesFromXml(InputStream in) {

// TODO should probably handle database creation in xml/data reader writer.
in.mark(Integer.MAX_VALUE);

Database database = platform.readDatabaseFromXml(in, alterCaseToMatchDatabaseDefaultCase);
if (alterTables) {
platform.alterDatabase(database, forceImport);
} else {
platform.createDatabase(database, dropIfExists, forceImport);
}

try {
in.reset();
} catch (IOException e) {
throw new IoException(e);
}

protected void importTablesFromXml(InputStream in) {
XmlDataReader reader = new XmlDataReader(in);
DatabaseWriter writer = new DatabaseWriter(platform, buildDatabaseWriterSettings());
DataProcessor dataProcessor = new DataProcessor(reader, writer);
Expand Down
Expand Up @@ -296,7 +296,7 @@ auto.sync.triggers=true
# Type: boolean
auto.upgrade=true

# Send symmetricds changes to client nodes when configuration changes.
# Capture and send SymmetricDS configuration changes to client nodes.
#
# Tags: general
# Type: boolean
Expand All @@ -305,6 +305,7 @@ auto.sync.configuration=true
# Whether triggers should fire when changes sync into the registration server
# from child nodes
#
# DatabaseOverridable: true
# Tags: general
# Type: boolean
auto.sync.configuration.on.incoming.at.registration.server=true
Expand Down
64 changes: 53 additions & 11 deletions symmetric-db/src/main/java/org/jumpmind/db/io/DatabaseXmlUtil.java
Expand Up @@ -29,6 +29,7 @@
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

import org.apache.commons.io.IOUtils;
Expand All @@ -54,7 +55,7 @@
public class DatabaseXmlUtil {

public static final String DTD_PREFIX = "http://db.apache.org/torque/dtd/database";

private DatabaseXmlUtil() {
}

Expand Down Expand Up @@ -118,9 +119,6 @@ public static Database read(Reader reader, boolean validate) {
try {
boolean done = false;
Database database = null;
Table table = null;
ForeignKey fk = null;
IIndex index = null;

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(reader);
Expand All @@ -142,6 +140,45 @@ public static Database read(Reader reader, boolean validate) {
}
}
} else if (name.equalsIgnoreCase("table")) {
Table table = nextTable(parser);
if (table != null) {
database.addTable(table);
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("database")) {
done = true;
}
break;
}
eventType = parser.next();
}

if (validate) {
database.initialize();
}
return database;
} catch (XmlPullParserException e) {
throw new IoException(e);
} catch (IOException e) {
throw new IoException(e);
}
}

public static Table nextTable(XmlPullParser parser) {
try {
Table table = null;
ForeignKey fk = null;
IIndex index = null;
boolean done = false;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT && !done) {
switch (eventType) {
case XmlPullParser.START_TAG:
String name = parser.getName();
if (name.equalsIgnoreCase("table")) {
table = new Table();
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attributeName = parser.getAttributeName(i);
Expand All @@ -150,7 +187,6 @@ public static Database read(Reader reader, boolean validate) {
table.setName(attributeValue);
}
}
database.addTable(table);
} else if (name.equalsIgnoreCase("column")) {
Column column = new Column();
for (int i = 0; i < parser.getAttributeCount(); i++) {
Expand Down Expand Up @@ -239,7 +275,7 @@ public static Database read(Reader reader, boolean validate) {
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("database")) {
if (name.equalsIgnoreCase("table")) {
done = true;
} else if (name.equalsIgnoreCase("index")
|| name.equalsIgnoreCase("unique")) {
Expand All @@ -251,13 +287,13 @@ public static Database read(Reader reader, boolean validate) {
}
break;
}
eventType = parser.next();
}

if (validate) {
database.initialize();
if (!done) {
eventType = parser.next();
}
}
return database;

return table;
} catch (XmlPullParserException e) {
throw new IoException(e);
} catch (IOException e) {
Expand Down Expand Up @@ -334,6 +370,12 @@ public static void write(Database model, Writer output) {
throw new IoException(e);
}
}

public static String toXml(Table table) {
StringWriter writer = new StringWriter();
write(table, writer);
return writer.toString();
}

public static void write(Table table, Writer output) {

Expand Down
Expand Up @@ -633,45 +633,53 @@ public Database readDatabaseFromXml(String filePath, boolean alterCaseToMatchDat
} finally {
IOUtils.closeQuietly(is);
}
}

public void alterCaseToMatchDatabaseDefaultCase(Database database) {
Table[] tables = database.getTables();
for (Table table : tables) {
alterCaseToMatchDatabaseDefaultCase(table);
}
}

public void alterCaseToMatchDatabaseDefaultCase(Table table) {
boolean storesUpperCase = isStoresUpperCaseIdentifiers();
if (!FormatUtils.isMixedCase(table.getName())) {
table.setName(storesUpperCase ? table.getName().toUpperCase() : table.getName()
.toLowerCase());
}

public Database readDatabaseFromXml(InputStream is, boolean alterCaseToMatchDatabaseDefaultCase) {
InputStreamReader reader = new InputStreamReader(is);
Database database = DatabaseXmlUtil.read(reader);
if (alterCaseToMatchDatabaseDefaultCase) {
boolean storesUpperCase = isStoresUpperCaseIdentifiers();
Table[] tables = database.getTables();
for (Table table : tables) {
if (!FormatUtils.isMixedCase(table.getName())) {
table.setName(storesUpperCase ? table.getName().toUpperCase() : table.getName()
.toLowerCase());
}

Column[] columns = table.getColumns();
for (Column column : columns) {
if (!FormatUtils.isMixedCase(column.getName())) {
column.setName(storesUpperCase ? column.getName().toUpperCase() : column
.getName().toLowerCase());
}
}
Column[] columns = table.getColumns();
for (Column column : columns) {
if (!FormatUtils.isMixedCase(column.getName())) {
column.setName(storesUpperCase ? column.getName().toUpperCase() : column.getName()
.toLowerCase());
}
}

IIndex[] indexes = table.getIndices();
for (IIndex index : indexes) {
if (!FormatUtils.isMixedCase(index.getName())) {
index.setName(storesUpperCase ? index.getName().toUpperCase() : index
.getName().toLowerCase());
}
IIndex[] indexes = table.getIndices();
for (IIndex index : indexes) {
if (!FormatUtils.isMixedCase(index.getName())) {
index.setName(storesUpperCase ? index.getName().toUpperCase() : index.getName()
.toLowerCase());
}

IndexColumn[] indexColumns = index.getColumns();
for (IndexColumn indexColumn : indexColumns) {
if (!FormatUtils.isMixedCase(indexColumn.getName())) {
indexColumn.setName(storesUpperCase ? indexColumn.getName()
.toUpperCase() : indexColumn.getName().toLowerCase());
}
}
IndexColumn[] indexColumns = index.getColumns();
for (IndexColumn indexColumn : indexColumns) {
if (!FormatUtils.isMixedCase(indexColumn.getName())) {
indexColumn.setName(storesUpperCase ? indexColumn.getName().toUpperCase()
: indexColumn.getName().toLowerCase());
}
}
}
}

public Database readDatabaseFromXml(InputStream is, boolean alterCaseToMatchDatabaseDefaultCase) {
InputStreamReader reader = new InputStreamReader(is);
Database database = DatabaseXmlUtil.read(reader);
if (alterCaseToMatchDatabaseDefaultCase) {
alterCaseToMatchDatabaseDefaultCase(database);
}
return database;

}
Expand Down
Expand Up @@ -127,6 +127,10 @@ public Object[] getObjectValues(BinaryEncoding encoding, String[] values,
public Database readDatabaseFromXml(String filePath, boolean alterCaseToMatchDatabaseDefaultCase);

public Database readDatabaseFromXml(InputStream in, boolean alterCaseToMatchDatabaseDefaultCase);

public void alterCaseToMatchDatabaseDefaultCase(Table table);

public void alterCaseToMatchDatabaseDefaultCase(Database database);

public boolean isLob(int type);

Expand Down
Expand Up @@ -6,7 +6,7 @@
import org.jumpmind.db.model.Table;
import org.junit.Test;

public class DatabaseIOTest {
public class DatabaseXmlUtilTest {

@Test
public void testReadXml() {
Expand Down

0 comments on commit ad82b3b

Please sign in to comment.