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