001    package railo.runtime.functions.displayFormatting;
002    
003    import java.text.SimpleDateFormat;
004    import java.util.Locale;
005    import java.util.TimeZone;
006    
007    import railo.commons.date.TimeZoneUtil;
008    import railo.runtime.PageContext;
009    import railo.runtime.engine.ThreadLocalPageContext;
010    import railo.runtime.exp.ExpressionException;
011    import railo.runtime.exp.PageException;
012    import railo.runtime.functions.BIF;
013    import railo.runtime.op.Caster;
014    import railo.runtime.type.dt.DateTime;
015    
016    /**
017     * Implements the CFML Function dateformat
018     */
019    public final class DateTimeFormat extends BIF {
020    
021            private static final long serialVersionUID = 134840879454373440L;
022            public static final String DEFAULT_MASK = "dd-MMM-yyyy HH:mm:ss";
023    
024            /**
025             * @param pc
026             * @param object
027             * @return Formated Time Object as String
028             * @throws ExpressionException
029             */
030            public static String call(PageContext pc , Object object) throws ExpressionException {
031                    return invoke(pc,object, DEFAULT_MASK,Locale.US,ThreadLocalPageContext.getTimeZone(pc));
032            }
033            
034            /**
035             * @param pc
036             * @param object
037             * @param mask Characters that show how CFML displays a date:
038             * @return Formated Time Object as String
039             * @throws ExpressionException
040             */
041            public static String call(PageContext pc , Object object, String mask) throws ExpressionException {
042                    return invoke(pc,object,mask,Locale.US,ThreadLocalPageContext.getTimeZone(pc));
043            }
044    
045            public static String call(PageContext pc , Object object, String mask,String strTimezone) throws ExpressionException {
046                    return invoke(pc,object,mask, Locale.US,strTimezone==null?ThreadLocalPageContext.getTimeZone(pc):TimeZoneUtil.toTimeZone(strTimezone));
047            }
048            
049            public static String invoke(PageContext pc , Object object, String mask,Locale locale,TimeZone tz) throws ExpressionException {
050                    if(mask==null) mask=DEFAULT_MASK;
051                    if(locale==null) locale=Locale.US;
052                    DateTime datetime = Caster.toDate(object,true,tz,null);
053                    if(datetime==null) {
054                        if(object.toString().trim().length()==0) return "";
055                        throw new ExpressionException("can't convert value "+object+" to a datetime value");
056                    }
057                    
058                    SimpleDateFormat format = new SimpleDateFormat(mask, locale);
059                    format.setTimeZone(tz);
060            return format.format(datetime);
061            }
062            
063            @Override
064            public Object invoke(PageContext pc, Object[] args) throws PageException {
065                    if(args.length==1)return call(pc,args[0]);
066                    if(args.length==2)return call(pc,args[0],Caster.toString(args[1]));
067                    return call(pc,args[0],Caster.toString(args[1]),Caster.toString(args[2]));
068            }
069    }