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.bean;
18  
19  import java.lang.reflect.Field;
20  import java.text.Format;
21  import java.util.ArrayList;
22  import java.util.LinkedHashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import com.orangesignal.csv.filters.CsvNamedValueFilter;
27  
28  /**
29   * 区切り文字形式データの項目名を基準として Java プログラム要素の操作を簡素化するヘルパークラスを提供します。
30   * 
31   * @author Koji Sugisawa
32   * @since 1.4.0
33   */
34  public class CsvColumnNameMappingBeanTemplate<T> extends AbstractCsvBeanTemplate<T, CsvColumnNameMappingBeanTemplate<T>> implements CsvColumnNameMappingBeanOperation<CsvColumnNameMappingBeanTemplate<T>> {
35  
36  	/**
37  	 * 項目名と Java プログラム要素のフィールド名のマップを保持します。
38  	 */
39  	private Map<String, String> columnMapping = new LinkedHashMap<String, String>();
40  
41  	/**
42  	 * 区切り文字形式データフィルタを保持します。
43  	 */
44  	private CsvNamedValueFilter filter;
45  
46  	// ------------------------------------------------------------------------
47  	// 利便性のための静的メソッド
48  
49  	/**
50  	 * 新しい {@link CsvColumnNameMappingBeanTemplate} のインスタンスを返します。
51  	 * 
52  	 * @param type Java プログラム要素の型
53  	 * @return 新しい {@link CsvColumnNameMappingBeanTemplate} のインスタンス
54  	 * @throws IllegalArgumentException {@code type} が {@code null} の場合。
55  	 */
56  	public static <T> CsvColumnNameMappingBeanTemplate<T> newInstance(final Class<T> type) {
57  		return new CsvColumnNameMappingBeanTemplate<T>(type);
58  	}
59  
60  	// -----------------------------------------------------------------------
61  	// コンストラクタ
62  
63  	/**
64  	 * コンストラクタです。
65  	 * 
66  	 * @param type Java プログラム要素の型
67  	 * @throws IllegalArgumentException {@code type} が {@code null} の場合。
68  	 */
69  	public CsvColumnNameMappingBeanTemplate(final Class<T> type) {
70  		super(type);
71  	}
72  
73  	// -----------------------------------------------------------------------
74  	// オーバーライド メソッド
75  
76  	@Override
77  	public CsvColumnNameMappingBeanTemplate<T> column(final String column, final String field) {
78  		return column(column, field, null);
79  	}
80  
81  	@Override
82  	public CsvColumnNameMappingBeanTemplate<T> column(final String column, final String field, final Format format) {
83  		columnMapping.put(column, field);
84  		if (format != null) {
85  			setValueParser(field, format);
86  			setValueFormatter(column, format);
87  		}
88  		return this;
89  	}
90  
91  	@Override
92  	public void setColumnMapping(final Map<String, String> columnMapping) {
93  		if (columnMapping == null) {
94  			throw new IllegalArgumentException("Column mapping must not be null");
95  		}
96  		this.columnMapping = new LinkedHashMap<String, String>(columnMapping);
97  	}
98  
99  	@Override
100 	public CsvColumnNameMappingBeanTemplate<T> columnMapping(final Map<String, String> columnMapping) {
101 		setColumnMapping(columnMapping);
102 		return this;
103 	}
104 
105 	@Override
106 	public CsvColumnNameMappingBeanTemplate<T> filter(final CsvNamedValueFilter filter) {
107 		this.filter = filter;
108 		return this;
109 	}
110 
111 	// ------------------------------------------------------------------------
112 	// パブリック メソッド
113 
114 	/**
115 	 * 項目名とフィールド名のマップが指定されていない場合、フィールド名からマップを作成して準備します。
116 	 */
117 	public void setupColumnMappingIfNeed() {
118 		if (columnMapping.size() == 0) {
119 			for (final Field f : getType().getDeclaredFields()) {
120 				final String name = f.getName();
121 				column(name, name);
122 			}
123 		}
124 	}
125 
126 	/**
127 	 * 指定された区切り文字形式データの値リストが含まれる必要があるかどうかを判定します。
128 	 * 
129 	 * @param columnNames 区切り文字形式データの項目名リスト
130 	 * @param values 区切り文字形式データの項目値のリスト
131 	 * @return {@code values} が含まれる必要がある場合は {@code true}
132 	 */
133 	public boolean isAccept(final List<String> columnNames, final List<String> values) {
134 		return filter != null && !filter.accept(columnNames, values);
135 	}
136 
137 	// 入力
138 
139 	public Map<String, Object[]> createFieldAndColumnsMap() {
140 		return super.createFieldAndColumnsMap(columnMapping);
141 	}
142 
143 	// 出力
144 
145 	/**
146 	 * 項目名のリストを作成して返します。
147 	 * 
148 	 * @return 項目名のリスト
149 	 */
150 	public List<String> createColumnNames() {
151 		final List<String> columnNames = new ArrayList<String>();
152 		for (final Map.Entry<String, String> entry : columnMapping.entrySet()) {
153 			columnNames.add(entry.getKey());
154 		}
155 		return columnNames;
156 	}
157 
158 	public String getFieldName(final String columnName) {
159 		return columnMapping.get(columnName);
160 	}
161 
162 }