package org.apache.taglibs.datetime; import java.text.DateFormatSymbols; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public final class FormatTag extends BodyTagSupport { // format tag attributes // Optional attribute, use users locale if known when formatting date private boolean locale_flag = false; // Optional attribute, time pattern string to use when formatting date private String pattern = null; // Optional attribute, name of script variable to use as pattern private String patternid = null; // Optional attribute, timeZone script variable id to use when formatting date private String timeZone_string; // Optional attribute, date object from rtexprvalue private Date date = null; // Optional attribute, the default text if the tag body or date given is invalid/null private String default_text = "Invalid Date"; // Optional attribute, the name of an attribute which contains the Locale private String localeRef = null; // Optional attribute, name of script variable to use as date symbols source private String symbolsRef = null; // format tag invocation variables // The symbols object private DateFormatSymbols symbols = null; // The date to be formatted an output by tag private Date output_date = null; /** * Method called at start of tag, always returns EVAL_BODY_TAG * * @return EVAL_BODY_TAG */ public final int doStartTag() throws JspException { output_date = date; return EVAL_BODY_TAG; } /** * Method called at end of format tag body. * * @return SKIP_BODY */ public final int doAfterBody() throws JspException { // Use the body of the tag as input for the date BodyContent body = getBodyContent(); String s = body.getString().trim(); // Clear the body since we will output only the formatted date body.clearBody(); if( output_date == null ) { long time; try { time = Long.valueOf(s).longValue(); output_date = new Date(time); } catch(NumberFormatException nfe) { } } return SKIP_BODY; } /** * Method called at end of Tag * * @return EVAL_PAGE */ public final int doEndTag() throws JspException { String date_formatted = default_text; if (output_date != null) { // Get the pattern to use SimpleDateFormat sdf; String pat = pattern; if (pat == null && patternid != null) { Object attr = pageContext.findAttribute(patternid); if (attr != null) pat = attr.toString(); } if (pat == null) { sdf = new SimpleDateFormat(); pat = sdf.toPattern(); } // Get a DateFormatSymbols if (symbolsRef != null) { symbols = (DateFormatSymbols) pageContext.findAttribute(symbolsRef); if (symbols == null) { throw new JspException( "datetime format tag could not find dateFormatSymbols for symbolsRef \"" + symbolsRef + "\"."); } } // Get a SimpleDateFormat using locale if necessary if (localeRef != null) { Locale locale = (Locale) pageContext.findAttribute(localeRef); if (locale == null) { throw new JspException( "datetime format tag could not find locale for localeRef \"" + localeRef + "\"."); } sdf = new SimpleDateFormat(pat, locale); } else if (locale_flag) { sdf = new SimpleDateFormat(pat, pageContext.getRequest().getLocale()); } else if (symbols != null) { sdf = new SimpleDateFormat(pat, symbols); } else { sdf = new SimpleDateFormat(pat); } // See if there is a timeZone if (timeZone_string != null) { TimeZone timeZone = (TimeZone) pageContext.getAttribute(timeZone_string, PageContext.SESSION_SCOPE); if (timeZone == null) { throw new JspTagException("Datetime format tag timeZone " + "script variable \"" + timeZone_string + " \" does not exist"); } sdf.setTimeZone(timeZone); } // Format the date for display date_formatted = sdf.format(output_date); } try { pageContext.getOut().write(date_formatted); } catch (Exception e) { throw new JspException("IO Error: " + e.getMessage()); } return EVAL_PAGE; } public void release() { //railo.print.ln("release FormatTag"); super.release(); locale_flag = false; pattern = null; patternid = null; date = null; localeRef = null; symbolsRef = null; symbols = null; } /** * Locale flag, if set to true, format date * for client's preferred locale if known. * * @param boolean use users locale, true or false */ public final void setLocale(short flag) { //locale_flag = flag; } /** * Set the time zone to use when formatting date. * * Value must be the name of a <b>timeZone</b> tag script * variable ID. * * @param String name of timeZone to use */ public final void setTimeZone(String tz) { timeZone_string = tz; } /** * Set the pattern to use when formatting Date. * * @param String SimpleDateFormat style time pattern format string */ public final void setPattern(String str) { pattern = str; } /** * Set the pattern to use when parsing Date using a script variable * attribute. * * @param String name of script variable attribute id */ public final void setPatternId(String str) { patternid = str; } /** * Set the date to use (overrides tag body) for formatting * * @param Date to use for formatting (could be null) */ public final void setDate(Date date) { this.date = date; } /** * Set the default text if an invalid date or no tag body is given * * @param String to use as default text */ public final void setDefault(String default_text) { this.default_text = default_text; } /** * Provides a key to search the page context for in order to get the * java.util.Locale to use. * * @param String name of locale attribute to use */ public void setLocaleRef(String value) { localeRef = value; } /** * Provides a key to search the page context for in order to get the * java.text.DateFormatSymbols to use * * @param symbolsRef */ public void setSymbolsRef(String symbolsRef) { this.symbolsRef = symbolsRef; } }