[
https://issues.apache.org/jira/browse/VELOCITY-600?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12603681#action_12603681
]
Adrian Tarau commented on VELOCITY-600:
---------------------------------------
Looks fine, but I think something like this should be into the core, part of
#foreach implementation. The modifications are minor and I think this template
{
#foreach($property in $properties)
$property.key : "$property.value" #if($velocityHasNext) , #end
#end
}
looks better than
{
#foreach($property in $loop.watch($properties))
$property.key : "$property.value" #if($loop.isLast()) , #end
#end
}
I agree, something like that could offer also isFirst, but exposing the
iterator hasNext is more that you need in general. Also having a tool on top of
the original collection brings : a new object is created, additional calls are
performed. Nothing major, but inside the directive you already have access of
it.hasNext() and there is only one additional line :
context.localPut(hasNextName , i.hasNext());
This is also similar with the new way to iterate collections in Java 5
for (Item item : items) {
System.out.print(item.toString());
if (...) { <-- how can I check if it is the last time or not 'cause I want
to print a new line only if is not the last element? I don't have access to the
iterator(they always use an iterator to implement this behind the scene).
System.out.print("\n");
}
}
> #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.5.1
>
>
> 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]