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}