/* Copyright 2005-2006 Tim Fennell
*
* Licensed 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 net.sourceforge.stripes.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTag;
import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.exception.StripesJspException;
import net.sourceforge.stripes.validation.Validate;
import net.sourceforge.stripes.validation.ValidationMetadata;
/**
* <p>Tag that generates HTML form fields of type
* {@literal <input type="text" name="foo" value="bar"/>}, which can dynamically re-populate their
* value. Text tags may have only a single value, whose default may be set using either the body
* of the tag, or using the value="" attribute of the tag. At runtime the contents of the
* text field are determined by looking for the first non-null value in the following list:</p>
*
* <ul>
* <li>A value with the same name in the HttpServletRequest</li>
* <li>A value on the ActionBean if an ActionBean instance is present</li>
* <li>The contents of the body of the tag</li>
* <li>The value attribute of the tag</li>
* </ul>
*
* @author Tim Fennell
*/
public class InputTextTag extends InputTagSupport implements BodyTag {
private Object value;
private String maxlength;
/** Basic constructor that sets the input tag's type attribute to "text". */
public InputTextTag() {
getAttributes().put("type", "text");
}
/** Sets the default value of the text field (if no body is present). */
public void setValue(Object value) { this.value = value; }
/** Returns the value set using setValue(). */
public Object getValue() { return this.value; }
/** Sets the HTML attribute of the same name. */
public void setMaxlength(String maxlength) { this.maxlength = maxlength; }
/** Gets the HTML attribute of the same name. */
public String getMaxlength() { return maxlength; }
/**
* Gets the maxlength value that is in effect for this tag, as determined by checking
* {@link #getMaxlength()} and then the {@code maxlength} element of the {@link Validate}
* annotation on the associated {@link ActionBean} property.
*
* @throws StripesJspException if thrown by {@link #getValidationMetadata()}
*/
protected String getEffectiveMaxlength() throws StripesJspException {
if (getMaxlength() == null) {
ValidationMetadata validation = getValidationMetadata();
if (validation != null && validation.maxlength() != null)
return validation.maxlength().toString();
else
return null;
}
else {
return getMaxlength();
}
}
/**
* Sets type input tags type to "text".
* @return EVAL_BODY_BUFFERED in all cases.
*/
@Override
public int doStartInputTag() throws JspException {
return EVAL_BODY_BUFFERED;
}
/** Does nothing. */
public void doInitBody() throws JspException { }
/**
* Does nothing.
* @return SKIP_BODY in all cases.
*/
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
/**
* Determines which source is applicable for the value of the text field and then writes
* out the tag.
*
* @return EVAL_PAGE in all cases.
* @throws JspException if the enclosing form tag cannot be found, or output cannot be written.
*/
@Override
public int doEndInputTag() throws JspException {
// Find out if we have a value from the PopulationStrategy
Object value = getSingleOverrideValue();
// Figure out where to pull the value from
if (value != null) {
getAttributes().put("value", format(value));
}
set("maxlength", getEffectiveMaxlength());
writeSingletonTag(getPageContext().getOut(), "input");
// Restore the original state before we mucked with it
getAttributes().remove("value");
return EVAL_PAGE;
}
}