svn commit: r564957 - in /ofbiz/trunk/framework: base/src/base/org/ofbiz/base/util/ base/src/base/org/ofbiz/base/util/string/ base/src/base/org/ofbiz/base/util/template/ service/src/org/ofbiz/service/ webapp/src/org/ofbiz/webapp/event/ widget/src/org/o...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r564957 - in /ofbiz/trunk/framework: base/src/base/org/ofbiz/base/util/ base/src/base/org/ofbiz/base/util/string/ base/src/base/org/ofbiz/base/util/template/ service/src/org/ofbiz/service/ webapp/src/org/ofbiz/webapp/event/ widget/src/org/o...

jleroux@apache.org
Author: jleroux
Date: Sat Aug 11 11:40:45 2007
New Revision: 564957

URL: http://svn.apache.org/viewvc?view=rev&rev=564957
Log:
A patch from Adrian Crum "Improved Time Zone Support, Part 2" (https://issues.apache.org/jira/browse/OFBIZ-1164)
Please see comments in Jira issue.


Modified:
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ObjectType.java
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/UtilDateTime.java
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/template/FreeMarkerWorker.java
    ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java
    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java
    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ObjectType.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ObjectType.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ObjectType.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ObjectType.java Sat Aug 11 11:40:45 2007
@@ -25,7 +25,6 @@
 import java.text.DateFormat;
 import java.text.NumberFormat;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.*;
 
 import javolution.util.FastList;
@@ -426,19 +425,24 @@
         }
     }
 
+    public static Object simpleTypeConvert(Object obj, String type, String format, Locale locale, boolean noTypeFail) throws GeneralException {
+        return simpleTypeConvert(obj, type, format, TimeZone.getDefault(), locale, noTypeFail);
+    }
+
     /**
      * Converts the passed object to the named simple type; supported types
      * include: String, Boolean, Double, Float, Long, Integer, Date (java.sql.Date),
-     * Time, Timestamp;
+     * Time, Timestamp, TimeZone;
      * @param obj Object to convert
      * @param type Name of type to convert to
      * @param format Optional (can be null) format string for Date, Time, Timestamp
+     * @param timeZone Optional (can be null) TimeZone for converting dates and times
      * @param locale Optional (can be null) Locale for formatting and parsing Double, Float, Long, Integer
      * @param noTypeFail Fail (Exception) when no type conversion is available, false will return the primary object
      * @return
      * @throws GeneralException
      */
