I am working on some automation using Jenkins, where I have the schema and DB details stored like
[schema1:db1, schema2:db2]
stored in a ANT property ${schemaValue}
<propertycopy name="schemaValue" from="${SchemaVariable}"/>
Now I am trying to loop through this array of hashes to execute the connection, I have tried with
<for param="theparam" list="${schemaValue}">
<sequential>
<echo message="param: @{theparam}"/>
</sequential>
</for>
But this considers ${schemaValue}
as String and not an array,
Help on this.
EDIT
As suggested by @AR.3, I have tried with
<propertyregex override="yes" property="paramValue" input="@{theparam}" regexp=".+:([^\]]+)]?" replace="\1"/>
<echo message="paramValue: ${paramValue}"/>
<propertyregex override="yes" property="paramKey" input="@{theparam}" regexp="[?([^\[]+):]" replace="\1"/>
<echo message="paramKey: ${paramKey}"/>
${paramValue} gives me db1 and db2 correctly
${paramKey} throws me error
There is no concept of an array in Ant in the strict sense that exists in standard programming languages. The
for
loop will simply iterate over elements of a string delimited by a delimiter (the default delimiter is,
). In your case, it also looks more like a map or a list of key-value pairs.If the expected behavior is to print the values in the map (
db1
anddb2
), an additional step involving a regular expression replacement can be used:So originally, the echoed values contained in
theparam
will be[schema1:db1
andschema2:db2]
. The pattern.+:([^\]]+)]?
will match against such values, by matching against::
,]
characters,]
.The
propertyregex
will put the value of the first group, i.e. the one matched by([^\]]+)
in a propertyparamValue
. This will be in fact the value after the colon.Running it should print:
EDIT:
To get the key instead, you can use the following regex: