Sergiu Dumitriu-2 wrote:
>
> Stefano Scheda wrote:
>> I'm trying to code some groovy string manipulation of database-extracted
>> data.
>> I can't post the actual code but it goes along these lines:
>>
>> #set ($mydb=$xwiki.sql.getDatabase("jdbc/ABC"))
>> #set ($SQLstring = "select mycol from fw_notifiche")
>>
>> #foreach($row in $mydb.executeQuery($SQLstring))
>> #set ($mycol = $row.getString("mycol"))
>>
>> <%
>> vcontext = context.get("vcontext");
>> mycol = vcontext.get("mycol");
>> newmycol = mycol.replaceAll("2", "two");
>> vcontext.put("newmycol", newmycol);
>> %>
>>
>> Here is the data: $newmycol <br>
>> #end
>>
>> The problem is that only the each loop receives the processing of the
>> vary
>> last row.
>> Let's say the the loop extracts three rows with values 1, 2, 3. The
>> previous
>> code results in this output:
>> 3
>> 3
>> 3
>> (i.e. unreplaced value from the last row)
>> While if I switch to mycol.replaceAll("3", "three"), the output is:
>> three
>> three
>> three
>> (i.e. each loop gets the replaced value from the last row)
>>
>> Seems that velocity and groovy are incorrectly linked thru the context,
>> or
>> what?
>
> The old rendering (being replaced starting with 1.6) executes the
> different interpreters in order, one after another, and not recursively.
> This means that the groovy is not executed inside the foreach:
> - first the velocity interpreter runs, and it sees <% groovy code as
> plain text, so after velocity the document will contain three (the
> number of selected rows) times the groovy block.
> - After that, the groovy interpreter runs, and it sees three times the
> same block. Since velocity was already interpreted, the velocity context
> is not updating anymore, the last values placed in it are there for each
> groovy block.
>
> There are two solutions:
> 1. Use only velocity, or only groovy. The code you posted does not
> justify the use of groovy, since replaceAll can be called from velocity,
> too. Maybe you have a different code that does require more advanced
> programming which can only be done in Groovy.
>
> 2. Put the groovy code in a different page, inside a pseudo-class,
> return a new instance of that class, and then in the velocity page you
> can call #set($groovyObject = $xwiki.parseGroovyFromPage("The name of
> the document with Groovy code")), and then inside the loop call
> $groovyObject.doSomething().
>
>
Thanks Sergiu,
I missed the ability to call replaceAll directly from velocity. That should
be enough for my current purpose.
BTW, I'm currently running on version 1.5. In case I had upgraded to 1.6
that sample code would behave as expected?
Stefano
--
View this message in context:
http://n2.nabble.com/Context-variables-vs--foreach-tp1300473p1301131.html
Sent from the XWiki- Users mailing list archive at Nabble.com.
_______________________________________________
users mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/users