1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.struts2.components;
23
24 import java.io.Writer;
25 import java.util.ArrayList;
26 import java.util.Iterator;
27 import java.util.List;
28
29 import org.apache.struts2.components.Param.UnnamedParametric;
30 import org.apache.struts2.util.AppendIteratorFilter;
31 import org.apache.struts2.util.MakeIterator;
32 import org.apache.struts2.views.annotations.StrutsTag;
33 import org.apache.struts2.views.annotations.StrutsTagAttribute;
34
35 import com.opensymphony.xwork2.util.ValueStack;
36 import com.opensymphony.xwork2.util.logging.Logger;
37 import com.opensymphony.xwork2.util.logging.LoggerFactory;
38
39 /***
40 * <!-- START SNIPPET: javadoc -->
41 * <p>Component for AppendIteratorTag, which jobs is to append iterators to form an
42 * appended iterator whereby entries goes from one iterator to another after each
43 * respective iterator is exhausted of entries.</p>
44 *
45 * <p>For example, if there are 3 iterator appended (each iterator has 3 entries),
46 * the following will be how the appended iterator entries will be arranged:</p>
47 *
48 * <ol>
49 * <li>First Entry of the First Iterator</li>
50 * <li>Second Entry of the First Iterator</li>
51 * <li>Third Entry of the First Iterator</li>
52 * <li>First Entry of the Second Iterator</li>
53 * <li>Second Entry of the Second Iterator</li>
54 * <li>Third Entry of the Second Iterator</li>
55 * <li>First Entry of the Third Iterator</li>
56 * <li>Second Entry of the Third Iterator</li>
57 * <li>Third Entry of the Third ITerator</li>
58 * </ol>
59 * <!-- END SNIPPET: javadoc -->
60 *
61 * <!-- START SNIPPET: params -->
62 * <ul>
63 * <li>id (String) - the id of which if supplied will have the resultant
64 * appended iterator stored under in the stack's context</li>
65 * </ul>
66 * <!-- END SNIPPET: params -->
67 *
68 *
69 * <!-- START SNIPPET: code -->
70 * public class AppendIteratorTagAction extends ActionSupport {
71 *
72 * private List myList1;
73 * private List myList2;
74 * private List myList3;
75 *
76 *
77 * public String execute() throws Exception {
78 *
79 * myList1 = new ArrayList();
80 * myList1.add("1");
81 * myList1.add("2");
82 * myList1.add("3");
83 *
84 * myList2 = new ArrayList();
85 * myList2.add("a");
86 * myList2.add("b");
87 * myList2.add("c");
88 *
89 * myList3 = new ArrayList();
90 * myList3.add("A");
91 * myList3.add("B");
92 * myList3.add("C");
93 *
94 * return "done";
95 * }
96 *
97 * public List getMyList1() { return myList1; }
98 * public List getMyList2() { return myList2; }
99 * public List getMyList3() { return myList3; }
100 *}
101 * <!-- END SNIPPET: code -->
102 *
103 * <!-- START SNIPPET: example -->
104 * <s:append var="myAppendIterator">
105 * <s:param value="%{myList1}" />
106 * <s:param value="%{myList2}" />
107 * <s:param value="%{myList3}" />
108 * </s:append>
109 * <s:iterator value="%{#myAppendIterator}">
110 * <s:property />
111 * </s:iterator>
112 * <!-- END SNIPPET: example -->
113 *
114 *
115 * @see org.apache.struts2.util.AppendIteratorFilter
116 * @see org.apache.struts2.views.jsp.iterator.AppendIteratorTag
117 *
118 */
119 @StrutsTag(name="append", tldTagClass="org.apache.struts2.views.jsp.iterator.AppendIteratorTag", description="Append the values of a list of iterators to one iterator")
120 public class AppendIterator extends ContextBean implements UnnamedParametric {
121
122 private static final Logger LOG = LoggerFactory.getLogger(AppendIterator.class);
123
124 private AppendIteratorFilter appendIteratorFilter= null;
125 private List _parameters;
126
127 public AppendIterator(ValueStack stack) {
128 super(stack);
129 }
130
131 public boolean start(Writer writer) {
132 _parameters = new ArrayList();
133 appendIteratorFilter = new AppendIteratorFilter();
134
135 return super.start(writer);
136 }
137
138 public boolean end(Writer writer, String body) {
139
140 for (Iterator paramEntries = _parameters.iterator(); paramEntries.hasNext(); ) {
141
142 Object iteratorEntryObj = paramEntries.next();
143 if (! MakeIterator.isIterable(iteratorEntryObj)) {
144 LOG.warn("param with value resolved as "+iteratorEntryObj+" cannot be make as iterator, it will be ignored and hence will not appear in the merged iterator");
145 continue;
146 }
147 appendIteratorFilter.setSource(MakeIterator.convert(iteratorEntryObj));
148 }
149
150 appendIteratorFilter.execute();
151
152 putInContext(appendIteratorFilter);
153
154 appendIteratorFilter = null;
155
156 return super.end(writer, body);
157 }
158
159
160 public void addParameter(Object value) {
161 _parameters.add(value);
162 }
163
164 @StrutsTagAttribute(description="The name of which if supplied will have the resultant appended iterator stored under in the stack's context")
165 public void setVar(String var) {
166 super.setVar(var);
167 }
168 }
169
170