    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 */
    016package org.opengion.fukurou.model;
    017
    018import org.opengion.fukurou.system.OgRuntimeException ;         // 6.4.2.0 (2016/01/29)
    019
    020/**
    021 * DataModel の実装クラスです。
    022 * Formatter で使用されるDataModelインターフェースに、対応する
    023 * 実データを管理します。
    024 * データ設定時に、コピーしますので、基本的には、オリジナルの書き換えは
    025 * できません。
    026 * 実データも、１行分のみ持っています。
    027 *
    028 * @og.group 画面表示
    029 *
    030 * @version  4.0
    031 * @author   Kazuhiko Hasegawa
    032 * @since    JDK5.0,
    033 */
    034public class ArrayDataModel implements DataModel<String> {
    035        private final boolean useThrow ;                        // 6.9.5.0 (2018/04/23) getColumnNo のカラム名が存在しない場合に、Exception を throw するかどうか
    036        private final String[] names ;
    037        private String[] values ;
    038
    039        /**
    040         * 引数に名前配列を指定したコンストラクター
    041         *
    042         * @og.rev 6.9.5.0 (2018/04/23) カラム名が存在しない場合に、Exception を throw するかどうかを指定可能にする。
    043         *
    044         * @param       nms             名前配列
    045         * @throws  IllegalArgumentException 引数の名前配列が null の場合
    046         */
    047        public ArrayDataModel( final String[] nms ) {
    048                this( nms , false );                    // 6.9.5.0 (2018/04/23) カラム名が存在しない場合は、-1 を返す設定。
    049        }
    050
    051        /**
    052         * 引数に名前配列を指定したコンストラクター
    053         *
    054         * getColumnNoメソッドで、カラム名が存在しない場合に、Exception を throw するかどうかを、
    055         * 第２パラメータで指定します。true で、Exception を throw するです。
    056         * このメソッドは、Formatter から呼ばれるため、インスタンス生成時にﾌﾗｸﾞ設定を行っておく必要があります。
    057         *
    058         * @og.rev 6.9.5.0 (2018/04/23) カラム名が存在しない場合に、Exception を throw するかどうかを指定可能にする。
    059         *
    060         * @param       nms                     名前配列
    061         * @param   useThrow    カラム名が存在しない場合に、Exception を throw するかどうか [true:throw する/false:-1 を返す]
    062         * @throws  IllegalArgumentException 引数の名前配列が null の場合
    063         */
    064        public ArrayDataModel( final String[] nms , final boolean useThrow ) {
    065                if( nms == null ) {
    066                        final String errMsg = "引数の名前配列に、null は設定できません。";
    067                        throw new IllegalArgumentException( errMsg );
    068                }
    069
    070                final int size = nms.length ;
    071                names = new String[size] ;
    072                System.arraycopy( nms,0,names,0,size );
    073                this.useThrow = useThrow;                                       // 6.9.5.0 (2018/04/23)
    074        }
    075
    076        /**
    077         * row にあるセルの設定値を置き換えます。
    078         *
    079         * @param   vals  新しい配列値。
    080         * @param   row   値が変更される行(無視されます)
    081         */
    082        @Override       // DataModel
    083        public void setValues( final String[] vals, final int row ) {
    084                final int size = vals.length;
    085                values = new String[size];
    086                System.arraycopy( vals,0,values,0,size );
    087        }
    088
    089        /**
    090         * カラム名に対応する カラム番号を返します。
    091         *
    092         * 特殊なカラムが指定された場合は、負の値を返します。
    093         * 例えば、[KEY.カラム名]、[I]、[ROW.ID] など、特定の負の値を返します。
    094         * また、カラム名が元のデータモデルに存在しない場合も、負の値か、
    095         * Exception を返します。負の値なのか、Exception なのかは、
    096         * 実装に依存します。
    097         *
    098         * @og.rev 6.9.5.0 (2018/04/23) カラム名が存在しない場合に、Exception を throw するかどうかを指定可能にする。
    099         *
    100         * @param       columnName      値が参照されるカラム名
    101         *
    102         * @return  指定されたセルのカラム番号。存在しなければ、-1
    103         * @throws  IllegalArgumentException 引数のカラム名が null の場合
    104         */
    105        @Override       // DataModel
    106        public int getColumnNo( final String columnName ) {
    107                if( columnName == null ) {
    108                        final String errMsg = "引数のカラム名に、null は設定できません。";
    109                        throw new IllegalArgumentException( errMsg );
    110                }
    111
    112                int address = -1;
    113                for( int i=0; i<names.length; i++ ) {
    114                        if( columnName.equalsIgnoreCase( names[i] ) ) {
    115                                address = i;
    116                                break;
    117                        }
    118                }
    119
    120                // 6.9.5.0 (2018/04/23) カラム名が存在しない場合に、Exception を throw するかどうか
    121                if( useThrow && address < 0 ) {
    122                        final String errMsg = "カラム名が存在しません:[" + columnName + "]" ;
    123                        throw new OgRuntimeException( errMsg );
    124                }
    125
    126                return address;
    127        }
    128
    129        /**
    130         * カラム名配列に対応する カラム番号配列を返します。
    131         *
    132         * これは、#getColumnNo( String ) に対する 複数のカラム名を検索した
    133         * 場合と同じです。
    134         *
    135         * @og.rev 6.3.9.1 (2015/11/27) メソッドの出口は、最後の１か所にすべきです(PMD)。
    136         * @og.rev 6.8.6.0 (2018/01/19) 可変長引数から、通常配列に変更。
    137         * @og.rev 6.9.5.0 (2018/04/23) #getColumnNo(String)を呼ぶように修正
    138         *
    139//       * @param       clmNms  値が参照されるカラム名配列(可変長引数)
    140         * @param       clmNms  値が参照されるカラム名配列
    141         *
    142         * @return  指定されたセルのカラム番号配列。
    143         * @og.rtnNotNull
    144         */
    145//      public int[] getColumnNos( final String... clmNms ) {
    146        public int[] getColumnNos( final String[] clmNms ) {
    147
    148                final int size = clmNms == null ? 0 : clmNms.length ;
    149
    150                final int[] clmNos = new int[size];
    151                for( int j=0; j<size; j++ ) {
    152                        // 6.9.5.0 (2018/04/23) #getColumnNo(String)を呼ぶように修正
    153                        clmNos[j] = getColumnNo( clmNms[j] );
    154//                      int address = -1;
    155//                      for( int i=0; i<names.length; i++ ) {
    156//                              if( clmNms[j].equalsIgnoreCase( names[i] ) ) {
    157//                                      address = i;
    158//                                      break;
    159//                              }
    160//                      }
    161//                      clmNos[j] = address;
    162                }
    163
    164                return clmNos;
    165        }
    166
    167        /**
    168         * カラム名配列を返します。
    169         *
    170         * @return      カラム名配列
    171         * @og.rtnNotNull
    172         */
    173        @Override       // DataModel
    174        public String[] getNames() {
    175                return names.clone();
    176        }
    177
    178        /**
    179         * row にあるセルの属性値を配列で返します。
    180         *
    181         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    182         *
    183         * @param   row     値が参照される行(無視されます)
    184         *
    185         * @return  指定されたセルの属性値
    186         * @og.rtnNotNull
    187         */
    188        @Override       // DataModel
    189        public String[] getValues( final int row ) {
    190                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    191                if( values == null ) {
    192                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
    193                        throw new OgRuntimeException( errMsg );
    194                }
    195
    196                return values.clone();
    197        }
    198
    199        /**
    200         * row および clm にあるセルの属性値をStringに変換して返します。
    201         *
    202         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    203         *
    204         * @param   row     値が参照される行(無視されます)
    205         * @param   clm     値が参照される列
    206         *
    207         * @return  指定されたセルの値
    208         *
    209         */
    210        @Override       // DataModel
    211        public String getValue( final int row, final int clm ) {
    212                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    213                if( values == null ) {
    214                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
    215                        throw new OgRuntimeException( errMsg );
    216                }
    217
    218                return values[clm];
    219        }
    220
    221        /**
    222         * clm のNativeタイプを返します。
    223         * Nativeタイプはorg.opengion.fukurou.model.NativeTypeで定義されています。
    224         *
    225         * @og.rev 4.1.1.2 (2008/02/28) 新規追加
    226         * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) のメソッドを使用するように変更。
    227         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    228         *
    229         * @param  clm      値が参照される列
    230         *
    231         * @return Nativeタイプ
    232         * @see org.opengion.fukurou.model.NativeType
    233         */
    234        @Override       // DataModel
    235        public NativeType getNativeType( final int clm ) {
    236                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
    237                if( values == null ) {
    238                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
    239                        throw new OgRuntimeException( errMsg );
    240                }
    241
    242                return NativeType.getType( values[clm] );
    243        }
    244}