And I believe the "find and replace" strategy is weak and error-prone.
Better define in a separate file what you want to customize and its new value. One file per environment. Sweet and simple.
At last I can put all pieces together:
Your "mycustomizations.properties" file should be like this:
#ownerType.ownerPath.envValueType=newvalue ProxyService:OSBProject1/ProxyService1:Service URI=/OSBProject1/ProxyServicePluto
and this is the Groovy code:
import groovy.xml.XmlUtil /* * Lookup customization file * Search //cus:envValueAssignments[(cus:envValueAssignments/xt:owner/xt:type/text() == $1 * AND //cus:envValueAssignments/xt:owner/xt:path/text() = $2)][xt:envValueType == $3] * and replace their xt:value with $4 * */ def customizations = new XmlSlurper().parse("ALSBCustomizationFile.xml").declareNamespace(xt: 'http://www.bea.com/wli/config/xmltypes',xsi: 'http://www.w3.org/2001/XMLSchema-instance', cus : 'http://www.bea.com/wli/config/customizations') //println XmlUtil.serialize( customizations ) File theInfoFile = new File("mycustomizations.properties") theInfoFile.eachLine { line -> if ( (line.trim().size() == 0) || (line.trim().startsWith("#")) ) { // ignore } else { words = line.split("=") keys = words[0].split(":") value = words[1] ownerType = keys[0] ownerPath = keys[1] envValueType = keys[2] customizations.'cus:customization'.each { if (it.'@xsi:type' == "cus:EnvValueCustomizationType") { println "FOUND" for (item in it.'cus:envValueAssignments') { if ( (item.'xt:envValueType' == envValueType) && (item.'xt:owner'.'xt:type' = ownerType) && (item.'xt:owner'.'xt:path' = ownerPath) ) { println "ITEM " + envValueType + " " + ownerType + " " + ownerPath + ", before is " + item.'xt:value' item.'xt:value'.replaceBody(value) println "ITEM " + envValueType + " " + ownerType + " " + ownerPath + ", after is " + item.'xt:value' } } } // if } // each } // if else } println XmlUtil.serialize( customizations )
Groovy is great but not intuitive and self-explanatory to use.... Groovy plugin for Eclipse does code completion but can't introspect the runtime type of a variable, of course...
No comments:
Post a Comment