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);
}
}
}
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
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. –