Using the long value for date/time parameters is probably the most reliable way to do it. The Work Effort calendar does it that way for some URL parameters.
Why use a custom type for parameters? You answered that question yourself: "It might actually be helpful to change how system generated object Strings are done, ie those not meant for human consumption..." Somewhere in the execution path there needs to be a way to flag data types as being intended to be used as parameters. My suggestion is to encapsulate the data in a Parameter data type, it sounds like your suggestion is to flag data types in some way or have data types destined for parameters be routed to some other execution path. I think it boils down to two different ways of looking at the problem. -Adrian --- On Thu, 5/13/10, David E Jones <d...@me.com> wrote: > Sorry, I meant for those questions to be an aspect of > rhetoric instead of trying to write out some sort of > requirement idea or issue. > > Whatever the case, your answer #3 is interesting... why use > a custom type with encoding/decoding when the current SQL > Date, Time, and Timestamp do so just fine (as long as you > use it's default toString and valueOf methods, with TimeZone > adjustment because the server will do that because we don't > distinguish between user input and system generated text). > It might actually be helpful to change how system generated > object Strings are done, ie those not meant for human > consumption, and for dates/times we could use an absolute > measure (like the millis from epoch) so that we don't have > to know which timezone the user is in to find the right > record in the database. > > I'm not sure if that's a good idea, but thought I'd throw > it out there... > > -David > > > On May 13, 2010, at 10:18 AM, Adrian Crum wrote: > > > 1. I don't know that it is official - it's more common > sense: If code exists to convert an object from one type to > another, why write more code that does the same thing? > > > > 2. I don't know. We would have to look for similar > code. > > > > 3. The best thing to do would be to use stronger data > typing. An HTTP (or URL) parameter should be a type - > instead of using a String. If we had a type for that, then > all kinds of convenient behavior could be attached to it > (like encoding/decoding, etc). > > > > -Adrian > > > > On 5/13/2010 9:09 AM, David E Jones wrote: > >> > >> Which brings up some questions: > >> > >> 1. is there an "official" way to convert types > that should be used everywhere (I think that's what you're > saying)? > >> 2. how many things are not using that? > >> 3. does the official way handle Object -> > String conversions for human versus machine (ie HTTP > parameter) use? > >> > >> -David > >> > >> > >> On May 13, 2010, at 8:54 AM, Adrian Crum wrote: > >> > >>> Just an observation, not commenting on this > commit specifically: > >>> > >>> The conversion to String should use the > ObjectType.simpleTypeConvert(...) method - there are a lot > of conversions being missed in this code. > >>> > >>> -Adrian > >>> > >>> On 5/13/2010 1:32 AM, jone...@apache.org > wrote: > >>>> Author: jonesde > >>>> Date: Thu May 13 08:32:09 2010 > >>>> New Revision: 943843 > >>>> > >>>> URL: http://svn.apache.org/viewvc?rev=943843&view=rev > >>>> Log: > >>>> Made widget link parameter treatment more > consistent; before if you specified a paramaeter name > without a from-field then it wouldn't convert the object > according to locale; now it does the same thing no matter > where the object comes from (ie explicit from-field or > implied by the parameter name); this fixes a timeZone > inconsistency that causes links with time/timestamp > parameters to not work > >>>> > >>>> Modified: > >>>> > ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java > >>>> > >>>> Modified: > ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java > >>>> URL: > >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java?rev=943843&r1=943842&r2=943843&view=diff > >>>> > ============================================================================== > >>>> --- > ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java > (original) > >>>> +++ > ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java > Thu May 13 08:32:09 2010 > >>>> @@ -30,6 +30,7 @@ import > javax.servlet.ServletContext; > >>>> import > javax.servlet.http.HttpServletRequest; > >>>> import > javax.servlet.http.HttpServletResponse; > >>>> > >>>> +import org.ofbiz.base.util.Debug; > >>>> import > org.ofbiz.base.util.StringUtil; > >>>> import > org.ofbiz.base.util.UtilDateTime; > >>>> import > org.ofbiz.base.util.UtilGenerics; > >>>> @@ -316,44 +317,41 @@ public class > WidgetWorker { > >>>> public > String getValue(Map<String, > Object> context) { > >>>> > if (this.value != null) { > >>>> > return > this.value.expandString(context); > >>>> - > } else if (this.fromField != > null&& this.fromField.get(context) > != null) { > >>>> - > Object retVal = this.fromField.get(context); > >>>> + > } > >>>> + > >>>> + > Object retVal = null; > >>>> + > if (this.fromField != > null&& this.fromField.get(context) > != null) { > >>>> + > retVal = this.fromField.get(context); > >>>> + > } else { > >>>> + > retVal = context.get(this.name); > >>>> + > } > >>>> + > >>>> + > if (retVal != null) { > >>>> + > TimeZone timeZone = (TimeZone) > context.get("timeZone"); > >>>> + > if (timeZone == null) timeZone = > TimeZone.getDefault(); > >>>> > >>>> - > if (retVal != null) { > >>>> - > TimeZone timeZone = (TimeZone) > context.get("timeZone"); > >>>> - > if (timeZone == null) timeZone = > TimeZone.getDefault(); > >>>> - > >>>> - > String returnValue = null; > >>>> - > // format string based on the > user's time zone (not locale because these are parameters) > >>>> - > if (retVal instanceof Double || > retVal instanceof Float || retVal instanceof BigDecimal) { > >>>> - > returnValue = > retVal.toString(); > >>>> - > } else if (retVal instanceof > java.sql.Date) { > >>>> - > DateFormat df = > UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, > timeZone, null); > >>>> - > returnValue = > df.format((java.util.Date) retVal); > >>>> - > } else if (retVal instanceof > java.sql.Time) { > >>>> - > DateFormat df = > UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, > timeZone, null); > >>>> - > returnValue = > df.format((java.util.Date) retVal); > >>>> - > } else if (retVal instanceof > java.sql.Timestamp) { > >>>> - > DateFormat df = > UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, > timeZone, null); > >>>> - > returnValue = > 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); > >>>> - > returnValue = > df.format((java.util.Date) retVal); > >>>> - > } else { > >>>> - > returnValue = > retVal.toString(); > >>>> - > } > >>>> - > return returnValue; > >>>> + > String returnValue = null; > >>>> + > // format string based on the user's time zone > (not locale because these are parameters) > >>>> + > if (retVal instanceof Double || retVal > instanceof Float || retVal instanceof BigDecimal) { > >>>> + > returnValue = > retVal.toString(); > >>>> + > } else if (retVal instanceof java.sql.Date) { > >>>> + > DateFormat df = > UtilDateTime.toDateFormat(UtilDateTime.DATE_FORMAT, > timeZone, null); > >>>> + > returnValue = > df.format((java.util.Date) retVal); > >>>> + > } else if (retVal instanceof java.sql.Time) { > >>>> + > DateFormat df = > UtilDateTime.toTimeFormat(UtilDateTime.TIME_FORMAT, > timeZone, null); > >>>> + > returnValue = > df.format((java.util.Date) retVal); > >>>> + > } else if (retVal instanceof > java.sql.Timestamp) { > >>>> + > DateFormat df = > UtilDateTime.toDateTimeFormat(UtilDateTime.DATE_TIME_FORMAT, > timeZone, null); > >>>> + > returnValue = > 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); > >>>> + > returnValue = > df.format((java.util.Date) retVal); > >>>> > } else { > >>>> - > return null; > >>>> + > returnValue = > retVal.toString(); > >>>> > } > >>>> + > return returnValue; > >>>> > } else { > >>>> - > // as a last chance try finding a context > field with the key of the name field > >>>> - > Object obj = context.get(this.name); > >>>> - > if (obj != null) { > >>>> - > return obj.toString(); > >>>> - > } else { > >>>> - > return null; > >>>> - > } > >>>> + > return null; > >>>> > } > >>>> } > >>>> } > >>>> > >>>> > >>>> > >> > >> > >