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;
18  
19  import java.io.IOException;
20  import java.io.Serializable;
21  import java.sql.ResultSetMetaData;
22  import java.sql.SQLException;
23  import java.sql.SQLFeatureNotSupportedException;
24  import java.sql.Types;
25  import java.util.List;
26  
27  /**
28   * {@link ResultSetMetaData} の実装クラスを提供します。
29   *
30   * @author Koji Sugisawa
31   */
32  public class CsvResultSetMetaData implements Serializable, ResultSetMetaData {
33  
34  	private static final long serialVersionUID = -177998106514695495L;
35  
36  	/**
37  	 * 列名のリストを保持します。
38  	 */
39  	private final List<String> columns;
40  
41  	/**
42  	 * コンストラクタです。
43  	 *
44  	 * @param reader 区切り文字形式入力ストリーム
45  	 * @throws IOException 入出力例外が発生した場合
46  	 */
47  	public CsvResultSetMetaData(final CsvReader reader) throws IOException {
48  		columns = reader.readValues();
49  		if (columns == null) {
50  			throw new IOException("No header is available");
51  		}
52  	}
53  
54  	// ------------------------------------------------------------------------
55  
56  	@Override
57  	public int getColumnCount() {
58  		return columns.size();
59  	}
60  
61  	/**
62  	 * {@inheritDoc}
63  	 * この実装は常に <code>false</code> を返します。
64  	 */
65  	@Override public boolean isAutoIncrement(final int column) { return false; }
66  
67  	/**
68  	 * {@inheritDoc}
69  	 * この実装は常に <code>true</code> を返します。
70  	 */
71  	@Override public boolean isCaseSensitive(final int column) { return true; }
72  
73  	/**
74  	 * {@inheritDoc}
75  	 * この実装は常に <code>false</code> を返します。
76  	 */
77  	@Override
78  	public boolean isSearchable(final int column) { return false; }
79  
80  	/**
81  	 * {@inheritDoc}
82  	 * この実装は常に <code>false</code> を返します。
83  	 */
84  	@Override public boolean isCurrency(final int column) { return false; }
85  
86  	/**
87  	 * {@inheritDoc}
88  	 * この実装は常に {@link ResultSetMetaData#columnNullableUnknown} を返します。
89  	 */
90  	@Override public int isNullable(final int column) { return columnNullableUnknown; }
91  
92  	/**
93  	 * {@inheritDoc}
94  	 * この実装は常に <code>false</code> を返します。
95  	 */
96  	@Override public boolean isSigned(final int column) { return false; }
97  
98  	/**
99  	 * {@inheritDoc}
100 	 * この実装は常に {@link Integer#MAX_VALUE} を返します。
101 	 */
102 	@Override public int getColumnDisplaySize(final int column) { return Integer.MAX_VALUE; }
103 
104 	@Override
105 	public String getColumnLabel(final int column) throws SQLException {
106 		return getColumnName(column);
107 	}
108 
109 	@Override
110 	public String getColumnName(final int column) throws SQLException {
111 		if (column < 1 || column > columns.size()) {
112 			throw new SQLException("Invalid column " + column);
113 		}
114 		return columns.get(column - 1);
115 	}
116 
117 	/**
118 	 * {@inheritDoc}
119 	 * この実装は常に空文字列 (<code>""</code>) を返します。
120 	 */
121 	@Override public String getSchemaName(final int column) { return ""; }
122 
123 	/**
124 	 * {@inheritDoc}
125 	 * この実装は常に <code>0</code> を返します。
126 	 */
127 	@Override public int getPrecision(final int column) { return 0; }
128 
129 	/**
130 	 * {@inheritDoc}
131 	 * この実装は常に <code>0</code> を返します。
132 	 */
133 	@Override public int getScale(final int column) { return 0; }
134 
135 	/**
136 	 * {@inheritDoc}
137 	 * この実装は常に空文字列 (<code>""</code>) を返します。
138 	 */
139 	@Override public String getTableName(final int column) { return ""; }
140 
141 	/**
142 	 * {@inheritDoc}
143 	 * この実装は常に空文字列 (<code>""</code>) を返します。
144 	 */
145 	@Override public String getCatalogName(final int column) { return ""; }
146 
147 	/**
148 	 * {@inheritDoc}
149 	 * この実装は常に {@link Types#VARCHAR} を返します。
150 	 */
151 	@Override public int getColumnType(final int column) { return Types.VARCHAR; }
152 
153 	/**
154 	 * {@inheritDoc}
155 	 * この実装は常に "java.lang.String" を返します。
156 	 */
157 	@Override public String getColumnTypeName(final int column) { return String.class.getName(); }
158 
159 	/**
160 	 * {@inheritDoc}
161 	 * この実装は常に <code>true</code> を返します。
162 	 */
163 	@Override public boolean isReadOnly(final int column) { return true; }
164 
165 	/**
166 	 * {@inheritDoc}
167 	 * この実装は常に <code>false</code> を返します。
168 	 */
169 	@Override public boolean isWritable(final int column) { return false; }
170 
171 	/**
172 	 * {@inheritDoc}
173 	 * この実装は常に <code>false</code> を返します。
174 	 */
175 	@Override public boolean isDefinitelyWritable(final int column) { return false; }
176 
177 	/**
178 	 * {@inheritDoc}
179 	 * この実装は常に "java.lang.String" を返します。
180 	 */
181 	@Override public String getColumnClassName(final int column) { return String.class.getName(); }
182 
183 	// ------------------------------------------------------------------------
184 
185 	/**
186 	 * {@inheritDoc}
187 	 * この実装は常に {@link SQLFeatureNotSupportedException} をスローします。
188 	 */
189 	@Override
190 	public <T> T unwrap(final Class<T> iface) throws SQLFeatureNotSupportedException {
191 		throw new SQLFeatureNotSupportedException("unwrap(Class) not supported");
192 	}
193 
194 	/**
195 	 * {@inheritDoc}
196 	 * この実装は常に {@link SQLFeatureNotSupportedException} をスローします。
197 	 */
198 	@Override
199 	public boolean isWrapperFor(final Class<?> iface) throws SQLFeatureNotSupportedException {
200 		throw new SQLFeatureNotSupportedException("isWrapperFor(Class) not supported");
201 	}
202 
203 }