package com.gh.mygreen.xlsmapper; import java.util.ArrayList; import java.util.List; import com.gh.mygreen.xlsmapper.validation.SheetBindingErrors; /** * 複数のシートを読み込む場合に、{@link SheetBindingErrors}を格納するクラス。 * * @author T.TSUCHIE * */ public class SheetBindingErrorsContainer { private List<SheetBindingErrors> list; final String objectName; final String[] objectNames; public SheetBindingErrorsContainer(final String objectName) { ArgUtils.notEmpty(objectName, "objectName"); this.objectName = objectName; this.objectNames = null; this.list = new ArrayList<SheetBindingErrors>(); } public SheetBindingErrorsContainer(final Class<?> clazz) { this(clazz.getCanonicalName()); } public SheetBindingErrorsContainer(final String[] objectNames) { ArgUtils.notEmpty(objectNames, "objectNames"); this.objectName = null; this.objectNames = objectNames; this.list = new ArrayList<SheetBindingErrors>(); } public SheetBindingErrorsContainer(final Class<?>[] classes) { ArgUtils.notEmpty(classes, "classes"); this.objectName = null; this.objectNames = new String[classes.length]; this.list = new ArrayList<SheetBindingErrors>(); for(int i=0; i < classes.length; i++) { this.objectNames[i] = classes[i].getCanonicalName(); } } /** * 引数listの中のindexのインデックス番号の要素を取得する。 * <p>indexで指定した要素が存在しない場合、インスタンスを作成しリストに追加する。 * @param index * @return */ SheetBindingErrors findBindingResult(final int index) { ArgUtils.notMin(index, 0, "index"); if(list.size() > index) { return list.get(index); } final SheetBindingErrors errors = new SheetBindingErrors(getObjectName(index)); list.add(errors); return errors; } private String getObjectName(final int index) { if(objectName != null) { return objectName; } else { return objectNames[index]; } } /** * シート名を指定してエラー情報を取得する。 * @param sheetName シート名 * @return * @throws IllegalArgumentException {@literal sheetName == null || sheetName.isEmpty() == true} * @throws IllegalArgumentException {@literal sheetName not contain.} */ public SheetBindingErrors getBindingResult(final String sheetName) { ArgUtils.notEmpty(sheetName, "sheetName"); for(SheetBindingErrors item : list) { if(sheetName.equals(item.getSheetName())) { return item; } } throw new IllegalArgumentException(String.format("not found errors for sheet '%s'.", sheetName)); } /** * 指定したシート名の情報が存在するかチェックする。 * @param sheetName シート名 * @return true: 存在する場合 * @throws IllegalArgumentException {@literal sheetName == null || sheetName.isEmpty() == true} * @throws IllegalArgumentException {@literal sheetName not contain.} */ public boolean containsBindingResult(final String sheetName) { ArgUtils.notEmpty(sheetName, "sheetName"); for(SheetBindingErrors item : list) { if(sheetName.equals(item.getSheetName())) { return true; } } return false; } /** * シート番号を指定してエラー情報を取得する。 * @param index シートのインデックス番号(0から始まる)。 * @return エラー情報。 * @throws IllegalArgumentException {@literal index < 0}. * @throws IllegalArgumentException {@literal index not contain.} */ public SheetBindingErrors getBindingResult(final int index) { ArgUtils.notMin(index, 0, "index"); if(list.size() > index) { return list.get(index); } throw new IllegalArgumentException(String.format("out of index number '%d' for errors.", index)); } /** * 指定したシート番号の情報が存在するかチェックする。 * @param index シートのインデックス番号(0から始まる)。 * @return true: 存在する場合 * @throws IllegalArgumentException {@literal index < 0}. * @throws IllegalArgumentException {@literal index not contain.} */ public boolean containsBindingResult(final int index) { ArgUtils.notMin(index, 0, "index"); return list.size() > index; } }