/*
* Copyright 2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orangesignal.csv.handlers;
import java.text.Format;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.orangesignal.csv.bean.AbstractCsvBeanTemplate;
import com.orangesignal.csv.bean.CsvValueConverter;
import com.orangesignal.csv.filters.BeanFilter;
/**
* Java プログラム要素のリストと区切り文字形式データアクセスを行うハンドラの基底クラスを提供します。
*
* @param <T> 区切り文字形式データの型
* @param <O> Java プログラム要素の操作を簡素化するヘルパークラスの型
* @param <H> 区切り文字形式データリストのデータアクセスハンドラの型
* @author Koji Sugisawa
*/
public abstract class AbstractBeanListHandler<T, O extends AbstractCsvBeanTemplate<T, O>, H extends AbstractBeanListHandler<T, O, H>> extends AbstractCsvListHandler<T, H> {
/**
* Java プログラム要素操作の簡素化ヘルパーを保持します。
*/
protected final O template;
/**
* Java プログラム要素フィルタを保持します。
*/
protected BeanFilter beanFilter;
/**
* 並び替え条件を保持します。
*/
protected List<BeanOrder> orders;
// ------------------------------------------------------------------------
/**
* コンストラクタです。
*
* @param template Java プログラム要素の操作を簡素化するヘルパークラスの型
* @throws IllegalArgumentException {@code template} が {@code null} の場合
*/
protected AbstractBeanListHandler(final O template) {
if (template == null) {
throw new IllegalArgumentException("AbstractCsvBeanTemplate must not be null");
}
this.template = template;
}
/**
* この実装は <code>orders</code> が指定されている場合、並び替えを行ってから {@link AbstractCsvListHandler#processScalar(List)} を呼出します。
*/
@Override
public List<T> processScalar(final List<T> beans) {
if (orders != null) {
BeanOrderComparator.sort(beans, orders);
}
return super.processScalar(beans);
}
// ------------------------------------------------------------------------
/**
* Java プログラム要素の型を返します。
*
* @return Java プログラム要素の型
*/
public Class<T> getType() { return template.getType(); }
/**
* Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップを設定します。
*
* @param valueParserMapping Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップ
* @throws IllegalArgumentException {@code valueParserMapping} が {@code null} の場合
* @since 1.2.4
*/
public void setValueParserMapping(final Map<String, Format> valueParserMapping) {
template.setValueParserMapping(valueParserMapping);
}
/**
* Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップを設定します。
*
* @param valueParserMapping Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップ
* @return このオブジェクトへの参照
* @throws IllegalArgumentException {@code valueParserMapping} が {@code null} の場合
* @since 1.2
*/
@SuppressWarnings("unchecked")
public H valueParserMapping(final Map<String, Format> valueParserMapping) {
setValueParserMapping(valueParserMapping);
return (H) this;
}
/**
* 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップを設定します。
*
* @param valueFormatterMapping 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップ
* @throws IllegalArgumentException {@code valueFormaterMapping} が {@code null} の場合
* @since 1.2.4
*/
public void setValueFormatterMapping(final Map<Object, Format> valueFormatterMapping) {
template.setValueFormatterMapping(valueFormatterMapping);
}
/**
* 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップを設定します。
*
* @param valueFormatterMapping 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップ
* @return このオブジェクトへの参照
* @throws IllegalArgumentException {@code valueFormaterMapping} が {@code null} の場合
* @since 1.2
*/
@SuppressWarnings("unchecked")
public H valueFormatterMapping(final Map<Object, Format> valueFormatterMapping) {
setValueFormatterMapping(valueFormatterMapping);
return (H) this;
}
/**
* 区切り文字形式データの項目値コンバータを設定します。
*
* @param valueConverter 区切り文字形式データの項目値コンバータ
* @throws IllegalArgumentException {@code valueConverter} が {@code null} の場合
* @since 1.2.4
*/
public void setValueConverter(final CsvValueConverter valueConverter) {
template.setValueConverter(valueConverter);
}
/**
* 区切り文字形式データの項目値コンバータを設定します。
*
* @param valueConverter 区切り文字形式データの項目値コンバータ
* @return このオブジェクトへの参照
* @throws IllegalArgumentException {@code valueConverter} が {@code null} の場合
* @since 1.2
*/
@SuppressWarnings("unchecked")
public H valueConverter(final CsvValueConverter valueConverter) {
setValueConverter(valueConverter);
return (H) this;
}
/**
* Java プログラム要素フィルタを設定します。
*
* @param beanFilter Java プログラム要素フィルタ
* @return このオブジェクトへの参照
* @since 1.2.3
*/
@SuppressWarnings("unchecked")
public H filter(final BeanFilter beanFilter) {
this.beanFilter = beanFilter;
return (H) this;
}
/**
* 並び替え条件を設定します。
*
* @param orders 並び替え条件
* @since 1.2.8
*/
public void setOrder(final List<BeanOrder> orders) {
this.orders = orders;
}
/**
* 並び替え条件を設定します。
*
* @param orders 並び替え条件
* @return このオブジェクトへの参照
* @since 1.2.8
*/
@SuppressWarnings("unchecked")
public H order(final BeanOrder... orders) {
setOrder(orders != null ? Arrays.asList(orders) : null);
return (H) this;
}
}