grettyに渡す引数を、以下のように渡したかった。
./gradlew appRun -Dgretty.port=8080 -Dgretty.xxx=xxxx
ほんで、以下のようにSystem.propertiesを回す。
System.properties.findAll { it.key.indexOf('gretty.')==0 }.collect{
new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
gretty[it.key]=it.value
}
なぜだか、portの引数でCast出来ない例外が発生して(゚Д゚)ハァ?ってなった。
(ちなみに、Groovyコンソール上だと、Integer型の引数を受けるpropertyにString型のオブジェクトを突っ込んでも、Cast出来ない例外は発生しない)
とりあえず、以下の様なことを試してみる。
class Dog{
int age = 1
String name = 'taro'
boolean isMale = true
Integer id = 1
void setName(String name){
this.name = name.toLowerCase()
}
void setId(Integer id){
if(id == null || id < 0){
throw new Exception('bad id')
}
this.id = id
}
String toString(){
"{$name:{'age':$age,'sex':'${isMale?'m':'f'}'}}"
}
}
def setPropValue(target,kv){
try{
def setter="set${kv.key.replaceFirst('^(.)'){it[1].toUpperCase()}}"
target.class.methods.each{
if(it.name == setter && it.parameterTypes.length == 1){
if(it.parameterTypes[0].isPrimitive() ||
it.parameterTypes[0].methods.find {
it.name=='valueOf' && it.parameterTypes.length == 1
} &&
it.parameterTypes[0] != String.class
){
println "p : $kv.key"
target[kv.key]=Eval.me(kv.value)
}else{
println "o : $kv.key"
target[kv.key]=kv.value
}
}
}
}
catch(e){println e}
}
def dog=new Dog()
['gretty.id':'2','gretty.name':'Hanako','gretty.isMale':'false','gretty.age':'2'].
collect{
new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
setPropValue(dog,it)
}
うまいこと値を放り込めそう。
上の関数をそのまま使って、
def setPropValue(target,kv){
try{
def setter="set${kv.key.replaceFirst('^(.)'){it[1].toUpperCase()}}"
target.class.methods.each{
if(it.name == setter && it.parameterTypes.length == 1){
if(it.parameterTypes[0].isPrimitive() ||
it.parameterTypes[0].methods.find {
it.name=='valueOf' && it.parameterTypes.length == 1
} &&
it.parameterTypes[0] != String.class
){
println "p : $kv.key"
target[kv.key]=Eval.me(kv.value)
}else{
println "o : $kv.key"
target[kv.key]=kv.value
}
}
}
}
catch(e){println e}
}
System.properties.findAll { it.key.indexOf('gretty.')==0 }.collect{
new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
setPropValue(gretty,it)
}
とする。
これで./gradlewにGrettyの設定を指定することができるようになった。
実際にはデフォルトの設定が上につらつら書いてあります。
Jenkinsにintegration testさせているとき、project毎にportを変更したりできるので便利です。