package org.activityinfo.core.shared.importing.strategy; import org.activityinfo.core.client.ResourceLocator; import org.activityinfo.model.form.FormInstance; import org.activityinfo.core.shared.importing.source.SourceRow; import org.activityinfo.core.shared.importing.validation.ValidationResult; import org.activityinfo.core.shared.type.converter.Converter; import org.activityinfo.promise.Promise; import java.util.Collections; import java.util.List; /** * Imports simple data fields using the supplied converter. */ public class DataFieldImporter implements FieldImporter { private ColumnAccessor source; private ImportTarget target; private Converter converter; public DataFieldImporter(ColumnAccessor source, ImportTarget target, Converter converter) { this.source = source; this.target = target; this.converter = converter; } @Override public Promise<Void> prepare(ResourceLocator locator, List<? extends SourceRow> batch) { return Promise.done(); } @Override public void validateInstance(SourceRow row, List<ValidationResult> results) { results.add(validate(row)); } private ValidationResult validate(SourceRow row) { if(source.isMissing(row)) { if(target.getFormField().isRequired()) { return ValidationResult.error("Required value is missing"); } else { return ValidationResult.MISSING; } } try { Object value = converter.convert(source.getValue(row)); return ValidationResult.OK; } catch(Exception e) { return ValidationResult.error(e.getMessage()); } } @Override public boolean updateInstance(SourceRow row, FormInstance instance) { final ValidationResult validateResult = validate(row); if (validateResult.shouldPersist()) { instance.set(target.getFormField().getId(), converter.convert(source.getValue(row))); return true; } return false; } @Override public List<FieldImporterColumn> getColumns() { return Collections.singletonList(new FieldImporterColumn(target, source)); } }