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

com.github.mygreen.supercsv.validation.CsvField Maven / Gradle / Ivy

Go to download

CSVのJavaライブラリであるSuperCSVに、アノテーション機能を追加したライブラリです。

There is a newer version: 2.3
Show newest version
package com.github.mygreen.supercsv.validation;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import com.github.mygreen.supercsv.annotation.CsvColumn;
import com.github.mygreen.supercsv.builder.ColumnMapping;
import com.github.mygreen.supercsv.util.ArgUtils;

/**
 * 独自にフィールドの値を検証する機能を実装する際のヘルパクラス。
 *
 * @param  フィールドのクラスタイプ。
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class CsvField {
    
    private final String name;
    
    private final T value;
    
    private final ColumnMapping columnMapping;
    
    private final ValidationContext validationContext;
    
    private final List> validators = new ArrayList<>();
    
    /**
     * 
     * @param  レコードのクラスタイプ。
     * @param validationContext 入力値検証の情報
     * @param record レコードオブジェクト
     * @param fieldName フィールド名
     * @throws NullPointerException {@literal bindingErrors or validationContext or record is null.}
     * @throws IllegalArgumentException 指定したフィールドがレコードに存在しない場合。
     */
    @SuppressWarnings("unchecked")
    public  CsvField(final ValidationContext validationContext, final R record, final String fieldName) {
        Objects.requireNonNull(validationContext);
        Objects.requireNonNull(record);
        ArgUtils.notEmpty(fieldName, "fieldName");
        
        this.columnMapping = validationContext.getBeanMapping().getColumnMapping(fieldName)
                .orElseThrow(() -> new IllegalArgumentException(
                        String.format("not found field '%s' in record '%s'", fieldName, record.getClass().getName())));
        
        this.validationContext = validationContext;
        this.name = fieldName;
        this.value = (T)columnMapping.getField().getValue(record);
        
    }
    
    /**
     * フィールドの名称を取得します。
     * @return コンストラクタで指定したフィールドの名称。
     */
    public String getName() {
        return name;
    }
    
    /**
     * フィールドのークラスタイプを取得します。
     * @return クラス情報を返す。
     */
    @SuppressWarnings("unchecked")
    public Class getType() {
        return (Class) columnMapping.getField().getType();
    }
    
    /**
     * フィールドのラベルを取得します。
     * @return アノテーションの属性{@link CsvColumn#label()}の値を取得します。
     */
    public String getLabel() {
        return columnMapping.getLabel();
    }
    
    /**
     * フィールドの列番号を取得します。
     * @return アノテーションの属性{@link CsvColumn#number()}の値を取得します。
     */
    public int getColumnNumber() {
        return columnMapping.getNumber();
    }
    
    /**
     * フィールドに対するエラーがあるか検査します。
     * @param bindingErrors エラー情報
     * @return trueの場合、エラーがあると判定します。
     * @throws NullPointerException {@literal bindingErrors is null.}
     */
    public boolean hasError(final CsvBindingErrors bindingErrors) {
        Objects.requireNonNull(bindingErrors);
        return bindingErrors.hasFieldErrors(name);
    }
    
    /**
     * フィールドに対するエラーがないか検査します。
     * @see #hasError(CsvBindingErrors)
     * @param bindingErrors エラー情報
     * @return trueの場合、エラーがないと判定します。
     * @throws NullPointerException {@literal bindingErrors is null.}
     */
    public boolean hasNotError(final CsvBindingErrors bindingErrors) {
        return !hasError(bindingErrors);
    }
    
    /**
     * 値が空かどうか判定します。
     * 

基本的に、nullかどうかで判定しますが、文字列型の場合は空文字かどうかでも判定します。 * @return trueの場合、空と判定します。 */ public boolean isEmpty() { if(value == null) { return true; } if(value instanceof String) { return ((String)value).isEmpty(); } return false; } /** * 値が空でないかどうか判定します。 * @since {@link #isEmpty()} * @return trueの場合、非空と判定します。 */ public boolean isNotEmpty() { return !isEmpty(); } /** * フィールドのバリデータを追加する。 * @param validator バリデータ。 * @return 自身のインスタンス。 * @throws NullPointerException {@literal validator is null.} */ public CsvField add(final CsvFieldValidator validator) { Objects.requireNonNull(validator); validators.add(validator); return this; } /** * フィールドの値の検証を行う。 *

既にエラーがある場合や検証後エラーとなる場合は、その時点で検証を中止する。

* @param bindingErrors エラー情報。 * @return 自身のインスタンス。 * @throws NullPointerException {@literal bindingErrors is null.} */ public CsvField validate(final CsvBindingErrors bindingErrors) { Objects.requireNonNull(bindingErrors); for(CsvFieldValidator validator : getValidators()) { if(hasError(bindingErrors)) { return this; } validator.validate(bindingErrors, this); } return this; } /** * フィールドのエラー情報を取得する。 * @param bindingErrors エラー情報 * @return エラーがない場合は空のリストを返します。 * @throws NullPointerException {@literal bindingErrors is null.} */ public List getFieldErrors(final CsvBindingErrors bindingErrors) { Objects.requireNonNull(bindingErrors); return bindingErrors.getFieldErrors(getName()); } /** * フィールドの値を取得します。 * @return CellProcessorでエラーが発生した場合、値はなくnullを返します。 */ public T getValue() { return value; } /** * カラムのマッピング情報 * @return CsvBeanに定義したカラムのマッピング情報 */ public ColumnMapping getColumnMapping() { return columnMapping; } /** * 入力値検証の情報 * @return コンストラクタで渡した */ public ValidationContext getValidationContext() { return validationContext; } /** * フィールドのValidatorの一覧を取得する。 * @return 設定されている{@link CsvFieldValidator}のリストを取得する。 */ public List> getValidators() { return validators; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy