/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Cyclos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.entities.accounts.external.filemapping; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Calendar; import java.util.Collection; import nl.strohalm.cyclos.entities.Relationship; import nl.strohalm.cyclos.utils.StringValuedEnum; import nl.strohalm.cyclos.utils.conversion.BooleanConverter; import nl.strohalm.cyclos.utils.conversion.CalendarConverter; import nl.strohalm.cyclos.utils.conversion.Converter; import nl.strohalm.cyclos.utils.conversion.FixedLengthNumberConverter; import nl.strohalm.cyclos.utils.conversion.NumberConverter; import org.apache.commons.lang.StringUtils; /** * A file mapping that has mapped fields * @author luis */ public abstract class FileMappingWithFields extends FileMapping { /** * A format for parsing numbers * @author luis */ public enum NumberFormat implements StringValuedEnum { FIXED_POSITION("F"), WITH_SEPARATOR("S"); private final String value; private NumberFormat(final String value) { this.value = value; } public String getValue() { return value; } } public static enum Relationships implements Relationship { FIELDS("fields"); private final String name; private Relationships(final String name) { this.name = name; } public String getName() { return name; } } public static final NumberFormat DEFAULT_NUMBER_FORMAT = NumberFormat.FIXED_POSITION; public static final Character DEFAULT_NEGATIVE_AMOUNT_VALUE = new Character('-'); public static final Integer DEFAULT_DECIMAL_PLACES = new Integer(2); public static final Character DEFAULT_DECIMAL_SEPARATOR = new Character('.'); public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; private static final long serialVersionUID = -6761459914402653154L; private NumberFormat numberFormat; private String negativeAmountValue; private Integer decimalPlaces; private Character decimalSeparator; private String dateFormat; private Collection<FieldMapping> fields; /** * Returns a converter for date */ public Converter<Calendar> getDateConverter() { final String format = dateFormat.toLowerCase().replace('m', 'M'); return new CalendarConverter(format); } public String getDateFormat() { return dateFormat; } public Integer getDecimalPlaces() { return decimalPlaces; } public Character getDecimalSeparator() { return decimalSeparator; } public Collection<FieldMapping> getFields() { return fields; } /** * Returns a converter for negateAmount */ public Converter<Boolean> getNegateAmountConverter() { return new BooleanConverter(String.valueOf(negativeAmountValue)); } public String getNegativeAmountValue() { return negativeAmountValue; } /** * Returns a converter for amount */ public Converter<BigDecimal> getNumberConverter() { if (numberFormat == NumberFormat.FIXED_POSITION) { return new FixedLengthNumberConverter<BigDecimal>(BigDecimal.class, decimalPlaces); } else { final DecimalFormatSymbols symbols = new DecimalFormatSymbols(); symbols.setDecimalSeparator(decimalSeparator); symbols.setGroupingSeparator('!'); final DecimalFormat format = new DecimalFormat("0." + StringUtils.repeat("0", decimalPlaces), symbols); format.setGroupingUsed(false); return new NumberConverter<BigDecimal>(BigDecimal.class, format); } } public NumberFormat getNumberFormat() { return numberFormat; } public void setDateFormat(final String dateFormat) { this.dateFormat = dateFormat; } public void setDecimalPlaces(final Integer decimalPlaces) { this.decimalPlaces = decimalPlaces; } public void setDecimalSeparator(final Character decimalSeparator) { this.decimalSeparator = decimalSeparator; } public void setFields(final Collection<FieldMapping> fields) { this.fields = fields; } public void setNegativeAmountValue(final String negativeAmountValue) { this.negativeAmountValue = negativeAmountValue; } public void setNumberFormat(final NumberFormat numberFormat) { this.numberFormat = numberFormat; } }