-    public static Object simpleTypeConvert(Object obj, String type, String format, Locale locale, boolean noTypeFail) throws GeneralException {
+    public static Object simpleTypeConvert(Object obj, String type, String format, TimeZone timeZone, Locale locale, boolean noTypeFail) throws GeneralException {
         if (obj == null) {
             return null;
         }
@@ -488,6 +492,13 @@
                 } else {
                     throw new GeneralException("Could not convert " + str + " to " + type + ": ");    
                 }
+            } else if ("TimeZone".equals(type) || "java.util.TimeZone".equals(type)) {
+                TimeZone tz = UtilDateTime.toTimeZone(str);
+                if (tz != null) {
+                    return tz;
+                } else {
+                    throw new GeneralException("Could not convert " + str + " to " + type + ": ");    
+                }
             } else if ("BigDecimal".equals(type) || "java.math.BigDecimal".equals(type)) {
                 str = StringUtil.removeSpaces(str);
                 try {
@@ -565,87 +576,47 @@
                     throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
                 }
             } else if ("Date".equals(type) || "java.sql.Date".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    try {
-                        return java.sql.Date.valueOf(str);
-                    } catch (Exception e) {
-                        try {
-                            DateFormat df = null;
-                            if (locale != null) {
-                                df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
-                            } else {
-                                df = DateFormat.getDateInstance(DateFormat.SHORT);
-                            }
-                            Date fieldDate = df.parse(str);
-
-                            return new java.sql.Date(fieldDate.getTime());
-                        } catch (ParseException e1) {
-                            throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                        }
-                    }
+                    df = UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, timeZone, null);
                 } else {
-                    try {
-                        SimpleDateFormat sdf = new SimpleDateFormat(format);
-                        java.util.Date fieldDate = sdf.parse(str);
-                        return new java.sql.Date(fieldDate.getTime());
-                    } catch (ParseException e) {
-                        throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                    }
+                    df = UtilDateTime.toDateFormat(format, timeZone, null);
+                }
+                try {
+                    Date fieldDate = df.parse(str);
+                    return new java.sql.Date(fieldDate.getTime());
+                } catch (ParseException e1) {
+                    throw new GeneralException("Could not convert " + str + " to " + type + ": ", e1);
                 }
             } else if ("Time".equals(type) || "java.sql.Time".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    try {
-                        return java.sql.Time.valueOf(str);
-                    } catch (Exception e) {
-                        try {
-                            DateFormat df = null;
-                            if (locale != null) {
-                                df = DateFormat.getTimeInstance(DateFormat.SHORT, locale);
-                            } else {
-                                df = DateFormat.getTimeInstance(DateFormat.SHORT);
-                            }
-                            Date fieldDate = df.parse(str);
-
-                            return new java.sql.Time(fieldDate.getTime());
-                        } catch (ParseException e1) {
-                            throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                        }
-                    }
+                    df = UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, timeZone, null);
                 } else {
-                    try {
-                        SimpleDateFormat sdf = new SimpleDateFormat(format);
-                        java.util.Date fieldDate = sdf.parse(str);
-                        return new java.sql.Time(fieldDate.getTime());
-                    } catch (ParseException e) {
-                        throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                    }
+                    df = UtilDateTime.toTimeFormat(format, timeZone, null);
+                }
+                try {
+                    Date fieldDate = df.parse(str);
+                    return new java.sql.Time(fieldDate.getTime());
+                } catch (ParseException e1) {
+                    throw new GeneralException("Could not convert " + str + " to " + type + ": ", e1);
                 }
             } else if ("Timestamp".equals(type) || "java.sql.Timestamp".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    try {
-                        return java.sql.Timestamp.valueOf(str);
-                    } catch (Exception e) {
-                        try {
-                            DateFormat df = null;
-                            if (locale != null) {
-                                df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
-                            } else {
-                                df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
-                            }
-                            Date fieldDate = df.parse(str);
-                            return new java.sql.Timestamp(fieldDate.getTime());
-                        } catch (ParseException e1) {
-                            throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                        }
+                    df = UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, timeZone, null);
+                    // hack to mimic Timestamp.valueOf() method
+                    if (str.length() > 0 && !str.contains(".")) {
+                        str = str + ".0";
                     }
                 } else {
-                    try {
-                        SimpleDateFormat sdf = new SimpleDateFormat(format);
-                        java.util.Date fieldDate = sdf.parse(str);
-                        return new java.sql.Timestamp(fieldDate.getTime());
-                    } catch (ParseException e) {
-                        throw new GeneralException("Could not convert " + str + " to " + type + ": ", e);
-                    }
+                    df = UtilDateTime.toDateTimeFormat(format, timeZone, null);
+                }
+                try {
+                    Date fieldDate = df.parse(str);
+                    return new java.sql.Timestamp(fieldDate.getTime());
+                } catch (ParseException e1) {
+                    throw new GeneralException("Could not convert " + str + " to " + type + ": ", e1);
                 }
             } else if ("List".equals(type) || "java.util.List".equals(type)) {
                 if (str.startsWith("[") && str.endsWith("]")) {
@@ -837,12 +808,13 @@
             fromType = "Date";
             java.sql.Date dte = (java.sql.Date) obj;
             if ("String".equals(type) || "java.lang.String".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    return dte.toString();
+                    df = UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, timeZone, null);
                 } else {
-                    SimpleDateFormat sdf = new SimpleDateFormat(format);
-                    return sdf.format(new java.util.Date(dte.getTime()));
+                    df = UtilDateTime.toDateFormat(format, timeZone, null);
                 }
+                return df.format(new java.util.Date(dte.getTime()));
             } else if ("Date".equals(type) || "java.sql.Date".equals(type)) {
                 return obj;
             } else if ("Time".equals(type) || "java.sql.Time".equals(type)) {
@@ -865,13 +837,13 @@
             java.sql.Time tme = (java.sql.Time) obj;
 
             if ("String".equals(type) || "java.lang.String".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    return tme.toString();
+                    df = UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, timeZone, null);
                 } else {
-                    SimpleDateFormat sdf = new SimpleDateFormat(format);
-
-                    return sdf.format(new java.util.Date(tme.getTime()));
+                    df = UtilDateTime.toTimeFormat(format, timeZone, null);
                 }
