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.hayabusa.db; 017 018import java.util.concurrent.ConcurrentMap; // 6.4.3.3 (2016/03/04) 019import java.util.concurrent.ConcurrentHashMap; // 6.4.3.1 (2016/02/12) refactoring 020import java.util.Set; // 6.0.2.4 (2014/10/17) 021import java.util.HashSet; // 6.0.2.4 (2014/10/17) 022import java.util.function.BiConsumer; // 6.4.5.0 (2016/04/08) 023 024import org.opengion.fukurou.util.StringUtil; 025import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 6.1.0.0 (2014/12/26) refactoring 026 027/** 028 * 編集設定情報を管理するためのデータ管理クラスです。 029 * ここで管理される各パラメーターの意味は以下の通りです。 030 * (各インデックス番号は、内部的に管理されているインデックス番号を意味します) 031 * 032 * ・0:編集名 033 * この編集設定オブジェクトの名称です。 034 * ・1:表示カラム 035 * 表示対象となるカラム一覧です。CSV形式で指定します。 036 * この一覧には、非表示のカラムも合わせて管理され、非表示カラムについては、 037 * カラム名の先頭に"!"をつけます。 038 * 例) AAA,!BBB,CCC ⇒ AAA,CCCの順に表示(BBBは非表示) 039 * ・2:集計カラム 040 * 各値をSUMする対象となるカラムです。(CSV形式で複数指定が可能) 041 * ここで指定されたカラムは数値型である必要があります。 042 * SQL構文における、SUM関数の引数として指定するカラムに相当します。 043 * ・3:グループカラム 044 * 集計カラムの各値をグルーピングするためのカラムです。(CSV形式で複数指定が可能) 045 * SQL構文における、GROUP BYに指定するカラムに相当します。 046 * ・4:小計カラム 047 * 集計カラムの各値に対し、小計行を付加するためのブレイクキーを指定します。(CSV形式で複数指定が可能) 048 * ・5:合計カラム 049 * 集計カラムの各値に対し、合計行を付加するためのブレイクキーを指定します。(CSV形式で複数指定が可能) 050 * ・6:総合計フラグ 051 * 集計カラムの各値に対し、総合計行を付加するかどうかを指定します。(0以外:追加する 0:追加しない) 052 * ・7:表示順カラム 053 * データの表示順をその順番にCSV形式で指定します。 054 * カラム名の先頭に"!"をつけた場合は、そのカラムは降順で表示されます。 055 * SQL構文における、orderby句に相当します。 056 * ・8:共通フラグ 057 * この編集設定オブジェクトが、共通(全ユーザー公開)編集かどうかを 058 * 指定します。(0以外:共通 0:個人のみ) 059 * 060 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 061 * 062 * @version 5.0 063 * @author Hiroki Nakamura 064 * @since JDK6.0, 065 */ 066public class DBEditConfig { 067 068 private static final int EDIT_KEY_NAME = 0; 069 private static final int EDIT_KEY_VIEW = 1; 070 private static final int EDIT_KEY_SUM = 2; 071 private static final int EDIT_KEY_GROUP = 3; 072 private static final int EDIT_KEY_SUBTOTAL = 4; 073 private static final int EDIT_KEY_TOTAL = 5; 074 private static final int EDIT_KEY_GRANDTOTAL= 6; 075 private static final int EDIT_KEY_FIRSTTOTAL= 7; // 6.1.1.0 (2015/01/17) FIRSTTOTAL 追加 076 private static final int EDIT_KEY_ORDERBY = 8; 077 private static final int EDIT_KEY_COMMON = 9; 078 079 private static final String[] EDIT_KEYS // 6.3.9.1 (2015/11/27) 修飾子を、なし → private に変更。キーに、"EDIT_" を最初から付けておきます。 080 = { "EDIT_NAME", "EDIT_VIEW", "EDIT_SUM", "EDIT_GROUP", "EDIT_SUBTOTAL", "EDIT_TOTAL", "EDIT_GRANDTOTAL", "EDIT_FIRSTTOTAL", "EDIT_ORDERBY", "EDIT_COMMON" }; 081 082 private final String[] editVals = new String[EDIT_KEYS.length]; // 6.3.9.1 (2015/11/27) 再利用率が低いのと、コンパイラが何とかしてくれるでしょう。 083 084 private int sumClmCount; 085 private int groupClmCount; 086 private int subTotalClmCount; 087 private int totalClmCount; 088 /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */ 089 private final ConcurrentMap<String,String> orderMap = new ConcurrentHashMap<>(); 090 private String orderByDescClms; 091 092 /** 093 * コンストラクタ 094 * 095 * 空の編集設定オブジェクトを構築します。 096 */ 097 public DBEditConfig() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 098 099 /** 100 * コンストラクタ 101 * 102 * 各種パラメーターを指定して編集設定オブジェクトを構築します。 103 * 104 * @og.rev 6.1.1.0 (2015/01/17) 総合計を最初の行に追加するかどうか(FirstTotal)の属性を追加 105 * 106 * @param editName 編集名称 107 * @param viewClms 画面表示カラム 108 * @param sumClms 集計カラム 109 * @param groupClms グループカラム 110 * @param subTotalClms 小計カラム 111 * @param totalClms 合計カラム 112 * @param useGrandTotal 総合計行を追加するか(1:追加する 1以外:追加しない) 113 * @param useFirstTotal 総合計行を追加するか(1:追加する 1以外:追加しない) 114 * @param orderByClms 表示順 115 * @param isCommon 共通編集かどうか(1:共通 1以外:個人のみ) 116 */ 117 public DBEditConfig( final String editName, final String viewClms 118 , final String sumClms, final String groupClms 119 , final String subTotalClms, final String totalClms 120 , final String useGrandTotal, final String useFirstTotal 121 , final String orderByClms, final String isCommon ) { 122 123 editVals[EDIT_KEY_NAME] = editName; 124 editVals[EDIT_KEY_VIEW] = viewClms; 125 editVals[EDIT_KEY_SUM] = sumClms; 126 editVals[EDIT_KEY_GROUP] = groupClms; 127 editVals[EDIT_KEY_SUBTOTAL] = subTotalClms; 128 editVals[EDIT_KEY_TOTAL] = totalClms; 129 editVals[EDIT_KEY_GRANDTOTAL] = useGrandTotal; 130 editVals[EDIT_KEY_FIRSTTOTAL] = useFirstTotal; // 6.1.1.0 (2015/01/17) 131 editVals[EDIT_KEY_ORDERBY] = orderByClms; 132 editVals[EDIT_KEY_COMMON] = isCommon; 133 134 init(); 135 } 136 137 /** 138 * コンストラクタ 139 * 140 * 各種パラメーターを配列で指定して編集設定オブジェクトを構築します。 141 * 各パラメータの配列インデックスは、{@link #getEditKeys(String,String)}で返される 142 * キー一覧の配列インデックスと一致します。 143 * 各パラメーターの意味については、クラスのJavadoc{@link DBEditConfig}を参照して下さい。 144 * 145 * @param editVals 設定値(配列) 146 */ 147 public DBEditConfig( final String[] editVals ) { 148 System.arraycopy( editVals, 0, this.editVals, 0, editVals.length ); 149 init(); 150 } 151 152 /** 153 * 編集設定オブジェクト作成時の初期化処理です。 154 * コンストラクタの引数に基づき内部変数の初期設定を行います。 155 */ 156 private void init() { 157 sumClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_SUM] ).length; 158 groupClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_GROUP] ).length; 159 subTotalClmCount= StringUtil.csv2Array( editVals[EDIT_KEY_SUBTOTAL] ).length; 160 totalClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_TOTAL] ).length; 161 162 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 163 if( editVals[EDIT_KEY_ORDERBY] == null ) { 164 orderByDescClms = null; 165 } 166 else { 167 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 168 final String[] ary = StringUtil.csv2Array( editVals[EDIT_KEY_ORDERBY] ); 169 for( int i=0; i<ary.length ;i++ ) { 170 String str = ary[i]; 171 if( StringUtil.startsChar( str , '!' ) ) { // 6.2.0.0 (2015/02/27) 1文字 String.startsWith 172 str = str.substring( 1 ); 173 if( buf.length() > 0 ) { buf.append( ',' ); } // 6.0.2.5 (2014/10/31) char を append する。 174 buf.append( str ); 175 } 176 orderMap.put( str, String.valueOf( i+1 ) ); 177 } 178 orderByDescClms = buf.toString(); 179 } 180 } 181 182 /** 183 * 画面ID、編集名をキーに、編集設定オブジェクトの各設定値の管理キーを指定します。 184 * 185 * 編集設定オブジェクトで管理される各キーに対して、 186 * "EDIT_[KEY]_(画面ID)_(編集名)"というキーを生成し、これを配列にして返します。 187 * 188 * @og.rev 6.0.2.2 (2014/10/03) 新規追加。DBEditConfig から、移動 189 * @og.rev 6.3.9.1 (2015/11/27) DBEditConfigManager から、移動。 190 * 191 * @param guikey 画面ID 192 * @param editName 編集名 193 * 194 * @return 編集設定を管理するためのキー一覧 195 */ 196 public static String[] getEditKeys( final String guikey, final String editName ) { 197 final String[] rtn = new String[EDIT_KEYS.length]; 198 final String keyNm = "_" + guikey + "_" + editName; 199 200 for( int i=0; i<EDIT_KEYS.length; i++ ) { 201 rtn[i] = EDIT_KEYS[i] + keyNm; 202 } 203 return rtn; 204 } 205 206 /** 207 * 編集設定オブジェクトの各設定値を配列にして返します。 208 * 209 * 配列のインデックス番号は、{@link #getEditKeys(String,String)}で生成されるキーの 210 * インデックス番号と一致します。 211 * 212 * @return 編集設定オブジェクトの設定値一覧(配列) 213 */ 214 public String[] getEditVals() { 215 final String[] rtn = new String[editVals.length]; 216 System.arraycopy( editVals, 0, rtn, 0, editVals.length ); 217 return rtn; 218 } 219 220 /** 221 * 編集名を返します。 222 * 223 * @return 編集名 224 */ 225 public String getEditName() { 226 return editVals[EDIT_KEY_NAME]; 227 } 228 229 /** 230 * 表示カラム名の一覧をCSV形式で返します。 231 * 非表示カラムについては、カラム名の先頭に"!"をつけて返されます。 232 * 例) AAA,!BBB,CCC ⇒ AAA,CCCの順に表示(BBBは非表示) 233 * 234 * @return 表示カラム名一覧(CSV形式) 235 */ 236 public String getViewClms() { 237 return editVals[EDIT_KEY_VIEW]; 238 } 239 240 /** 241 * 表示カラム(CSV形式)をチェックし、変更があれば、反映したカラムを作成します。 242 * 243 * 表示カラムは、並び順や非表示マーカー(!)などが加味され、ユーザー、画面ごとに 244 * データベースに記録されています。JSPソースを修正した場合、データベースに 245 * 書き込まれた表示カラムは、反映されないため、カラム選択画面等に表示されません。 246 * そこで、オリジナルのカラムに追加された場合は、カラムを比較することで、 247 * 追加分のカラムを、非表示カラムとして、後ろに追記します。 248 * 削除された場合は、ViewForm で警告表示することで、ユーザーに変更を促します。 249 * 250 * @og.rev 6.0.2.4 (2014/10/17) JSP修正時の追加カラム対応 251 * 252 * @param orgClms オリジナルのカラム(CSV形式) 253 * 254 * @return 変更後の表示カラム(CSV形式) 255 */ 256 public String getViewClms( final String orgClms ) { 257 String viewClms = editVals[EDIT_KEY_VIEW]; 258 259 if( orgClms == null || orgClms.isEmpty() ) { return viewClms; } // orgClms がなければ、viewClms を返す。 260 // 基本的には、両者のカラムは、一致するはず。 261 final String[] vclms = viewClms.split( "," ); // 表示順、非表示処理を行ったカラム 262 final String[] fclms = orgClms.split( "," ); // 元々の表示可能カラムすべて(fullClms) 263 264 // 表示可能カラムすべての Set を作成します。 265 final Set<String> fset = new HashSet<>(); 266 for( int i=0; i<fclms.length; i++ ) { // orgClms をSet に追加します。 267 fset.add( fclms[i] ); 268 } 269 270 // 非表示カラムの内、表示可能カラムに存在しない分だけの Set を作成します。 271 // また、表示可能カラムから、順番に、viewClms の値を削除していきます。 272 final Set<String> vset = new HashSet<>(); 273 final StringBuilder vbuf = new StringBuilder( BUFFER_MIDDLE ); // 新しい viewClms 作成用 274 for( int i=0; i<vclms.length; i++ ) { // viewClms をSet に追加します。 275 String clm = vclms[i]; 276 if( clm == null || clm.isEmpty() ) { continue; } // 6.0.2.5 (2014/10/31) 潜在バグ? 先頭に"," が来るとアベンドする。 277 clm = clm.charAt(0) == '!' ? clm.substring(1) : clm ; // 非表示の (!) は削除します。 278 if( fset.remove( clm ) ) { // fullSet にあれば、削除するとともに、新viewClmsを作成する。 279 if( vbuf.length() > 0 ) { vbuf.append(','); } // 最初以降は、カンマで連結する。 // 6.0.2.5 (2014/10/31) char を append する。 280 vbuf.append( vclms[i] ); // append するのは、(!) 付のカラム 281 } 282 else { 283 vset.add( clm ); // fullSet になければ、viewSet に追加 284 } 285 } 286 287 // この段階で、fset、vset ともに、それぞれ独自のカラムが残っている。 288 // どちらも、残っていなければ、正常なので、viewClms を返す。 289 if( vset.isEmpty() && fset.isEmpty() ) { return viewClms; } 290 291 // fullSet にカラムが残っていれば、非表示で、新viewClmsに、追加する。 292 if( !fset.isEmpty() ) { 293 final String[] defClms = fset.toArray( new String[fset.size()] ); 294 for( int i=0; i<defClms.length; i++ ) { 295 if( vbuf.length() > 0 ) { vbuf.append(','); } // 6.0.2.5 (2014/10/31) 最初以降は、カンマで連結する。 296 vbuf.append('!').append( defClms[i] ); // 非表示カラムとして、後ろに追加する。 297 } 298 } 299 viewClms = vbuf.toString(); 300 301 editVals[EDIT_KEY_VIEW] = viewClms; 302 return viewClms; 303 } 304 305 /** 306 * 集計カラムの一覧をCSV形式で返します。 307 * 308 * @return 集計カラムの一覧(カンマ区切) 309 */ 310 public String getSumClms() { 311 return editVals[EDIT_KEY_SUM]; 312 } 313 314 /** 315 * 集計処理を行うかどうかを返します。 316 * これは、集計カラムが指定されているか、と同じ意味です。 317 * 318 * @return true:対象 false:非対象 319 */ 320 public boolean useSum() { 321 return editVals[EDIT_KEY_SUM] != null && editVals[EDIT_KEY_SUM].length() > 0 ; 322 } 323 324 /** 325 * 指定されたカラムが集計対象のカラムかどうかを返します。 326 * 327 * @param clm カラム 328 * 329 * @return true:対象 false:非対象 330 */ 331 public boolean isSumClm( final String clm ) { 332 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 333 // 条件反転注意 334 return clm != null && editVals[EDIT_KEY_SUM] != null && ( ","+editVals[EDIT_KEY_SUM]+"," ).indexOf( ","+clm+"," ) >= 0 ; 335 336 } 337 338 /** 339 * 集計カラムのカラム数を返します。 340 * 341 * @return 集計カラムのカラム数 342 */ 343 public int getSumClmCount() { 344 return sumClmCount; 345 } 346 347 /** 348 * グループカラムの一覧をCSV形式で返します。 349 * 350 * @return グループカラムの一覧(カンマ区切) 351 */ 352 public String getGroupClms() { 353 return editVals[EDIT_KEY_GROUP]; 354 } 355 356 /** 357 * グループ処理を行うかどうかを返します。 358 * これは、グループカラムが指定されているか、と同じ意味です。 359 * 360 * @return true:対象 false:非対象 361 */ 362 public boolean useGroup() { 363 return editVals[EDIT_KEY_GROUP] != null && editVals[EDIT_KEY_GROUP].length() > 0 ; 364 } 365 366 /** 367 * 指定されたカラムがグループ対象のカラムかどうかを返します。 368 * 369 * @param clm カラム 370 * 371 * @return true:対象 false:非対象 372 */ 373 public boolean isGroupClm( final String clm ) { 374 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 375 // 条件反転注意 376 return clm != null && editVals[EDIT_KEY_GROUP] != null && ( ","+editVals[EDIT_KEY_GROUP]+"," ).indexOf( ","+clm+"," ) >= 0 ; 377 378 } 379 380 /** 381 * グループカラムのカラム数を返します。 382 * 383 * @return グループカラムのカラム数 384 */ 385 public int getGroupClmCount() { 386 return groupClmCount; 387 } 388 389 /** 390 * 小計カラムの一覧をCSV形式で返します。 391 * 392 * @return 小計カラムの一覧(カンマ区切) 393 */ 394 public String getSubTotalClms() { 395 return editVals[EDIT_KEY_SUBTOTAL]; 396 } 397 398 /** 399 * 小計処理を行うかどうかを返します。 400 * これは、小計カラムが指定されているか、と同じ意味です。 401 * 402 * @return true:対象 false:非対象 403 */ 404 public boolean useSubTotal() { 405 return editVals[EDIT_KEY_SUBTOTAL] != null && editVals[EDIT_KEY_SUBTOTAL].length() > 0 ; 406 } 407 408 /** 409 * 指定されたカラムが小計対象のカラムかどうかを返します。 410 * 411 * @param clm カラム 412 * 413 * @return true:対象 false:非対象 414 */ 415 public boolean isSubTotalClm( final String clm ) { 416 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 417 // 条件反転注意 418 return clm != null && editVals[EDIT_KEY_SUBTOTAL] != null && ( ","+editVals[EDIT_KEY_SUBTOTAL]+"," ).indexOf( ","+clm+"," ) >= 0 ; 419 420 } 421 422 /** 423 * 小計カラムのカラム数を返します。 424 * 425 * @return グループカラムのカラム数 426 */ 427 public int getSubTotalClmCount() { 428 return subTotalClmCount; 429 } 430 431 /** 432 * 合計カラムの一覧をCSV形式で返します。 433 * 434 * @return 合計カラムの一覧(カンマ区切) 435 */ 436 public String getTotalClms() { 437 return editVals[EDIT_KEY_TOTAL]; 438 } 439 440 /** 441 * 合計処理を行うかどうかを返します。 442 * これは、合計カラムが指定されているか、と同じ意味です。 443 * 444 * @return true:対象 false:非対象 445 */ 446 public boolean useTotal() { 447 return editVals[EDIT_KEY_TOTAL] != null && editVals[EDIT_KEY_TOTAL].length() > 0 ; 448 } 449 450 /** 451 * 指定されたカラムが合計対象のカラムかどうかを返します。 452 * 453 * @param clm カラム 454 * 455 * @return true:対象 false:非対象 456 */ 457 public boolean isTotalClm( final String clm ) { 458 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 459 // 条件反転注意 460 return clm != null && editVals[EDIT_KEY_TOTAL] != null && ( ","+editVals[EDIT_KEY_TOTAL]+"," ).indexOf( ","+clm+"," ) >= 0 ; 461 462 } 463 464 /** 465 * 合計カラムのカラム数を返します。 466 * 467 * @return グループカラムのカラム数 468 */ 469 public int getTotalClmCount() { 470 return totalClmCount; 471 } 472 473 /** 474 * 総合計行を付加するかどうかを返します。 475 * 476 * @return true:対象 false:非対象 477 */ 478 public boolean useGrandTotal() { 479 return StringUtil.nval( editVals[EDIT_KEY_GRANDTOTAL], false ); 480 } 481 482 /** 483 * 総合計を最初の行に追加するかどうかを返します。 484 * 485 * @og.rev 6.1.1.0 (2015/01/17) 総合計を最初の行に追加するかどうか(FirstTotal)の属性を追加 486 * 487 * @return true:対象 false:非対象 488 */ 489 public boolean useFirstTotal() { 490 return StringUtil.nval( editVals[EDIT_KEY_FIRSTTOTAL], false ); 491 } 492 493 /** 494 * 表示順カラムをCSV形式で返します。 495 * カラムの並び順が表示順としての優先順になります。 496 * また、降順で表示するカラムについては、カラム名の先頭に"!"が付加されます。 497 * 498 * @return 標準順カラムの一覧(カンマ区切) 499 */ 500 public String getOrderByClms() { 501 return editVals[EDIT_KEY_ORDERBY]; 502 } 503 504 /** 505 * 指定されたカラムの表示順の優先番号を返します。 506 * 指定カラムが標準として指定されていない場合は、""(ゼロストリング)を返します。 507 * 508 * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 509 * 510 * @param clm カラム 511 * 512 * @return 表示順の優先番号 513 * @og.rtnNotNull 514 */ 515 public String getOrder( final String clm ) { 516 // ConcurrentMap#getOrDefault(Object,V) を使用して、Map の値が null のときの初期値を返します。 517 return clm == null || editVals[EDIT_KEY_ORDERBY] == null 518 ? "" 519 : orderMap.getOrDefault( clm , "" ); 520 521 } 522 523 /** 524 * 指定されたカラムの表示順指定が降順であるかどうかを返します。 525 * 標準と指定されていない場合は、falseを返します。 526 * 527 * @param clm カラム 528 * 529 * @return true:降順 false:昇順 530 */ 531 public boolean isOrderByDesc( final String clm ) { 532 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 533 // 条件反転注意 534 return clm != null && orderByDescClms != null && ( ","+orderByDescClms+"," ).indexOf( ","+clm+"," ) >= 0 ; 535 536 } 537 538 /** 539 * 並び替え処理を行うかどうかを返します。 540 * これは、表示順カラムが指定されているか、と同じ意味です。 541 * 542 * @return true:対象 false:非対象 543 */ 544 public boolean useOrderBy() { 545 return editVals[EDIT_KEY_ORDERBY] != null && editVals[EDIT_KEY_ORDERBY].length() > 0 ; 546 } 547 548 /** 549 * この編集設定オブジェクトが、共通(全ユーザー公開)編集か 550 * どうかを返します。 551 * 552 * @return 0以外:共通 0:個人のみ 553 */ 554 public boolean isCommon() { 555 return StringUtil.nval( editVals[EDIT_KEY_COMMON], false ); 556 } 557 558 /** 559 * 画面IDに対応した、内部のキーと値の各要素に対して指定されたアクションを実行します。 560 * 561 * getEditKeys(String,String) で得られるキーの文字列配列と、getEditVals()で得られる値の文字列配列 562 * を、順次、action メソッドに渡していきます。 563 * キーの文字列配列の作成時の編集名は、このオブジェクトの編集名を使用します。 564 * 565 * @og.rev 6.4.5.0 (2016/04/08) UserInfo のEditConfig関連機能を、DBEditConfigManagerに移植します。新規追加 566 * 567 * @param guikey 画面ID 568 * @param action 各要素に対して実行される関数型インタフェース( editKey、editVal ) 569 */ 570 public void forEach( final String guikey, final BiConsumer<String ,String> action ) { 571 final String keyNm = "_" + guikey + "_" + editVals[EDIT_KEY_NAME]; 572 573 for( int i=0; i<EDIT_KEYS.length; i++ ) { 574 action.accept( EDIT_KEYS[i] + keyNm , editVals[i] ); 575 } 576 } 577}