// Copyright 2015 The Project Buendia Authors // // 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 distrib- // uted 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 // specific language governing permissions and limitations under the License. package org.projectbuendia.client.models; import android.content.ContentValues; import com.google.common.base.Optional; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.projectbuendia.client.net.Server; import org.projectbuendia.client.json.JsonPatient; import org.projectbuendia.client.providers.Contracts; import org.projectbuendia.client.utils.Logger; import org.projectbuendia.client.utils.Utils; /** Represents the data to write to a new patient or the data to update on a patient. */ public class PatientDelta { public Optional<String> id = Optional.absent(); public Optional<String> givenName = Optional.absent(); public Optional<String> familyName = Optional.absent(); public Optional<Integer> gender = Optional.absent(); public Optional<LocalDate> birthdate = Optional.absent(); public Optional<LocalDate> admissionDate = Optional.absent(); public Optional<LocalDate> firstSymptomDate = Optional.absent(); public Optional<String> assignedLocationUuid = Optional.absent(); private static final Logger LOG = Logger.create(); /** Returns the {@link ContentValues} corresponding to the delta. */ public ContentValues toContentValues() { ContentValues cv = new ContentValues(); if (id.isPresent()) { cv.put(Contracts.Patients.ID, id.get()); } if (givenName.isPresent()) { cv.put(Contracts.Patients.GIVEN_NAME, givenName.get()); } if (familyName.isPresent()) { cv.put(Contracts.Patients.FAMILY_NAME, familyName.get()); } if (gender.isPresent()) { cv.put(Contracts.Patients.GENDER, gender.get() == JsonPatient.GENDER_MALE ? "M" : "F"); } if (birthdate.isPresent()) { cv.put(Contracts.Patients.BIRTHDATE, birthdate.get().toString()); } if (assignedLocationUuid.isPresent()) { cv.put(Contracts.Patients.LOCATION_UUID, assignedLocationUuid.get()); } return cv; } @Override public String toString() { JSONObject jsonObject = new JSONObject(); if (toJson(jsonObject)) { return jsonObject.toString(); } return super.toString(); } /** * Serializes the fields changed in the delta to a {@link JSONObject}. * @return whether serialization succeeded */ public boolean toJson(JSONObject json) { // TODO: Use a JsonPatient instead of all these field name constants. try { if (id.isPresent()) { json.put(Server.PATIENT_ID_KEY, id.get()); } if (givenName.isPresent()) { json.put(Server.PATIENT_GIVEN_NAME_KEY, givenName.get()); } if (familyName.isPresent()) { json.put(Server.PATIENT_FAMILY_NAME_KEY, familyName.get()); } if (gender.isPresent()) { json.put( Server.PATIENT_SEX_KEY, gender.get() == JsonPatient.GENDER_UNKNOWN ? "U" : gender.get() == JsonPatient.GENDER_MALE ? "M" : "F"); } if (birthdate.isPresent()) { json.put( Server.PATIENT_BIRTHDATE_KEY, Utils.toString(birthdate.get())); } JSONArray observations = new JSONArray(); if (admissionDate.isPresent()) { JSONObject observation = new JSONObject(); observation.put(Server.OBSERVATION_QUESTION_UUID, ConceptUuids.ADMISSION_DATE_UUID); observation.put( Server.OBSERVATION_ANSWER_DATE, Utils.toString(admissionDate.get())); observations.put(observation); } if (firstSymptomDate.isPresent()) { JSONObject observation = new JSONObject(); observation.put(Server.OBSERVATION_QUESTION_UUID, ConceptUuids.FIRST_SYMPTOM_DATE_UUID); observation.put( Server.OBSERVATION_ANSWER_DATE, Utils.toString(firstSymptomDate.get())); observations.put(observation); } if (observations != null) { json.put(Server.ENCOUNTER_OBSERVATIONS_KEY, observations); } if (assignedLocationUuid.isPresent()) { json.put( Server.PATIENT_ASSIGNED_LOCATION, getLocationObject(assignedLocationUuid.get())); } return true; } catch (JSONException e) { LOG.w(e, "Unable to serialize a patient delta to JSON."); return false; } } private static JSONObject getLocationObject(String assignedLocationUuid) throws JSONException { JSONObject location = new JSONObject(); location.put("uuid", assignedLocationUuid); return location; } private static long getTimestamp(DateTime dateTime) { return dateTime.toInstant().getMillis()/1000; } }