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.List;
21  
22  import com.orangesignal.csv.CsvListHandler;
23  import com.orangesignal.csv.CsvReader;
24  
25  /**
26   * 区切り文字形式データリストのデータアクセスを行うハンドラの基底クラスを提供します。
27   *
28   * @param <T> 区切り文字形式データの型
29   * @param <H> 区切り文字形式データリストのデータアクセスハンドラの型
30   * @author Koji Sugisawa
31   * @since 1.3.0
32   */
33  public abstract class AbstractCsvListHandler<T, H extends AbstractCsvListHandler<T, H>> implements CsvListHandler<T> {
34  
35  	/**
36  	 * 取得データの開始位置を保持します。
37  	 */
38  	protected int offset;
39  
40  	/**
41  	 * 取得データの限度数を保持します。
42  	 */
43  	protected int limit;
44  
45  	/**
46  	 * デフォルトコンストラクタです。
47  	 */
48  	public AbstractCsvListHandler() {}
49  
50  	@Override
51  	public void setOffset(final int offset) {
52  		this.offset = offset;
53  	}
54  
55  	@SuppressWarnings("unchecked")
56  	@Override
57  	public H offset(final int offset) {
58  		setOffset(offset);
59  		return (H) this;
60  	}
61  
62  	@Override
63  	public void setLimit(final int limit) {
64  		this.limit = limit;
65  	}
66  
67  	@SuppressWarnings("unchecked")
68  	@Override
69  	public H limit(final int limit) {
70  		setLimit(limit);
71  		return (H) this;
72  	}
73  
74  	@Override
75  	public List<T> load(final CsvReader reader) throws IOException {
76  		return load(reader, false);
77  	}
78  
79  	/**
80  	 * {@inheritDoc}
81  	 * この実装は単に {@code offset} と {@code limit} を使用して処理します。
82  	 */
83  	@Override
84  	public List<T> processScalar(final List<T> list) {
85  		final int fromIndex = Math.max(this.offset, 0);
86  		final int toIndex = this.limit <= 0 ? list.size() : Math.min(fromIndex + this.limit, list.size());
87  		return list.subList(fromIndex, toIndex);
88  	}
89  
90  }