package uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json;
import org.joda.time.DateTime;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitDiseaseExtentClass;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitGlobalOrTropical;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.AdminUnitReview;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.DiseaseGroup;
import java.util.List;
import static ch.lambdaj.Lambda.*;
import static org.hamcrest.core.IsEqual.equalTo;
/**
* A DTO for the properties of an AdminUnit, with reference to a DiseaseGroup.
* Copyright (c) 2014 University of Oxford
*/
public class GeoJsonDiseaseExtentFeatureProperties {
private String name;
private String diseaseExtentClass;
private Integer occurrenceCount;
private boolean needsReview;
public GeoJsonDiseaseExtentFeatureProperties(AdminUnitDiseaseExtentClass adminUnitDiseaseExtentClass,
List<AdminUnitReview> reviews)
{
setName(adminUnitDiseaseExtentClass.getAdminUnitGlobalOrTropical().getPublicName());
setDiseaseExtentClass(
formatDisplayString(adminUnitDiseaseExtentClass.getValidatorDiseaseExtentClass().getName()));
setNeedsReview(computeNeedsReview(adminUnitDiseaseExtentClass, reviews));
setOccurrenceCount(adminUnitDiseaseExtentClass.getValidatorOccurrenceCount());
}
private String formatDisplayString(String s) {
s = s.replace("_", " ");
return s.charAt(0) + s.substring(1).toLowerCase();
}
// An AdminUnitDiseaseExtentClass needs reviewing if it has never been reviewed before,
// or if the disease extent has been generated since the most recent review.
private boolean computeNeedsReview(AdminUnitDiseaseExtentClass extentClass, List<AdminUnitReview> reviews) {
DateTime comparisonDate = getComparisonDate(extentClass.getDiseaseGroup());
DateTime reviewedDate = extractReviewedDate(reviews, extentClass.getAdminUnitGlobalOrTropical());
return reviewedDate == null || comparisonDate != null && comparisonDate.isAfter(reviewedDate);
}
/**
* Return the latest date (that is not null) between lastExtentGenerationDate and automaticModelRunsStartDate.
* @param diseaseGroup The disease group holding the two dates.
* @return The date against which to compare reviewed date.
*/
public DateTime getComparisonDate(DiseaseGroup diseaseGroup) {
return getLatest(diseaseGroup.getLastExtentGenerationDate(), diseaseGroup.getAutomaticModelRunsStartDate());
}
private DateTime getLatest(DateTime date1, DateTime date2) {
if (date1 == null) {
return date2;
} else if (date2 == null) {
return date1;
} else {
return date1.isAfter(date2) ? date1 : date2;
}
}
private DateTime extractReviewedDate(List<AdminUnitReview> reviews, AdminUnitGlobalOrTropical adminUnit) {
List<AdminUnitReview> reviewsOfAdminUnit = select(reviews,
having(on(AdminUnitReview.class).getAdminUnitGlobalOrTropicalGaulCode(), equalTo(adminUnit.getGaulCode())));
return max(reviewsOfAdminUnit, on(AdminUnitReview.class).getCreatedDate());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDiseaseExtentClass() {
return diseaseExtentClass;
}
public void setDiseaseExtentClass(String diseaseExtentClass) {
this.diseaseExtentClass = diseaseExtentClass;
}
public Integer getOccurrenceCount() {
return occurrenceCount;
}
public void setOccurrenceCount(Integer occurrenceCount) {
this.occurrenceCount = occurrenceCount;
}
public boolean getNeedsReview() {
return needsReview;
}
public void setNeedsReview(boolean needsReview) {
this.needsReview = needsReview;
}
///COVERAGE:OFF - generated code
///CHECKSTYLE:OFF AvoidInlineConditionalsCheck|LineLengthCheck|MagicNumberCheck|NeedBracesCheck - generated code
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GeoJsonDiseaseExtentFeatureProperties)) return false;
GeoJsonDiseaseExtentFeatureProperties that = (GeoJsonDiseaseExtentFeatureProperties) o;
if (diseaseExtentClass != null ? !diseaseExtentClass.equals(that.diseaseExtentClass) : that.diseaseExtentClass != null)
return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return true;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (diseaseExtentClass != null ? diseaseExtentClass.hashCode() : 0);
return result;
}
///CHECKSTYLE:ON
///COVERAGE:ON
}