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}