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 * 実データも、1行分のみ持っています。
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 String[] names ;
036        private String[] values ;
037
038        /**
039         * 引数に名前配列を指定したコンストラクター
040         *
041         * @param       nms     名前配列
042         * @throws  IllegalArgumentException 引数の名前配列が null の場合
043         */
044        public ArrayDataModel( final String[] nms ) {
045                if( nms == null ) {
046                        final String errMsg = "引数の名前配列に、null は設定できません。";
047                        throw new IllegalArgumentException( errMsg );
048                }
049
050                final int size = nms.length ;
051                names = new String[size] ;
052                System.arraycopy( nms,0,names,0,size );
053        }
054
055        /**
056         * row にあるセルの設定値を置き換えます。
057         *
058         * @param   vals  新しい配列値。
059         * @param   row   値が変更される行(無視されます)
060         */
061        @Override
062        public void setValues( final String[] vals, final int row ) {
063                final int size = vals.length;
064                values = new String[size];
065                System.arraycopy( vals,0,values,0,size );
066        }
067
068        /**
069         * カラム名に対応する カラム番号を返します。
070         *
071         * 特殊なカラムが指定された場合は、負の値を返します。
072         * 例えば、[KEY.カラム名]、[I]、[ROW.ID] など、特定の負の値を返します。
073         * また、カラム名が元のデータモデルに存在しない場合も、負の値か、
074         * Exception を返します。負の値なのか、Exception なのかは、
075         * 実装に依存します。
076         *
077         * @param       columnName      値が参照されるカラム名
078         *
079         * @return  指定されたセルのカラム番号。存在しなければ、-1
080         * @throws  IllegalArgumentException 引数のカラム名が null の場合
081         */
082        @Override
083        public int getColumnNo( final String columnName ) {
084                if( columnName == null ) {
085                        final String errMsg = "引数のカラム名に、null は設定できません。";
086                        throw new IllegalArgumentException( errMsg );
087                }
088
089                int address = -1;
090                for( int i=0; i<names.length; i++ ) {
091                        if( columnName.equalsIgnoreCase( names[i] ) ) {
092                                address = i;
093                                break;
094                        }
095                }
096
097                return address;
098        }
099
100        /**
101         * カラム名配列に対応する カラム番号配列を返します。
102         *
103         * これは、#getColumnNo( String ) に対する 複数のカラム名を検索した
104         * 場合と同じです。
105         *
106         * @og.rev 6.3.9.1 (2015/11/27) メソッドの出口は、最後の1か所にすべきです(PMD)。
107         * @og.rev 6.8.6.0 (2018/01/19) 可変長引数から、通常配列に変更。
108         *
109//       * @param       clmNms  値が参照されるカラム名配列(可変長引数)
110         * @param       clmNms  値が参照されるカラム名配列
111         *
112         * @return  指定されたセルのカラム番号配列。
113         * @og.rtnNotNull
114         */
115//      public int[] getColumnNos( final String... clmNms ) {
116        public int[] getColumnNos( final String[] clmNms ) {
117
118                final int size = clmNms == null ? 0 : clmNms.length ;
119
120                final int[] clmNos = new int[size];
121                for( int j=0; j<size; j++ ) {
122                        int address = -1;
123                        for( int i=0; i<names.length; i++ ) {
124                                if( clmNms[j].equalsIgnoreCase( names[i] ) ) {
125                                        address = i;
126                                        break;
127                                }
128                        }
129                        clmNos[j] = address;
130                }
131
132                return clmNos;
133        }
134
135        /**
136         * カラム名配列を返します。
137         *
138         * @return      カラム名配列
139         * @og.rtnNotNull
140         */
141        @Override
142        public String[] getNames() {
143                return names.clone();
144        }
145
146        /**
147         * row にあるセルの属性値を配列で返します。
148         *
149         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
150         *
151         * @param   row     値が参照される行(無視されます)
152         *
153         * @return  指定されたセルの属性値
154         * @og.rtnNotNull
155         */
156        @Override
157        public String[] getValues( final int row ) {
158                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
159                if( values == null ) {
160                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
161                        throw new OgRuntimeException( errMsg );
162                }
163
164                return values.clone();
165        }
166
167        /**
168         * row および clm にあるセルの属性値をStringに変換して返します。
169         *
170         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
171         *
172         * @param   row     値が参照される行(無視されます)
173         * @param   clm     値が参照される列
174         *
175         * @return  指定されたセルの値
176         *
177         */
178        @Override
179        public String getValue( final int row, final int clm ) {
180                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
181                if( values == null ) {
182                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
183                        throw new OgRuntimeException( errMsg );
184                }
185
186                return values[clm];
187        }
188
189        /**
190         * clm のNativeタイプを返します。
191         * Nativeタイプはorg.opengion.fukurou.model.NativeTypeで定義されています。
192         *
193         * @og.rev 4.1.1.2 (2008/02/28) 新規追加
194         * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) のメソッドを使用するように変更。
195         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
196         *
197         * @param  clm      値が参照される列
198         *
199         * @return Nativeタイプ
200         * @see org.opengion.fukurou.model.NativeType
201         */
202        @Override
203        public NativeType getNativeType( final int clm ) {
204                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
205                if( values == null ) {
206                        final String errMsg = "#setValues(String[],int)を先に実行しておいてください。";
207                        throw new OgRuntimeException( errMsg );
208                }
209
210                return NativeType.getType( values[clm] );
211        }
212}