+                return df.format(new java.util.Date(tme.getTime()));
             } else if ("Date".equals(type) || "java.sql.Date".equals(type)) {
                 throw new GeneralException("Conversion from " + fromType + " to " + type + " not currently supported");
             } else if ("Time".equals(type) || "java.sql.Time".equals(type)) {
@@ -894,13 +866,13 @@
             java.sql.Timestamp tme = (java.sql.Timestamp) obj;
 
             if ("String".equals(type) || "java.lang.String".equals(type)) {
+                DateFormat df = null;
                 if (format == null || format.length() == 0) {
-                    return tme.toString();
+                    df = UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, timeZone, null);
                 } else {
-                    SimpleDateFormat sdf = new SimpleDateFormat(format);
-
-                    return sdf.format(new java.util.Date(tme.getTime()));
+                    df = UtilDateTime.toDateTimeFormat(format, timeZone, null);
                 }
+                return df.format(new java.util.Date(tme.getTime()));
             } else if ("Date".equals(type) || "java.sql.Date".equals(type)) {
                 return new java.sql.Date(tme.getTime());
             } else if ("Time".equals(type) || "java.sql.Time".equals(type)) {
@@ -949,6 +921,16 @@
                 return loc;
             } else if ("String".equals(type) || "java.lang.String".equals(type)) {
                 return loc.toString();
+            } else {
+                throw new GeneralException("Conversion from " + fromType + " to " + type + " not currently supported");
+            }
+        } else if (obj instanceof java.util.TimeZone) {
+            fromType = "TimeZone";
+            TimeZone tz = (TimeZone) obj;
+            if ("TimeZone".equals(type) || "java.util.TimeZone".equals(type)) {
+                return tz;
+            } else if ("String".equals(type) || "java.lang.String".equals(type)) {
+                return tz.getID();
             } else {
                 throw new GeneralException("Conversion from " + fromType + " to " + type + " not currently supported");
             }

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/UtilDateTime.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/UtilDateTime.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/UtilDateTime.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/UtilDateTime.java Sat Aug 11 11:40:45 2007
@@ -58,6 +58,18 @@
     };
 
     public static final DecimalFormat df = new DecimalFormat("0.00;-0.00");
