package uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import org.apache.commons.lang.ObjectUtils;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseOccurrence;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Location;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.LocationPrecision;
import uk.ac.ox.zoo.seeg.abraid.mp.common.service.workflow.support.ModellingLocationPrecisionAdjuster;
/**
* A DTO to represent a DiseaseOccurrence in an R compatible form (NA instead of null), without a weighting.
* Used for CSV serialization of bias occurrences for modelling.
* Copyright (c) 2014 University of Oxford
*/
@JsonPropertyOrder({ "longitude", "latitude", "admin", "gaul", "disease", "date" })
public class JsonBiasModellingDiseaseOccurrence {
private static final String R_CODE_NULL_IDENTIFIER = "NA";
@JsonProperty("Longitude")
private double longitude;
@JsonProperty("Latitude")
private double latitude;
@JsonProperty("Admin")
private int admin;
@JsonProperty("GAUL")
private String gaul;
@JsonProperty("Disease")
private int disease;
@JsonProperty("Date")
private String date;
public JsonBiasModellingDiseaseOccurrence(ModellingLocationPrecisionAdjuster precisionAdjuster,
double longitude, double latitude,
int admin, String gaul, int disease, String date) {
setLongitude(longitude);
setLatitude(latitude);
setAdmin(precisionAdjuster.adjust(admin, gaul));
setGaul(gaul);
setDisease(disease);
setDate(date);
}
public JsonBiasModellingDiseaseOccurrence(ModellingLocationPrecisionAdjuster precisionAdjuster,
DiseaseOccurrence occurrence) {
this(precisionAdjuster,
occurrence.getLocation().getGeom().getX(),
occurrence.getLocation().getGeom().getY(),
occurrence.getLocation().getPrecision().getModelValue(),
extractGaulString(occurrence.getLocation()),
occurrence.getDiseaseGroup().getId(),
extractDateString(occurrence.getOccurrenceDate()));
}
/**
* Gets the string representing a date for use in the model data.
* @param occurrenceDate The date to format.
* @return The date string.
*/
protected static String extractDateString(DateTime occurrenceDate) {
return ISODateTimeFormat.date().print(occurrenceDate);
}
/**
* Gets the string representing the GAUL code to use in the model data.
* @param location The occurrence location.
* @return The GAUL code string.
*/
protected static String extractGaulString(Location location) {
if (location.getPrecision().equals(LocationPrecision.PRECISE)) {
return replaceNullGaul(null);
} else if (location.getPrecision().equals(LocationPrecision.COUNTRY)) {
return replaceNullGaul(location.getCountryGaulCode());
} else {
return replaceNullGaul(location.getAdminUnitQCGaulCode());
}
}
private static String replaceNullGaul(Integer gaul) {
return (gaul == null) ? R_CODE_NULL_IDENTIFIER : ObjectUtils.toString(gaul);
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public int getAdmin() {
return admin;
}
public void setAdmin(int admin) {
this.admin = admin;
}
public String getGaul() {
return gaul;
}
public void setGaul(String gaul) {
this.gaul = (gaul == null) ? R_CODE_NULL_IDENTIFIER : gaul;
}
public int getDisease() {
return disease;
}
public void setDisease(int disease) {
this.disease = disease;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}