来自groovy.config的groovy打印环境

时间:2015-10-28 14:47:45

标签: groovy

如何从配置文件中打印可用的环境? oigbect ConfigSlurper创建的形式是什么?

我试过

def config2 = new ConfigSlurper().parse(new File('obieeadmincfg.groovy').toURL())

config2.config.environments.each { println ${it} }
        and 
println prettyPrint(toJson(config2))
        and
for ( i in 0 ..config2.config.environments.size()-1)
    println config2.config.environments[i]

groovy.config

//Config3.groovy
obieadmin {
    //default values
    serverurl = "http://default.mycompany.com"

}

environments {
    pldev01 {
        obieeadmin {
            serverurl = 'devgdwobi03.x.com'

        }
    }
    plsbx02 {
        obieeadmin {
            serverurl = 'devgdwobi03.x.com'

        }
    }
}

2 个答案:

答案 0 :(得分:0)

我担心你不能开箱即用。

但是使用一点Groovy Metaprogramming它是可以实现的。 Groovy配置slurper解析正确的Groovy文件,您可以对GroovyShell执行相同的操作。您可以捕获对environment方法的调用,从而提供绑定绑定。在该闭包中,您必须收集所有顶级方法调用(具有相同的methodMissing)。 为基本脚本提供缺少处理程序的属性和方法,可以抑制运行时错误,并且无需关心其他属性即可执行脚本。

不是最好的路径,但它有效。

package test
import org.codehaus.groovy.control.CompilerConfiguration

class A extends Script {
    def propertyMissing(String name) { null }
    def propertyMissing(String name, def arg) {}
    def methodMissing(String name, def args) {}
    @Override Object run() { null }
}

class NameCollector {
    def envs = []
    def methodMissing(String name, def args) { envs << name }
}

// configure interceptors.
def configuration = new CompilerConfiguration()
configuration.scriptBaseClass = 'test.A'
def nc = new NameCollector()
def environments = { Closure it ->
        it.delegate = nc;
        it.resolveStrategy = Closure.DELEGATE_ONLY
        it()
}
// execute config script
new GroovyShell([environments: environments] as Binding, configuration).evaluate(new File("config.groovy"))
nc.envs // Return, print them.

答案 1 :(得分:0)

不确定这是否将永远有效,但是目前您可以通过覆盖'environments'条件块的设置来做到这一点,例如:

def config = """environments {
  dev {
    foo = "bar"
  }
  prod {
    foo = "baz"
  }
}"""

def configSlurper = new ConfigSlurper()
configSlurper.registerConditionalBlock('environments', null)
assert configSlurper.parse(config).environments.keySet() == ['dev', 'prod'].toSet()