View Javadoc
1   /*
2    * Copyright 2013 the original author or authors.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.orangesignal.csv.handlers;
18  
19  import java.text.Format;
20  import java.util.Arrays;
21  import java.util.List;
22  import java.util.Map;
23  
24  import com.orangesignal.csv.bean.AbstractCsvBeanTemplate;
25  import com.orangesignal.csv.bean.CsvValueConverter;
26  import com.orangesignal.csv.filters.BeanFilter;
27  
28  /**
29   * Java プログラム要素のリストと区切り文字形式データアクセスを行うハンドラの基底クラスを提供します。
30   * 
31   * @param <T> 区切り文字形式データの型
32   * @param <O> Java プログラム要素の操作を簡素化するヘルパークラスの型
33   * @param <H> 区切り文字形式データリストのデータアクセスハンドラの型
34   * @author Koji Sugisawa
35   */
36  public abstract class AbstractBeanListHandler<T, O extends AbstractCsvBeanTemplate<T, O>, H extends AbstractBeanListHandler<T, O, H>> extends AbstractCsvListHandler<T, H> {
37  
38  	/**
39  	 * Java プログラム要素操作の簡素化ヘルパーを保持します。
40  	 */
41  	protected final O template;
42  
43  	/**
44  	 * Java プログラム要素フィルタを保持します。
45  	 */
46  	protected BeanFilter beanFilter;
47  
48  	/**
49  	 * 並び替え条件を保持します。
50  	 */
51  	protected List<BeanOrder> orders;
52  
53  	// ------------------------------------------------------------------------
54  
55  	/**
56  	 * コンストラクタです。
57  	 * 
58  	 * @param template Java プログラム要素の操作を簡素化するヘルパークラスの型
59  	 * @throws IllegalArgumentException {@code template} が {@code null} の場合
60  	 */
61  	protected AbstractBeanListHandler(final O template) {
62  		if (template == null) {
63  			throw new IllegalArgumentException("AbstractCsvBeanTemplate must not be null");
64  		}
65  		this.template = template;
66  	}
67  
68  	/**
69  	 * この実装は <code>orders</code> が指定されている場合、並び替えを行ってから {@link AbstractCsvListHandler#processScalar(List)} を呼出します。
70  	 */
71  	@Override
72  	public List<T> processScalar(final List<T> beans) {
73  		if (orders != null) {
74  			BeanOrderComparator.sort(beans, orders);
75  		}
76  		return super.processScalar(beans);
77  	}
78  
79  	// ------------------------------------------------------------------------
80  
81  	/**
82  	 * Java プログラム要素の型を返します。
83  	 * 
84  	 * @return Java プログラム要素の型
85  	 */
86  	public Class<T> getType() { return template.getType(); }
87  
88  	/**
89  	 * Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップを設定します。
90  	 * 
91  	 * @param valueParserMapping Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップ
92  	 * @throws IllegalArgumentException {@code valueParserMapping} が {@code null} の場合
93  	 * @since 1.2.4
94  	 */
95  	public void setValueParserMapping(final Map<String, Format> valueParserMapping) {
96  		template.setValueParserMapping(valueParserMapping);
97  	}
98  
99  	/**
100 	 * Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップを設定します。
101 	 * 
102 	 * @param valueParserMapping Java プログラム要素のフィールド名と項目値を解析するオブジェクトのマップ
103 	 * @return このオブジェクトへの参照
104 	 * @throws IllegalArgumentException {@code valueParserMapping} が {@code null} の場合
105 	 * @since 1.2
106 	 */
107 	@SuppressWarnings("unchecked")
108 	public H valueParserMapping(final Map<String, Format> valueParserMapping) {
109 		setValueParserMapping(valueParserMapping);
110 		return (H) this;
111 	}
112 
113 	/**
114 	 * 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップを設定します。
115 	 * 
116 	 * @param valueFormatterMapping 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップ
117 	 * @throws IllegalArgumentException {@code valueFormaterMapping} が {@code null} の場合
118 	 * @since 1.2.4
119 	 */
120 	public void setValueFormatterMapping(final Map<Object, Format> valueFormatterMapping) {
121 		template.setValueFormatterMapping(valueFormatterMapping);
122 	}
123 
124 	/**
125 	 * 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップを設定します。
126 	 * 
127 	 * @param valueFormatterMapping 項目名 (または項目位置) と項目値へ書式化するオブジェクトのマップ
128 	 * @return このオブジェクトへの参照
129 	 * @throws IllegalArgumentException {@code valueFormaterMapping} が {@code null} の場合
130 	 * @since 1.2
131 	 */
132 	@SuppressWarnings("unchecked")
133 	public H valueFormatterMapping(final Map<Object, Format> valueFormatterMapping) {
134 		setValueFormatterMapping(valueFormatterMapping);
135 		return (H) this;
136 	}
137 
138 	/**
139 	 * 区切り文字形式データの項目値コンバータを設定します。
140 	 * 
141 	 * @param valueConverter 区切り文字形式データの項目値コンバータ
142 	 * @throws IllegalArgumentException {@code valueConverter} が {@code null} の場合
143 	 * @since 1.2.4
144 	 */
145 	public void setValueConverter(final CsvValueConverter valueConverter) {
146 		template.setValueConverter(valueConverter);
147 	}
148 
149 	/**
150 	 * 区切り文字形式データの項目値コンバータを設定します。
151 	 * 
152 	 * @param valueConverter 区切り文字形式データの項目値コンバータ
153 	 * @return このオブジェクトへの参照
154 	 * @throws IllegalArgumentException {@code valueConverter} が {@code null} の場合
155 	 * @since 1.2
156 	 */
157 	@SuppressWarnings("unchecked")
158 	public H valueConverter(final CsvValueConverter valueConverter) {
159 		setValueConverter(valueConverter);
160 		return (H) this;
161 	}
162 
163 	/**
164 	 * Java プログラム要素フィルタを設定します。
165 	 * 
166 	 * @param beanFilter Java プログラム要素フィルタ
167 	 * @return このオブジェクトへの参照
168 	 * @since 1.2.3
169 	 */
170 	@SuppressWarnings("unchecked")
171 	public H filter(final BeanFilter beanFilter) {
172 		this.beanFilter = beanFilter;
173 		return (H) this;
174 	}
175 
176 	/**
177 	 * 並び替え条件を設定します。
178 	 * 
179 	 * @param orders 並び替え条件
180 	 * @since 1.2.8
181 	 */
182 	public void setOrder(final List<BeanOrder> orders) {
183 		this.orders = orders;
184 	}
185 
186 	/**
187 	 * 並び替え条件を設定します。
188 	 * 
189 	 * @param orders 並び替え条件
190 	 * @return このオブジェクトへの参照
191 	 * @since 1.2.8
192 	 */
193 	@SuppressWarnings("unchecked")
194 	public H order(final BeanOrder... orders) {
195 		setOrder(orders != null ? Arrays.asList(orders) : null);
196 		return (H) this;
197 	}
198 
199 }