/*
 * Copyright 2015 Martijn van der Woud - The Crimson Cricket Internet Services
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 *
 */

package com.crimsoncricket.ddd.application;

import com.crimsoncricket.ddd.application.EventSerializer;
import com.crimsoncricket.ddd.domain.model.DomainEvent;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import static com.crimsoncricket.asserts.Assert.assertArgumentNotNull;

public class EventSerializerJSON implements EventSerializer {

    private Gson gson;

    public EventSerializerJSON() {
        this.gson = new GsonBuilder().create();
    }

    @Override
    public String serialize(DomainEvent anEvent) {
        assertArgumentNotNull(anEvent, "The domain event may not be null.");
        return gson.toJson(anEvent);
    }

    @Override
    public <T extends DomainEvent> T unserialize(String serializedEvent, Class<T> eventClass) {
        return gson.fromJson(serializedEvent, eventClass);
    }


}

@@ -747,91 +747,175 @@
 ddd.
-application.EventSerializer;%0Aimport com.crimsoncricket.ddd.domain.model.DomainEvent
+domain.model.DomainEvent;%0Aimport com.google.gson.Gson;%0Aimport com.google.gson.GsonBuilder;%0Aimport com.google.gson.TypeAdapter;%0Aimport com.google.gson.stream.JsonReader
 ;%0Aim
@@ -927,35 +927,47 @@
 com.google.gson.
-Gso
+stream.JsonToke
 n;%0Aimport com.go
@@ -976,27 +976,87 @@
 le.gson.
-GsonBuilder
+stream.JsonWriter;%0A%0Aimport java.io.IOException;%0Aimport java.time.ZoneId
 ;%0A%0Aimpor
@@ -1281,16 +1281,737 @@
 uilder()
+%0A                .registerTypeAdapter(ZoneId.class, new TypeAdapter%3CZoneId%3E() %7B%0A                    @Override%0A                    public void write(JsonWriter out, ZoneId value) throws IOException %7B%0A                        out.value(value == null ? null : value.getId());%0A                    %7D%0A                    @Override%0A                    public ZoneId read(JsonReader in) throws IOException %7B%0A                        if (in.peek() == JsonToken.NULL) %7B%0A                            in.nextNull();%0A                            return null;%0A                        %7D else %7B%0A                            return ZoneId.of(in.nextString());%0A                        %7D%0A                    %7D%0A                %7D)%0A                
 .create(

Add serializer type adapter for java.time.ZoneId