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    }