├── .gitattributes ├── .github └── workflows │ └── verify.yml ├── .gitignore ├── LICENSE ├── README.md ├── deploy.bat ├── env.bat ├── make_javadoc.bat ├── make_package.bat ├── make_site.bat ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── github │ │ └── mygreen │ │ └── supercsv │ │ ├── annotation │ │ ├── CsvBean.java │ │ ├── CsvColumn.java │ │ ├── CsvComposition.java │ │ ├── CsvOverridesAttribute.java │ │ ├── CsvPartial.java │ │ ├── CsvPostRead.java │ │ ├── CsvPostWrite.java │ │ ├── CsvPreRead.java │ │ ├── CsvPreWrite.java │ │ ├── DefaultGroup.java │ │ ├── PatternFlag.java │ │ ├── constraint │ │ │ ├── CsvConstraint.java │ │ │ ├── CsvDateTimeMax.java │ │ │ ├── CsvDateTimeMin.java │ │ │ ├── CsvDateTimeRange.java │ │ │ ├── CsvEquals.java │ │ │ ├── CsvLengthBetween.java │ │ │ ├── CsvLengthExact.java │ │ │ ├── CsvLengthMax.java │ │ │ ├── CsvLengthMin.java │ │ │ ├── CsvNumberMax.java │ │ │ ├── CsvNumberMin.java │ │ │ ├── CsvNumberRange.java │ │ │ ├── CsvPattern.java │ │ │ ├── CsvRequire.java │ │ │ ├── CsvUnique.java │ │ │ ├── CsvUniqueHashCode.java │ │ │ ├── CsvWordForbid.java │ │ │ ├── CsvWordRequire.java │ │ │ └── package-info.java │ │ ├── conversion │ │ │ ├── CsvConversion.java │ │ │ ├── CsvDefaultValue.java │ │ │ ├── CsvFixedSize.java │ │ │ ├── CsvFullChar.java │ │ │ ├── CsvHalfChar.java │ │ │ ├── CsvLeftPad.java │ │ │ ├── CsvLower.java │ │ │ ├── CsvMultiPad.java │ │ │ ├── CsvNullConvert.java │ │ │ ├── CsvOneSideTrim.java │ │ │ ├── CsvRegexReplace.java │ │ │ ├── CsvRightPad.java │ │ │ ├── CsvTrim.java │ │ │ ├── CsvTruncate.java │ │ │ ├── CsvUpper.java │ │ │ ├── CsvWordReplace.java │ │ │ └── package-info.java │ │ ├── format │ │ │ ├── CsvBooleanFormat.java │ │ │ ├── CsvDateTimeFormat.java │ │ │ ├── CsvEnumFormat.java │ │ │ ├── CsvFormat.java │ │ │ ├── CsvNumberFormat.java │ │ │ └── package-info.java │ │ └── package-info.java │ │ ├── builder │ │ ├── AbstractProcessorBuilder.java │ │ ├── AnnotationComparator.java │ │ ├── AnnotationExpander.java │ │ ├── BeanFactory.java │ │ ├── BeanMapping.java │ │ ├── BeanMappingFactory.java │ │ ├── BeanMappingFactoryHelper.java │ │ ├── BuildCase.java │ │ ├── CallbackMethod.java │ │ ├── ColumnMapping.java │ │ ├── Configuration.java │ │ ├── DefaultBeanFactory.java │ │ ├── DefaultHeaderMapper.java │ │ ├── ExpandedAnnotation.java │ │ ├── FieldAccessor.java │ │ ├── FixedSizeHeaderMapper.java │ │ ├── GeneralProcessorBuilder.java │ │ ├── HeaderMapper.java │ │ ├── LazyBeanMappingFactory.java │ │ ├── ListenerCallbackMethod.java │ │ ├── ProcessorBuilder.java │ │ ├── ProcessorBuilderResolver.java │ │ ├── SpringBeanFactory.java │ │ ├── joda │ │ │ ├── AbstractJodaProcessorBuilder.java │ │ │ ├── DateTimeProcessorBuilder.java │ │ │ ├── LocalDateProcessorBuilder.java │ │ │ ├── LocalDateTimeProcessorBuilder.java │ │ │ ├── LocalTimeProcessorBuilder.java │ │ │ ├── MonthDayProcessorBuilder.java │ │ │ ├── YearMonthProcessorBuilder.java │ │ │ └── package-info.java │ │ ├── package-info.java │ │ ├── standard │ │ │ ├── AbstractDateProcessorBuilder.java │ │ │ ├── AbstractNumberProcessorBuilder.java │ │ │ ├── BigDecimalProcessorBuilder.java │ │ │ ├── BigIntegerProcessorBuilder.java │ │ │ ├── BooleanProcessorBuilder.java │ │ │ ├── ByteProcessorBuilder.java │ │ │ ├── CalendarProcessorBuilder.java │ │ │ ├── CharacterProcessorBuilder.java │ │ │ ├── DateProcessorBuilder.java │ │ │ ├── DoubleProcessorBuilder.java │ │ │ ├── EnumProcessorBuilder.java │ │ │ ├── FloatProcessorBuilder.java │ │ │ ├── IntegerProcessorBuilder.java │ │ │ ├── LongProcessorBuilder.java │ │ │ ├── ShortProcessorBuilder.java │ │ │ ├── SqlDateProcessorBuilder.java │ │ │ ├── StringProcessorBuilder.java │ │ │ ├── TimeProcessorBuilder.java │ │ │ ├── TimestampProcessorBuilder.java │ │ │ └── package-info.java │ │ └── time │ │ │ ├── AbstractTemporalProcessorBuilder.java │ │ │ ├── LocalDateProcessorBuilder.java │ │ │ ├── LocalDateTimeProcessorBuilder.java │ │ │ ├── LocalTimeProcessorBuilder.java │ │ │ ├── MonthDayProcessorBuilder.java │ │ │ ├── OffsetDateTimeProcessorBuilder.java │ │ │ ├── OffsetTimeProcessorBuilder.java │ │ │ ├── YearMonthProcessorBuilder.java │ │ │ ├── YearProcessorBuilder.java │ │ │ ├── ZonedDateTimeProcessorBuilder.java │ │ │ └── package-info.java │ │ ├── cellprocessor │ │ ├── ConstraintProcessorFactory.java │ │ ├── ConstraintProcessorHandler.java │ │ ├── ConversionProcessorFactory.java │ │ ├── ConversionProcessorHandler.java │ │ ├── ProcessorFactory.java │ │ ├── ValidationCellProcessor.java │ │ ├── constraint │ │ │ ├── DateTimeMax.java │ │ │ ├── DateTimeMaxFactory.java │ │ │ ├── DateTimeMin.java │ │ │ ├── DateTimeMinFactory.java │ │ │ ├── DateTimeRange.java │ │ │ ├── DateTimeRangeFactory.java │ │ │ ├── EqualedValueProvider.java │ │ │ ├── Equals.java │ │ │ ├── EqualsFactory.java │ │ │ ├── ForbiddenWordProvider.java │ │ │ ├── LengthBetween.java │ │ │ ├── LengthBetweenFactory.java │ │ │ ├── LengthExact.java │ │ │ ├── LengthExactFactory.java │ │ │ ├── LengthMax.java │ │ │ ├── LengthMaxFactory.java │ │ │ ├── LengthMin.java │ │ │ ├── LengthMinFactory.java │ │ │ ├── NumberMax.java │ │ │ ├── NumberMaxFactory.java │ │ │ ├── NumberMin.java │ │ │ ├── NumberMinFactory.java │ │ │ ├── NumberRange.java │ │ │ ├── NumberRangeFactory.java │ │ │ ├── Pattern.java │ │ │ ├── PatternFactory.java │ │ │ ├── Require.java │ │ │ ├── RequireFactory.java │ │ │ ├── RequiredWordProvider.java │ │ │ ├── Unique.java │ │ │ ├── UniqueFactory.java │ │ │ ├── UniqueHashCode.java │ │ │ ├── UniqueHashCodeFactory.java │ │ │ ├── WordForbid.java │ │ │ ├── WordForbidFactory.java │ │ │ ├── WordRequire.java │ │ │ ├── WordRequireFactory.java │ │ │ └── package-info.java │ │ ├── conversion │ │ │ ├── AbstractPaddingOperator.java │ │ │ ├── ByteSizePaddingProcessor.java │ │ │ ├── CharCategory.java │ │ │ ├── CharReplacer.java │ │ │ ├── CharWidthPaddingProcessor.java │ │ │ ├── DefaultValue.java │ │ │ ├── DefaultValueFactory.java │ │ │ ├── FullChar.java │ │ │ ├── FullCharFactory.java │ │ │ ├── HalfChar.java │ │ │ ├── HalfCharFactory.java │ │ │ ├── JapaneseCharReplacer.java │ │ │ ├── LeftPad.java │ │ │ ├── LeftPadFactory.java │ │ │ ├── Lower.java │ │ │ ├── LowerFactory.java │ │ │ ├── MultiPad.java │ │ │ ├── MultiPadFactory.java │ │ │ ├── NullConvert.java │ │ │ ├── NullConvertFactory.java │ │ │ ├── OneSideTrim.java │ │ │ ├── OneSideTrimFactory.java │ │ │ ├── PaddingProcessor.java │ │ │ ├── RegexReplace.java │ │ │ ├── RegexReplaceFactory.java │ │ │ ├── ReplacedWordProvider.java │ │ │ ├── RightPad.java │ │ │ ├── RightPadFactory.java │ │ │ ├── SimplePaddingProcessor.java │ │ │ ├── Trim.java │ │ │ ├── TrimFactory.java │ │ │ ├── Truncate.java │ │ │ ├── TruncateFactory.java │ │ │ ├── Upper.java │ │ │ ├── UpperFactory.java │ │ │ ├── WordReplace.java │ │ │ ├── WordReplaceFactory.java │ │ │ └── package-info.java │ │ ├── format │ │ │ ├── AbstractTextFormatter.java │ │ │ ├── BooleanFormatter.java │ │ │ ├── DateFormatWrapper.java │ │ │ ├── EnumFormatter.java │ │ │ ├── JodaFormatWrapper.java │ │ │ ├── NumberFormatWrapper.java │ │ │ ├── ParseProcessor.java │ │ │ ├── ParseProcessorFactory.java │ │ │ ├── PrintProcessor.java │ │ │ ├── PrintProcessorFactory.java │ │ │ ├── SimpleDateFormatBuilder.java │ │ │ ├── SimpleNumberFormatter.java │ │ │ ├── TemporalFormatWrapper.java │ │ │ ├── TextFormatter.java │ │ │ ├── TextParseException.java │ │ │ ├── TextParser.java │ │ │ ├── TextPrintException.java │ │ │ ├── TextPrinter.java │ │ │ └── package-info.java │ │ └── package-info.java │ │ ├── exception │ │ ├── SuperCsvBindingException.java │ │ ├── SuperCsvInvalidAnnotationException.java │ │ ├── SuperCsvNoMatchColumnSizeException.java │ │ ├── SuperCsvNoMatchHeaderException.java │ │ ├── SuperCsvRowException.java │ │ ├── SuperCsvValidationException.java │ │ └── package-info.java │ │ ├── expression │ │ ├── CustomFunctions.java │ │ ├── ExpressionEvaluationException.java │ │ ├── ExpressionLanguage.java │ │ ├── ExpressionLanguageJEXLImpl.java │ │ └── package-info.java │ │ ├── io │ │ ├── AbstractCsvAnnotationBeanReader.java │ │ ├── AbstractCsvAnnotationBeanWriter.java │ │ ├── BeanMappingCache.java │ │ ├── CsvAnnotationBeanReader.java │ │ ├── CsvAnnotationBeanWriter.java │ │ ├── CsvErrorHandler.java │ │ ├── CsvReadStatus.java │ │ ├── CsvSuccessHandler.java │ │ ├── CsvWriteStatus.java │ │ ├── LazyCsvAnnotationBeanReader.java │ │ ├── LazyCsvAnnotationBeanWriter.java │ │ └── package-info.java │ │ ├── localization │ │ ├── EncodingControl.java │ │ ├── MessageBuilder.java │ │ ├── MessageInterpolator.java │ │ ├── MessageParseException.java │ │ ├── MessageResolver.java │ │ ├── Messages.properties │ │ ├── PropertiesMessageResolver.java │ │ ├── ResourceBundleMessageResolver.java │ │ ├── SpringMessageResolver.java │ │ ├── SuperCsvMessages.properties │ │ └── package-info.java │ │ ├── package-info.java │ │ ├── util │ │ ├── ArgUtils.java │ │ ├── StackUtils.java │ │ ├── Utils.java │ │ └── package-info.java │ │ └── validation │ │ ├── CsvBindingErrors.java │ │ ├── CsvError.java │ │ ├── CsvExceptionConverter.java │ │ ├── CsvField.java │ │ ├── CsvFieldError.java │ │ ├── CsvFieldValidator.java │ │ ├── CsvValidator.java │ │ ├── MessageCodeGenerator.java │ │ ├── ValidationContext.java │ │ ├── beanvalidation │ │ ├── CsvBeanValidator.java │ │ ├── JakartaCsvBeanValidator.java │ │ ├── JakartaMessageInterpolatorAdapter.java │ │ ├── MessageInterpolatorAdapter.java │ │ └── package-info.java │ │ └── package-info.java └── javadoc │ ├── overview.html │ ├── resources │ └── external-link-12.png │ ├── stylesheet.css │ └── stylesheet.org.css ├── site ├── memo │ └── memo.txt ├── site.xml └── sphinx │ ├── .devcontainer │ ├── devcontainer.json │ ├── on_create.sh │ └── requirements.txt │ ├── .gitignore │ ├── .textlintrc.json │ ├── Makefile │ ├── deploy.sh │ ├── make.bat │ ├── package-lock.json │ ├── package.json │ └── source │ ├── _static │ ├── external-link-12.png │ ├── jquery.externallink.js │ └── mycustom.css │ ├── _templates │ └── layout.html │ ├── basic.rst │ ├── composition.rst │ ├── conf.py │ ├── configuration.rst │ ├── configuration_configuration.rst │ ├── configuration_systemproperty.rst │ ├── conversion.rst │ ├── conversion_annotation.rst │ ├── conversion_custom.rst │ ├── fixedsizecolumn.rst │ ├── format.rst │ ├── format_annotation.rst │ ├── format_annotation_boolean.rst │ ├── format_annotation_datetime.rst │ ├── format_annotation_enum.rst │ ├── format_annotation_number.rst │ ├── format_custom.rst │ ├── howtouse.rst │ ├── index.rst │ ├── labelledcolumn.rst │ ├── lifecycle.rst │ ├── lifecycle_annotation.rst │ ├── lifecycle_listener.rst │ ├── migration.rst │ ├── partialization.rst │ ├── processorbuilder.rst │ ├── release.rst │ ├── spring.rst │ ├── spring_beanfactory.rst │ ├── spring_message.rst │ ├── validation.rst │ ├── validation_annotation.rst │ ├── validation_beanvalidation.rst │ ├── validation_beanvalidation_spring.rst │ ├── validation_custom.rst │ ├── validation_handle.rst │ ├── validation_message.rst │ └── validation_validator.rst └── test ├── data ├── data_equaled_value.txt ├── data_forbidden_word.txt ├── data_replaced_word.txt ├── data_required_word.txt ├── test_read_error_column_size.csv ├── test_read_error_elinjection_column.csv ├── test_read_error_elinjection_header.csv ├── test_read_error_header_size.csv ├── test_read_error_header_value.csv ├── test_read_error_wrong_pattern.csv ├── test_read_external_error_enum.csv ├── test_read_external_error_type.csv ├── test_read_external_normal.csv ├── test_read_fixedColumn.csv ├── test_read_lazy.csv ├── test_read_lazy_fixedColumn.csv ├── test_read_lazy_noHeader.csv ├── test_read_lazy_partial.csv ├── test_read_lazy_wrong_pattern.csv ├── test_read_normal.csv ├── test_spring_read_error_notFound_userName.csv ├── test_spring_read_normal.csv ├── test_write_append.csv ├── test_write_error_continue.csv ├── test_write_fixedColumn.csv ├── test_write_ignore_constaint.csv ├── test_write_lazy_error_continue.csv ├── test_write_lazy_fixedColumn_noSetHeader.csv ├── test_write_lazy_fixedColumn_setHeader.csv ├── test_write_lazy_noSetHeader.csv ├── test_write_lazy_noSetHeader_append.csv ├── test_write_lazy_noSetHeader_noHeader.csv ├── test_write_lazy_partial.csv ├── test_write_lazy_partial_noSetHeader.csv ├── test_write_lazy_setHeader.csv ├── test_write_normal.csv ├── test_write_partial.csv └── test_write_tab.csv ├── java ├── com │ └── github │ │ └── mygreen │ │ └── supercsv │ │ ├── builder │ │ ├── AnnotationExpanderTest.java │ │ ├── BeanMappingFactoryTest.java │ │ ├── CallbackMethodTest.java │ │ ├── DefaultBeanFactoryTest.java │ │ ├── FieldAccessorTest.java │ │ ├── GeneralProcessorBuilderTest.java │ │ ├── ProcesssorBuilderTest.java │ │ ├── SampleObject.xsd │ │ ├── SpringBeanFactoryTest.java │ │ ├── SpringTest.java │ │ ├── SpringTestConfig.java │ │ ├── joda │ │ │ ├── DateTimeProcessorBuilderTest.java │ │ │ ├── LocalDateProcessorBuilderTest.java │ │ │ ├── LocalDateTimeProcessorBuilderTest.java │ │ │ ├── LocalTimeProcessorBuilderTest.java │ │ │ ├── MonthDayProcessorBuilderTest.java │ │ │ └── YearMonthProcessorBuilderTest.java │ │ ├── spring │ │ │ ├── CsvUserNameExist.java │ │ │ ├── UrlFormatter.java │ │ │ ├── UrlProcessorBuilder.java │ │ │ ├── UserCsv.java │ │ │ ├── UserListener.java │ │ │ ├── UserMailPattern.java │ │ │ ├── UserMailPatternValidator.java │ │ │ ├── UserNameExist.java │ │ │ ├── UserNameExistFactory.java │ │ │ ├── UserService.java │ │ │ └── UserValidator.java │ │ ├── standard │ │ │ ├── BigDecimalProcessorBuilderTest.java │ │ │ ├── BigIntegerProcessorBuilderTest.java │ │ │ ├── BooleanProcessorBuilderTest.java │ │ │ ├── ByteProcessorBuilderTest.java │ │ │ ├── CalendarProcessorBuilderTest.java │ │ │ ├── CharacterProcessorBuilderTest.java │ │ │ ├── DateProcessorBuilderTest.java │ │ │ ├── DoubleProcessorBuilderTest.java │ │ │ ├── EnumProcessorBuilderTest.java │ │ │ ├── FloatProcessorBuilderTest.java │ │ │ ├── IntegerProcessorBuilderTest.java │ │ │ ├── LongProcessorBuilderTest.java │ │ │ ├── ShortProcessorBuilderTest.java │ │ │ ├── SqlDateProcessorBuilderTest.java │ │ │ ├── StringProcessorBuilderTest.java │ │ │ ├── TimeProcessorBuilderTest.java │ │ │ └── TimestampProcessorBuilderTest.java │ │ └── time │ │ │ ├── LocalDateProcessorBuilderTest.java │ │ │ ├── LocalDateTimeProcessorBuilderTest.java │ │ │ ├── LocalTimeProcessorBuilderTest.java │ │ │ ├── MonthDayProcessorBuilderTest.java │ │ │ ├── OffsetDateTimeProcessorBuilderTest.java │ │ │ ├── OffsetTimeProcessorBuilderTest.java │ │ │ ├── YearMonthProcessorBuilderTest.java │ │ │ ├── YearProcessorBuilderTest.java │ │ │ └── ZonedDateTimeProcessorBuilderTest.java │ │ ├── cellprocessor │ │ ├── ConstraintProcessorHandlerTest.java │ │ ├── ConversionProcessorHandlerTest.java │ │ ├── NextCellProcessor.java │ │ ├── constraint │ │ │ ├── DateTimeMaxFactoryTest.java │ │ │ ├── DateTimeMaxTest.java │ │ │ ├── DateTimeMinFactoryTest.java │ │ │ ├── DateTimeMinTest.java │ │ │ ├── DateTimeRangeFactoryTest.java │ │ │ ├── DateTimeRangeTest.java │ │ │ ├── EqualsFactoryTest.java │ │ │ ├── EqualsTest.java │ │ │ ├── LengthBetweenFactoryTest.java │ │ │ ├── LengthBetweenTest.java │ │ │ ├── LengthExactFactoryTest.java │ │ │ ├── LengthExactTest.java │ │ │ ├── LengthMaxFactoryTest.java │ │ │ ├── LengthMaxTest.java │ │ │ ├── LengthMinFactoryTest.java │ │ │ ├── LengthMinTest.java │ │ │ ├── NextCellProcessor.java │ │ │ ├── NumberMaxFactoryTest.java │ │ │ ├── NumberMaxTest.java │ │ │ ├── NumberMinFactoryTest.java │ │ │ ├── NumberMinTest.java │ │ │ ├── NumberRangeFactoryTest.java │ │ │ ├── NumberRangeTest.java │ │ │ ├── PatternFactoryTest.java │ │ │ ├── PatternTest.java │ │ │ ├── RequireFactoryTest.java │ │ │ ├── RequireTest.java │ │ │ ├── UniqueFactoryTest.java │ │ │ ├── UniqueHashCodeFactoryTest.java │ │ │ ├── UniqueHashCodeTest.java │ │ │ ├── UniqueTest.java │ │ │ ├── WordForbidFactoryTest.java │ │ │ ├── WordForbidTest.java │ │ │ ├── WordRequireFactoryTest.java │ │ │ └── WordRequireTest.java │ │ ├── conversion │ │ │ ├── CharReplacerTest.java │ │ │ ├── DefaultValueFactoryTest.java │ │ │ ├── DefaultValueTest.java │ │ │ ├── FullCharFactoryTest.java │ │ │ ├── FullCharTest.java │ │ │ ├── HalfCharFactoryTest.java │ │ │ ├── HalfCharTest.java │ │ │ ├── JapaneseCharReplacerTest.java │ │ │ ├── LeftPadFactoryTest.java │ │ │ ├── LeftPadTest.java │ │ │ ├── LowerFactoryTest.java │ │ │ ├── LowerTest.java │ │ │ ├── MultiPadFactoryTest.java │ │ │ ├── MultiPadTest.java │ │ │ ├── NextCellProcessor.java │ │ │ ├── NullConvertFactoryTest.java │ │ │ ├── NullConvertTest.java │ │ │ ├── OneSideTrimFactoryTest.java │ │ │ ├── OneSideTrimTest.java │ │ │ ├── PaddingProcessorTest.java │ │ │ ├── RegexReplaceFactoryTest.java │ │ │ ├── RegexReplaceTest.java │ │ │ ├── RightPadFactoryTest.java │ │ │ ├── RightPadTest.java │ │ │ ├── TrimFactoryTest.java │ │ │ ├── TrimTest.java │ │ │ ├── TruncateFactoryTest.java │ │ │ ├── TruncateTest.java │ │ │ ├── UpperFactoryTest.java │ │ │ ├── UpperTest.java │ │ │ ├── WordReplaceFactoryTest.java │ │ │ └── WordReplaceTest.java │ │ └── format │ │ │ ├── BoolenFormatterTest.java │ │ │ ├── DateFormatWrapperTest.java │ │ │ ├── EnumFormatterTest.java │ │ │ ├── NumberFormatWrapperTest.java │ │ │ └── SimpleNumberFormatterTest.java │ │ ├── expression │ │ ├── CustomFunctionsTest.java │ │ └── ExpressionLanguageJEXLImplTest.java │ │ ├── io │ │ ├── CsvAnnotationBeanReaderTest.java │ │ ├── CsvAnnotationBeanWriterTest.java │ │ ├── HowtoUseCsv.java │ │ ├── LazyCsvAnnotationBeanReaderTest.java │ │ ├── LazyCsvAnnotationBeanWriterTest.java │ │ ├── SampleELInjectionBean.java │ │ ├── SampleEnum.java │ │ ├── SampleFixedColumnBean.java │ │ ├── SampleLazyBean.java │ │ ├── SampleLazyFixedColumnBean.java │ │ ├── SampleLazyPartialBean.java │ │ ├── SampleNormalBean.java │ │ └── SamplePartialBean.java │ │ ├── localization │ │ └── MessageInterpolatorTest.java │ │ ├── tool │ │ ├── HasCellProcessorAssert.java │ │ ├── TestUtils.java │ │ └── package-info.java │ │ ├── util │ │ └── UtilsTest.java │ │ └── validation │ │ ├── CsvBindingErrorsTest.java │ │ ├── CsvValidatorTest.java │ │ └── beanvalidation │ │ ├── CsvBeanValidatorTest.java │ │ └── JakartaCsvBeanValidatorTest.java └── test │ └── external │ ├── ExternalCsv.java │ ├── ExternalTest.java │ ├── PostalCode.java │ └── package-info.java └── resources ├── SpringTestContext.xml ├── TestMessages.properties ├── ValidationMessages_ja.properties └── logback.xml /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | 3 | *.bat text eol=crlf 4 | *.sh text eol=lf 5 | 6 | -------------------------------------------------------------------------------- /.github/workflows/verify.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Java CI with Maven 5 | 6 | on: 7 | push: 8 | branches-ignore: 9 | - 'gh-pages' 10 | pull_request: 11 | branches-ignore: 12 | - 'gh-pages' 13 | 14 | jobs: 15 | build: 16 | 17 | runs-on: ubuntu-latest 18 | 19 | steps: 20 | - name: Set up Locale 21 | run: | 22 | sudo apt-get -y install fonts-ipafont language-pack-ja 23 | sudo locale-gen ja_JP.UTF-8 24 | sudo update-locale LANG=ja_JP.UTF-8 25 | sudo update-locale LC_ALL=ja_JP.UTF-8 26 | sudo localectl status 27 | - name: Set up Time-Zone 28 | run: | 29 | sudo timedatectl set-timezone Asia/Tokyo 30 | date 31 | - uses: actions/checkout@v4 32 | - name: Set up JDK 1.8 33 | uses: actions/setup-java@v4 34 | with: 35 | distribution: 'corretto' 36 | java-version: 8 37 | - name: Set up Maven 38 | uses: stCarolas/setup-maven@v5 39 | with: 40 | maven-version: 3.9.6 41 | - name: Build with Maven 42 | env: 43 | TZ: 'Asia/Tokyo' 44 | run: mvn -B clean verify -Dgpg.skip=true 45 | 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | /target/ 14 | 15 | 16 | ## for maven. 17 | /bin 18 | /target 19 | 20 | ## for eclipse. 21 | /.settings 22 | /.classpath 23 | /.factorypath 24 | /.project 25 | 26 | ## for tmporary file. 27 | *~ 28 | ~* 29 | \#*\# 30 | 31 | ## for testdata 32 | /src/test/out 33 | 34 | ## for coverage 35 | /coverage 36 | /coverage.exec 37 | 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Maven Central Version](https://img.shields.io/maven-central/v/com.github.mygreen/super-csv-annotation?color=ffa500 2 | )](https://central.sonatype.com/artifact/com.github.mygreen/super-csv-annotation) [![Javadocs](http://javadoc.io/badge/com.github.mygreen/super-csv-annotation.svg?color=blue)](http://javadoc.io/doc/com.github.mygreen/super-csv-annotation) [![Build Status](https://github.com/mygreen/super-csv-annotation/actions/workflows/verify.yml/badge.svg)](https://travis-ci.org/mygreen/super-csv-annotation) 3 | 4 | Super CSV Annotation 5 | ==================== 6 | 7 | This library 'Super CSV' extension library with annotation function. 8 | + this library automatic building for CellProcessor from Annotation with JavaBean. 9 | + and simply showing localized messages. 10 | 11 | # Depends 12 | ------------------------------ 13 | + Java1.8 14 | - (SuperCSV2.x is Java1.6+, but this library require Java1.8) 15 | + SuperCSV 2.4+ 16 | 17 | # Setup 18 | 19 | 1. Add dependency for Super Csv Annotation 20 | ```xml:pom.xml 21 | 22 | com.github.mygreen 23 | super-csv-annotation 24 | 2.4 25 | 26 | ``` 27 | 2. Add dependency for Logging library. Example Logback. 28 | ```xml:pom.xml 29 | 30 | ch.qos.logback 31 | logback-classic 32 | 1.2.11 33 | test 34 | 35 | ``` 36 | 37 | # Build 38 | 39 | 1. Setup Java SE 8 40 | 2. Setup Maven 41 | 3. Build with Maven 42 | 1. make jar files. 43 | ```console 44 | # mvn clean package 45 | ``` 46 | 2. generate site. 47 | ```console 48 | # mvn site -Dgpg.skip=true 49 | ``` 50 | 51 | # Document 52 | - Project infomation 53 | - http://mygreen.github.io/super-csv-annotation/index.html 54 | - Manual 55 | - http://mygreen.github.io/super-csv-annotation/sphinx/index.html 56 | - Javadoc 57 | - http://mygreen.github.io/super-csv-annotation/apidocs/index.html 58 | - http://javadoc.io/doc/com.github.mygreen/super-csv-annotation/ 59 | -------------------------------------------------------------------------------- /deploy.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | %~d0 4 | cd %~p0 5 | 6 | call env.bat 7 | 8 | call mvn -version 9 | 10 | call mvn clean -Dmaven.test.skip=true source:jar javadoc:jar verify deploy 11 | 12 | pause 13 | -------------------------------------------------------------------------------- /env.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | if NOT "%JAVA_HOME_8%" == "" ( 4 | set JAVA_HOME="%JAVA_HOME_8%" 5 | ) 6 | 7 | set PATH=%PATH%;%JAVA_HOME%\bin;%M2_HOME%\bin; 8 | 9 | 10 | -------------------------------------------------------------------------------- /make_javadoc.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | %~d0 4 | cd %~p0 5 | 6 | call env.bat 7 | call mvn -version 8 | 9 | mkdir target 10 | call mvn javadoc:javadoc > target/javadoc.log 2>&1 11 | 12 | start target/javadoc.log 13 | 14 | -------------------------------------------------------------------------------- /make_package.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | %~d0 4 | cd %~p0 5 | 6 | call env.bat 7 | call mvn -version 8 | 9 | call mvn package 10 | 11 | pause 12 | -------------------------------------------------------------------------------- /make_site.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | %~d0 4 | cd %~p0 5 | 6 | call env.bat 7 | call mvn -version 8 | 9 | call mvn clean 10 | mkdir target 11 | call mvn site -Dgpg.skip=true -Dfile.encoding=UTF-8 > target/site.log 2>&1 12 | 13 | REM github-pagesの対応 14 | echo "" > .\target\site\.nojekyll 15 | 16 | start target/site.log 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/CsvColumn.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.supercsv.cellprocessor.ift.CellProcessor; 10 | 11 | import com.github.mygreen.supercsv.builder.ProcessorBuilder; 12 | 13 | 14 | /** 15 | * CSVのカラムであることを表現するためのアノテーションです。 16 | *

