/* * $Id: OptionTag.java 815693 2009-09-16 09:43:29Z pbenedict $ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.struts.taglib.html; import org.apache.struts.Globals; import org.apache.struts.taglib.TagUtils; import org.apache.struts.util.MessageResources; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; /** * Tag for select options. The body of this tag is presented to the user in * the option list, while the value attribute is the value returned to the * server if this option is selected. * * @version $Rev: 815693 $ $Date: 2005-08-21 19:08:45 -0400 (Sun, 21 Aug 2005) * $ */ public class OptionTag extends BodyTagSupport { // ----------------------------------------------------- Instance Variables /** * The message resources for this package. */ protected static MessageResources messages = MessageResources.getMessageResources(Constants.Package + ".LocalStrings"); /** * The message text to be displayed to the user for this tag (if any) */ protected String text = null; // ------------------------------------------------------------- Properties /** * The name of the servlet context attribute containing our message * resources. */ protected String bundle = Globals.MESSAGES_KEY; /** * Is this option disabled? */ protected boolean disabled = false; /** * Should the label be filtered for HTML sensitive characters? */ protected boolean filter = false; /** * The key used to look up the text displayed to the user for this option, * if any. */ protected String key = null; /** * The name of the attribute containing the Locale to be used for looking * up internationalized messages. */ protected String locale = Globals.LOCALE_KEY; /** * The style associated with this tag. */ private String style = null; /** * The named style class associated with this tag. */ private String styleClass = null; /** * The identifier associated with this tag. */ protected String styleId = null; /** * The language code of this element. */ private String lang = null; /** * The direction for weak/neutral text of this element. */ private String dir = null; /** * The advisory title of this element. */ private String title = null; /** * The message resources key of the advisory title. */ private String titleKey = null; /** * The server value for this option, also used to match against the * current property value to determine whether this option should be * marked as selected. */ protected String value = null; public String getBundle() { return (this.bundle); } public void setBundle(String bundle) { this.bundle = bundle; } public boolean getDisabled() { return (this.disabled); } public void setDisabled(boolean disabled) { this.disabled = disabled; } public boolean getFilter() { return (this.filter); } public void setFilter(boolean filter) { this.filter = filter; } public String getKey() { return (this.key); } public void setKey(String key) { this.key = key; } public String getLocale() { return (this.locale); } public void setLocale(String locale) { this.locale = locale; } public String getStyle() { return style; } public void setStyle(String style) { this.style = style; } public String getStyleClass() { return styleClass; } public void setStyleClass(String styleClass) { this.styleClass = styleClass; } /** * Return the style identifier for this tag. */ public String getStyleId() { return (this.styleId); } /** * Set the style identifier for this tag. * * @param styleId The new style identifier */ public void setStyleId(String styleId) { this.styleId = styleId; } public String getValue() { return (this.value); } public void setValue(String value) { this.value = value; } /** * Returns the language code of this element. * * @since Struts 1.3.6 */ public String getLang() { return this.lang; } /** * Sets the language code of this element. * * @since Struts 1.3.6 */ public void setLang(String lang) { this.lang = lang; } /** * Returns the direction for weak/neutral text this element. * * @since Struts 1.3.6 */ public String getDir() { return this.dir; } /** * Sets the direction for weak/neutral text of this element. * * @since Struts 1.3.6 */ public void setDir(String dir) { this.dir = dir; } /** * Returns the advisory title attribute. * * @since Struts 1.4 */ public String getTitle() { return title; } /** * Sets the advisory title attribute. * * @since Struts 1.4 */ public void setTitle(String title) { this.title = title; } /** * Returns the message resources key of the advisory title. * * @since Struts 1.4 */ public String getTitleKey() { return titleKey; } /** * Sets the message resources key of the advisory title. * * @since Struts 1.4 */ public void setTitleKey(String titleKey) { this.titleKey = titleKey; } // --------------------------------------------------------- Public Methods /** * Process the start of this tag. * * @throws JspException if a JSP exception has occurred */ public int doStartTag() throws JspException { // Initialize the placeholder for our body content this.text = null; // Do nothing until doEndTag() is called return (EVAL_BODY_TAG); } /** * Process the body text of this tag (if any). * * @throws JspException if a JSP exception has occurred */ public int doAfterBody() throws JspException { if (bodyContent != null) { String text = bodyContent.getString(); if (text != null) { text = text.trim(); if (text.length() > 0) { this.text = text; } } } return (SKIP_BODY); } /** * Process the end of this tag. * * @throws JspException if a JSP exception has occurred */ public int doEndTag() throws JspException { TagUtils.getInstance().write(pageContext, this.renderOptionElement()); return (EVAL_PAGE); } /** * Generate an HTML %lt;option> element. * * @throws JspException * @since Struts 1.1 */ protected String renderOptionElement() throws JspException { StringBuffer results = new StringBuffer("<option value=\""); if (filter) { results.append(TagUtils.getInstance().filter(this.value)); } else { results.append(this.value); } results.append("\""); if (disabled) { results.append(" disabled=\"disabled\""); } if (this.selectTag().isMatched(this.value)) { results.append(" selected=\"selected\""); } if (style != null) { results.append(" style=\""); results.append(TagUtils.getInstance().filter(style)); results.append("\""); } if (styleId != null) { results.append(" id=\""); results.append(TagUtils.getInstance().filter(styleId)); results.append("\""); } if (styleClass != null) { results.append(" class=\""); results.append(TagUtils.getInstance().filter(styleClass)); results.append("\""); } if (dir != null) { results.append(" dir=\""); results.append(TagUtils.getInstance().filter(dir)); results.append("\""); } if (lang != null) { results.append(" lang=\""); results.append(TagUtils.getInstance().filter(lang)); results.append("\""); } if (title != null || titleKey != null) { results.append(" title=\""); results.append(message(title, titleKey)); results.append("\""); } results.append(">"); results.append(text()); results.append("</option>"); return results.toString(); } /** * Acquire the select tag we are associated with. * * @throws JspException */ private SelectTag selectTag() throws JspException { SelectTag selectTag = (SelectTag) pageContext.getAttribute(Constants.SELECT_KEY); if (selectTag == null) { JspException e = new JspException(messages.getMessage("optionTag.select")); TagUtils.getInstance().saveException(pageContext, e); throw e; } return selectTag; } /** * Release any acquired resources. */ public void release() { super.release(); bundle = Globals.MESSAGES_KEY; dir = null; disabled = false; key = null; lang = null; locale = Globals.LOCALE_KEY; style = null; styleClass = null; text = null; title = null; titleKey = null; value = null; } // ------------------------------------------------------ Protected Methods /** * Return the text specified by the literal value or the message resources * key, if any; otherwise return <code>null</code>. * * @param literal Literal text value or <code>null</code> * @param key Message resources key or <code>null</code> * @throws JspException if both arguments are non-null */ protected String message(String literal, String key) throws JspException { if (literal != null) { if (key != null) { JspException e = new JspException(messages.getMessage("common.both")); TagUtils.getInstance().saveException(pageContext, e); throw e; } else { return (literal); } } else { if (key != null) { return TagUtils.getInstance().message(pageContext, getBundle(), getLocale(), key); } else { return null; } } } /** * Return the text to be displayed to the user for this option (if any). * * @throws JspException if an error occurs */ protected String text() throws JspException { String optionText = this.text; if ((optionText == null) && (this.key != null)) { optionText = TagUtils.getInstance().message(pageContext, bundle, locale, key); } // no body text and no key to lookup so display the value if (optionText == null) { optionText = this.value; } return optionText; } }