Groovy шаблон - генерация кода - PullRequest
0 голосов
/ 09 июня 2011

Я прошу совета и дополнения к коду для использования с шаблонами groovy.

Во всех примерах шаблонов в Интернете используется очень ограниченная логика, но я просто не могу преодолеть этот барьер и код в моем шаблонеявляется существенным.

Это приемлемо?Что может быть лучшим способом сделать это?

Спасибо, Питер

Задача состоит в том, чтобы сгенерировать код типа TCL - особенно если тогда / elsif / else typeintint

if { [streq $pm_enrichment('a1') "'aaaa2'"] && [strlen $pm_enrichment('aaaa3')] &&\
    [strlen $pm_enrichment('aaaa4') ] } { 
     set pm_enrichment('ResultAAA') 0 
}
elseif { [streq $pm_enrichment('b1') "'bb2'"] && [strlen $pm_enrichment('bbb3')] &&\
[strlen $pm_enrichment('bbbb4') ] } { 
     set pm_enrichment('ResultBBB') 1 
}
else { [streq $pm_enrichment('c1') "'cc2'"] && [strlen $pm_enrichment('ccc3')] &&\
[strlen $pm_enrichment('cccc4') ] } { 
     set pm_enrichment('ResultCCC') 2G 
} 


//////////////////////////////////////
def dataCasesClosure= {->
    pos=0
    arrSorted = []
    mapStmt.each{arrSorted.add(it.key) }
    arrSorted = arrSorted.sort()
    outStr=''''''

arrSorted.each { i ->
    tmpStatement = statement
    tmpResultStmt = resultStmt
    list=mapStmt[i]
    resultList=mapResultStmt[i]

pos=0
int index = tmpStatement.indexOf(keyword);
while (index >=0){
    val = list[pos].replaceAll(~'"','')
    pos +=1
    tmpStatement=tmpStatement.replaceFirst( ~/#/,/${val}/)
    index = tmpStatement.indexOf(keyword, index+keyword.length())   ;
}

if (tmpStatement ==~/\W+$/) {
    tmpStatement=tmpStatement[0..-2]
}

pos=0
index = tmpResultStmt.indexOf(keyword);
while (index >=0){
    val = resultList[pos]
    pos +=1
    tmpResultStmt=tmpResultStmt.replaceFirst( ~/#/,/${val}/)                
    index = tmpResultStmt.indexOf(keyword, index+keyword.length())  ;
}

if (i==0) {
    outStr= "if {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n  }"
} else if (i < arrSorted.size()-1  ){
    outStr += "elseif {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n  }"
} else {
    outStr += "else {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n  }"
}
}

outStr

} // ### dataCasesClosure

def valuesIfThenStmt= [
"statement":dataCasesClosure
]

tplIfThenStmt = '''
##############################
${statement}
'''

def engine = new SimpleTemplateEngine()
templateResult = engine.createTemplate(tplIfThenStmt).make(valuesIfThenStmt)
println templateResult.toString()

1 Ответ

1 голос
/ 12 ноября 2011

Если это все, что вам нужно сгенерировать, шаблон излишний. Вы могли бы просто вызвать dataCasesClosure напрямую, чтобы получить его вывод.

Предполагая, что это часть более крупного шаблона, я думаю, что было бы разумно использовать замыкания для получения выходных данных для особенно сложных деталей, как вы это сделали. Я лично сделал это в экстремальных масштабах с хорошими результатами.

...