Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

package gov.va.med.pbm.ampl.asset.mock;

import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import gov.va.med.pbm.ampl.asset.mock.measurements.Measure;
import gov.va.med.pbm.ampl.asset.mock.measurements.MeasureFactory;
import gov.va.med.pbm.ampl.constant.MockDataConstants;
import gov.va.med.pbm.ampl.controller.EnvironmentInternalController;
import gov.va.med.pbm.ampl.model.Measurement;
import gov.va.med.pbm.ampl.model.ValueQuantity;
import gov.va.med.pbm.ampl.utility.DateUtility;
import gov.va.med.pbm.ampl.utility.NumberUtility;

/**
* This class generates mock data for the {@link EnvironmentInternalController} end points .
*
* @author Ian Meinert
* @author Pavani Mukthipudi
*
* @since 1.0
*/
public class MeasurementData {

private String patientId;

/**
* The application logger.
*/
static final Logger LOGGER = LoggerFactory.getLogger(MeasurementData.class);

/**
* Single parameter constructor.
*
* @param patientId {@link Long}
*/
public MeasurementData(String patientId) {
this.patientId = patientId;
}

/**
* Generates a {@link Measurement} {@link Collection} used in mock cases.
*
* @param c the count of {@link Measurement} to create
* @return a {@link Collection} of {@link Measurement} with mock data
*/
public Collection<Measurement> testMeasurementsForPatient(int c) {
Collection<Measurement> vc = new ArrayList<Measurement>();

// REQUIRED FOR VITALS SUMMARY - DON'T DELETE
String[] vitalType = { "TEMPERATURE", "RESPIRATION", "PULSE OXIMETRY", "BLOOD PRESSURE", "PULSE", "HEIGHT", "WEIGHT",
"PAIN", "HEAD CIRCUMFERENCE", "LENGTH" };
for (int i = 0; i < c; i++) {
vc.add(this.createRequiredMeasurements(vitalType[i % MockDataConstants.TEN]));
}

// Some calculations require certain vitals to be present to function.
// Let's add these now
vc.add(this.createRequiredMeasurements("HEIGHT"));
vc.add(this.createRequiredMeasurements("WEIGHT"));
vc.add(this.createRequiredMeasurements("CREATININE"));

return vc;
}

/**
* This method will return the latest entered of each type of measurement.
*
* @param baseCollection collection of {@link Measurement}
* @return filtered collection of {@link Measurement}
*/
public Collection<Measurement> getMeasuresLast(Collection<Measurement> baseCollection) {
Collection<Measurement> measurements = new ArrayList<Measurement>();

for (Measurement item : baseCollection) {
// if the returning collection doesnt contain a given measurement name, add it
if (measurements.stream().noneMatch(m -> m.getName().equals(item.getName()))) {
measurements.add(item);
} else {
// iterate over each in stack. if found, compare the entered date
finalCollectionLoop: for (Measurement measurement : measurements) {
if (measurement.getName().equals(item.getName())) {
int dateCompare = measurement.getEntered().compareTo(item.getEntered());

// measurement date entered is older than item date entered
if (dateCompare < 0) {
measurements.remove(measurement);
measurements.add(item);

break finalCollectionLoop;
}
}
}
}
}

return measurements;
}

/**
* Creates a {@link Measurement} containing sample data.
*
* @param name the {@link Measurement} name
* @return mock {@link Measurement}
*/
private Measurement createRequiredMeasurements(String name) {
Measurement m = new Measurement();
FacilityData f = new FacilityData();

int k = NumberUtility.randomBetween(MockDataConstants.ZERO, MockDataConstants.SEVEN);
OffsetDateTime dt = DateUtility.randomOffsetDateTime(MockDataConstants.TWO_K, MockDataConstants.TWO_K_EIGHTTEEN);

this.setValueQuantities(name, m);

m.setEntered(dt.plusMinutes(NumberUtility.randomBetween(1, MockDataConstants.FIFTY_NINE)));
m.setEnteredBy("enteredBy_" + k);
m.setFacility(f.testFacilityForPatient(k));
m.setFlag("flag_" + k);
m.setHospitalLocation("hospitalLocation_" + k);
m.setName(name);
m.setPatientId(patientId);
m.setQualifier("qualifier_" + k);
m.setRange("range_" + k);
m.setRate("rate_" + k);
m.setSupplementalOxygen("supplementalOxygen_" + k);
m.setTimeTaken(dt);

return m;
}

/**
* This method sets the {@link ValueQuantity} for each imperial and metric field.
*
* @param name the name of the measurement
* @param m the {@link Measurement}
*/
private void setValueQuantities(String name, Measurement m) {
Measure measure = MeasureFactory.getMeasureType(name);

m.setImperial(measure.getImperial());
m.setMetric(measure.getMetric());
}
}