[
https://issues.apache.org/jira/browse/VELOCITY-600?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12603982#action_12603982
]
Nathan Bubna commented on VELOCITY-600:
---------------------------------------
If someone decides to roll a 1.5.1 release, then i'd be fine with throwing this
patch in too. Feel free to re-unresolve this with 1.5.1 as the fix version,
so that it isn't forgotten.
However, a 1.6 release is just as likely (if not more likely) to be the next
thing out the door. Both 1.5.1 and 1.6 are hung up on the same bug
(VELOCITY-537). Once that is fixed i will put my energy toward a 1.6 release,
as that has features i'm eager for (vararg support!). Anyone who wants to push
a 1.5.1 release is welcome to do so, but i'm not sure if anyone will with 1.6
so imminent. And in either case, i think 537 needs fixing first.
> #foreach & velocityCount
> ------------------------
>
> Key: VELOCITY-600
> URL: https://issues.apache.org/jira/browse/VELOCITY-600
> Project: Velocity
> Issue Type: Improvement
> Components: Engine
> Reporter: Adrian Tarau
> Priority: Minor
> Fix For: 1.6
>
> Attachments: VELOCITY-600.patch
>
>
> velocityCount = Used in the #foreach() directive, defines the string to be
> used as the context key for the loop count. A template would access the loop
> count as $velocityCount.
> Knowing current version of the loop counter is very useful, but something is
> missing. Very often, when you generate some content base on a
> model(JavaScript code based on some UI model) you have the need to know if
> this is the last time when the #foreach block will be executed or not.
> Example
> You have a collection of objects Property(bean with key, value fields) and
> you want to generate a JavaScript object with them. The result should be like
> this :
> {id : 1 , name = "John", ...}
> you can generate this with
> {
> #foreach($property in $properties)
> $property.key : "$property.value" #if($velocityCount !=
> $properties.size()) , #end
> #end
> }
> You can store $properties.size() of course outside the loop.
> The template will be less verbose if I will have something like that.
> #if($velocityHasNext) , #end.
> Instead of saving only the counter, a new variable called velocityHasNext
> whould be populated with the result of iterator.hasNext(). This is a minor
> modification of current #foreach directive
> while (!maxNbrLoopsExceeded && i.hasNext())
> {
> // TODO: JDK 1.4+ -> valueOf()
> context.localPut(counterName , new Integer(counter));
> context.localPut(hasNextName , i.hasNext()); <--- here is the
> change
> Object value = i.next();
> context.localPut(elementKey, value);
> /*
> * If the value is null, use the special null holder context
> */
> if( value == null )
> {
> if( nullHolderContext == null )
> {
> // lazy instantiation
> nullHolderContext = new NullHolderContext(elementKey,
> context);
> }
> node.jjtGetChild(3).render(nullHolderContext, writer);
> }
> else
> {
> node.jjtGetChild(3).render(context, writer);
> }
> counter++;
> // Determine whether we're allowed to continue looping.
> // ASSUMPTION: counterInitialValue is not negative!
> maxNbrLoopsExceeded = (counter - counterInitialValue) >=
> maxNbrLoops;
> }
> also init should contain
> public void init(RuntimeServices rs, InternalContextAdapter context, Node
> node)
> throws TemplateInitException
> {
> super.init(rs, context, node);
> counterName = rsvc.getString(RuntimeConstants.COUNTER_NAME);
> hasNextName = rsvc.getString(RuntimeConstants.HAS_NEXT_NAME);
> counterInitialValue =
> rsvc.getInt(RuntimeConstants.COUNTER_INITIAL_VALUE);
> ....
> }
> This should help creating clear templates(and avoid some mistakes, sometime -
> like using the wrong collection to test :) ).
> Thanks.
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]