Как сгенерировать XML-файл из DatabaseChangeLog программно
Я внес изменения в объект DatabaseChangeLog программно. Как я могу сгенерировать файл diffChangeLogFile на основе этого DatabaseChangeLog из Java.
РЕДАКТИРОВАТЬ: вот пример
public DatabaseChangeLog removeDropColumnChangeFromDatabaseChangeLog(
DatabaseChangeLog databaseChangeLog, String oldName,
String newName, String tableName) {
DatabaseChangeLog changeLog = databaseChangeLog;
Collection<ChangeSet> changeSetsToRemove = new ArrayList<ChangeSet>();
List<ChangeSet> changeSets = changeLog.getChangeSets();
// Remove DropColumnChange from ChangeSets using tableName, oldName and
// newName
for (ChangeSet cs : changeSets) {
for (Change change : cs.getChanges()) {
if (change instanceof DropColumnChange) {
DropColumnChange aux2 = (DropColumnChange) change;
if (aux2.getTableName().equals(tableName)) {
if (aux2.getColumnName().equals(oldName)) {
changeSetsToRemove.add(cs);
}
}
}
}
}
changeSets.removeAll(changeSetsToRemove);
DatabaseChangeLog databaseChangeLogWithoutAddColumn = new DatabaseChangeLog();
for (ChangeSet cs : changeSets) {
databaseChangeLogWithoutAddColumn.addChangeSet(cs);
}
return databaseChangeLogWithoutAddColumn;
}
этот метод будет иметь объект DatabaseChangeLog в качестве входных данных и удалит из него изменение dropColumn, когда имя таблицы будет равно параметру tableName.
После этой модификации объекта DatabaseChangeLog я хочу сгенерировать xml-файл, который содержит наборы изменений относительно объекта DatabaseChangeLog (xml, который liquibase генерирует после diff для обновления).
Что-то вроде этого:
databaseChange.generateXmlFile (pathToFile);
1 ответ
В конце концов я обнаружил в исходном коде liquibase, как он преобразует список changeSets в вывод файла xml (мы можем получить список chnageSets из databaseChangeLog)
/**
* Prints changeLog that would bring the target database to be the same as
* the reference database
*/
public void print(PrintStream out, ChangeLogSerializer changeLogSerializer) throws ParserConfigurationException, IOException, DatabaseException {
List<ChangeSet> changeSets = generateChangeSets();
changeLogSerializer.write(changeSets, out);
out.flush();
}
Вот пример того, как я сгенерировал вывод файла XML после внесения изменений в объект databaseChangeLog
// TESTING CHANGELOG GENERATION
PrintStream printStreamFile =null;
try {
printStreamFile = new PrintStream("pathTofile/changeLogAfterChange.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
XMLChangeLogSerializer changeLogSerializer = new XMLChangeLogSerializer();
try {
changeLogSerializer.write(databaseChangeLog.getChangeSets(), printStreamFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Я надеюсь, это поможет.