1 /***
2 * Copyright (c) 2003 held jointly by the individual authors.
3 *
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published
6 * by the Free Software Foundation; either version 2.1 of the License, or
7 * (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; with out even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * > http://www.gnu.org/copyleft/lesser.html
19 * > http://www.opensource.org/licenses/lgpl-license.php
20 */
21 package net.mlw.vlh.web.tag;
22
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.Iterator;
26 import java.util.List;
27
28 import javax.servlet.jsp.JspException;
29 import javax.servlet.jsp.tagext.BodyTagSupport;
30
31 import net.mlw.vlh.ValueList;
32 import net.mlw.vlh.web.util.JspUtils;
33
34 import org.apache.commons.beanutils.BeanUtils;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37
38 /***
39 * Generate a select box from a ValueList <br>
40 *
41 * @author Matthew L. Wilson
42 * @version $Revision: 1.8 $ $Date: 2005/11/23 15:02:16 $
43 */
44 public class DefaultSelectTag extends BodyTagSupport
45 {
46
47 private static final Log LOGGER = LogFactory.getLog(DefaultSelectTag.class);
48
49 private String name;
50
51 private String attributes;
52
53 private String value;
54
55 private String text;
56
57 /***
58 * @see javax.servlet.jsp.tagext.TagSupport#doEndTag()
59 */
60 public int doEndTag() throws JspException
61 {
62 ValueListSpaceTag rootTag = (ValueListSpaceTag) JspUtils.getParent(this, ValueListSpaceTag.class);
63
64 ValueList valueList = rootTag.getValueList();
65
66 StringBuffer sb = new StringBuffer();
67
68 sb.append("<select name=").append("'").append(name).append("'").append(attributes).append(">");
69
70 if (bodyContent != null && bodyContent.getString() != null)
71 {
72 sb.append(bodyContent.getString());
73 }
74
75 try
76 {
77 String[] svalues = pageContext.getRequest().getParameterValues(name);
78 List values = (svalues == null) ? Collections.EMPTY_LIST : Arrays.asList(svalues);
79
80 for (Iterator iter = valueList.getList().iterator(); iter.hasNext();)
81 {
82 Object bean = iter.next();
83 String value = BeanUtils.getProperty(bean, this.value);
84
85 sb.append("<option ");
86 if (values.contains(value))
87 {
88 sb.append("selected='true' ");
89 }
90 sb.append("value='").append(value).append("'>");
91 sb.append(BeanUtils.getProperty(bean, text));
92 sb.append("</option>");
93 }
94 }
95 catch (Exception e)
96 {
97 LOGGER.error("DefaultSelectTag.doEndTag() exception...", e);
98 throw new JspException(e);
99 }
100 sb.append("</select>");
101
102 JspUtils.write(pageContext, sb.toString());
103
104 release();
105
106 return EVAL_PAGE;
107 }
108
109 /***
110 * @return Returns the attributes.
111 */
112 public String getAttributes()
113 {
114 return attributes;
115 }
116
117 /***
118 * @param attributes
119 * The attributes to set.
120 */
121 public void setAttributes(String attributes)
122 {
123 this.attributes = attributes;
124 }
125
126 /***
127 * @return Returns the name.
128 */
129 public String getName()
130 {
131 return name;
132 }
133
134 /***
135 * @param name
136 * The name to set.
137 */
138 public void setName(String name)
139 {
140 this.name = name;
141 }
142
143 /***
144 * @return Returns the text.
145 */
146 public String getText()
147 {
148 return text;
149 }
150
151 /***
152 * @param text
153 * The text to set.
154 */
155 public void setText(String text)
156 {
157 this.text = text;
158 }
159
160 /***
161 * @return Returns the value.
162 */
163 public String getValue()
164 {
165 return value;
166 }
167
168 /***
169 * @param value
170 * The value to set.
171 */
172 public void setValue(String value)
173 {
174 this.value = value;
175 }
176
177 private void reset()
178 {
179 this.attributes = null;
180 this.name = null;
181 this.text = null;
182 this.value = null;
183 }
184
185 /***
186 * Called on a Tag handler to release state.
187 * The page compiler guarantees that JSP page implementation
188 * objects will invoke this method on all tag handlers,
189 * but there may be multiple invocations on doStartTag and doEndTag in between.
190 *
191 * @see javax.servlet.jsp.tagext.Tag#release()
192 */
193 public void release()
194 {
195 super.release();
196 reset();
197 }
198 }