2017-03-21 2 views
2

Ich habe Änderungen an einem DatabaseChangeLog-Objekt programmgesteuert vorgenommen. Wie könnte ich die DiffChangeLogFile-Datei basierend auf diesem DatabaseChangeLog von Java generieren.Wie XML-Datei von DatabaseChangeLog programmgesteuert generiert wird

EDIT: Hier ist ein Beispiel

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; 
    } 

diese Methode wird ein DatabaseChangeLog Objekt als Eingabe hat und es wird die dropColumn Änderung von ihr zu löschen, wenn der Tabellenname mit dem Tabellennamen Parameter gleich ist.

Nach dieser Änderung am DatabaseChangeLog-Objekt möchte ich eine XML-Datei generieren, die die Changesets relativ zum DatabaseChangeLog-Objekt enthält (das XML, das liquibase nach einem Diff generiert, um eine Aktualisierung vorzunehmen).

Etwas wie folgt aus:

databaseChange.generateXmlFile (pathToFile);

+0

Können Sie erklären, was "... Änderungen an einem DatabaseChangeLog-Objekt programmatisch ..." bedeutet? Ich verstehe nicht, was du getan hast. – Jens

+0

@Jens i hinzugefügt ein Beispiel oben – larnouch

+0

Vielleicht kann man die Haupt verwenden [Liquibase] (http://www.liquibase.org/javadoc/liquibase/Liquibase.html) Klasse und eine seiner Methoden aufrufen, dies zu tun. Ich habe Liquibase nicht benutzt, indem ich es direkt von Java aus aufgerufen habe, noch habe ich irgendein Liquibase-Plugin geschrieben. Vielleicht liegt es an meinem Mangel an Wissen hier, aber wie laufen Sie den Code (bzw. wie laufen Sie liquibase?) – Jens

Antwort

3

Finnaly fand ich in liquibase-Quellcode, wie es eine Liste von Changesets in eine XML-Datei Ausgabe umwandelt. (Wir die Liste der chnageSets von databaseChangeLog abrufen kann)

/** 
    * 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(); 
    } 

Hier ein Beispiel ist, wie ich die erzeugte XML-Datei-Ausgabe nach dem Vornehmen von Änderungen in der DatenbankChangeLog-Objekt

Ich hoffe, das wird helfen.

Verwandte Themen