/* * Copyright (c) 2015 OpenSilk Productions LLC * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * */ package syncthing.api; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.joda.time.DateTime; import java.lang.reflect.Type; import java.util.Date; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import syncthing.api.model.Versioning; import syncthing.api.model.VersioningTypeConverter; import syncthing.api.model.event.Event; import syncthing.api.model.event.EventDeserializer; /** * Created by drew on 3/8/15. */ @Module public class GsonModule { @Provides @Singleton public Gson provideGson() { return new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) .registerTypeAdapter(DateTime.class, new DateTimeTypeConverter()) .registerTypeAdapter(Event.class, new EventDeserializer()) .registerTypeAdapter(Versioning.class, new VersioningTypeConverter()) .create(); } private static class DateTimeTypeConverter implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> { @Override public JsonElement serialize(DateTime src, Type srcType, JsonSerializationContext context) { return new JsonPrimitive(src.toString()); } @Override public DateTime deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { try { return new DateTime(json.getAsString()); } catch (IllegalArgumentException e) { // May be it came in formatted as a java.util.Date, so try that Date date = context.deserialize(json, Date.class); return new DateTime(date); } } } }