All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nerd4j.csv.registry.CSVFieldConverterRegistry Maven / Gradle / Ivy

There is a newer version: 1.2.0
Show newest version
/*
 * #%L
 * Nerd4j CSV
 * %%
 * Copyright (C) 2013 Nerd4j
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * This program 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 Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * .
 * #L%
 */
package org.nerd4j.csv.registry;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import org.nerd4j.csv.exception.CSVConfigurationException;
import org.nerd4j.csv.field.CSVFieldConverter;
import org.nerd4j.csv.field.converter.BooleanToString;
import org.nerd4j.csv.field.converter.DateToString;
import org.nerd4j.csv.field.converter.EmptyCSVFieldConverter;
import org.nerd4j.csv.field.converter.EnumToString;
import org.nerd4j.csv.field.converter.NumberToString;
import org.nerd4j.csv.field.converter.StringToBoolean;
import org.nerd4j.csv.field.converter.StringToDate;
import org.nerd4j.csv.field.converter.StringToEnum;
import org.nerd4j.csv.field.converter.StringToNumber;
import org.nerd4j.i18n.LocaleUtil;


/**
 * Represents a registry of {@link CSVFieldConverter}s.
 * 
 * 

* This registry is internally used to refer {@link CSVFieldConverter}s by name. * It is possible to register custom providers able to provide custom converters. *

* *

* The following converters are registered by default: *

    *
  • parseByte : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseShort : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseInteger : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseLong : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseFloat : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseDouble : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseBigInteger : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseBigDecimal : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseAtomicInteger : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • parseAtomicLong : pattern = the number parse pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
    *
  • formatByte : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatShort : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatInteger : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatLong : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatFloat : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatDouble : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatBigInteger : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatBigDecimal : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatAtomicInteger: pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
  • formatAtomicLong : pattern = the number format pattern (optional) * locale = the pattern locale for symbols (optional)
  • *
    *
  • parseBoolean : no parameters
  • *
  • formatBoolean : no parameters
  • *
    *
  • parseDate : pattern = the date format pattern (mandatory) * time-zone = input date timezone (optional)
  • *
  • formatDate : pattern = the date format pattern (mandatory) * time-zone = output date timezone (optional)
  • *
    *
  • parseEnum : enum-type = the fully qualified enum class name (mandatory)
  • *
  • formatEnum : enum-type = the fully qualified enum class name (mandatory)
  • *
*

* * @author Nerd4j Team */ final class CSVFieldConverterRegistry extends CSVAbstractRegistry> { /** * Default constructor. * */ public CSVFieldConverterRegistry() { super(); this.registerDefaults(); } /* *************** */ /* INNER CLASSES */ /* *************** */ /** * Represents a provider able to create {@link String} to {@link Number} converters. * * @param type of the {@link Number} to be returned. * * @author Nerd4j Team */ private static final class StringToNumberProvider implements CSVRegistryEntryProvider> { /** The type of the {@link Number} to be returned. */ private final Class numberType; /** * Constructor with parameters. * * @param numberType one of the accepted implementations of the {@link Number}. */ public StringToNumberProvider( final Class numberType ) { super(); this.numberType = numberType; } /** * {@inheritDoc} */ @Override public CSVFieldConverter get( Map params ) { final String pattern = params.get("pattern"); final String nlocale = params.get("locale"); final Locale locale = nlocale == null ? null : LocaleUtil.getLocale(nlocale); return new StringToNumber( numberType, pattern, locale ); } } /** * Represents a provider able to create {@link Number} to {@link String} converters. * * @param type of the {@link Number} to be returned. * * @author Nerd4j Team */ private static final class NumberToStringProvider implements CSVRegistryEntryProvider> { /** * Constructor with parameters. * * @param numberType one of the accepted implementations of the {@link Number}. */ public NumberToStringProvider() { super(); } /** * {@inheritDoc} */ @Override public CSVFieldConverter get( Map params ) { final String pattern = params.get("pattern"); final String nlocale = params.get("locale"); final Locale locale = nlocale == null ? null : LocaleUtil.getLocale(nlocale); return new NumberToString( pattern, locale ); } } /* ***************** */ /* PRIVATE METHODS */ /* ***************** */ /** * Creates and registers the default entries and providers. * */ @SuppressWarnings("rawtypes") private void registerDefaults() { /* The empty converter to use in case of missing configuration. */ setEntry( "default", new EmptyCSVFieldConverter() ); /* String to Number Providers. */ setProvider( "parseByte", new StringToNumberProvider(Byte.class) ); setProvider( "parseShort", new StringToNumberProvider(Short.class) ); setProvider( "parseInteger", new StringToNumberProvider(Integer.class) ); setProvider( "parseLong", new StringToNumberProvider(Long.class) ); setProvider( "parseFloat", new StringToNumberProvider(Float.class) ); setProvider( "parseDouble", new StringToNumberProvider(Double.class) ); setProvider( "parseBigInteger", new StringToNumberProvider(BigInteger.class) ); setProvider( "parseBigDecimal", new StringToNumberProvider(BigDecimal.class) ); setProvider( "parseAtomicInteger", new StringToNumberProvider(AtomicInteger.class) ); setProvider( "parseAtomicLong", new StringToNumberProvider(AtomicLong.class) ); /* Number to String Providers. */ setProvider( "formatByte", new NumberToStringProvider() ); setProvider( "formatShort", new NumberToStringProvider() ); setProvider( "formatInteger", new NumberToStringProvider() ); setProvider( "formatLong", new NumberToStringProvider() ); setProvider( "formatFloat", new NumberToStringProvider() ); setProvider( "formatDouble", new NumberToStringProvider() ); setProvider( "formatBigInteger", new NumberToStringProvider() ); setProvider( "formatBigDecimal", new NumberToStringProvider() ); setProvider( "formatAtomicInteger", new NumberToStringProvider() ); setProvider( "formatAtomicLong", new NumberToStringProvider() ); /* String to Boolean Provider. */ setProvider( "parseBoolean", new CSVRegistryEntryProvider>() { @Override public CSVFieldConverter get( Map params ) { return new StringToBoolean(); } }); /* Boolean to String Provider. */ setProvider( "formatBoolean", new CSVRegistryEntryProvider>() { @Override public CSVFieldConverter get( Map params ) { return new BooleanToString(); } }); /* String to Date Provider. */ setProvider( "parseDate", new CSVRegistryEntryProvider>() { @Override public CSVFieldConverter get( Map params ) { final String pattern = params.get( "pattern" ); final String timeZoneID = params.get( "time-zone" ); final TimeZone timeZone; if( timeZoneID == null ) { timeZone = TimeZone.getDefault(); } else { /* * A nasty trick to walk around implicit GMT timezone got * from TimeZone.getTimeZone(timeZoneID ) if timeZoneId * cannot be converted to any useful value. */ timeZone = TimeZone.getTimeZone( timeZoneID ); /* Not nullable, is at least GMT */ final String tzID = timeZone.getID(); /* * Check if got timezone is a GMT default o real value. * If is a default throw exception. */ if ( tzID.equals( "GMT" ) && !tzID.equals( timeZoneID ) ) throw new CSVConfigurationException( "The value time-zone (" + timeZoneID + ") do not represent a TimeZone identifier" ); } return new StringToDate( pattern, timeZone ); } }); /* Date to String Provider. */ setProvider( "formatDate", new CSVRegistryEntryProvider>() { @Override public CSVFieldConverter get( Map params ) { final String pattern = params.get( "pattern" ); final String timeZoneID = params.get( "time-zone" ); final TimeZone timeZone; if( timeZoneID == null ) { timeZone = TimeZone.getDefault(); } else { /* * A nasty trick to walk around implicit GMT timezone got * from TimeZone.getTimeZone(timeZoneID ) if timeZoneId * cannot be converted to any useful value. */ timeZone = TimeZone.getTimeZone( timeZoneID ); /* Not nullable, is at least GMT */ final String tzID = timeZone.getID(); /* * Check if got timezone is a GMT default o real value. * If is a default throw exception. */ if ( tzID.equals( "GMT" ) && !tzID.equals( timeZoneID ) ) throw new CSVConfigurationException( "The value time-zone (" + timeZoneID + ") do not represent a TimeZone identifier" ); } return new DateToString( pattern, timeZone ); } }); /* String to Enum Provider. */ setProvider( "parseEnum", new CSVRegistryEntryProvider>() { @Override @SuppressWarnings({ "unchecked" }) public CSVFieldConverter> get( Map params ) { final String enumType = params.get( "enum-type" ); if( enumType == null ) throw new CSVConfigurationException( "The enum-type is mandatory to build parseEnum" ); try{ final Class enumClass = Class.forName( enumType ); if( ! enumClass.isEnum() ) throw new CSVConfigurationException( "The value enum-type to not represent an enum" ); return new StringToEnum( enumClass ); }catch( ClassNotFoundException ex ) { throw new CSVConfigurationException( "The value enum-type do not represent a canonical class name", ex ); } } }); /* Enum to String Provider. */ setProvider( "formatEnum", new CSVRegistryEntryProvider>() { @Override @SuppressWarnings({ "unchecked" }) public CSVFieldConverter,String> get( Map params ) { return new EnumToString(); } }); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy