package org.openlmis.core.network.adapter; 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.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.inject.Inject; import org.openlmis.core.LMISApp; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.model.Regimen; import org.openlmis.core.model.RegimenItem; import org.openlmis.core.model.repository.RegimenRepository; import java.lang.reflect.Type; import roboguice.RoboGuice; import static org.openlmis.core.model.Regimen.RegimeType; public class RegimenItemAdapter implements JsonSerializer<RegimenItem>, JsonDeserializer<RegimenItem> { private final Gson gson; @Inject public RegimenRepository regimenRepository; public RegimenItemAdapter() { RoboGuice.getInjector(LMISApp.getContext()).injectMembersWithoutViews(this); gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); } @Override public RegimenItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { RegimenItem regimenItem = gson.fromJson(json, RegimenItem.class); RegimeType regimeType = null; String categoryName = json.getAsJsonObject().get("categoryName").getAsString(); if(categoryName.equals(RegimeType.Adults.toString())) { regimeType = RegimeType.Adults; } else if (categoryName.equals(RegimeType.Paediatrics.toString())) { regimeType = RegimeType.Paediatrics; } try { Regimen regimen = regimenRepository.getByNameAndCategory(json.getAsJsonObject().get("name").getAsString(), regimeType); if (regimen == null) { regimen = createRegimen(json); } regimenItem.setRegimen(regimen); } catch (LMISException e) { e.reportToFabric(); throw new JsonParseException("can not find RegimenItem by name and category"); } return regimenItem; } private Regimen createRegimen(JsonElement json) throws LMISException { Regimen regimen = gson.fromJson(json, Regimen.class); regimen.setCustom(true); regimenRepository.create(regimen); return regimen; } @Override public JsonElement serialize(RegimenItem src, Type typeOfSrc, JsonSerializationContext context) { JsonParser jsonParser = new JsonParser(); JsonObject result = jsonParser.parse(gson.toJson(src.getRegimen())).getAsJsonObject(); result.addProperty("patientsOnTreatment", src.getAmount()); return result; } }