/* Copyright 2007 Ben Gunter
*
* 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 java.io.IOException;
import javax.servlet.jsp.JspException;
import net.sourceforge.stripes.controller.StripesFilter;
import net.sourceforge.stripes.format.Formatter;
import net.sourceforge.stripes.format.FormatterFactory;
import net.sourceforge.stripes.util.Log;
/**
* This tag accepts an object and formats it using an appropriate
* {@link Formatter}. The resulting {@link String} can be assigned in the page,
* request, session or application scopes by using "var" and "scope" or it can
* be written directly to the JSP output.
*
* @author Ben Gunter
* @since Stripes 1.5
*/
public class FormatTag extends VarTagSupport {
private static final Log log = Log.getInstance(FormatTag.class);
private Object value;
private String formatType;
private String formatPattern;
/** Get the format pattern */
public String getFormatPattern() {
return formatPattern;
}
/** Set the format pattern */
public void setFormatPattern(String formatPattern) {
this.formatPattern = formatPattern;
}
/** Get the format type */
public String getFormatType() {
return formatType;
}
/** Set the format type */
public void setFormatType(String formatType) {
this.formatType = formatType;
}
/** Get the object to be formatted */
public Object getValue() {
return value;
}
/** Set the object to be formatted */
public void setValue(Object value) {
this.value = value;
}
/**
* Attempts to format an object using an appropriate {@link Formatter}. If
* no formatter is available for the object, then this method will call
* <code>toString()</code> on the object. A null <code>value</code> will
* be formatted as an empty string.
*
* @param value
* the object to be formatted
* @return the formatted value
*/
@SuppressWarnings("unchecked")
protected String format(Object value) {
if (value == null)
return "";
FormatterFactory factory = StripesFilter.getConfiguration().getFormatterFactory();
Formatter formatter = factory.getFormatter(value.getClass(),
getPageContext().getRequest().getLocale(),
this.formatType,
this.formatPattern);
if (formatter == null)
return String.valueOf(value);
else
return formatter.format(value);
}
/**
* Calls {@link #format(Object)} and writes the resulting {@link String} to
* the JSP output.
*
* @param value
* the object to be formatted and written
* @throws JspException
*/
protected void writeOut(Object value) throws JspException {
String formatted = format(value);
try {
pageContext.getOut().print(formatted);
}
catch (IOException e) {
JspException jspe = new JspException(
"IOException encountered while writing formatted value '"
+ formatted + " to the JspWriter.", e);
log.warn(jspe);
throw jspe;
}
}
@Override
public int doStartTag() throws JspException {
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
if (var == null) {
writeOut(value);
}
else {
export(format(value));
}
return EVAL_PAGE;
}
}