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 * @og.rev 5.7.2.3 (2014/01/31) vsã®ãƒã‚§ãƒ?‚¯æ¡ä»¶ã‚’戻ã? 063 * @og.rev 5.7.3.1 (2014/02/14) nmsã®ãƒã‚§ãƒ?‚¯æ¡ä»¶ã‚‚戻ã? 064 * 065 * @param nms åå‰é…å? 066 * @param vs 値?’é‡é…å? 067 * @param ms 変更区åˆ??é…å? 068 * @throws IllegalArgumentException 引数ã®é…å?ãŒä¸æ£ãªå ´å? 069 */ 070 public ArrayTableModel( final String[] nms, final String[][] vs, final String[] ms ) { 071 if( nms == null || nms.length == 0 ) { 072 String errMsg = "引数ã®åå‰é…å?ã«ã€null ã¯è¨å®šã§ãã¾ã›ã‚“ã€?; 073 throw new IllegalArgumentException( errMsg ); 074 } 075 // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ãƒ¼ã‚¸ã‚’判りやã™ãã™ã‚‹ã€? 076 // 5.7.2.3 (2014/01/31) çµæžœ?行ã§length=0ã§é€šã‚‹ã‚ˆã†ãªã®ã§vsã®ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒ?‚¯æ¡ä»¶ã‚’戻ã™ã? 077 if( vs == null ) { 078 // if( vs == null || vs.length == 0 || vs[0] == null || vs[0].length == 0 ) { 079 String errMsg = "引数ã®å€¤é…å?ã«ã€null ã¯è¨å®šã§ãã¾ã›ã‚“ã€?; 080 throw new IllegalArgumentException( errMsg ); 081 } 082 // 5.7.3.1 (2014/02/14) 5.7.2.3ã§ã®æˆ»ã—ã§ã¯ä¸ååˆ? ã£ãŸã?ã§ã“ã¡ã‚‰ã‚‚戻ã? 083 if( vs.length > 0 ) { 084 if( vs[0] == null || vs[0].length == 0 || nms.length != vs[0].length ) { 085 // if( nms.length != vs[0].length ) { 086 // String errMsg = "åå‰é…å?ã¨å€¤é…å?ã®ã‚«ãƒ©ãƒ?•°ãŒç•°ãªã‚Šã¾ã™ã?" ; 087 String errMsg = "åå‰é…å?ã¨å€¤é…å?ã®ã‚«ãƒ©ãƒ?•°ãŒç•°ãªã‚Šã¾ã™ã?" + CR 088 + " nms =" + Arrays.toString( nms ) + CR 089 + " vs[0] =" + Arrays.toString( vs[0] ) ; 090 throw new IllegalArgumentException( errMsg ); 091 } 092 } 093 094 int cols = nms.length; 095 names = new String[cols]; 096 System.arraycopy( nms, 0, names, 0, cols ); 097 098 int rows = vs.length; 099 vals = new String[rows][cols]; 100 for( int i = 0; i < rows; i++ ) { 101 System.arraycopy( vs[i], 0, vals[i], 0, cols ); 102 } 103 104 if( ms != null && ms.length > 0 ) { 105 if( vs.length == ms.length ) { 106 modTypes = new String[rows]; 107 System.arraycopy( ms, 0, modTypes, 0, rows ); 108 } 109 else { 110 // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ãƒ¼ã‚¸ã‚’判りやã™ãã™ã‚‹ã€? 111 // String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?"; 112 String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?" + CR 113 + " 変更区åˆ?行数 =" + ms.length + CR 114 + " 値é…å? 行数 =" + vs.length ; 115 throw new IllegalArgumentException( errMsg ); 116 } 117 // if( vs.length != ms.length ) { 118 // String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?"; 119 // throw new IllegalArgumentException( errMsg ); 120 // } 121 // else { 122 // modTypes = new String[rows]; 123 // System.arraycopy( ms, 0, modTypes, 0, rows ); 124 // } 125 } 126 else { 127 modTypes = null; 128 } 129 } 130 131 /** 132 * rowã§æŒ?®šã•れãŸè¡Œç•ªå·(インãƒ?ƒƒã‚¯ã‚¹ç•ªå·)ã«è¡Œã‚’追åŠ?—ã¾ã™ã? 133 * 134 * 値é…å?ã‚’ã‚»ãƒ?ƒˆã™ã‚‹å ´åˆã?ã€ä»¥ä¸‹ã?æ¡ä»¶ã‚’æº?Ÿã™å¿?¦ãŒã‚りã¾ã™ã? 135 * ?‘.行番å·ã¯ã€???rowCount-1) ã®ç¯?›² 136 * ?’.å?é…å?ã¯ã€not nullã€?ã‹ã¤ ?‘件以ä¸? 137 * ?“.å?é…å?ã®å€‹æ•°ã¯ã€å?部カラãƒ?•°ã¨åŒã˜ 138 * 139 * ã“ã“ã§ç™»éŒ²ã—ãŸå€¤ã¯ã€å?部ã®å€¤é…å?ã¨åˆ¥ç®¡ç?•れã¾ã™ã?ã§ã€ã‚»ãƒ?ƒˆå¾Œã«ã€å?ã³ã‚²ãƒ?ƒˆã—ã¦ã‚? 140 * ã“ã“ã§ã‚»ãƒ?ƒˆã—ãŸå€¤ã‚’å–りå?ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã€? 141 * ã¾ãŸã?åŒã˜è¡Œç•ªå·ã§ã‚»ãƒ?ƒˆã—ãŸå ´åˆã?ã€å¾Œã§ã‚»ãƒ?ƒˆã—ãŸå€¤ãŒæœ‰åйã§ã™ã? 142 * 143 * ※ インãƒ?ƒƒã‚¯ã‚¹(row)ã¨ã¯ã€ã“ã®ArrayTableModel ã«æŒã¤ vals é…å?ã®è¡Œã?インãƒ?ƒƒã‚¯ã‚¹ã§ã™ã? 144 * よã£ã¦ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã®DBTableModelã®è¡Œç•ªå·ã§ã¯ã‚りã¾ã›ã‚“ã€? 145 * 146 * @og.rev 5.6.0.3 (2012/01/24) 変更ã•れãŸå?ã‚’ã?æ›¸ãæˆ»ã™æ©Ÿè?を追åŠ?—ã¾ã™ã? 147 * 148 * @param vals é…å?値 149 * @param row 追åŠ?™ã‚‹ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ 150 * @throws IllegalArgumentException 引数ãŒï¼‘,2,3ã?æ¡ä»¶ã‚’æº?Ÿã•ãªã??åˆã? 151 */ 152 public void setValues( final String[] vals, final int row ) { 153 // throw new RuntimeException( "ã“ã?クラスã§ã¯ã€setValuesメソãƒ?ƒ‰ã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“" ); 154 if( row < 0 || row > getRowCount() ) { 155 String errMsg = "引数ã®ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ã¯ã€??? + (getRowCount()-1) + " ã®é–“ã§æŒ?®šã—ã¦ãã ã•ã„。index=[" + row + "]"; 156 throw new IllegalArgumentException( errMsg ); 157 } 158 else if( vals == null || vals.length == 0 ) { 159 String errMsg = "引数ã®å€¤é…å?ã«ã€nullã€ã¾ãŸã? 0ä»¶é…å?ã¯æŒ?®šã§ãã¾ã›ã‚“。index=[" + row + "]"; 160 throw new IllegalArgumentException( errMsg ); 161 } 162 else if( vals.length != names.length ) { 163 String errMsg = "引数ã®å€¤é…å?ã®å€‹æ•°ã¨ã€å?部カラãƒ?•°ãŒä¸??ã—ã¾ã›ã‚“ã€? 164 + " index=[" + row + "] : 引数個数=[" + vals.length + "] != å†?ƒ¨ã‚«ãƒ©ãƒ?•°=[" + names.length + "]"; 165 throw new IllegalArgumentException( errMsg ); 166 } 167 168 if( rtnMap == null ) { rtnMap = new HashMap<Integer,String[]>(); } 169 170 int cols = vals.length; 171 String[] newVals = new String[cols]; 172 System.arraycopy( vals, 0, newVals, 0, cols ); 173 174 rtnMap.put( Integer.valueOf( row ) , newVals ); 175 } 176 177 /** 178 * BizLogicã§ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤‰æ›´ã•れãŸå?åˆã?ã€ã“ã®Mapã§å€¤ã®é…å?ã‚’è¿”ã—ã¾ã™ã? 179 * Mapã®ã‚ーã¯ã€ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹(row)ã®Integerオブジェクトã§ã™ã?値ã¯ã€è¨å®šã•れ㟠Stringé…å?ã§ã™ã? 180 * ãªã«ã‚‚変更ãŒã•れã¦ã?ªã‘れã°ã€null ã‚’è¿”ã—ã¾ã™ã? 181 * 182 * ※ インãƒ?ƒƒã‚¯ã‚¹(row)ã¨ã¯ã€ã“ã®ArrayTableModel ã«æŒã¤ vals é…å?ã®è¡Œã?インãƒ?ƒƒã‚¯ã‚¹ã§ã™ã? 183 * よã£ã¦ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã®DBTableModelã®è¡Œç•ªå·ã§ã¯ã‚りã¾ã›ã‚“ã€? 184 * 185 * @og.rev 5.6.0.3 (2012/01/24) 変更ã•れãŸå?ã‚’ã?æ›¸ãæˆ»ã™ãŸã‚ã?Map<インãƒ?ƒƒã‚¯ã‚¹,値é…å?> ã‚’è¿”ã—ã¾ã™ã? 186 * 187 * @return æ›¸ãæˆ»ã™ãŸã‚ã?Map?œã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹,値é…å??? 188 * @see AbstractBizLogic#isRequireTable() 189 */ 190 public Map<Integer,String[]> getModifyVals() { 191 return rtnMap; 192 } 193 194 /** 195 * カラãƒ?ã«å¯¾å¿œã™ã‚?カラãƒ?•ªå·ã‚’è¿”ã—ã¾ã™ã? 196 * 197 * 特殊ãªã‚«ãƒ©ãƒ?ŒæŒ?®šã•れãŸå ´åˆã?ã€è²??値を返ã—ã¾ã™ã? 198 * 例ãˆã°ã€[KEY.カラãƒ?]ã€[I]ã€[ROW.ID] ãªã©ã€ç‰¹å®šã?è²??値を返ã—ã¾ã™ã? 199 * ã¾ãŸã?カラãƒ?ãŒå?ã®ãƒ??タモãƒ?ƒ«ã«å˜åœ¨ã—ãªã??åˆã‚‚ã€è²??値ã‹ã? 200 * Exception ã‚’è¿”ã—ã¾ã™ã?è²??値ãªã®ã‹ã?Exception ãªã®ã‹ã?ã€? 201 * 実è£?«ä¾å˜ã—ã¾ã™ã? 202 * 203 * @param columnName 値ãŒå‚ç…§ã•れるカラãƒ? 204 * 205 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®ã‚«ãƒ©ãƒ?•ªå·ã€‚å˜åœ¨ã—ãªã‘れã°ã€?1 206 * @throws IllegalArgumentException 引数ã®ã‚«ãƒ©ãƒ?ã?null ã®å ´å? 207 */ 208 public int getColumnNo( final String columnName ) { 209 if( columnName == null ) { 210 String errMsg = "引数ã®ã‚«ãƒ©ãƒ?ã«ã€null ã¯è¨å®šã§ãã¾ã›ã‚“ã€?; 211 throw new IllegalArgumentException( errMsg ); 212 } 213 214 int address = -1; 215 for( int i = 0; i < names.length; i++ ) { 216 if( columnName.equalsIgnoreCase( names[i] ) ) { 217 address = i; 218 break; 219 } 220 } 221 222 return address; 223 } 224 225 /** 226 * カラãƒ?é…å?ã«å¯¾å¿œã™ã‚?カラãƒ?•ªå·é…å?ã‚’è¿”ã—ã¾ã™ã? 227 * 228 * ã“れã¯ã€?getColumnNo( String ) ã«å¯¾ã™ã‚‹ è¤?•°ã®ã‚«ãƒ©ãƒ?を検索ã—㟠229 * å ´åˆã¨åŒã˜ã§ã™ã? 230 * 231 * @param clmNms 値ãŒå‚ç…§ã•れるカラãƒ?é…å? 232 * 233 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®ã‚«ãƒ©ãƒ?•ªå·é…å?ã€? 234 */ 235 public int[] getColumnNos( final String[] clmNms ) { 236 if( clmNms == null ) { return new int[0]; } 237 238 int[] clmNos = new int[clmNms.length]; 239 for( int j = 0; j < clmNms.length; j++ ) { 240 int address = -1; 241 for( int i = 0; i < names.length; i++ ) { 242 if( clmNms[j].equalsIgnoreCase( names[i] ) ) { 243 address = i; 244 break; 245 } 246 } 247 clmNos[j] = address; 248 } 249 250 return clmNos; 251 } 252 253 /** 254 * カラãƒ?é…å?ã‚’è¿”ã—ã¾ã™ã? 255 * 256 * @return カラãƒ?é…å? 257 */ 258 public String[] getNames() { 259 return names.clone(); 260 } 261 262 /** 263 * row ã«ã‚るセルã®å±žæ?値をé?列ã§è¿”ã—ã¾ã™ã? 264 * 265 * @param row 値ãŒå‚ç…§ã•れるè¡? 266 * 267 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®å±žæ?値é…å? 268 */ 269 public String[] getValues( final int row ) { 270 return vals[row].clone(); 271 } 272 273 /** 274 * row ãŠã‚ˆã³ clm ã«ã‚るセルã®å±žæ?値をStringã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã? 275 * 276 * @param row 値ãŒå‚ç…§ã•れるè¡? 277 * @param clm 値ãŒå‚ç…§ã•れるå? 278 * 279 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®å€¤ 280 * 281 */ 282 public String getValue( final int row, final int clm ) { 283 return vals[row][clm]; 284 } 285 286 /** 287 * row ãŠã‚ˆã³ clm ã«ã‚るセルã®å±žæ?値をStringã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã? 288 * 289 * @param row 値ãŒå‚ç…§ã•れるè¡? 290 * @param clm 値ãŒå‚ç…§ã•れるå?(ã‚ー) 291 * 292 * @return æŒ?®šã•れãŸã‚»ãƒ«ã®å€¤ 293 * 294 */ 295 public String getValue( final int row, final String clm ) { 296 return vals[row][getColumnNo( clm )]; 297 } 298 299 /** 300 * ãƒ??ã‚¿ãƒ??ブルå†??行ã?æ•°ã‚’è¿”ã—ã¾ã™ã? 301 * 302 * @return モãƒ?ƒ«ã®è¡Œæ•° 303 * 304 */ 305 public int getRowCount() { 306 return vals.length; 307 } 308 309 /** 310 * row å˜ä½ã«å¤‰æ›´ã•れãŸã‚¿ã‚¤ãƒ?追åŠ?変更/削除)ã‚’è¿”ã—ã¾ã™ã? 311 * タイプã?å§‹ã‚ã«ä¸?º¦ç™»éŒ²ã™ã‚‹ã¨ãれ以é™ã«å¤‰æ›´ã¯ã‹ã‹ã‚Šã¾ã›ã‚“ã€? 312 * ã¤ã¾ã‚Šã?å§‹ã‚㫠追åŠ?§ä½œæ?ã—ãŸãƒ??ã‚¿ã¯ã€ãã®å¾Œå¤‰æ›´ãŒã‚ã£ã¦ã‚‚追åŠ??ã¾ã¾ã§ã™ã? 313 * ãªã«ã‚‚変更ã•れã¦ã?ªã??åˆã?, ""(ゼãƒã‚¹ãƒˆãƒªãƒ³ã‚°)ã‚’è¿”ã—ã¾ã™ã? 314 * 315 * @param row 値ãŒå‚ç…§ã•れるè¡? 316 * 317 * @return 変更ã•れãŸã‚¿ã‚¤ãƒ—ã?値 318 */ 319 public String getModifyType( final int row ) { 320 return modTypes == null ? "" : modTypes[row]; 321 } 322 323 /** 324 * clm ã®Nativeタイプを返ã—ã¾ã™ã? 325 * Nativeタイプã?org.opengion.fukurou.model.NativeTypeã§å®šç¾©ã•れã¦ã?¾ã™ã? 326 * 327 * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€? 328 * 329 * @param clm 値ãŒå‚ç…§ã•れるå? 330 * 331 * @return Nativeタイãƒ? 332 * @see org.opengion.fukurou.model.NativeType 333 */ 334 public NativeType getNativeType( final int clm ) { 335 // return StringUtil.getNativeType( vals[0][clm] ); 336 return NativeType.getType( vals[0][clm] ); 337 } 338 339 /** 340 * ã“ã?オブジェクトã?æ–?—å?表記を返ã—ã¾ã™ã? 341 * ãƒ?ƒãƒ?‚°ç”¨ã§ã™ã? 342 * 343 * @og.rev 5.6.7.0 (2013/07/27) æ–°è¦è¿½åŠ? 344 * 345 * @return æ–?—å?è¡¨ç¾ 346 * @see java.lang.Object#toString() 347 */ 348 @Override 349 public String toString() { 350 StringBuilder buf = new StringBuilder(); 351 352 buf.append( "NAMES=" ).append( Arrays.toString( names ) ).append( CR ) 353 .append( " COL_LEN=" ).append( (names != null) ? names.length : -1 ).append( CR ) 354 .append( " ROW_LEN=" ).append( (vals != null) ? vals.length : -1 ).append( CR ) ; 355 356 return buf.toString(); 357 } 358 }