2015-03-10 3 views
2

Я пытаюсь использовать конфигурацию Apache Commons в groovy script для чтения значений из простого файла свойств и заполнения XML-шаблона этими значениями из этот файл. Цель этого примера - запустить несколько экземпляров Tomcat с настройками, заданными в файлах свойств. Несмотря на чудовищность инфраструктуры Apache Commons Configuration, она была выбрана из-за ее способности читать/писать/проверять различные типы конфигурации прямо из коробки.Как сохранить конфигурацию xml, заполненную значениями из файла свойств в Apache Commons Конфигурация не может сохранить

Шаблон представляет собой кусок server.xml TOMCAT в:

<?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 выше. например with port = "$ {tomcat.server.port}" Есть ли способ сохранить его со значениями из файла свойств?

+1

Рекомендую вам переписать этот вопрос. Интересно немного рассказать о вашем случае использования, но мы, возможно, сможем вам помочь, если вы создадите простой, воспроизводимый пример и покажете его нам. Создайте крошечный XML-файл с одним или двумя элементами, крошечным файлом свойств и покажите нам [MCVE] (http://stackoverflow.com/help/mcve), которые мы можем скопировать/скомпилировать/выполнить, чтобы увидеть проблему. –

+1

@ Дункан, спасибо вам за совет. Я обновил свой вопрос. –

ответ

0

Более глубокое исследование методов построения и userguide помогло найти способ сделать это.

AbstractConfiguration предоставляет метод интерполяцииConfiguration(). Этот метод создает клон текущей конфигурации, а затем выполняет интерполяцию по всем своим свойствам. Таким образом, результатом этого метода является объект конфигурации, имеющий в основном тот же контент, что и исходная конфигурация , но со всеми переменными, замененными фактическими значениями (насколько это было возможно).

Так следующий кусок кода работает отлично:

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") 

Это печально, что Google не связывает интерполяции с заменой и замены.