Skip to content

Commit a9aad5b

Browse files
committed
ModelAdapter now manages special iteration variable
1 parent e6cbac8 commit a9aad5b

File tree

5 files changed

+34
-8
lines changed

5 files changed

+34
-8
lines changed

Releasenotes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,6 @@ Release 3.2.0
150150
* Now building for JDK 1.7
151151
* Transformation of model value to iterable for for each now done in ModelAdaptor
152152
* ModelAdapter can be configured to treat everything as a list when looping over it, prevents map to be iterated over as entries
153+
* ModelAdapter now manages special iterator alias, DefaultModelAdapter provides "_it" for backward compatibility
154+
153155

src/com/floreysoft/jmte/DefaultModelAdaptor.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
*/
3131
public class DefaultModelAdaptor implements ModelAdaptor {
3232

33+
private static final String DEFAULT_SPECIAL_ITERATOR_VARIABLE = "_it";
34+
3335
public enum LoopMode {
3436
DEFAULT,
3537
/**
@@ -38,15 +40,21 @@ public enum LoopMode {
3840
LIST
3941
}
4042

41-
protected Map<Class<?>, Map<String, Member>> cache = new HashMap<Class<?>, Map<String, Member>>();
42-
private LoopMode loopMode;
43+
protected final Map<Class<?>, Map<String, Member>> cache = new HashMap<Class<?>, Map<String, Member>>();
44+
private final LoopMode loopMode;
45+
private final String specialIteratorVariable;
4346

4447
public DefaultModelAdaptor() {
4548
this(LoopMode.DEFAULT);
4649
}
4750

4851
public DefaultModelAdaptor(LoopMode loopMode) {
52+
this(loopMode, DEFAULT_SPECIAL_ITERATOR_VARIABLE);
53+
}
54+
55+
public DefaultModelAdaptor(LoopMode loopMode, String specialIteratorVariable) {
4956
this.loopMode = loopMode;
57+
this.specialIteratorVariable = specialIteratorVariable;
5058
}
5159

5260
public Object getValue(Map<String, Object> model, String expression) {
@@ -98,6 +106,11 @@ public Iterable<Object> getIterable(Object value) {
98106
return iterable;
99107
}
100108

109+
@Override
110+
public String getSpecialIteratorVariable() {
111+
return specialIteratorVariable;
112+
}
113+
101114
protected Object traverse(List<String> segments, Map<String, Object> model,
102115
ErrorHandler errorHandler, Token token) {
103116
if (segments.size() == 0) {

src/com/floreysoft/jmte/Engine.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ public Iterable<Object> getIterable(Object value) {
246246
return null;
247247
}
248248

249+
@Override
250+
public String getSpecialIteratorVariable() {
251+
return null;
252+
}
253+
249254
};
250255

251256
String output = transformInternal(pattern, null, model, modelAdaptor, null);

src/com/floreysoft/jmte/ModelAdaptor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,12 @@ public Object getValue(TemplateContext context, Token token,
3434
*/
3535
public Iterable<Object> getIterable(Object value);
3636

37+
/**
38+
* Gets the name of the special iterator variable which will be used as an alternative
39+
* variable name of the iterator in a foreach loop. E.g. something like <em>it</em>.
40+
*
41+
* @return name of the special iterator variable
42+
*/
43+
public String getSpecialIteratorVariable();
44+
3745
}

src/com/floreysoft/jmte/template/AbstractTemplate.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
public abstract class AbstractTemplate implements Template {
1313

14-
public static final String SPECIAL_ITERATOR_VARIABLE = "_it";
1514
public static final String ODD_PREFIX = "odd_";
1615
public static final String EVEN_PREFIX = "even_";
1716
public static final String LAST_PREFIX = "last_";
@@ -25,12 +24,11 @@ public abstract class AbstractTemplate implements Template {
2524

2625
protected void addSpecialVariables(ForEachToken feToken,
2726
Map<String, Object> model) {
28-
String suffix = feToken.getVarName();
29-
addSpecialVariables(feToken, model, suffix);
30-
27+
addSpecialVariables(feToken, model, feToken.getVarName());
3128
// special _it variable as an alias for run variable in inner loop
32-
model.put(SPECIAL_ITERATOR_VARIABLE, model.get(feToken.getVarName()));
33-
addSpecialVariables(feToken, model, SPECIAL_ITERATOR_VARIABLE);
29+
final String specialIteratorVariable = engine.getModelAdaptor().getSpecialIteratorVariable();
30+
model.put(specialIteratorVariable, model.get(feToken.getVarName()));
31+
addSpecialVariables(feToken, model, specialIteratorVariable);
3432
}
3533

3634
private void addSpecialVariables(ForEachToken feToken, Map<String, Object> model, String suffix) {

0 commit comments

Comments
 (0)