package org.activityinfo.core.shared.type.converter; import org.activityinfo.model.type.FieldTypeClass; import org.activityinfo.core.shared.type.formatter.DateFormatter; import org.activityinfo.core.shared.type.formatter.QuantityFormatterFactory; import java.util.logging.Logger; /** * Provides Converters between supported types. * * * */ public class ConverterFactory { private static final Logger LOGGER = Logger.getLogger(ConverterFactory.class.getName()); private final DateToStringConverter dateToStringConverter; private final QuantityToStringConverter quantityParser; private final StringToQuantityConverter stringToQuantityFormatter; private CoordinateParser.NumberFormatter coordinateNumberFormatter; public ConverterFactory(QuantityFormatterFactory quantityFormatterFactory, DateFormatter dateFormatter, CoordinateParser.NumberFormatter coordinateNumberFormatter) { this.coordinateNumberFormatter = coordinateNumberFormatter; quantityParser = new QuantityToStringConverter(quantityFormatterFactory.create()); stringToQuantityFormatter = new StringToQuantityConverter(quantityFormatterFactory.create()); dateToStringConverter = new DateToStringConverter(dateFormatter); } public Converter create(FieldTypeClass from, FieldTypeClass to) { if(from == to) { return NullConverter.INSTANCE; } if(from == FieldTypeClass.FREE_TEXT || from == FieldTypeClass.NARRATIVE) { return createStringConverter(to); } else if(from == FieldTypeClass.QUANTITY) { return createQuantityConverter(to); } else if(from == FieldTypeClass.LOCAL_DATE) { return createDateConverter(to); } else if(from == FieldTypeClass.REFERENCE) { throw new IllegalArgumentException("Reference fields are handled elsewhere"); } throw new UnsupportedOperationException("Conversion from " + from + " to " + to + " is not supported."); } private Converter createDateConverter(FieldTypeClass to) { if(to == FieldTypeClass.FREE_TEXT || to == FieldTypeClass.NARRATIVE) { return dateToStringConverter; } throw new UnsupportedOperationException(to.getId()); } public Converter createQuantityConverter(FieldTypeClass to) { if(to == FieldTypeClass.FREE_TEXT || to == FieldTypeClass.NARRATIVE) { return quantityParser; } throw new UnsupportedOperationException(to.getId()); } public Converter createStringConverter(FieldTypeClass fieldType) { if(fieldType == FieldTypeClass.QUANTITY) { return stringToQuantityFormatter; } else if(fieldType == FieldTypeClass.LOCAL_DATE) { return StringToDateConverter.INSTANCE; } else if(fieldType == FieldTypeClass.FREE_TEXT || fieldType == FieldTypeClass.NARRATIVE) { return NullConverter.INSTANCE; } throw new UnsupportedOperationException(fieldType.getId()); } public CoordinateParser.NumberFormatter getCoordinateNumberFormatter() { return coordinateNumberFormatter; } }