+    /**
+     * JDBC escape format for java.sql.Date conversions.
+     */
+    public static final String DATE_FORMAT = "yyyy-MM-dd";
+    /**
+     * JDBC escape format for java.sql.Timestamp conversions.
+     */
+    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss.S";
+    /**
+     * JDBC escape format for java.sql.Time conversions.
+     */
+    public static final String TIME_FORMAT = "HH:mm:ss";
 
     public static double getInterval(Date from, Date thru) {
         return thru != null ? thru.getTime() - from.getTime() : 0;
@@ -884,22 +896,87 @@
     }
 
     /**
+     * Returns an initialized DateFormat object.
+     * @param dateFormat optional format string
+     * @param tz
+     * @param locale can be null if dateFormat is not null
+     * @return DateFormat object
+     */
+    public static DateFormat toDateFormat(String dateFormat, TimeZone tz, Locale locale) {
+        DateFormat df = null;
+        if (dateFormat == null) {
+            df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        } else {
+            df = new SimpleDateFormat(dateFormat);
+        }
+        df.setTimeZone(tz);
+        return df;
+    }
+
+    /**
+     * Returns an initialized DateFormat object.
+     * @param dateTimeFormat optional format string
+     * @param tz
+     * @param locale can be null if dateTimeFormat is not null
+     * @return DateFormat object
+     */
+    public static DateFormat toDateTimeFormat(String dateTimeFormat, TimeZone tz, Locale locale) {
+        DateFormat df = null;
+        if (dateTimeFormat == null) {
+            df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
+        } else {
+            df = new SimpleDateFormat(dateTimeFormat);
+        }
+        df.setTimeZone(tz);
+        return df;
+    }
+
+    /**
+     * Returns an initialized DateFormat object.
+     * @param timeFormat optional format string
+     * @param tz
+     * @param locale can be null if timeFormat is not null
+     * @return DateFormat object
+     */
+    public static DateFormat toTimeFormat(String timeFormat, TimeZone tz, Locale locale) {
+        DateFormat df = null;
+        if (timeFormat == null) {
+            df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
+        } else {
+            df = new SimpleDateFormat(timeFormat);
+        }
+        df.setTimeZone(tz);
+        return df;
+    }
+
+    /**
      * Localized String to Timestamp conversion. To be used in tandem with timeStampToString().
-     *
      */
     public static Timestamp stringToTimeStamp(String dateTimeString, TimeZone tz, Locale locale) throws ParseException {
-        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
-        dateFormat.setTimeZone(tz);
+        return stringToTimeStamp(dateTimeString, null, tz, locale);
+    }
+
+    /**
+     * Localized String to Timestamp conversion. To be used in tandem with timeStampToString().
+     */
+    public static Timestamp stringToTimeStamp(String dateTimeString, String dateTimeFormat, TimeZone tz, Locale locale) throws ParseException {
+        DateFormat dateFormat = toDateTimeFormat(dateTimeFormat, tz, locale);
         Date parsedDate = dateFormat.parse(dateTimeString);
         return new Timestamp(parsedDate.getTime());
     }
 
     /**
      * Localized Timestamp to String conversion. To be used in tandem with stringToTimeStamp().
-     *
      */
     public static String timeStampToString(Timestamp stamp, TimeZone tz, Locale locale) {
-        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
+        return timeStampToString(stamp, null, tz, locale);
+    }
+
+    /**
+     * Localized Timestamp to String conversion. To be used in tandem with stringToTimeStamp().
+     */
+    public static String timeStampToString(Timestamp stamp, String dateTimeFormat, TimeZone tz, Locale locale) {
+        DateFormat dateFormat = toDateTimeFormat(dateTimeFormat, tz, locale);
         dateFormat.setTimeZone(tz);
         return dateFormat.format(stamp);
     }

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java Sat Aug 11 11:40:45 2007
@@ -19,14 +19,17 @@
 package org.ofbiz.base.util.string;
 
 import java.io.Serializable;
+import java.text.DateFormat;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 
 import org.ofbiz.base.util.BshUtil;
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.UtilFormatOut;
 import org.ofbiz.base.util.UtilMisc;
@@ -50,7 +53,7 @@
     protected String original;
     protected List stringElements = new LinkedList();
     protected static boolean localizeCurrency = false;
