Sergio del Amo
Sergio del Amo

Reputation: 78126

What is the best way to access an array inside Velocity?

I have a Java array such as:

String[] arr = new String[] {"123","doc","projectReport.doc"};

In my opinion the natural way to access would be:

 #set($att_id = $arr[0])
 #set($att_type = $arr[1])
 #set($att_name = $arr[2])

But that it is not working. I have come with this workaround. But it a bit too much code for such an easy task.

#set($counter = 0)
#foreach($el in $arr)
    #if($counter==0)
        #set($att_id = $el)
    #elseif($counter==1)
        #set($att_type = $el)
    #elseif($counter==2)
         #set($att_name = $el)
    #end
    #set($counter = $counter + 1)
#end

Is there any other way?

Upvotes: 25

Views: 72452

Answers (8)

ctrl freak
ctrl freak

Reputation: 12395

Velocity 1.6

$myarray.isEmpty()
$myarray.size()
$myarray.get(2)
$myarray.set(1, 'test')

http://velocity.apache.org/engine/1.7/user-guide.html

Upvotes: 2

Brian
Brian

Reputation: 8823

You could wrap the array in a List using Arrays.asList(T... a). The new List object is backed by the original array so it doesn't wastefully allocate a copy. Even changes made to the new List will propagate back to the array.

Then you can use $list.get(int index) to get your objects out in Velocity.

If you need to get just one or two objects from an array, you can also use Array.get(Object array, int index) to get an item from an array.

Upvotes: 10

Angelo van der Sijpt
Angelo van der Sijpt

Reputation: 3641

Brian's answer is indeed correct, although you might like to know that upcoming Velocity 1.6 has direct support for arrays; see the Velocity documentation for more information.

Upvotes: 1

I has the same question and it got answered on another thread

#set ( $Page = $additionalParams.get('Page') )
#set ( $Pages = [] )
#if ( $Page != $null && $Page != "" )
    #foreach($i in $Page.split(";"))
        $Pages.add($i)
    #end
#end

Array indexing in Confluence / Velocity templates

Upvotes: 0

Nathan Bubna
Nathan Bubna

Reputation: 6943

You can use use Velocity 1.6: for an array named $array one can simply do $array.get($index).

In the upcoming Velocity 1.7, one will be able to do $array[$index] (as well as $list[$index] and $map[$key]).

Upvotes: 27

Rajesh Chowdary
Rajesh Chowdary

Reputation: 21

String[] arr = new String[] {"123", "doc", "projectReport.doc"}; 

In my opinion the natural way to access would be:

 #set($att_id = $arr[0]) 
 #set($att_type = $arr[1]) 
 #set($att_name = $arr[2]) 

The value for this can be get by using $array.get("arr", 1) because there is no direct way to get the value from array like $att_id = $arr[0] in velocity.
Hope it works :)

Upvotes: 2

kez
kez

Reputation:

there is an implicit counter $velocityCount which starts with value 1 so you do not have to create your own counter.

Upvotes: 1

Luke Quinane
Luke Quinane

Reputation: 16615

I ended up using the ListTool from the velocity-tools.jar. It has methods to access an array's elements and also get its size.

Upvotes: 0

Related Questions