nl.strohalm.cyclos.entities.accounts.external.filemapping.FileMappingWithFields.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.entities.accounts.external.filemapping.FileMappingWithFields.java

Source

/*
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;
    }

}