Как сохранить конфигурацию 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")

Грустно, что гугл не связывает интерполяцию с заменой и заменой.

Другие вопросы по тегам