フィールドに付与します。

17 | * 18 | *

基本的な使い方

19 | * 27 | * 28 | *

29 |  * {@literal @CsvBean}
30 |  * public class SampleCsv {
31 |  *     
32 |  *     {@literal @CsvColumn(number=1)}
33 |  *     private int no;
34 |  *     
35 |  *     {@literal @CsvColumn(number=2, label="名前")}
36 |  *     private String name;
37 |  *     
38 |  *     // getter/setterは省略
39 |  * }
40 |  * 
41 | * 42 | * @version 2.1 43 | * @author T.TSUCHIE 44 | * 45 | */ 46 | @Target({ElementType.FIELD}) 47 | @Retention(RetentionPolicy.RUNTIME) 48 | @Documented 49 | public @interface CsvColumn { 50 | 51 | /** 52 | * 列番号を指定します。 53 | *

他のカラムの値との重複は許可しません。

54 | * @return 番号は1から始まります。 55 | */ 56 | int number() default 0; 57 | 58 | /** 59 | * 見出しとなるラベルを指定します。 60 | * @return 指定しない場合、フィールド名が適用されます。 61 | */ 62 | String label() default ""; 63 | 64 | /** 65 | * 独自の{@link ProcessorBuilder}を指定して{@link CellProcessor} を組み立てたい場合に指定します。 66 | *

サポートしていないクラスタイプに対応するときなどに指定します。

67 | * @return {@link ProcessorBuilder}を実装したクラスを指定します。 68 | */ 69 | @SuppressWarnings("rawtypes") 70 | Class[] builder() default {}; 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/DefaultGroup.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.annotation; 2 | 3 | 4 | /** 5 | * デフォルトのグループ。 6 | *

アノテーションで、グループを指定しない場合、デフォルトのグループに所属します。

7 | * 8 | * @since 2.0 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public interface DefaultGroup { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/constraint/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 制約のアノテーションを提供します。 3 | * 4 | * @author T.TSUCHIE 5 | * 6 | */ 7 | package com.github.mygreen.supercsv.annotation.constraint; 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/conversion/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 変換用のアノテーションを提供します。 3 | * 4 | * @author T.TSUCHIE 5 | * 6 | */ 7 | package com.github.mygreen.supercsv.annotation.conversion; 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/format/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 書式の定義を行うアノテーションを提供します。 3 | * 4 | * @since 2.0 5 | * @author T.TSUCHIE 6 | * 7 | */ 8 | package com.github.mygreen.supercsv.annotation.format; 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/annotation/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * アノテーション機能を提供します。 3 | * 4 | * @author T.TSUCHIE 5 | * 6 | */ 7 | package com.github.mygreen.supercsv.annotation; 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/AnnotationComparator.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import java.lang.annotation.Annotation; 4 | import java.util.Comparator; 5 | 6 | import com.github.mygreen.supercsv.util.Utils; 7 | 8 | 9 | /** 10 | * 入力値検証を行うアノテーションの順番に並び変えます。 11 | *

並び順は、アノテーションの属性「order」の定義に従います。

12 | *

属性「order」の値が同じ場合は、クラス名の昇順になります。

13 | * 14 | * @since 2.0 15 | * @author T.TSUCHIE 16 | * 17 | */ 18 | public class AnnotationComparator implements Comparator { 19 | 20 | /** 21 | * 属性「order」が定義されていないときの値。 22 | */ 23 | private static final int DEFAULT_ORDER = Integer.MAX_VALUE; 24 | 25 | @Override 26 | public int compare(final Annotation anno1, final Annotation anno2) { 27 | 28 | final String name1 = anno1.annotationType().getName(); 29 | final String name2 = anno2.annotationType().getName(); 30 | 31 | final int order1 = Utils.getAnnotationAttribute(anno1, "order", int.class).orElse(DEFAULT_ORDER); 32 | final int order2 = Utils.getAnnotationAttribute(anno2, "order", int.class).orElse(DEFAULT_ORDER); 33 | 34 | if(order1 == order2) { 35 | return name1.compareTo(name2); 36 | } else { 37 | return Integer.compare(order1, order2); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/BeanFactory.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import org.supercsv.exception.SuperCsvReflectionException; 4 | 5 | /** 6 | * インスタンスを作成する処理のインタフェース 7 | * 8 | * @param create()メソッドの引数のクラスタイプ。 9 | * @param create()メソッドの戻り値のタイプ。 10 | * 11 | * @since 2.0 12 | * @author T.TSUCHIE 13 | * 14 | */ 15 | public interface BeanFactory { 16 | 17 | /** 18 | * 引数Tのクラスタイプのインスタンスを返す。 19 | * @param type クラスタイプ。 20 | * @return 作成したクラスのインスタンス。 21 | * @throws NullPointerException {@literal type is null.} 22 | * @throws SuperCsvReflectionException インスタンスの作成に失敗した場合 23 | */ 24 | R create(T type); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/BuildCase.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | 4 | /** 5 | * CellProcessorを組み立てる時のケースを表現する列挙型です。 6 | *

読み込み/書き込み用と区別する時に利用します。

7 | * 8 | * @since 2.0 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public enum BuildCase { 13 | 14 | /** 読み込み時 */ 15 | Read, 16 | /** 書き込み時 */ 17 | Write; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/DefaultBeanFactory.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import java.lang.reflect.Constructor; 4 | import java.lang.reflect.Modifier; 5 | import java.util.Objects; 6 | 7 | import org.supercsv.exception.SuperCsvReflectionException; 8 | import org.supercsv.util.BeanInterfaceProxy; 9 | 10 | 11 | /** 12 | * Beanのインスタンスを生成する標準のクラス。 13 | * 14 | * @version 2.2 15 | * @since 2.0 16 | * @author T.TSUCHIE 17 | * 18 | */ 19 | public class DefaultBeanFactory implements BeanFactory, Object> { 20 | 21 | @Override 22 | public Object create(final Class clazz) { 23 | Objects.requireNonNull(clazz, "clazz should not be null."); 24 | 25 | try { 26 | if(clazz.isInterface()) { 27 | return BeanInterfaceProxy.createProxy(clazz); 28 | 29 | } else { 30 | 31 | final Class declaredClass = clazz.getDeclaringClass(); 32 | 33 | if(declaredClass != null && !Modifier.isStatic(clazz.getModifiers())) { 34 | // 非staticな内部クラスの場合 35 | Constructor cons = clazz.getDeclaredConstructor(declaredClass); 36 | cons.setAccessible(true); 37 | return cons.newInstance((Object)null); 38 | } 39 | 40 | Constructor cons = clazz.getDeclaredConstructor(); 41 | cons.setAccessible(true); 42 | return cons.newInstance(); 43 | 44 | } 45 | } catch (ReflectiveOperationException e) { 46 | throw new SuperCsvReflectionException(String.format("fail create Bean instance of '%s'", clazz.getName()), e); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/DefaultHeaderMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | 4 | /** 5 | * カラムのラベル情報をヘッダーとする。 6 | * 7 | * @since 2.1 8 | * @author T.TSUCHIE 9 | * 10 | */ 11 | public class DefaultHeaderMapper implements HeaderMapper { 12 | 13 | @Override 14 | public String toMap(final ColumnMapping column, final Configuration config, final Class[] groups) { 15 | return column.getLabel(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/FixedSizeHeaderMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import java.util.Optional; 4 | 5 | import com.github.mygreen.supercsv.annotation.conversion.CsvFixedSize; 6 | import com.github.mygreen.supercsv.cellprocessor.conversion.PaddingProcessor; 7 | 8 | /** 9 | * アノテーション{@link CsvFixedSize}を元に、ヘッダーラベル情報を処理します。 10 | *

パディング文字がゼロ埋めのときや、文字数を超えたとき切り出す設定の場合、 11 | * 意図した結果とならない場合があるため、このクラスを参考に各自実装してください。 12 | *

13 | * 14 | * @since 2.1 15 | * @author T.TSUCHIE 16 | * 17 | */ 18 | public class FixedSizeHeaderMapper implements HeaderMapper { 19 | 20 | @Override 21 | public String toMap(final ColumnMapping column, final Configuration config, final Class[] groups) { 22 | 23 | // @CsvFixedSizeアノテーションを取得する 24 | final Optional fixedLengthAnno = column.getField().getAnnotationsByGroup(CsvFixedSize.class, groups) 25 | .stream().findFirst(); 26 | 27 | if(!fixedLengthAnno.isPresent()) { 28 | return column.getLabel(); 29 | } 30 | 31 | final PaddingProcessor paddingProcessor = (PaddingProcessor)config.getBeanFactory() 32 | .create(fixedLengthAnno.get().paddingProcessor()); 33 | 34 | // アノテーションが存在する場合は、その情報を使ってパディングする。 35 | String label = fixedLengthAnno.map(anno -> paddingProcessor.pad(column.getLabel(), 36 | anno.size(), anno.padChar(), anno.rightAlign(), anno.chopped())) 37 | .orElse(column.getLabel()); 38 | 39 | return label; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/GeneralProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import com.github.mygreen.supercsv.annotation.format.CsvFormat; 4 | import com.github.mygreen.supercsv.cellprocessor.format.TextFormatter; 5 | import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException; 6 | import com.github.mygreen.supercsv.localization.MessageBuilder; 7 | 8 | /** 9 | * 不明なタイプの時の汎用のビルダクラス。 10 | *

アノテーション{@link CsvFormat}の指定は必須。

11 | * 12 | * @since 2.0 13 | * @author T.TSUCHIE 14 | * 15 | */ 16 | public class GeneralProcessorBuilder extends AbstractProcessorBuilder { 17 | 18 | /** 19 | * {@inheritDoc} 20 | * @throws SuperCsvInvalidAnnotationException 必ず例外をスローする。 21 | */ 22 | @Override 23 | protected TextFormatter getDefaultFormatter(final FieldAccessor field, final Configuration config) { 24 | 25 | throw new SuperCsvInvalidAnnotationException(MessageBuilder.create("anno.required") 26 | .var("property", field.getNameWithClass()) 27 | .varWithAnno("anno", CsvFormat.class) 28 | .format()); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/HeaderMapper.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | /** 4 | * カラムに対するヘッダーを決める処理のインタフェース。 5 | * 6 | * @since 2.1 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public interface HeaderMapper { 11 | 12 | /** 13 | * カラム情報からヘッダーのラベル情報を取得する。 14 | * @param column カラム情報 15 | * @param config システム情報 16 | * @param groups グループ情報 17 | * @return ヘッダー情報 18 | */ 19 | String toMap(ColumnMapping column, Configuration config, Class[] groups); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/ListenerCallbackMethod.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import java.lang.reflect.InvocationTargetException; 4 | import java.lang.reflect.Method; 5 | import java.util.Objects; 6 | 7 | import org.supercsv.exception.SuperCsvReflectionException; 8 | 9 | /** 10 | * Listenerクラス用のコールバック用メソッドの実行 11 | * 12 | * @since 2.0 13 | * @author T.TSUCHIE 14 | * 15 | */ 16 | public class ListenerCallbackMethod extends CallbackMethod { 17 | 18 | private final Object listener; 19 | 20 | public ListenerCallbackMethod(final Object listener, final Method method) { 21 | super(method); 22 | Objects.requireNonNull(listener); 23 | this.listener = listener; 24 | } 25 | 26 | @Override 27 | protected void execute(final Object record, final Object[] paramValues) { 28 | try { 29 | method.invoke(listener, paramValues); 30 | 31 | } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 32 | Throwable t = e.getCause() == null ? e : e.getCause(); 33 | throw new SuperCsvReflectionException( 34 | String.format("Fail execute method '%s#%s'.", listener.getClass().getName(), method.getName()), 35 | t); 36 | } 37 | 38 | 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/ProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder; 2 | 3 | import java.util.Optional; 4 | 5 | import org.supercsv.cellprocessor.ift.CellProcessor; 6 | 7 | 8 | /** 9 | * {@link CellProcessor}を組み立てるためのインタフェース。 10 | * 11 | * @param 処理対象のクラスタイプ。 12 | * @version 2.0 13 | * @since 1.1 14 | * @author T.TSUCHIE 15 | * 16 | */ 17 | public interface ProcessorBuilder { 18 | 19 | /** 20 | * 読み込み用の{@link CellProcessor}を組み立てる。 21 | * @param type フィールドのクラスタイプ。 22 | * @param field フィールド情報。 23 | * @param config 設定情報 24 | * @param groups グループ情報 25 | * @return 組み立てた{@link CellProcessor}。 26 | */ 27 | Optional buildForReading(Class type, FieldAccessor field, Configuration config, Class[] groups); 28 | 29 | /** 30 | * 書き込み用の{@link CellProcessor}を組み立てる。 31 | * @param type フィールドのクラスタイプ。 32 | * @param field フィールド情報。 33 | * @param config 設定情報 34 | * @param groups グループ情報 35 | * @return 組み立てた{@link CellProcessor}。 36 | */ 37 | Optional buildForWriting(Class type, FieldAccessor field, Configuration config, Class[] groups); 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/DateTimeProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.DateTime; 4 | 5 | import com.github.mygreen.supercsv.builder.ProcessorBuilder; 6 | 7 | /** 8 | * {@link DateTime}に対する{@link ProcessorBuilder}。 9 | * @version 2.0 10 | * @since 1.2 11 | * @author T.TSUCHIE 12 | * 13 | */ 14 | public class DateTimeProcessorBuilder extends AbstractJodaProcessorBuilder { 15 | 16 | /** 17 | * {@literal yyyy-MM-dd HH:mm:ssZZ}を返す。 18 | */ 19 | @Override 20 | protected String getDefaultPattern() { 21 | return "yyyy-MM-dd HH:mm:ssZZ"; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/LocalDateProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.LocalDate; 4 | 5 | /** 6 | * {@link LocalDate}に対するAutoBuilder。 7 | * @version 2.0 8 | * @since 1.2 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public class LocalDateProcessorBuilder extends AbstractJodaProcessorBuilder { 13 | 14 | /** 15 | * {@literal yyyy-MM-dd}を返す。 16 | */ 17 | @Override 18 | protected String getDefaultPattern() { 19 | return "yyyy-MM-dd"; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/LocalDateTimeProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.LocalDateTime; 4 | 5 | import com.github.mygreen.supercsv.builder.ProcessorBuilder; 6 | 7 | /** 8 | * {@link LocalDateTime}に対する{@link ProcessorBuilder}。 9 | * @version 2.0 10 | * @since 1.2 11 | * @author T.TSUCHIE 12 | * 13 | */ 14 | public class LocalDateTimeProcessorBuilder extends AbstractJodaProcessorBuilder { 15 | 16 | /** 17 | * {@literal yyyy-MM-dd HH:mm:ss}を返す。 18 | */ 19 | @Override 20 | protected String getDefaultPattern() { 21 | return "yyyy-MM-dd HH:mm:ss"; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/LocalTimeProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.LocalTime; 4 | 5 | import com.github.mygreen.supercsv.builder.ProcessorBuilder; 6 | 7 | /** 8 | * {@link LocalTime}に対する{@link ProcessorBuilder}。 9 | * @version 2.0 10 | * @since 1.2 11 | * @author T.TSUCHIE 12 | * 13 | */ 14 | public class LocalTimeProcessorBuilder extends AbstractJodaProcessorBuilder { 15 | 16 | /** 17 | * {@literal HH:mm:ss}を返す。 18 | */ 19 | @Override 20 | protected String getDefaultPattern() { 21 | return "HH:mm:ss"; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/MonthDayProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.MonthDay; 4 | 5 | /** 6 | * {@link MonthDay}に対するAutoBuilder。 7 | * @since 2.1 8 | * @author T.TSUCHIE 9 | * 10 | */ 11 | public class MonthDayProcessorBuilder extends AbstractJodaProcessorBuilder { 12 | 13 | /** 14 | * {@literal MM-dd}を返す。 15 | */ 16 | @Override 17 | protected String getDefaultPattern() { 18 | return "MM-dd"; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/YearMonthProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.joda; 2 | 3 | import org.joda.time.YearMonth; 4 | 5 | /** 6 | * {@link YearMonth}に対するAutoBuilder。 7 | * @since 2.1 8 | * @author T.TSUCHIE 9 | * 10 | */ 11 | public class YearMonthProcessorBuilder extends AbstractJodaProcessorBuilder { 12 | 13 | /** 14 | * {@literal yyyy-MM}を返す。 15 | */ 16 | @Override 17 | protected String getDefaultPattern() { 18 | return "yyyy-MM"; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/joda/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Joda-Timeのクラスタイプに対する{@link com.github.mygreen.supercsv.builder.ProcessorBuilder}の実装を提供します。 3 | * 4 | * @author T.TSUCHIE 5 | * 6 | */ 7 | package com.github.mygreen.supercsv.builder.joda; 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * {@link org.supercsv.cellprocessor.ift.CellProcessor}を組み立てる機能を提供します。 3 | * 4 | * @author T.TSUCHIE 5 | * 6 | */ 7 | package com.github.mygreen.supercsv.builder; 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/BigDecimalProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.math.BigDecimal; 4 | 5 | /** 6 | * BigDecimal型に対するビルダクラス。 7 | * 8 | * @version 2.0 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public class BigDecimalProcessorBuilder extends AbstractNumberProcessorBuilder { 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/BigIntegerProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.math.BigInteger; 4 | 5 | /** 6 | * BigInteger型に対するビルダクラス。 7 | * 8 | * @version 2.0 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public class BigIntegerProcessorBuilder extends AbstractNumberProcessorBuilder { 13 | 14 | 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/BooleanProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.util.Optional; 4 | 5 | import com.github.mygreen.supercsv.annotation.format.CsvBooleanFormat; 6 | import com.github.mygreen.supercsv.builder.AbstractProcessorBuilder; 7 | import com.github.mygreen.supercsv.builder.Configuration; 8 | import com.github.mygreen.supercsv.builder.FieldAccessor; 9 | import com.github.mygreen.supercsv.cellprocessor.format.BooleanFormatter; 10 | import com.github.mygreen.supercsv.cellprocessor.format.TextFormatter; 11 | 12 | 13 | /** 14 | * boolean/Boolean型のビルダクラス。 15 | * 16 | * @version 2.0 17 | * @author T.TSUCHIE 18 | * 19 | */ 20 | public class BooleanProcessorBuilder extends AbstractProcessorBuilder { 21 | 22 | @Override 23 | protected TextFormatter getDefaultFormatter(final FieldAccessor field, final Configuration config) { 24 | 25 | final Optional formatAnno = field.getAnnotation(CsvBooleanFormat.class); 26 | 27 | final BooleanFormatter formatter = formatAnno.map(anno -> new BooleanFormatter(anno.readForTrue(), anno.readForFalse(), 28 | anno.writeAsTrue(), anno.writeAsFalse(), anno.ignoreCase(), anno.failToFalse())) 29 | .orElseGet(() -> new BooleanFormatter()); 30 | 31 | formatAnno.ifPresent(a -> formatter.setValidationMessage(a.message())); 32 | 33 | return formatter; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/ByteProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Byte型に対するビルダ 5 | * 6 | * @since 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class ByteProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/CharacterProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import com.github.mygreen.supercsv.builder.AbstractProcessorBuilder; 4 | import com.github.mygreen.supercsv.builder.Configuration; 5 | import com.github.mygreen.supercsv.builder.FieldAccessor; 6 | import com.github.mygreen.supercsv.cellprocessor.format.TextFormatter; 7 | import com.github.mygreen.supercsv.cellprocessor.format.TextParseException; 8 | 9 | 10 | /** 11 | * char/Character型に対するビルダ 12 | * 13 | * @version 2.0 14 | * @author T.TSUCHIE 15 | * 16 | */ 17 | public class CharacterProcessorBuilder extends AbstractProcessorBuilder { 18 | 19 | @Override 20 | protected TextFormatter getDefaultFormatter(final FieldAccessor field, final Configuration config) { 21 | 22 | return new TextFormatter() { 23 | 24 | @Override 25 | public Character parse(final String text) { 26 | 27 | if(text.length() >= 1) { 28 | return text.charAt(0); 29 | } else { 30 | throw new TextParseException(text, field.getDeclaredClass(), 31 | "Cannot be parsed as a char as it is a String longer than 1 character"); 32 | } 33 | } 34 | 35 | @Override 36 | public String print(final Character object) { 37 | return object.toString(); 38 | } 39 | 40 | @Override 41 | public void setValidationMessage(String validationMessage) { 42 | // not support 43 | 44 | } 45 | 46 | }; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/DateProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * {@link Date}型に対するビルダ。 7 | * 8 | * @version 2.0 9 | * @author T.TSUCHIE 10 | * 11 | */ 12 | public class DateProcessorBuilder extends AbstractDateProcessorBuilder { 13 | 14 | /** 15 | * 標準の書式を取得する。 16 | * @return 常に、'{@literal yyyy-MM-dd HH:mm:ss}' を返す。 17 | */ 18 | @Override 19 | protected String getDefaultPattern() { 20 | return "yyyy-MM-dd HH:mm:ss"; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/DoubleProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Double型に対するビルダ 5 | * 6 | * @version 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class DoubleProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/EnumProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.util.Optional; 4 | 5 | import com.github.mygreen.supercsv.annotation.format.CsvEnumFormat; 6 | import com.github.mygreen.supercsv.builder.AbstractProcessorBuilder; 7 | import com.github.mygreen.supercsv.builder.Configuration; 8 | import com.github.mygreen.supercsv.builder.FieldAccessor; 9 | import com.github.mygreen.supercsv.cellprocessor.format.EnumFormatter; 10 | 11 | 12 | /** 13 | * 列挙型に対するビルダ 14 | * 15 | * @version 2.0 16 | * @author T.TSUCHIE 17 | * 18 | */ 19 | public class EnumProcessorBuilder> extends AbstractProcessorBuilder { 20 | 21 | public EnumProcessorBuilder() { 22 | super(); 23 | 24 | } 25 | 26 | @Override 27 | protected void init() { 28 | super.init(); 29 | 30 | // 制約のアノテーションの追加 31 | } 32 | 33 | @SuppressWarnings("unchecked") 34 | @Override 35 | protected EnumFormatter getDefaultFormatter(final FieldAccessor field, final Configuration config) { 36 | 37 | final Optional formatAnno = field.getAnnotation(CsvEnumFormat.class); 38 | final Optional selector = formatAnno.map(a -> a.selector().isEmpty() ? null : a.selector()); 39 | final boolean ignoreCase = formatAnno.map(a -> a.ignoreCase()).orElse(false); 40 | 41 | final EnumFormatter formatter; 42 | if(selector.isPresent()) { 43 | formatter = new EnumFormatter((Class)field.getType(), ignoreCase, selector.get()); 44 | } else { 45 | formatter = new EnumFormatter((Class)field.getType(), ignoreCase); 46 | } 47 | 48 | formatAnno.ifPresent(a -> formatter.setValidationMessage(a.message())); 49 | 50 | return formatter; 51 | } 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/FloatProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Float型に対するビルダ 5 | * 6 | * @version 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class FloatProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/IntegerProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Integer型に対するビルダ。 5 | * 6 | * @version 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class IntegerProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/LongProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Long型に対するビルダ 5 | * 6 | * @version 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class LongProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/ShortProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | /** 4 | * Short型に対するビルダ。 5 | * 6 | * @since 2.0 7 | * @author T.TSUCHIE 8 | * 9 | */ 10 | public class ShortProcessorBuilder extends AbstractNumberProcessorBuilder { 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/SqlDateProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.sql.Date; 4 | 5 | /** 6 | * 7 | * @version 2.0 8 | * @author T.TSUCHIE 9 | * 10 | */ 11 | public class SqlDateProcessorBuilder extends AbstractDateProcessorBuilder { 12 | 13 | /** 14 | * 標準の書式を取得する。 15 | * @return 常に、'{@literal yyyy-MM-dd}' を返す。 16 | */ 17 | @Override 18 | protected String getDefaultPattern() { 19 | return "yyyy-MM-dd"; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/mygreen/supercsv/builder/standard/TimeProcessorBuilder.java: -------------------------------------------------------------------------------- 1 | package com.github.mygreen.supercsv.builder.standard; 2 | 3 | import java.sql.Time; 4 | 5 | /** 6 | * 7 | * @version 2.0 8 | * @author T.TSUCHIE 9 | * 10 | */ 11 | public class TimeProcessorBuilder extends AbstractDateProcessorBuilder