001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.process;
017
018 import org.opengion.fukurou.model.DataModel;
019 import org.opengion.fukurou.model.NativeType;
020 import org.opengion.fukurou.util.StringUtil;
021
022 import java.util.Arrays;
023
024 /**
025 * LineModel は、データの?‘行å?を管ç�?�™る為の TableModel と類似の実è£?‚¯ラスですã?
026 *
027 * ãƒ??タの?‘行å?ã‚?LineModel に割り当てますã?
028 * カラãƒ?•ª号はã€? から始まりますã?カラãƒ?��よりカラãƒ?•ª号を求めるå?合にã€?
029 * 存在しなã�??合ã?ã€?1 を返しますã?
030 * カラãƒ?•ª号ã�?-1 の場合ã?、å?ç�?‚’行いませんã€?
031 *
032 * 注意:このクラスは、同期å?ç�?�•れてã�?�¾せんã€?
033 *
034 * @version 4.0
035 * @author Kazuhiko Hasegawa
036 * @since JDK5.0,
037 */
038 public class LineModel implements DataModel<Object> { // 4.3.3.6 (2008/11/15) Generics警告対å¿?
039 /** タブセパレータ */
040 private static final String TAB = "\t"; // タブ区åˆ?‚Šæ–??
041
042 /** リターンコーãƒ? System.getProperty("line.separator") */
043 private static final String CR = System.getProperty("line.separator");
044
045 private String[] names = null;
046 private Object[] data = null;
047 private int dtSize = 0;
048 private int rowNo = -1;
049
050 /**
051 * こã?オブジェクトを初期化しますã?
052 * æŒ?®šã?引数åˆ??å†?ƒ¨配å?を作æ?しますã?
053 *
054 * @param columnCount カラãƒ?•°
055 */
056 public void init( final int columnCount ) {
057 if( columnCount <= 0 ) {
058 String errMsg = "å†?ƒ¨配å?の数量が 0かã?è²?�§すã?count=[" + columnCount + "]";
059 throw new RuntimeException( errMsg );
060 }
061 dtSize = columnCount;
062 names = new String[dtSize];
063 data = new Object[dtSize];
064 }
065
066 /**
067 * カラãƒ?��配å?を指定して、このオブジェクトを初期化しますã?
068 *
069 * @param clmNms カラãƒ?��配å?
070 */
071 public void init( final String[] clmNms ) {
072 if( clmNms == null ) {
073 String errMsg = "カラãƒ?��配å?がã? null ですã?";
074 throw new RuntimeException( errMsg );
075 }
076 dtSize = clmNms.length;
077 names = new String[dtSize];
078 System.arraycopy( clmNms,0,names,0,dtSize );
079 data = new Object[dtSize];
080 }
081
082 /**
083 * 名前をセãƒ?ƒˆしますã?
084 * æŒ?®šã?カラãƒ?•ª号がã?-1 の場合ã?、なにもしませんã€?
085 *
086 * @param clm 値が変更されるカラãƒ?•ª号
087 * @param key 新しい名前
088 *
089 */
090 public void setName( final int clm,final String key ) {
091 if( clm >= 0 ) { names[clm] = key; }
092 }
093
094 /**
095 * カラãƒ?•ª号に対するカラãƒ?��を取得しますã?
096 * æŒ?®šã?カラãƒ?•ª号がã?-1 の場合ã?、null を返しますã?
097 *
098 * @param clm æœ??のカラãƒ?•ª号は 0ã€?番目のカラãƒ?•ª号は 1、などとするã€?
099 *
100 * @return カラãƒ?��
101 *
102 */
103 public String getName( final int clm ) {
104 return ( clm >= 0 ) ? names[clm] : null ;
105 }
106
107 /**
108 * カラãƒ?��配å?を返しますã?
109 * 配å?オブジェクトã?、clone されたコピã?を返しますã?でã€?
110 * å†?®¹を書き換えたã�??合ã?、setName() メソãƒ?ƒ‰を使用してくださいã€?
111 *
112 * @return カラãƒ?��配å?
113 */
114 public String[] getNames() {
115 return names.clone();
116 }
117
118 /**
119 * column に対応しã�?値を登録しますã?
120 * æŒ?®šã?カラãƒ?•ª号がã?-1 の場合ã?、なにもしませんã€?
121 *
122 * @param clm 値が変更されるカラãƒ?•ª号
123 * @param value 新しい値。null も可
124 *
125 */
126 public void setValue( final int clm,final Object value ) {
127 if( clm >= 0 ) { data[clm] = value; }
128 }
129
130 /**
131 * column にあるセルの属æ?値をObjectに変換して返しますã?
132 * æŒ?®šã?カラãƒ?•ª号がã?-1 の場合ã?、null を返しますã?
133 *
134 * @param clm 値が参照されるカラãƒ?•ª号
135 *
136 * @return æŒ?®šされたセルの値 Object
137 *
138 */
139 public Object getValue( final int clm ) {
140 return ( clm >= 0 ) ? data[clm] : null ;
141 }
142
143 /**
144 * row および clm にあるセルの属æ?値をStringに変換して返しますã?
145 *
146 * @param row 値が参照されるè¡?
147 * @param clm 値が参照されるå?
148 *
149 * @return æŒ?®šされたセルの値
150 *
151 */
152 public String getValue( final int row, final int clm) {
153 String errMsg = "こã?クラスでは実è£?�•れてã�?�¾せんã€?;
154 throw new UnsupportedOperationException( errMsg );
155 }
156
157 /**
158 * 属æ?値配å?をセãƒ?ƒˆしますã?
159 * こã?メソãƒ?ƒ‰では、カラãƒ?��配å?は更新しません。é?列数が異なるå?合やã€?
160 * 属æ?値配å?ã�?null の場合ã?設定できませんã€?
161 * 設定ã?ã€??列オブジェクトã?コピã?をセãƒ?ƒˆしますã?で、登録å…??配å?オブジェクトを
162 * 書き換えた場合でもã?こã?オブジェクトã?å†?ƒ¨値は変更されませんのでã€?
163 * 副作用を期å¾?�—たコーãƒ?‚£ングは、行わなã�?�§下さã�??
164 * 注意:å?オブジェクトé?列è?身はコピã?しますが、å?ã€??オブジェクトそのもã?はã€?
165 * arraycopy してã�?‚‹ã�?�‘ですã?個ã?のオブジェクトã?状態変化に対してはã€?
166 * å�?‚¯ライアントå?で対応がå¿?¦�ですã?
167 *
168 * @param values セãƒ?ƒˆする値配å?
169 * @param rno 処ç�?¸の行番号
170 */
171 public void setValues( final Object[] values, final int rno ) {
172 if( values == null ) {
173 String errMsg = "値配å?がã? null ですã?row=[" + rno + "]";
174 throw new RuntimeException( errMsg );
175 }
176 else if( names.length != values.length ) {
177 String errMsg = "カラãƒ?��配å?と異なる要ç´??属æ?値配å?は登録できませんã€? + CR
178 + " names.length=[" + names.length + "],"
179 + " values.length[" + values.length + "],"
180 + " row=[" + rno + "]" + CR
181 + " names=" + StringUtil.array2csv( names )
182 + " values=" + Arrays.toString( values ) ; // 5.1.8.0 (2010/07/01) errMsg 修正
183 throw new RuntimeException( errMsg );
184 }
185
186 rowNo = rno;
187 System.arraycopy( values,0,data,0,values.length );
188 }
189
190 /**
191 * 属æ?値をé?列で返しますã?
192 * 配å?オブジェクトã?、clone されたコピã?を返しますã?でã€?
193 * å†?®¹を書き換えたã�??合ã?、setValue() メソãƒ?ƒ‰を使用してくださいã€?
194 *
195 * @return æŒ?®šされたセルの属æ?値
196 */
197 public Object[] getValues() {
198 return data.clone();
199 }
200
201 /**
202 * row にあるセルの属æ?値をé?列で返しますã?
203 *
204 * @param row 値が参照されるè¡?
205 *
206 * @return æŒ?®šされたセルの属æ?値
207 */
208 public String[] getValues( final int row ) {
209 String errMsg = "こã?クラスでは実è£?�•れてã�?�¾せんã€?;
210 throw new UnsupportedOperationException( errMsg );
211 }
212
213 /**
214 * 行データモãƒ?ƒ«属æ?に、å?ç�?¸の行番号æƒ??を設定しますã?
215 * ä¸?ˆ¬に、setValue( int clm, Object value ) との併用時に使用しますã?
216 *
217 * @param rno 処ç�?¸の行番号
218 */
219 public void setRowNo( final int rno ) {
220 rowNo = rno;
221 }
222
223 /**
224 * 行データモãƒ?ƒ«属æ?の、å?ç�?¸の行番号æƒ??を返しますã?
225 *
226 * @return 処ç�?¸の行番号
227 *
228 */
229 public int getRowNo() {
230 return rowNo;
231 }
232
233 /**
234 * columnName 名称に対応すã‚?カラãƒ?•ª号を返しますã?存在しなã�??合ã?ã€?1 を返しますã?
235 *
236 * @param columnName 値が参照されるカラãƒ?•ª号
237 *
238 * @return æŒ?®šされたセルのカラãƒ?•ª号(存在しなã�??合ã?ã€?1)
239 *
240 */
241 public int getColumnNo( final String columnName ) {
242 int clmNo = -1;
243 if( columnName != null ) {
244 for( int i=0; i<dtSize; i++ ) {
245 if( columnName.equalsIgnoreCase( names[i] ) ) {
246 clmNo = i;
247 break;
248 }
249 }
250 }
251
252 return clmNo;
253 }
254
255 /**
256 * ãƒ??タãƒ??ブルå†??列ã?数を返しますã?
257 *
258 * @return モãƒ?ƒ«の列数
259 *
260 */
261 public int size() {
262 return dtSize ;
263 }
264
265 /**
266 * こã?å†?ƒ¨ãƒ??タの名前配å?をé?結した文字å?で、å?力しますã?
267 *
268 * @return å†?ƒ¨ãƒ??タの名前配å?をé?結した文字å?
269 */
270 public String nameLine() {
271 String rtn = "No Data";
272
273 if( dtSize > 0 ) {
274 StringBuilder buf = new StringBuilder();
275 buf.append( "#Name" );
276 for( int clm=0; clm<dtSize; clm++ ) {
277 buf.append( TAB );
278 buf.append( names[clm] );
279 }
280 rtn = buf.toString() ;
281 }
282 return rtn ;
283 }
284
285 /**
286 * こã?å†?ƒ¨ãƒ??タの名前配å?をé?結した文字å?で、å?力しますã?
287 *
288 * @return 名前配å?をé?結した文字å?
289 */
290 public String dataLine() {
291 String rtn = "No Data";
292
293 if( dtSize > 0 ) {
294 StringBuilder buf = new StringBuilder();
295 buf.append( rowNo );
296 for( int clm=0; clm<dtSize; clm++ ) {
297 buf.append( TAB );
298 buf.append( data[clm] );
299 }
300 rtn = buf.toString() ;
301 }
302 return rtn ;
303 }
304
305 /**
306 * こã?å†?ƒ¨ãƒ??タを見える形で出力しますã?
307 *
308 * @return å†?ƒ¨ãƒ??タを見える形
309 */
310 @Override
311 public String toString() {
312 return nameLine() + CR + dataLine() ;
313 }
314
315 /**
316 * clm のNativeタイプを返しますã?
317 * Nativeタイプã?org.opengion.fukurou.model.NativeTypeで定義されてã�?�¾すã?
318 *
319 * @og.rev 4.1.1.2 (2008/02/28) 新規追åŠ?
320 * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) のメソãƒ?ƒ‰を使用するように変更ã€?
321 *
322 * @param clm 値が参照されるå?
323 *
324 * @return Nativeタイãƒ?
325 * @see org.opengion.fukurou.model.NativeType
326 */
327 public NativeType getNativeType( final int clm ) {
328 // return StringUtil.getNativeType( data[clm].toString() );
329 return NativeType.getType( data[clm].toString() );
330 }
331 }