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.io.IOException;
20  import java.util.ArrayList;
21  import java.util.List;
22  
23  import com.orangesignal.csv.CsvReader;
24  import com.orangesignal.csv.CsvWriter;
25  import com.orangesignal.csv.annotation.CsvEntity;
26  import com.orangesignal.csv.bean.CsvEntityOperation;
27  import com.orangesignal.csv.bean.CsvEntityTemplate;
28  import com.orangesignal.csv.filters.CsvNamedValueFilter;
29  import com.orangesignal.csv.io.CsvEntityReader;
30  import com.orangesignal.csv.io.CsvEntityWriter;
31  
32  /**
33   * 区切り文字形式データ注釈要素 {@link com.orangesignal.csv.annotation.CsvEntity} で注釈付けされた Java プログラム要素のリストで区切り文字形式データアクセスを行うハンドラを提供します。
34   * 
35   * @author Koji Sugisawa
36   * @see com.orangesignal.csv.annotation.CsvEntity
37   * @see com.orangesignal.csv.annotation.CsvColumn
38   * @see com.orangesignal.csv.annotation.CsvColumns
39   * @see com.orangesignal.csv.manager.CsvEntityManager
40   */
41  public class CsvEntityListHandler<T> extends AbstractBeanListHandler<T, CsvEntityTemplate<T>, CsvEntityListHandler<T>> implements CsvEntityOperation<CsvEntityListHandler<T>> {
42  
43  	/**
44  	 * 区切り文字形式データの列見出し (ヘッダ) 行の出力を無効化するかどうかを保持します。
45  	 * 
46  	 * @since 2.2
47  	 */
48  	private boolean disableWriteHeader;
49  
50  	/**
51  	 * コンストラクタです。
52  	 * 
53  	 * @param entityClass 区切り文字形式データ注釈要素 {@link com.orangesignal.csv.annotation.CsvEntity} で注釈付けされた Java プログラム要素の型
54  	 * @throws IllegalArgumentException {@code entityClass} が {@code null} または不正な場合
55  	 */
56  	public CsvEntityListHandler(final Class<T> entityClass) {
57  		super(CsvEntityTemplate.newInstance(entityClass));
58  	}
59  
60  	/**
61  	 * 区切り文字形式データの列見出し (ヘッダ) 行の出力を無効化するかどうかを設定します。
62  	 * 
63  	 * @param disableWriteHeader 区切り文字形式データの列見出し (ヘッダ) 行の出力を無効化するかどうか
64  	 * @return このオブジェクトへの参照
65  	 * @since 2.2
66  	 */
67  	public CsvEntityListHandler<T> disableWriteHeader(final boolean disableWriteHeader) {
68  		setDisableWriteHeader(disableWriteHeader);
69  		return this;
70  	}
71  
72  	/**
73  	 * 区切り文字形式データの列見出し (ヘッダ) 行の出力を無効化するかどうかを設定します。
74  	 * 
75  	 * @param disableWriteHeader 区切り文字形式データの列見出し (ヘッダ) 行の出力を無効化するかどうか
76  	 * @since 2.2
77  	 */
78  	public void setDisableWriteHeader(final boolean disableWriteHeader) {
79  		this.disableWriteHeader = disableWriteHeader;
80  	}
81  
82  	@Override
83  	public CsvEntityListHandler<T> filter(final CsvNamedValueFilter filter) {
84  		template.filter(filter);
85  		return this;
86  	}
87  
88  	@Override
89  	public List<T> load(final CsvReader reader, final boolean ignoreScalar) throws IOException {
90  		@SuppressWarnings("resource")
91  		final CsvEntityReader<T> r = new CsvEntityReader<T>(reader, template);
92  
93  		// すべてのデータを読取って繰返し処理します。
94  		final List<T> results = new ArrayList<T>();
95  		final boolean order = ignoreScalar || orders != null && !orders.isEmpty();
96  		int offset = 0;
97  
98  		List<String> values;
99  		while ((values = r.readValues()) != null && (order || limit <= 0 || results.size() < limit)) {
100 			if (beanFilter == null && !order && offset < this.offset) {
101 				offset++;
102 				continue;
103 			}
104 			final T entity = r.toEntity(values);
105 			if (beanFilter != null) {
106 				if (!beanFilter.accept(entity)) {
107 					continue;
108 				}
109 				if (!order && offset < this.offset) {
110 					offset++;
111 					continue;
112 				}
113 			}
114 			results.add(entity);
115 		}
116 
117 		if (ignoreScalar || !order) {
118 			return results;
119 		}
120 		return processScalar(results);
121 	}
122 
123 	@Override
124 	public void save(final List<T> entities, final CsvWriter writer) throws IOException {
125 		if (entities == null) {
126 			throw new IllegalArgumentException("CsvEntities must not be null");
127 		}
128 
129 		@SuppressWarnings("resource")
130 		final CsvEntityWriter<T> w = new CsvEntityWriter<T>(writer, template, disableWriteHeader);
131 
132 		// データ出力
133 		for (final T entity : entities) {
134 			if (entity == null || entity.getClass().getAnnotation(CsvEntity.class) == null) {
135 				w.write(null);
136 				continue;
137 			} else if (beanFilter != null && !beanFilter.accept(entity)) {
138 				continue;
139 			}
140 
141 			w.write(entity);
142 		}
143 	}
144 
145 }