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.business;
017
018 import org.opengion.fukurou.model.DataModel;
019 import org.opengion.fukurou.model.NativeType;
020
021 import java.util.Map;
022 import java.util.HashMap;
023 import java.util.Arrays;
024
025 /**
026 * 業務ロジãƒ?‚¯をå?ç�?�™るためã?ãƒ??ブルモãƒ?ƒ«ですã?
027 *
028 * こã?ãƒ??ブルモãƒ?ƒ«では、オブジェクト生成時に、カラãƒ??列ã?値配å?をå?に、å?部ãƒ??タを生成しã€?
029 * そã?後ã?、行ã?追åŠ?‚„値の変更はできませんã€?
030 *
031 * @og.rev 5.1.1.0 (2009/12/01) 新規作æ?
032 * @og.group 業務ロジãƒ?‚¯
033 *
034 * @version 5.0
035 * @author Hiroki Nakamura
036 * @since JDK1.6,
037 */
038 public class ArrayTableModel implements DataModel<String> {
039 private static final String CR = System.getProperty("line.separator"); // 5.6.7.0 (2013/07/27) 追åŠ?
040
041 private final String[] names;
042 private final String[][] vals;
043 private final String[] modTypes;
044
045 private Map<Integer,String[]> rtnMap = null; // 5.6.0.3 (2012/01/24) 変更されたå?をã?書き戻すためã?Map<インãƒ?ƒƒクス,値配å?>
046
047 /**
048 * 引数に名前配å?、å?配å?を指定したコンストラクター
049 *
050 * @param nms 名前配å?
051 * @param vs 値?’重配å?
052 * @throws IllegalArgumentException 引数の配å?が不正な場å�?
053 */
054 public ArrayTableModel( final String[] nms, final String[][] vs ) {
055 this( nms, vs, null );
056 }
057
058 /**
059 * 引数に名前配å?、å?配å?、変更区åˆ??列をæŒ?®šしたコンストラクター
060 *
061 * @og.rev 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ージを判りやすくするã€?
062 *
063 * @param nms 名前配å?
064 * @param vs 値?’重配å?
065 * @param ms 変更区åˆ??配å?
066 * @throws IllegalArgumentException 引数の配å?が不正な場å�?
067 */
068 public ArrayTableModel( final String[] nms, final String[][] vs, final String[] ms ) {
069 if( nms == null || nms.length == 0 ) {
070 String errMsg = "引数の名前配å?に、null は設定できませんã€?;
071 throw new IllegalArgumentException( errMsg );
072 }
073 // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ージを判りやすくするã€?
074 // if( vs == null ) {
075 if( vs == null || vs.length == 0 || vs[0] == null || vs[0].length == 0 ) {
076 String errMsg = "引数の値配å?に、null は設定できませんã€?;
077 throw new IllegalArgumentException( errMsg );
078 }
079 // if( vs.length > 0 ) {
080 // if( vs[0] == null || vs[0].length == 0 || nms.length != vs[0].length ) {
081 if( nms.length != vs[0].length ) {
082 // String errMsg = "名前配å?と値配å?のカラãƒ?•°が異なりますã?" ;
083 String errMsg = "名前配å?と値配å?のカラãƒ?•°が異なりますã?" + CR
084 + " nms =" + Arrays.toString( nms ) + CR
085 + " vs[0] =" + Arrays.toString( vs[0] ) ;
086 throw new IllegalArgumentException( errMsg );
087 }
088 // }
089
090 int cols = nms.length;
091 names = new String[cols];
092 System.arraycopy( nms, 0, names, 0, cols );
093
094 int rows = vs.length;
095 vals = new String[rows][cols];
096 for( int i = 0; i < rows; i++ ) {
097 System.arraycopy( vs[i], 0, vals[i], 0, cols );
098 }
099
100 if( ms != null && ms.length > 0 ) {
101 if( vs.length == ms.length ) {
102 modTypes = new String[rows];
103 System.arraycopy( ms, 0, modTypes, 0, rows );
104 }
105 else {
106 // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ージを判りやすくするã€?
107 // String errMsg = "変更区åˆ?‚’æŒ?®šするå?合ã?値配å?の行数とä¸??するå¿?¦�がありますã?";
108 String errMsg = "変更区åˆ?‚’æŒ?®šするå?合ã?値配å?の行数とä¸??するå¿?¦�がありますã?" + CR
109 + " 変更区åˆ?行数 =" + ms.length + CR
110 + " 値配å? 行数 =" + vs.length ;
111 throw new IllegalArgumentException( errMsg );
112 }
113 // if( vs.length != ms.length ) {
114 // String errMsg = "変更区åˆ?‚’æŒ?®šするå?合ã?値配å?の行数とä¸??するå¿?¦�がありますã?";
115 // throw new IllegalArgumentException( errMsg );
116 // }
117 // else {
118 // modTypes = new String[rows];
119 // System.arraycopy( ms, 0, modTypes, 0, rows );
120 // }
121 }
122 else {
123 modTypes = null;
124 }
125 }
126
127 /**
128 * rowでæŒ?®šされた行番号(インãƒ?ƒƒクス番号)に行を追åŠ?�—ますã?
129 * <del>(こã?クラスでは、このメソãƒ?ƒ‰はサポã?トされてã�?�¾せんã€?</del>
130 * 値配å?をセãƒ?ƒˆする場合ã?、以下ã?条件をæº?�Ÿすå¿?¦�がありますã?
131 * ?‘.行番号はã€???rowCount-1) のç¯?›²
132 * ?’.å?配å?は、not nullã€?かつ ?‘件以ä¸?
133 * ?“.å?配å?の個数は、å?部カラãƒ?•°と同じ
134 *
135 * ここで登録した値は、å?部の値配å?と別管ç�?�•れますã?で、セãƒ?ƒˆ後に、å?びゲãƒ?ƒˆしてã‚?
136 * ここでセãƒ?ƒˆした値を取りå?すことはできませんã€?
137 * またã?同じ行番号でセãƒ?ƒˆした場合ã?、後でセãƒ?ƒˆした値が有効ですã?
138 *
139 * ※ インãƒ?ƒƒクス(row)とは、このArrayTableModel に持つ vals 配å?の行ã?インãƒ?ƒƒクスですã?
140 * よって、オリジナルのDBTableModelの行番号ではありませんã€?
141 *
142 * @og.rev 5.6.0.3 (2012/01/24) 変更されたå?をã?書き戻す機è?を追åŠ?�—ますã?
143 *
144 * @param vals 配å?値
145 * @param row 追åŠ?�™るインãƒ?ƒƒクス
146 * @throws IllegalArgumentException 引数が1,2,3ã?条件をæº?�Ÿさなã�??合ã?
147 */
148 public void setValues( final String[] vals, final int row ) {
149 // throw new RuntimeException( "こã?クラスでは、setValuesメソãƒ?ƒ‰はサポã?トされてã�?�¾せん" );
150 if( row < 0 || row > getRowCount() ) {
151 String errMsg = "引数のインãƒ?ƒƒクスはã€??? + (getRowCount()-1) + " の間でæŒ?®šしてください。index=[" + row + "]";
152 throw new IllegalArgumentException( errMsg );
153 }
154 else if( vals == null || vals.length == 0 ) {
155 String errMsg = "引数の値配å?に、null、またã? 0件配å?はæŒ?®šできません。index=[" + row + "]";
156 throw new IllegalArgumentException( errMsg );
157 }
158 else if( vals.length != names.length ) {
159 String errMsg = "引数の値配å?の個数と、å?部カラãƒ?•°がä¸??しませんã€?
160 + " index=[" + row + "] : 引数個数=[" + vals.length + "] != å†?ƒ¨カラãƒ?•°=[" + names.length + "]";
161 throw new IllegalArgumentException( errMsg );
162 }
163
164 if( rtnMap == null ) { rtnMap = new HashMap<Integer,String[]>(); }
165
166 int cols = vals.length;
167 String[] newVals = new String[cols];
168 System.arraycopy( vals, 0, newVals, 0, cols );
169
170 rtnMap.put( Integer.valueOf( row ) , newVals );
171 }
172
173 /**
174 * BizLogicで、データが変更されたå?合ã?、このMapで値の配å?を返しますã?
175 * Mapのキーは、インãƒ?ƒƒクス(row)のIntegerオブジェクトですã?値は、設定された String配å?ですã?
176 * なにも変更がされてã�?�ªければ、null を返しますã?
177 *
178 * ※ インãƒ?ƒƒクス(row)とは、このArrayTableModel に持つ vals 配å?の行ã?インãƒ?ƒƒクスですã?
179 * よって、オリジナルのDBTableModelの行番号ではありませんã€?
180 *
181 * @og.rev 5.6.0.3 (2012/01/24) 変更されたå?をã?書き戻すためã?Map<インãƒ?ƒƒクス,値配å?> を返しますã?
182 *
183 * @return 書き戻すためã?Map?œインãƒ?ƒƒクス,値配å???
184 * @see AbstractBizLogic#isRequireTable()
185 */
186 public Map<Integer,String[]> getModifyVals() {
187 return rtnMap;
188 }
189
190 /**
191 * カラãƒ?��に対応すã‚?カラãƒ?•ª号を返しますã?
192 *
193 * 特殊なカラãƒ?�ŒæŒ?®šされた場合ã?、è²??値を返しますã?
194 * 例えば、[KEY.カラãƒ?��]、[I]、[ROW.ID] など、特定ã?è²??値を返しますã?
195 * またã?カラãƒ?��がå?のãƒ??タモãƒ?ƒ«に存在しなã�??合も、è²??値かã?
196 * Exception を返しますã?è²??値なのかã?Exception なのかã?ã€?
197 * 実è£?�«依存しますã?
198 *
199 * @param columnName 値が参照されるカラãƒ?��
200 *
201 * @return æŒ?®šされたセルのカラãƒ?•ª号。存在しなければã€?1
202 * @throws IllegalArgumentException 引数のカラãƒ?��ã�?null の場å�?
203 */
204 public int getColumnNo( final String columnName ) {
205 if( columnName == null ) {
206 String errMsg = "引数のカラãƒ?��に、null は設定できませんã€?;
207 throw new IllegalArgumentException( errMsg );
208 }
209
210 int address = -1;
211 for( int i = 0; i < names.length; i++ ) {
212 if( columnName.equalsIgnoreCase( names[i] ) ) {
213 address = i;
214 break;
215 }
216 }
217
218 return address;
219 }
220
221 /**
222 * カラãƒ?��配å?に対応すã‚?カラãƒ?•ª号配å?を返しますã?
223 *
224 * これはã€?getColumnNo( String ) に対する è¤?•°のカラãƒ?��を検索した
225 * 場合と同じですã?
226 *
227 * @param clmNms 値が参照されるカラãƒ?��配å?
228 *
229 * @return æŒ?®šされたセルのカラãƒ?•ª号配å?ã€?
230 */
231 public int[] getColumnNos( final String[] clmNms ) {
232 if( clmNms == null ) { return new int[0]; }
233
234 int[] clmNos = new int[clmNms.length];
235 for( int j = 0; j < clmNms.length; j++ ) {
236 int address = -1;
237 for( int i = 0; i < names.length; i++ ) {
238 if( clmNms[j].equalsIgnoreCase( names[i] ) ) {
239 address = i;
240 break;
241 }
242 }
243 clmNos[j] = address;
244 }
245
246 return clmNos;
247 }
248
249 /**
250 * カラãƒ?��配å?を返しますã?
251 *
252 * @return カラãƒ?��配å?
253 */
254 public String[] getNames() {
255 return names.clone();
256 }
257
258 /**
259 * row にあるセルの属æ?値をé?列で返しますã?
260 *
261 * @param row 値が参照されるè¡?
262 *
263 * @return æŒ?®šされたセルの属æ?値配å?
264 */
265 public String[] getValues( final int row ) {
266 return vals[row].clone();
267 }
268
269 /**
270 * row および clm にあるセルの属æ?値をStringに変換して返しますã?
271 *
272 * @param row 値が参照されるè¡?
273 * @param clm 値が参照されるå?
274 *
275 * @return æŒ?®šされたセルの値
276 *
277 */
278 public String getValue( final int row, final int clm ) {
279 return vals[row][clm];
280 }
281
282 /**
283 * row および clm にあるセルの属æ?値をStringに変換して返しますã?
284 *
285 * @param row 値が参照されるè¡?
286 * @param clm 値が参照されるå?(キー)
287 *
288 * @return æŒ?®šされたセルの値
289 *
290 */
291 public String getValue( final int row, final String clm ) {
292 return vals[row][getColumnNo( clm )];
293 }
294
295 /**
296 * ãƒ??タãƒ??ブルå†??行ã?数を返しますã?
297 *
298 * @return モãƒ?ƒ«の行数
299 *
300 */
301 public int getRowCount() {
302 return vals.length;
303 }
304
305 /**
306 * row 単位に変更されたタイãƒ?追åŠ?変更/削除)を返しますã?
307 * タイプã?始めにä¸?º¦登録するとそれ以降に変更はかかりませんã€?
308 * つまりã?始めに 追åŠ?�§作æ?したãƒ??タは、その後変更があっても追åŠ??ままですã?
309 * なにも変更されてã�?�ªã�??合ã?, ""(ゼロストリング)を返しますã?
310 *
311 * @param row 値が参照されるè¡?
312 *
313 * @return 変更されたタイプã?値
314 */
315 public String getModifyType( final int row ) {
316 return modTypes == null ? "" : modTypes[row];
317 }
318
319 /**
320 * clm のNativeタイプを返しますã?
321 * Nativeタイプã?org.opengion.fukurou.model.NativeTypeで定義されてã�?�¾すã?
322 *
323 * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) のメソãƒ?ƒ‰を使用するように変更ã€?
324 *
325 * @param clm 値が参照されるå?
326 *
327 * @return Nativeタイãƒ?
328 * @see org.opengion.fukurou.model.NativeType
329 */
330 public NativeType getNativeType( final int clm ) {
331 // return StringUtil.getNativeType( vals[0][clm] );
332 return NativeType.getType( vals[0][clm] );
333 }
334
335 /**
336 * こã?オブジェクトã?æ–?—å?表記を返しますã?
337 * ãƒ?ƒ�ãƒ?‚°用ですã?
338 *
339 * @og.rev 5.6.7.0 (2013/07/27) 新規追åŠ?
340 *
341 * @return æ–?—å?表現
342 * @see java.lang.Object#toString()
343 */
344 @Override
345 public String toString() {
346 StringBuilder buf = new StringBuilder();
347
348 buf.append( "NAMES=" ).append( Arrays.toString( names ) ).append( CR )
349 .append( " COL_LEN=" ).append( (names != null) ? names.length : -1 ).append( CR )
350 .append( " ROW_LEN=" ).append( (vals != null) ? vals.length : -1 ).append( CR ) ;
351
352 return buf.toString();
353 }
354 }