package mil.nga.giat.mage.sdk.gson.deserializer; import android.content.Context; import android.util.Log; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import mil.nga.giat.mage.sdk.datastore.user.Event; import mil.nga.giat.mage.sdk.datastore.user.Team; import mil.nga.giat.mage.sdk.datastore.user.TeamHelper; import mil.nga.giat.mage.sdk.exceptions.TeamException; /** * JSON to {@link Event} * * @author newmanw * */ public class EventsDeserializer implements JsonDeserializer<Map<Event, Collection<Team>>> { private static final String LOG_NAME = EventsDeserializer.class.getName(); private TeamHelper teamHelper; private Gson teamDeserializer; private Gson eventDeserializer; public EventsDeserializer(Context context) { teamHelper = TeamHelper.getInstance(context); teamDeserializer = TeamDeserializer.getGsonBuilder(); eventDeserializer = EventDeserializer.getGsonBuilder(); } /** * Convenience method for returning a Gson object with a registered GSon * TypeAdaptor i.e. custom deserializer. * * @return A Gson object that can be used to convert Json into a {@link Event}. */ public static Gson getGsonBuilder(Context context) { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(new TypeToken<Map<Event, Collection<Team>>>(){}.getType(), new EventsDeserializer(context)); return gsonBuilder.create(); } @Override public Map<Event, Collection<Team>> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { Map<Event, Collection<Team>> events = new HashMap<>(); for (JsonElement element : json.getAsJsonArray()) { JsonObject jsonEvent = element.getAsJsonObject(); Event event = eventDeserializer.fromJson(jsonEvent, Event.class); Collection<Team> teams = deserializeTeams(jsonEvent.getAsJsonArray("teams")); events.put(event, teams); } return events; } private Collection<Team> deserializeTeams(JsonArray jsonTeams) { Collection<Team> teams = new ArrayList<>(); for (JsonElement element : jsonTeams) { JsonObject jsonTeam = element.getAsJsonObject(); Team team = null; try { team = teamHelper.read(jsonTeam.get("id").getAsString()); } catch (TeamException e) { Log.e(LOG_NAME, "Error reading user from database", e); } if (team == null) { team = teamDeserializer.fromJson(jsonTeam.toString(), Team.class); } if (team != null) { teams.add(team); } } return teams; } }