2016-03-17 1 views
0

J'ai une exigence de créer le changelog de liquibase qui a tous les changeset requis requis au runtime et exécute liquibase avec ce flux changelog créé dynamiquement. Je sais que nous pouvons avoir des fichiers xml changelog statiques et les alimenter pour exécuter liquibase.Exécuter liquibase avec changelog xml en tant qu'entrée de flux

Je voulais savoir s'il y avait un moyen de charger ce changelog dynamique xml et de lancer la liquibase?

+0

Quel est le problème que vous essayez de résoudre avec une telle approche? Il est possible d'implémenter votre propre lecteur et éditeur de changelog: https://liquibase.jira.com/wiki/display/CONTRIB/ChangeLogParser/https://liquibase.jira.com/wiki/display/CONTRIB/ChangeLogSerializer mais votre utilisation semble vraiment inhabituel, il est probablement possible de le faire d'une autre manière. – dbf

+0

Notre cas d'utilisation est comme si nous essayions de créer des entités dynamiques pour des données spécifiques à l'utilisateur. Nous aurons un ensemble de changesets qui seront gérés par un fichier maître changelog xml. Mais pour la création d'entités dynamiques, nous voulons l'atteindre par programmation sans redémarrer l'application. Ici, nous voulons créer changeset xml en tant que flux et exécuter liquibase avec le au lieu du fichier physique. –

Répondre

1

J'ai eu la même exigence, j'ai créé une nouvelle ressource qui accesseur charge une chaîne JSON (est le même pour xml)

public class Main { 

private class StreamResourceAccessor extends AbstractResourceAccessor { 
    private String json; 
    public StreamResourceAccessor(String jsonString) { 
     super(); 
     this.json = jsonString; 
    } 

    @Override 
    public Set<InputStream> getResourcesAsStream(String name) throws IOException { 
     InputStream stream = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)); 

     Set<InputStream> returnSet = new HashSet<>(); 
     returnSet.add(stream); 
     return returnSet; 
    } 

    @Override 
    public Set<String> list(String arg0, String arg1, boolean arg2, boolean arg3, boolean arg4) throws IOException { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public ClassLoader toClassLoader() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

public static void main(String[] args) throws SQLException, LiquibaseException { 
    String url = "jdbc:postgresql://localhost/postgres"; 
    Properties props = new Properties(); 
    props.setProperty("user","postgres"); 
    props.setProperty("password",""); 
    //props.setProperty("ssl","true"); 
    Connection connection = DriverManager.getConnection(url, props); 

    Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); 
    String jsonText = "{\"databaseChangeLog\":[{\"preConditions\":[{\"runningAs\":{\"username\":\"postgres\"}}]},{\"changeSet\":{\"id\":\"1\",\"author\":\"nvoxland\",\"changes\":[{\"createTable\":{\"tableName\":\"person\",\"columns\":[{\"column\":{\"name\":\"id\",\"type\":\"int\",\"autoIncrement\":true,\"constraints\":{\"primaryKey\":true,\"nullable\":false},}},{\"column\":{\"name\":\"firstname\",\"type\":\"varchar(50)\"}},{\"column\":{\"name\":\"lastname\",\"type\":\"varchar(50)\",\"constraints\":{\"nullable\":false},}},{\"column\":{\"name\":\"state\",\"type\":\"char(2)\"}}]}}]}},{\"changeSet\":{\"id\":\"2\",\"author\":\"nvoxland\",\"changes\":[{\"addColumn\":{\"tableName\":\"person\",\"columns\":[{\"column\":{\"name\":\"username\",\"type\":\"varchar(8)\"}}]}}]}},{\"changeSet\":{\"id\":\"3\",\"author\":\"nvoxland\",\"changes\":[{\"addLookupTable\":{\"tableName\":\"person\",\"existingTableName\":\"person\",\"existingColumnName\":\"state\",\"newTableName\":\"state\",\"newColumnName\":\"id\",\"newColumnDataType\":\"char(2)\",}}]}}]}"; 

    Main main = new Main(); 
    ResourceAccessor resourceAccessor = main.new StreamResourceAccessor(jsonText); 

    Liquibase liquibase = new Liquibase("hello.json", resourceAccessor, database); 
    try { 
     Contexts context = new Contexts(); 
     liquibase.update(context); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

}