2016-03-17 3 views
0

У меня есть требование создать журнал изменений linibase, который имеет все необходимые изменения во время выполнения и запускает Liquibase с этим динамически созданным потоком изменений.Запуск жидкости с изменением xml в качестве потока ввода

Я знаю, что у нас могут быть статические файлы xml-файлов изменений и кормить их для запуска Liquibase.

Я хотел знать, есть ли способ загрузить этот динамический журнал изменений xml и запустить Liquibase?

+0

Какую проблему вы пытаетесь решить с таким подходом? Возможно реализовать собственный журнал изменений и запись: https://liquibase.jira.com/wiki/display/CONTRIB/ChangeLogParser/https://liquibase.jira.com/wiki/display/CONTRIB/ChangeLogSerializer, но ваш usecase выглядит действительно необычно, возможно, это можно сделать другим путем. – dbf

+0

Наш пример использования подобен тому, как мы пытаемся создать динамическое сущность для конкретных данных пользователя. У нас будет набор наборов изменений, которые будут обрабатываться главным файлом xml-файла. Но для создания динамических сущностей мы хотим достичь этого программно, не перезагружая приложение. Здесь мы хотим создать changeet xml как поток и запустить linibase с ним вместо физического файла. –

ответ

1

У меня было такое же требование, я создал новый ресурс аксессор который загружает строку JSON (это то же самое для 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); 
    } 
} 

}