Как сохранить конфигурацию xml, заполненную значениями из файла свойств в Apache Commons Конфигурация не может быть сохранена
Я пытаюсь использовать конфигурацию Apache Commons в скрипте groovy для чтения значений из простого файла свойств и заполнения шаблона XML этими значениями из этого файла. Цель этого примера - запустить несколько экземпляров Tomcat с настройками, заданными в файлах свойств. Несмотря на чудовищность инфраструктуры конфигурации Apache Commons, она была выбрана из-за ее способности считывать / записывать / проверять различные типы конфигурации прямо из коробки.
Шаблон является частью файла tomcat server.xml:
<?xml version='1.0' encoding='utf-8'?>
<Server port="${tomcat.server.port}" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="${tomcat.http.port}"
address="${tomcat.http.ip}"/>
<Engine jvmRoute="${tomcat.jvmroute}"/>
</Service>
</Server>
И файл свойств (скажем, tomcat.properties):
application=someapp
tomcat.server.port=8087
tomcat.http.port=8088
tomcat.jvmroute=${application}
Я использую DefaultConfigurationBuilder для объединения этих файлов в конфигурацию. Файл определений создается динамически. Код:
import groovy.xml.MarkupBuilder
import org.apache.commons.configuration.*
String configurationDefinition = "tomcat.configuration.xml"
File configurationDefinitionFile = new File(configurationDefinition)
FileWriter configurationDefinitionWriter = new FileWriter(configurationDefinitionFile)
MarkupBuilder fileList = new MarkupBuilder(configurationDefinitionWriter)
fileList.configuration() {
properties(fileName:'tomcat.properties')
xml(fileName:'server.xml')
}
configurationDefinitionWriter.close()
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
builder.setFile(configurationDefinitionFile);
Configuration propertiesConfig = builder.getConfiguration(true);
//propertiesConfig.getKeys().each { propertyName ->
// println("$propertyName = ${propertiesConfig.getString(propertyName)}")
//}
XMLConfiguration conf = (XMLConfiguration)propertiesConfig.getConfiguration(1)
//conf.getKeys().each { propertyName ->
// println("$propertyName = ${conf.getString(propertyName)}")
//}
conf.save("server_parsed.xml")
Сохраненный файл идентичен серверу server.xml выше. например, с port="${tomcat.server.port}" Есть ли способ сохранить его со значениями из файла свойств?
1 ответ
Более глубокое исследование методов построения и руководство пользователя помогло найти способ сделать это.
AbstractConfiguration предоставляет метод interpolatedConfiguration(). Этот метод создает клон текущей конфигурации, а затем выполняет интерполяцию по всем ее свойствам. Таким образом, результатом этого метода является объект конфигурации с практически тем же содержимым, что и исходная конфигурация, но со всеми переменными, замененными их фактическими значениями (насколько это было возможно).
Так что следующий фрагмент кода работает отлично:
import groovy.xml.MarkupBuilder
import org.apache.commons.configuration.*
String configurationDefinition = "tomcat.configuration.xml"
File configurationDefinitionFile = new File(configurationDefinition)
FileWriter configurationDefinitionWriter = new FileWriter(configurationDefinitionFile)
MarkupBuilder fileList = new MarkupBuilder(configurationDefinitionWriter)
fileList.configuration() {
properties(fileName:'tomcat.properties')
xml(fileName:'server.xml')
}
configurationDefinitionWriter.close()
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
builder.setFile(configurationDefinitionFile);
Configuration propertiesConfig = builder.getConfiguration(true);
XMLConfiguration conf = (XMLConfiguration)propertiesConfig.getConfiguration(1)
XMLConfiguration interpolatedConf = (XMLConfiguration )conf.interpolatedConfiguration()
interpolatedConf.save("server_parsed.xml")
Грустно, что гугл не связывает интерполяцию с заменой и заменой.