-    protected static String currencyCode = null;            
+    protected static String currencyCode = null;
     
     public FlexibleStringExpander(String original) {
         this.original = original;
@@ -142,6 +145,25 @@
      * @return The original String expanded by replacing varaible place holders.
      */
     public static String expandString(String original, Map context, Locale locale) {
+        return expandString(original, context, null, locale);
+    }
+    
+    /**
+     * Does on-the-fly parsing and expansion of the original String using
+     * varaible values from the passed context. Variables are denoted with
+     * the "${}" syntax and the variable name inside the curly-braces can use
+     * the "." (dot) syntax to access sub-Map entries and the "[]" square-brace
+     * syntax to access List elements.
+     * It Also supports the execution of bsh files by using the 'bsh:' prefix.
+     * Further it is possible to control the output by specifying the suffix
+     *     '?currency(XXX)' to format the output according the current locale
+     *     and specified (XXX) currency
+     *
+     * @param original The original String that will be expanded
+     * @param context A context Map containing the variable values
+     * @return The original String expanded by replacing varaible place holders.
+     */
+    public static String expandString(String original, Map context, TimeZone timeZone, Locale locale) {
         // if null or less than 3 return original; 3 chars because that is the minimum necessary for a ${}
         if (original == null || original.length() < 3) {
             return original;
@@ -166,14 +188,21 @@
         if (locale == null && context.containsKey("autoUserLogin")) {
             locale = UtilMisc.ensureLocale(((Map) context.get("autoUserLogin")).get("lastLocale"));
         }
+        
+        if (timeZone == null) {
+            timeZone = (TimeZone) context.get("timeZone");
+            if (timeZone == null) {
+                timeZone = TimeZone.getDefault();
+            }
+        }
 
         StringBuffer expanded = new StringBuffer();
         // TODO: for performance to save object build up and tear down times we should use Javolution to make OnTheFlyHandler reusable and use a factory methods instead of constructor
-        ParseElementHandler handler = new OnTheFlyHandler(expanded, context, locale);
+        ParseElementHandler handler = new OnTheFlyHandler(expanded, context, timeZone, locale);
         parseString(original, handler);
         
         //call back into this method with new String to take care of any/all nested expands
-        return expandString(expanded.toString(), context, locale);
+        return expandString(expanded.toString(), context, timeZone, locale);
     }
     
     public static void parseString(String original, ParseElementHandler handler) {
@@ -314,10 +343,12 @@
         protected StringBuffer targetBuffer;
         protected Map context;
         protected Locale locale;
+        protected TimeZone timeZone;
         
-        public OnTheFlyHandler(StringBuffer targetBuffer, Map context, Locale locale) {
+        public OnTheFlyHandler(StringBuffer targetBuffer, Map context, TimeZone timeZone, Locale locale) {
             this.targetBuffer = targetBuffer;
             this.context = context;
+            this.timeZone = timeZone;
             this.locale = locale;
         }
         
@@ -346,7 +377,19 @@
             FlexibleMapAccessor fma = new FlexibleMapAccessor(envName);
             Object envVal = fma.get(context, locale);
             if (envVal != null) {
-                if (localizeCurrency) {
+                if (envVal instanceof java.sql.Date) {
+                    DateFormat df = UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, timeZone, null);
+                    targetBuffer.append(df.format((java.util.Date) envVal));
+                } else if (envVal instanceof java.sql.Time) {
+                    DateFormat df = UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, timeZone, null);
+                    targetBuffer.append(df.format((java.util.Date) envVal));
+                } else if (envVal instanceof java.sql.Timestamp) {
+                    DateFormat df = UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, timeZone, null);
+                    targetBuffer.append(df.format((java.util.Date) envVal));
+                } else if (envVal instanceof java.util.Date) {
+                    DateFormat df = UtilDateTime.toDateTimeFormat("EEE MMM dd hh:mm:ss z yyyy", timeZone, null);
+                    targetBuffer.append(df.format((java.util.Date) envVal));
+                } else if (localizeCurrency) {
                     targetBuffer.append(UtilFormatOut.formatCurrency(new Double(envVal.toString()), currencyCode, locale));
                 } else {
                     targetBuffer.append(envVal.toString());

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/template/FreeMarkerWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/template/FreeMarkerWorker.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/template/FreeMarkerWorker.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/template/FreeMarkerWorker.java Sat Aug 11 11:40:45 2007
@@ -195,12 +195,11 @@
         }
         env.setLocale(locale);
 
-        /* uncomment code block when framework time zone support is implemented
         TimeZone timeZone = (TimeZone) context.get("timeZone");
         if (timeZone == null) {
             timeZone = TimeZone.getDefault();
         }
-        env.setTimeZone(timeZone); */
+        env.setTimeZone(timeZone);
     }
 
     public static Configuration getDefaultOfbizConfig() throws TemplateException, IOException {

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java Sat Aug 11 11:40:45 2007
@@ -707,7 +707,7 @@
      * @param mode The mode which to build the new map
      */
     public Map makeValid(Map source, String mode) {
-        return makeValid(source, mode, true, null, null);
+        return makeValid(source, mode, true, null);
     }
 
     /**
@@ -727,9 +727,22 @@
      * @param source The source map
      * @param mode The mode which to build the new map
      * @param includeInternal When false will exclude internal fields
-     * @param locale locale to use to do some type conversion
+     * @param locale Locale to use to do some type conversion
      */
     public Map makeValid(Map source, String mode, boolean includeInternal, List errorMessages, Locale locale) {
+        return makeValid(source, mode, includeInternal, errorMessages, null, locale);
+    }
+
+    /**
+     * Creates a new Map based from an existing map with just valid parameters.
+     * Tries to convert parameters to required type.
+     * @param source The source map
+     * @param mode The mode which to build the new map
+     * @param includeInternal When false will exclude internal fields
+     * @param tz TimeZone to use to do some type conversion
+     * @param locale Locale to use to do some type conversion
+     */
+    public Map makeValid(Map source, String mode, boolean includeInternal, List errorMessages, TimeZone timeZone, Locale locale) {
         Map target = new HashMap();
 
         if (source == null) {
@@ -741,6 +754,21 @@
         if (contextInfo.size() == 0) {
             return target;
         }
+
+        if (locale == null) {
+            locale = (Locale) source.get("locale");
+            if (locale == null) {
+                locale = Locale.getDefault();
+            }
+        }
+        
+        if (timeZone == null) {
+            timeZone = (TimeZone) source.get("timeZone");
+            if (timeZone == null) {
+                timeZone = TimeZone.getDefault();
+            }
+        }
+        
         Iterator i = contextParamList.iterator();
 
         while (i.hasNext()) {
@@ -770,7 +798,7 @@
 
                             try {
                                 // no need to fail on type conversion; the validator will catch this
-                                value = ObjectType.simpleTypeConvert(value, param.type, null, locale, false);
+                                value = ObjectType.simpleTypeConvert(value, param.type, null, timeZone, locale, false);
                             } catch (GeneralException e) {
                                 String errMsg = "Type conversion of field [" + key + "] to type [" + param.type + "] failed for value \"" + value + "\": " + e.toString();
                                 Debug.logWarning("[ModelService.makeValid] : " + errMsg, module);

Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java Sat Aug 11 11:40:45 2007
@@ -30,6 +30,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.TimeZone;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -201,6 +202,7 @@
         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
         //GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator");
         Locale locale = UtilHttp.getLocale(request);
+        TimeZone timeZone = UtilHttp.getTimeZone(request);
         
         Map params = UtilHttp.getParameterMap(request);
         // get the schedule parameters
@@ -291,7 +293,7 @@
             // set even if null so that values will get nulled in the db later on
             serviceContext.put(name, value);
         }    
-        serviceContext = modelService.makeValid(serviceContext, ModelService.IN_PARAM, true, null, locale);
+        serviceContext = modelService.makeValid(serviceContext, ModelService.IN_PARAM, true, null, timeZone, locale);
         
         if (userLogin != null) {
             serviceContext.put("userLogin", userLogin);                            

Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java Sat Aug 11 11:40:45 2007
@@ -294,7 +294,7 @@
         // get only the parameters for this service - converted to proper type
         // TODO: pass in a list for error messages, like could not convert type or not a proper X, return immediately with messages if there are any
         List errorMessages = new LinkedList();
-        serviceContext = model.makeValid(serviceContext, ModelService.IN_PARAM, true, errorMessages, locale);
+        serviceContext = model.makeValid(serviceContext, ModelService.IN_PARAM, true, errorMessages, timeZone, locale);
         if (errorMessages.size() > 0) {
             // uh-oh, had some problems...
             request.setAttribute("_ERROR_MESSAGE_LIST_", errorMessages);

Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/ServiceMultiEventHandler.java Sat Aug 11 11:40:45 2007
@@ -23,6 +23,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -110,6 +111,7 @@
 
         // some needed info for when running the service
         Locale locale = UtilHttp.getLocale(request);
+        TimeZone timeZone = UtilHttp.getTimeZone(request);
         HttpSession session = request.getSession();
         GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
 
@@ -207,6 +209,8 @@
                     if ("userLogin".equals(paramName)) continue;
                     // don't include locale, that is also taken care of below
                     if ("locale".equals(paramName)) continue;
+                    // don't include timeZone, that is also taken care of below
+                    if ("timeZone".equals(paramName)) continue;
 
                     Object value = null;
                     if (modelParam.stringMapPrefix != null && modelParam.stringMapPrefix.length() > 0) {
@@ -273,7 +277,7 @@
                 }
 
                 // get only the parameters for this service - converted to proper type
-                serviceContext = modelService.makeValid(serviceContext, ModelService.IN_PARAM, true, null, locale);
+                serviceContext = modelService.makeValid(serviceContext, ModelService.IN_PARAM, true, null, timeZone, locale);
 
                 // include the UserLogin value object
                 if (userLogin != null) {
@@ -283,6 +287,11 @@
                 // include the Locale object
                 if (locale != null) {
                     serviceContext.put("locale", locale);
+                }
+
+                // include the TimeZone object
+                if (timeZone != null) {
+                    serviceContext.put("timeZone", timeZone);
                 }
 
                 // Debug.logInfo("ready to call " + serviceName + " with context " + serviceContext, module);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java?view=diff&rev=564957&r1=564956&r2=564957
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Sat Aug 11 11:40:45 2007
@@ -19,6 +19,7 @@
 package org.ofbiz.widget.form;
 
 import java.math.BigDecimal;
+import java.text.DateFormat;
 import java.text.NumberFormat;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -27,6 +28,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.StringTokenizer;
+import java.util.TimeZone;
 
 import javolution.util.FastList;
 
@@ -615,6 +617,8 @@
         
         Locale locale = (Locale) context.get("locale");
         if (locale == null) locale = Locale.getDefault();
+        TimeZone timeZone = (TimeZone) context.get("timeZone");
+        if (timeZone == null) timeZone = TimeZone.getDefault();
         
         // if useRequestParameters is TRUE then parameters will always be used, if FALSE then parameters will never be used
         // if isError is TRUE and useRequestParameters is not FALSE (ie is null or TRUE) then parameters will be used
@@ -667,11 +671,23 @@
             }
 
             if (retVal != null) {
-                // format number based on the user's locale
+                // format string based on the user's locale and time zone
                 if (retVal instanceof Double || retVal instanceof Float || retVal instanceof BigDecimal) {
                     NumberFormat nf = NumberFormat.getInstance(locale);
                     nf.setMaximumFractionDigits(10);
                     return nf.format(retVal);
+                } else if (retVal instanceof java.sql.Date) {
+                    DateFormat df = UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, timeZone, null);
+                    return df.format((java.util.Date) retVal);
+                } else if (retVal instanceof java.sql.Time) {
+                    DateFormat df = UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, timeZone, null);
+                    return df.format((java.util.Date) retVal);
+                } else if (retVal instanceof java.sql.Timestamp) {
+                    DateFormat df = UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, timeZone, null);
+                    return df.format((java.util.Date) retVal);
+                } else if (retVal instanceof java.util.Date) {
+                    DateFormat df = UtilDateTime.toDateTimeFormat("EEE MMM dd hh:mm:ss z yyyy", timeZone, null);
+                    return df.format((java.util.Date) retVal);
                 } else {
                     return retVal.toString();
                 }