package org.activityinfo.legacy.shared.impl; import org.activityinfo.legacy.shared.model.IndicatorDTO; import org.activityinfo.legacy.shared.model.SiteDTO; import org.activityinfo.model.expr.eval.FieldReader; import org.activityinfo.model.expr.eval.FieldReaderFactory; import org.activityinfo.model.form.FormField; import org.activityinfo.model.legacy.CuidAdapter; import org.activityinfo.model.type.FieldType; import org.activityinfo.model.type.FieldValue; import org.activityinfo.model.type.number.Quantity; import org.activityinfo.model.type.number.QuantityType; public class SiteFieldReaderFactory implements FieldReaderFactory<SiteDTO> { @Override public FieldReader<SiteDTO> create(FormField field) { if(field.getType() instanceof QuantityType) { return new QuantityReader(field); } else { throw new UnsupportedOperationException("type: " + field.getType()); } } private static class QuantityReader implements FieldReader<SiteDTO> { private final QuantityType type; private final String propertyName; public QuantityReader(FormField field) { type = (QuantityType) field.getType(); propertyName = IndicatorDTO.getPropertyName(CuidAdapter.getLegacyIdFromCuid(field.getId())); } @Override public FieldValue readField(SiteDTO record) { Object value = record.get(propertyName); if(value instanceof Number) { return new Quantity(((Number) value).doubleValue(), type.getUnits()); } else { // TODO: Replace with use of an explicit default value when ready return new Quantity(0, type.getUnits()); } } @Override public FieldType getType() { return type; } } }