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 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 * 第2パラメータで指定します。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) メソッドの出口は、最後の1か所にすべきです(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}