For the archives:

On 25 Sep 2015, at 8:56 am, Paul Hoadley <[email protected]> wrote:

> On 23 Sep 2015, at 10:12 pm, Philippe Rabier <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> You have to modify ERXRestUtils but I’m surprised it’s not already done.
> 
> AFAICS, it’s done for LocalDateTime and LocalDate, but not LocalTime (or 
> DateTime).
> 
>> There are 2 methods:
>> - convertValue to build the output
>> - coerceValueToTypeNamed to convert input data
>> 
>> For example, we wanted to support epoch format for NSTimestamp attributes so 
>> we modified a little bit ERXRestUtils and ERXRestRequestNode:
>> https://github.com/Sophiacom/wonder/tree/sophiacom/Frameworks/EOF/ERRest/Sources/er/rest
>>  
>> <https://github.com/Sophiacom/wonder/tree/sophiacom/Frameworks/EOF/ERRest/Sources/er/rest>
>> 
>> This part should be refactored because it’s too big. But we moved away from 
>> the full ERRest stack so we won’t do it, I think, because we won’t be able 
>> to test this modifications in production.
> 
> Thanks for the background. I thought that might be where all the magic 
> happens, but I was also hoping someone would tell me there was an extensible 
> way to plug in new types. That would certainly be a nice feature.

I dove into ERXRestUtils with limited (well, no) success—it’s not clear to me 
how/when these methods are used. Since I only need this working on the output 
side for now, I extended ERXJSONRestWriter to register a custom 
JsonValueProcessor class for the LocalTime type:

        @Override
        protected JsonConfig configWithContext(ERXRestContext context) {
                JsonConfig result = super.configWithContext(context);
                result.registerJsonValueProcessor(LocalTime.class,
                                new LocalTimeProcessor(context));
                return result;
        }

LocalTimeProcessor then implements:

        @Override
        public Object processArrayValue(Object value, JsonConfig config) {
                if (value == null) {
                        return null;
                } else {
                        DateTimeFormatter fmt = 
DateTimeFormat.forPattern("HH:mm");
                        return fmt.print((LocalTime) value);
                }
        }

        @Override
        public Object processObjectValue(String key, Object value,
                        JsonConfig config) {
                return processArrayValue(value, config);
        }

And I then register the new writer in didFinishLaunching():

        ERXRestFormat.registerFormatNamed(new ERXJSONRestParser(),
                        new LSJSONRestWriter(), new ERXRestFormatDelegate(),
                        ERXRestFormat.JSON_KEY, "application/json");

Critiques welcome. Here’s one: this only adds the new LocalTime type for JSON 
output. While this is fine (because (a) I only want JSON, and (b) both XML and 
plist output already do something sensible with that type), it can’t be an 
appropriate general way to add new types. Are custom types covered in a WOWODC 
talk I missed? Pascal?


-- 
Paul Hoadley
http://logicsquad.net/



 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to