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.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.hayabusa.resource.GUIInfo;
021import org.opengion.hayabusa.resource.UserInfo;
022import org.opengion.hayabusa.resource.CodeData;
023import org.opengion.hayabusa.resource.FavoriteGUIData;
024import org.opengion.hayabusa.resource.ResourceManager;
025import org.opengion.fukurou.util.XHTMLTag;
026import org.opengion.fukurou.util.FileMap;
027import org.opengion.fukurou.util.TagBuffer;
028import org.opengion.fukurou.util.ToString;                                                      // 6.1.1.0 (2015/01/17)
029import org.opengion.fukurou.util.StringUtil ;
030import org.opengion.fukurou.util.ArraySet;                                                      // 6.4.3.4 (2016/03/11)
031
032import org.opengion.fukurou.system.OgBuilder ;                                          // 6.4.4.1 (2016/03/18)
033import static org.opengion.fukurou.util.StringUtil.nval ;
034import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE;       // 6.1.0.0 (2014/12/26) refactoring
035import static org.opengion.fukurou.system.HybsConst.BR;                         // 6.1.0.0 (2014/12/26) refactoring
036
037import java.util.Set ;
038import java.util.LinkedHashSet;
039import java.util.TreeSet;                                                                                       // 6.8.3.1 (2017/12/01)
040import java.util.Iterator;
041import java.util.Map;
042
043/**
044 * 画面アクセスメニューを作成します。
045 *
046 * 画面リソースの階層番号(レベル)は、
047 *  0:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
048 *  1:トップ階層(【分類名称】)
049 *  2:選択階層(通常の折りたたみメニュー)
050 *  3:選択非表示(通常は、隠してあります)
051 * です。
052 * お気に入りメニューを登録するキーワードに、HybsSystem.GUI_FAV_MENU_KEY を使用しています。
053 * これは、エンジン内部で使用しているキーワードです。
054 *
055 * ※ 6.9.4.1 (2018/04/09) HYBS_BR の廃止
056 *    以前から、画面メニューを少し空けるために、HYBS_BR が使われていましたが、廃止しました。
057 *
058 * @og.formSample
059 * ●形式:<og:topMenu />
060 * ●body:なし
061 *
062 * ●Tag定義:
063 *   <og:topMenu
064 *       menuType           【TAG】作成するメニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2,NONE,TILE)を指定します(初期値:NORMAL)
065 *       expand             【TAG】折り返しメニューを構築するかどうかを指定します(初期値:true)
066 *       groups             【TAG】表示対象となるグループをCSV形式で指定します
067 *       classify           【TAG】表示対象となる分類(classify)を指定します
068 *       href               【TAG】グループメニューの表示対象となるソース名(href)を指定します(初期値:menu.jsp)
069 *       target             【TAG】グループメニューの表示対象となるフレーム名(target)を指定します(初期値:MENU)
070 *       imageOnly          【TAG】グループメニューの表示に、画像のみかどうか[true:画像のみ/false:画像+ラベル]を指定します(初期値:false)
071 *       sideCount          【TAG】グループメニューの表示対象となるメニューを横並びさせる数を指定します
072 *       minCellCount       【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最小行数を指定します(初期値:8)
073 *       maxCellCount       【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最大行数を指定します(初期値:8)
074 *       cache              【TAG】グループメニューのキャッシュを使用するかどうか[true/false]を指定します(初期値:true)
075 *       match              【TAG】正判定(マッチする場合に、メニューに出す)条件を設定します
076 *       unmatch            【TAG】逆判定(マッチする場合に、メニューに出さない)条件を設定します
077 *       useButton          【TAG】画面リンクにボタンを使用するかどうか[true/false]を指定します(初期値:false)
078 *       buttonRequest      【TAG】マトリクスからの遷移先でボタンメニュー表示するかどうか[true/false]を指定します(初期値:false)
079 *       inlineStyle        【TAG】標準画面を初期状態で表示するかどうか[true/false]を指定します(初期値:false)
080 *       useDivOneLevel     【TAG】ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうか[true/false]を指定します(初期値:false)
081 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
082 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
083 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
084 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
085 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
086 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
087 *   >   ... Body ...
088 *   </og:topMenu>
089 *
090 * ●使用例
091 *    <og:topMenu />
092 *
093 *    <og:topMenu
094 *          menuType     = "NORMAL"      NORMAL:通常 / GROUP:グループメニュー / ONELEVEL:1レベル / NEXTGUI:次アクセス先
095 *                                           / MATRIX:一覧表メニュー / MATRIX2:一覧表メニュー(大分類なし版) / NONE:表示しない / TILE:タイル表示
096 *          expand       = "true"        true:折り返しメニュー / false:階層メニュー
097 *          groups       = "AA,BB,CC"    表示対象となるグループをCSV形式で指定します。
098 *          classify     = "ABC"         表示対象となる分類を指定します。
099 *          href         = "menu.jsp"    グループメニューの対象ソース名(href)を指定します。
100 *          target       = "MENU"        グループメニューの対象フレーム名(target)を指定します。
101 *          imageOnly    = "false"       グループメニューに、 true:画像のみ / false:画像+ラベル を指定します。
102 *          sideCount    = "6"           グループメニューの表示対象となるメニューを横並びさせる数を指定します。
103 *          minCellCount = "8"           表形式メニューの1セルの最小行数を指定します。
104 *          maxCellCount = "8"           表形式メニューの1セルの最大行数を指定します。
105 *          cache        = "true"        グループメニューのキャッシュを使用するかどうか指定します。
106 *          match        = "正規表現"    正判定(マッチする場合に、メニューに出す)条件を設定します。
107 *          unmatch      = "正規表現"    逆判定(マッチする場合に、メニューに出さない)条件を設定します。
108 *          useButton    = "false"       ボタン形式のリンクを使用するかを指定します。
109 *          useDivOneLevel  = "false"    ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。
110 *    />
111 *
112 * @og.rev 3.5.5.3 (2004/04/09) 新規作成
113 * @og.group メニュー制御
114 *
115 * @version  4.0
116 * @author   Kohei Naruse
117 * @since    JDK5.0,
118 */
119public class TopMenuTag extends CommonTagSupport {
120        /** このプログラムのVERSION文字列を設定します。   {@value} */
121        private static final String VERSION = "6.9.9.1 (2018/08/27)" ;
122        private static final long serialVersionUID = 699120180827L ;
123
124        private static final String FIELD_IN  = "<fieldset style=\"display:inline;\">";
125        private static final String FIELD_OUT = "</fieldset>" + BR;
126//      private static final String JSP          = HybsSystem.sys( "JSP" );
127//      private static final String CNTX         = HybsSystem.sys( "CONTEXT_NAME" );    // 5.5.4.2 (2012/07/13) META-INF/resources 対応
128        private static final String MENU_IMG = "/jsp/menuImage/" ;                                      // 5.5.4.2 (2012/07/13) META-INF/resources 対応
129
130        // 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
131//      private boolean multiSessionCheck = HybsSystem.sysBool( "USE_MULTI_SESSION_CHECK" );
132
133        // 6.7.5.0 (2017/03/10) TILE表示追加
134        private static final Set<String> MENU_TYPE_SET = new ArraySet<>( "NORMAL","GROUP","ONELEVEL","NEXTGUI","MATRIX","MATRIX2","NONE","TILE" );
135
136        private String   menuType       = "NORMAL" ;            // NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2,NONE,TILE
137        private boolean  expand         = true;                         // true:折り返しメニュー / false:階層メニュー
138        private String[] groups         ;                                       // 表示対象となるグループをCSV形式で指定します。
139        private String   selClassify;                                   // 表示対象となる分類を指定します。
140        private String   href           = "menu.jsp";           // グループメニューの対象ソース名(href)を指定します。
141        private String   target         = "MENU";                       // グループメニューの対象フレーム名(target)を指定します。
142        private boolean  imageOnly      ;                                       // グループメニューに、 true:画像のみ / false:画像+ラベル を指定します
143        private int      sideCount      = -1;                           // 5.2.3.0 (2010/12/01) 表示対象となるメニューを横並びさせる数を指定します。
144        private int      minCellCount   = 8;                    // 表形式メニューの1セルの最小行数を指定します。
145        private int      maxCellCount   = 8;                    // 表形式メニューの1セルの最大行数を指定します。
146        private boolean  cache          = true;                         // グループメニューのキャッシュを使用するかどうか指定します。
147        // 3.8.8.7 (2007/05/01) メニューの表示条件指定追加
148        private String match            ;                                       // 正判定(マッチする場合に、メニューに出す)条件を設定
149        private String unmatch          ;                                       // 逆判定(マッチする場合に、メニューに出さない)条件を設定
150        private String imageDir         = MENU_IMG;                     // 6.7.5.0 (2017/03/10) TILE表示追加
151
152        private final transient FileMap imgFileMap = new FileMap() ;            // 6.3.9.0 (2015/11/06) helpMapの初期化を、initメソッドに変更する。
153
154        private final String JSP         = HybsSystem.sys( "JSP" );                             // 6.9.9.3 (2018/09/25) JavaDoc エラー対応
155
156        // MULTI_SESSION_CHECK 時のリンクに付加する情報
157        private String  mscKey          ;
158
159        private boolean  useButton              ;                               // ボタン形式のリンクを使用するか 4.2.1.0 (2008/04/01)
160        private boolean  buttonRequest  ;                               // マトリクス2からの遷移でボタン形式にするかのリクエスト変数 4.2.1.0 (2008/04/17)
161        private boolean  excludeButton  ;                               // 4.3.3.0 (2008/10/01) ボタンメニューの場合でも強制的に従来のプルダウンにします。
162        private boolean  inlineStyle    ;                               // 4.3.3.0 (2008/10/01) trueでLv3の画面にstyle属性でinlineを付加
163
164        private boolean  useDivOneLevel ;                               // 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。
165
166        /**
167         * デフォルトコンストラクター
168         *
169         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
170         */
171        public TopMenuTag() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
172
173        /**
174         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
175         *
176         * @og.rev 4.0.0.0 (2007/10/31) 1レベルメニューの見直し
177         * @og.rev 4.2.1.0 (2008/04/01) マトリクスメニュー2追加
178         * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加
179         * @og.rev 5.3.0.0 (2010/11/22) NEXTGUI もマルチセッションチェックをしない。
180         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
181         * @og.rev 5.5.0.4 (2012/03/12) FAQ表示対応
182         * @og.rev 5.5.2.5 (2012/05/21) FAQ対応 廃止
183         * @og.rev 5.5.4.2 (2012/07/13) META-INF/resources からの読み取り対応
184         * @og.rev 6.3.8.3 (2015/10/03) NONE(表示しない) 追加。
185         * @og.rev 6.3.8.4 (2015/10/09) topMenu 内でのHelp機能を廃止します。
186         * @og.rev 6.3.8.4 (2015/10/09) FileMap のコンストラクタ変更に伴う対応。
187         * @og.rev 6.3.9.0 (2015/11/06) helpMapの初期化を、initメソッドに変更する。
188         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加(imageDir 属性追加)
189         * @og.rev 6.9.4.0 (2018/04/02) caseKey 、caseVal 属性対応
190         * @og.rev 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
191         * @og.rev 6.9.5.0 (2018/04/23) 6.9.9.3 (2018/09/25) JavaDoc エラー対応
192         *
193         * @return      後続処理の指示
194         */
195        @Override
196        public int doEndTag() {
197                debugPrint();           // 4.0.0 (2005/02/28)
198                if( useTag() ) {                // 6.9.4.0 (2018/04/02) caseKey 、caseVal 属性対応
199
200                        // 6.3.8.3 (2015/10/03) NONE(表示しない) 追加。
201                        if( "NONE".equals( menuType ) ) { return EVAL_PAGE; }
202
203                        // Ver 4.0.0 2007/09/04
204                        // ONELEVEL, NEXTGUI の場合は、multiSessionCheck を行いません。
205//                      if( multiSessionCheck && !"ONELEVEL".equals( menuType ) && !"NEXTGUI".equals( menuType ) ) {
206                        if( !"ONELEVEL".equals( menuType ) && !"NEXTGUI".equals( menuType ) ) {                                                 // 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
207                                final String cnt = (String)getSessionAttribute( HybsSystem.MULTI_SESSION_CHECK );
208                                if( cnt == null ) {
209                                        final String errMsg = "マルチセッションチェックのキーが存在しません。"
210                                                                + "topMenu タグを実行する前に、必ず jspInit タグを"
211                                                                + "実行しておいてください。" ;
212                                        jspPrint( errMsg );
213                                        return SKIP_PAGE ;              // ページの残りの処理を行わない。
214                                }
215                                mscKey = HybsSystem.MULTI_SESSION_CHECK + "=" + cnt ;
216                        }
217
218                        // 6.7.5.0 (2017/03/10) TILE表示追加(imageDir 属性追加)
219                        final Set<?> set = pageContext.getServletContext().getResourcePaths( imageDir );
220                        // 6.3.8.4 (2015/10/09) FileMap のコンストラクタ変更に伴う対応。
221                        // 6.3.9.0 (2015/11/06) helpMapの初期化を、initメソッドに変更する。
222//                      imgFileMap.init( imageDir , "/" + CNTX + imageDir , set );
223                        imgFileMap.init( imageDir , "/" + HybsSystem.getContextName() + imageDir , set );               // 6.9.9.3 (2018/09/25) JavaDoc エラー対応
224
225                        if( "NORMAL".equals( menuType ) ) {
226                                jspPrint( "<div class=\"forpos\" id=\"dummy\"></div>" + CR );
227                                if( ! useButton ){ // 4.2.1.0 (2008/04/26) ボタン時にはお気に入りを出さない
228                                        jspPrint( makeFavoriteMenu() );
229                                }
230                                jspPrint( makeMenu() );
231                        }
232                        else if( "GROUP".equals( menuType ) ) {
233                                jspPrint( makeGroupMenu() );
234                        }
235                //      else if( "CLASSIFY".equals( menuType ) ) {
236                //              jspPrint( makeClassifyMenu() );
237                //      }
238                        else if( "ONELEVEL".equals( menuType ) && selClassify != null ) {
239                                jspPrint( makeOneLevelMenu() );
240                        }
241                        // 5.2.3.0 (2010/12/01) NEXTGUI 追加
242                        else if( "NEXTGUI".equals( menuType ) ) {
243                                jspPrint( makeNextguiMenu() );
244                        }
245                        else if( "MATRIX".equals( menuType ) ) {
246                                jspPrint( makeMatrixMenu() );
247                        }
248                        else if( "MATRIX2".equals( menuType ) ) {       // 4.2.1.0 (2008/04/01) 大分類なし版追加
249                                jspPrint( makeMatrixMenu2() );
250                        }
251                        else if( "TILE".equals( menuType ) ) {          // 6.7.5.0 (2017/03/10) TILE表示追加
252                                jspPrint( makeTileMenu() );
253                        }
254                //      else {
255                //              jspPrint( "menuType が想定外です。menuType=[" + menuType + "]" );
256                //      }
257                }
258
259                return EVAL_PAGE ;              // ページの残りを評価する。
260        }
261
262        /**
263         * タグリブオブジェクトをリリースします。
264         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
265         *
266         * @og.rev 5.2.3.0 (2010/12/01) sideCountの初期値を -1(無制限)に変更
267         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
268         * @og.rev 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。
269         * @og.rev 6.3.8.4 (2015/10/09) topMenu 内でのHelp機能を廃止します。
270         * @og.rev 6.3.9.0 (2015/11/06) helpMapの初期化を、initメソッドに変更する。
271         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加(imageDir 属性追加)
272         * @og.rev 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
273         */
274        @Override
275        protected void release2() {
276                super.release2();
277                expand                          = true;
278                menuType                        = "NORMAL";
279                groups                          = null;
280                selClassify                     = null;
281//              multiSessionCheck       = HybsSystem.sysBool( "USE_MULTI_SESSION_CHECK" );
282                href                            = "menu.jsp";           // グループメニューの対象ソース名(href)を指定します。
283                imageOnly                       = false;                        // グループメニューに、 true:画像のみ / false:画像+ラベル を指定します
284                target                          = "MENU";                       // グループメニューの対象フレーム名(target)を指定します。
285                sideCount                       = -1;                           // 5.2.3.0 (2010/12/01) 表示対象となるメニューを横並びさせる数を指定します。
286                minCellCount            = 8;                            // 表形式メニューの1セルの最小行数を指定します。
287                maxCellCount            = 8;                            // 表形式メニューの1セルの最大行数を指定します。
288                mscKey                          = null;                         // MULTI_SESSION_CHECK 時のリンクに付加する情報
289                imgFileMap.clear();                                             // 6.3.9.0 (2015/11/06) helpMapの初期化を、initメソッドに変更する。
290                cache                           = true;                         // グループメニューのキャッシュを使用するかどうか指定します。
291                match                           = null;                         // 正判定(マッチする場合に、メニューに出す)条件を設定
292                unmatch                         = null;                         // 逆判定(マッチする場合に、メニューに出さない)条件を設定
293                imageDir                        = MENU_IMG;                     // 6.7.5.0 (2017/03/10) TILE表示追加
294                useButton                       = false;                        // ボタン形式のリンクを使用するか
295                buttonRequest           = false;                        // trueでボタンメニューの表示を行う
296                excludeButton           = false;                        // trueでボタンメニュー時でも強制的に従来のプルダウンにする。
297                inlineStyle                     = false;                        // trueの場合は標準画面(Lv3)にdisplay:inlineを付加
298                useDivOneLevel          = false;                        // 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。
299        }
300
301        /**
302         * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。
303         *
304         * @og.rev 3.5.6.5 (2004/08/09) GUIInfo の comments 属性を title にセットする。
305         * @og.rev 3.6.0.9 (2004/12/03) リアルアドレス設定時に、{&#064;XXXX}処理を追加
306         * @og.rev 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。
307         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
308         * @og.rev 4.0.0.0 (2007/10/31) 分類の廃止に伴い、全面見直し
309         * @og.rev 4.2.1.0 (2008/04/01) 小分類指定での表示対応(↑の対応での再実装漏れ)
310         * @og.rev 4.2.1.0 (2008/04/11) 小分類をexpandしない場合にはspanタグで囲う。
311         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
312         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止 , gamenId の変数設定
313         *
314         * @return  メニュー
315         * @og.rtnNotNull
316         */
317        private String makeMenu() {
318                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
319
320                final UserInfo userInfo = getUser();
321
322                // 4.0.0 (2005/01/31)
323
324                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
325//              String gamenId          ;                       // 画面ID
326                int menuNo = 11;
327                int kmokuNo = 0;
328
329                boolean isInFieldset    = false;                // 大分類の中か?
330                boolean isInClassify    = false;                // 小分類の中か?
331                boolean isHiddenMenu    = false;                // 隠しメニューが存在するか?        6.0.2.5 (2014/10/31) refactoring
332                boolean isClassHidden   = false;                // 分類隠しが存在するか?          6.0.2.5 (2014/10/31) refactoring
333                int level ;
334                int preLevel = 0;
335
336                for( int i=0; i<guiInfos.length; i++ ) {
337                        if( guiInfos[i].isRead() ) {            // 4.0.0 (2005/01/31)
338                                final String gamenId = guiInfos[i].getKey() ;
339
340//                              if( match   != null && !gamenId.matches( match  ) ) { continue; }
341//                              if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
342                                // 6.9.7.0 (2018/05/14) PMD
343                                if(             match  != null && !gamenId.matches( match )
344                                        || unmatch != null && gamenId.matches( unmatch ) ) { continue; }
345
346                                // 4.2.1.0 (2008/04/01)
347                                // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
348//                              if( selClassify != null ) {
349////                                    if( !selClassify.equals( guiInfos[i].getKey() ) && !selClassify.equals( guiInfos[i].getClassify() ) ) {
350//                                      if( !selClassify.equals( gamenId ) && !selClassify.equals( guiInfos[i].getClassify() ) ) {
351                                if( selClassify != null && !selClassify.equals( gamenId ) && !selClassify.equals( guiInfos[i].getClassify() ) ) {
352                                                continue; // 分類(classify) に含まれない
353//                                      }
354                                }
355
356                                // 処理すべき画面かのチェック
357                                final int guiFlg = guiCheck( guiInfos, i );
358                                if( guiFlg == 0 ) { continue; }
359
360                                level = guiInfos[i].getLevel();         // 4.0.0 (2005/01/31)
361
362                                // 隠しメニュー展開用
363                                if( preLevel >= 3 && level < 3 ) {
364                                        if( isHiddenMenu ) {                    // 6.0.2.5 (2014/10/31) refactoring
365                                                rtn.append( makeEllipses( menuNo,kmokuNo,3 ) );
366                                                kmokuNo++;
367                                        }
368                                        isHiddenMenu = false;                   // 6.0.2.5 (2014/10/31) refactoring
369                                }
370
371                                // 大分類(フィールドメニュー)
372                                if( level == 1 ) {
373                                        if( isInFieldset ) {
374                                                rtn.append( FIELD_OUT )
375                                                        .append( "</div>" );
376                                        }
377                                        isInFieldset = true;
378
379                                        // 隠しメニュー用
380                                        if( expand ) {
381                                                rtn.append( "<div class=\"expand1 " );
382
383                                                if( guiFlg == 1 ) {
384                                                        rtn.append( "unpopular ");
385                                                }
386
387                                                rtn.append( "\">" );
388                                        }
389                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) );           // 5.5.2.5 (2012/05/21) イメージアイコン対応
390
391                                        isInClassify = false;
392                                }
393                                // 小分類・直リンク
394                                else if( level == 2 ) {
395                                        menuNo++;
396                                        kmokuNo = 0;
397                                        if( expand ) {
398                                                rtn.append( "<div class=\"expand1 " );
399
400                                                // 隠しメニュー用
401                                                if( guiFlg == 1 ) {
402                                                        rtn.append( "unpopular " );
403                                                        isClassHidden = true;                   // 6.0.2.5 (2014/10/31) refactoring
404                                                }
405
406                                                // rtn.append( "\" id=\"menu" + menuNo + "\">" );
407                                                // 4.3.3.0 (2008/10/01) useButton=true時は表示しない
408                                                rtn.append( "\" id=\"menu" + menuNo + "\" ");
409                                                if( useButton ){
410                                                        rtn.append( "style=\"display:none\"");
411                                                }
412                                                rtn.append( '>');               // 6.0.2.5 (2014/10/31) char を append する。
413
414                                        }
415                                        else{   // 4.2.1.0 (2008/04/11)expandしない場合にはspan要素で囲ってnon-expandクラスを指定。
416                                                rtn.append( "<span class=\"non-expand\">" );
417                                        }
418
419                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) );           // 5.5.2.5 (2012/05/21) イメージアイコン対応
420                                        rtn.append( BR );
421                                        if( expand ) {
422                                                rtn.append( "</div>" );
423                                        }
424                                        else{   // 4.2.1.0 (2008/04/11)
425                                                rtn.append( "</span>");
426                                        }
427
428                                        isInClassify = true;
429                                }
430                                // 通常メニュー・隠しメニュー
431                                // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
432//                              else if( level >= 3 ) {
433//                                      if( isInClassify ) {
434                                else if( level >= 3 && isInClassify ) {
435                                                if( expand ) {
436                                                        rtn.append( "<div class=\"expand2 " );
437
438                                                        // 隠しメニュー用
439                                                        if( level == 4 ) {
440                                                                rtn.append( "unpopular " );
441                                                                isHiddenMenu = true;                    // 6.0.2.5 (2014/10/31) refactoring
442                                                        }
443
444                                                        // rtn.append( "\" id=\"menu" + menuNo + "_" + kmokuNo + "\">" );
445                                                        // 4.3.3.0 (2008/10/01) メニューを初期状態で開けるようにする
446                                                        // 6.0.2.5 (2014/10/31) char を append する。
447                                                        rtn.append( "\" id=\"menu" ).append( menuNo ).append( '_' ).append( kmokuNo ).append( "\" " );
448                                                        if( inlineStyle && level == 3 ) {
449                                                                rtn.append( " style=\"display:inline\"" );
450                                                        }
451                                                        rtn.append( '>' );              // 6.0.2.5 (2014/10/31) char を append する。
452                                                }
453                        //                      // 6.9.4.1 (2018/04/09) HYBS_BR 対応
454                        //                      if( "HYBS_BR".equals( guiInfos[i].getAddress() ) ) {
455                        //                              rtn.append( BR );
456                        //                      }
457                        //                      else {
458//                      //                      // 画面IDが"HYBS_BR"の時は処理しない
459//                      //                      if( !"HYBS_BR".equals( guiInfos[i].getKey() ) ) {
460                                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) );           // 5.5.2.5 (2012/05/21) イメージアイコン対応
461                        //                      }
462                                                rtn.append( BR );
463                                                if( expand ) {
464                                                        rtn.append( "</div>" );
465                                                }
466                                                kmokuNo++;
467//                                      }
468                                }
469
470                                rtn.append( CR );
471
472                                preLevel = level;
473                        }
474                }
475
476                // 終了処理
477                if( isHiddenMenu ) {                                                                            // 6.0.2.5 (2014/10/31) refactoring
478                        rtn.append( makeEllipses( menuNo,kmokuNo,3 ) );
479                }
480
481                if( isInFieldset ) {
482                        rtn.append( FIELD_OUT );
483                        rtn.append( "</div>" );
484                }
485
486                if( isClassHidden ) {                                                                           // 6.0.2.5 (2014/10/31) refactoring
487                        rtn.append( makeEllipses( menuNo,0,2 ) );
488                }
489
490                return rtn.toString();
491        }
492
493        /**
494         * TILEメニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。
495         *
496         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加
497         * @og.rev 6.9.4.0 (2018/04/02) HYBS_BR(ブレイク)の条件を緩める。
498         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止 , gamenId の変数設定
499         *
500         * @return  メニュー
501         * @og.rtnNotNull
502         */
503        private String makeTileMenu() {
504                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
505
506                final UserInfo userInfo = getUser();
507
508                // 4.0.0 (2005/01/31)
509
510                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
511//              String gamenId          ;                       // 画面ID
512                int menuNo = 11;
513                int kmokuNo = 0;
514
515                boolean isInFieldset    = false;                // 大分類の中か?
516                boolean isInClassify    = false;                // 小分類の中か?
517                boolean isHiddenMenu    = false;                // 隠しメニューが存在するか?        6.0.2.5 (2014/10/31) refactoring
518                boolean isClassHidden   = false;                // 分類隠しが存在するか?          6.0.2.5 (2014/10/31) refactoring
519                int level ;
520                int preLevel = 0;
521
522                String hybsBR = "";                                             // 6.7.5.0 (2017/03/10)
523                for( int i=0; i<guiInfos.length; i++ ) {
524                        if( guiInfos[i].isRead() ) {            // 4.0.0 (2005/01/31)
525                                final String gamenId = guiInfos[i].getKey() ;
526                                if( match   != null && !gamenId.matches( match  ) ) { continue; }
527                                if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
528
529                                // 4.2.1.0 (2008/04/01)
530                                // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
531//                              if( selClassify != null ) {
532//                                      if( !selClassify.equals( gamenId ) && !selClassify.equals( guiInfos[i].getClassify() ) ) {
533                                if( selClassify != null && !selClassify.equals( gamenId ) && !selClassify.equals( guiInfos[i].getClassify() ) ) {
534                                                continue; // 分類(classify) に含まれない
535//                                      }
536                                }
537
538                                // 6.9.4.0 (2018/04/02) HYBS_BR(ブレイク)の条件を緩める。
539                                if( isInFieldset && isInClassify && "HYBS_BR".equals( guiInfos[i].getAddress() ) ) {            // 6.7.5.0 (2017/03/10)
540//                              if( "HYBS_BR".equals( gamenId ) ) {                                                                             // 6.9.4.0 (2018/04/02)
541                                        hybsBR = "</tr><tr>" ;
542                                }
543
544                                // 処理すべき画面かのチェック
545                                final int guiFlg = guiCheck( guiInfos, i );
546                                if( guiFlg == 0 ) { continue; }
547
548                                level = guiInfos[i].getLevel();         // 4.0.0 (2005/01/31)
549
550                                // 隠しメニュー展開用
551                                if( preLevel >= 3 && level < 3 ) {
552                                        if( isHiddenMenu ) {                    // 6.0.2.5 (2014/10/31) refactoring
553                                                rtn.append( makeEllipses( menuNo,kmokuNo,3 ) );
554                                                kmokuNo++;
555                                        }
556                                        isHiddenMenu = false;                   // 6.0.2.5 (2014/10/31) refactoring
557                                }
558
559                                // 大分類(フィールドメニュー)
560                                if( level == 1 ) {
561                                        if( isInFieldset ) {
562                                                rtn.append( "</td></tr></table>" )              // 6.7.5.0 (2017/03/10)
563                                                        .append( FIELD_OUT )
564                                                        .append( "</div>" );
565                                        }
566                                        isInFieldset = true;
567
568                                        // 隠しメニュー用
569                                        if( expand ) {
570                                                rtn.append( "<div class=\"expand1 " );
571
572                                                if( guiFlg == 1 ) {
573                                                        rtn.append( "unpopular ");
574                                                }
575                                                rtn.append( "\">" );
576                                        }
577                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) )            // 5.5.2.5 (2012/05/21) イメージアイコン対応
578                                                .append( "<table><tr>" );               // 6.7.5.0 (2017/03/10)
579
580                                        isInClassify = false;
581                                }
582                                // 小分類・直リンク
583                                else if( level == 2 ) {
584                                        menuNo++;
585                                        kmokuNo = 0;
586                                        if( expand ) {
587                                                if( isInFieldset ) {            // 6.7.5.0 (2017/03/10)
588                                                        if( isInClassify ) {
589                                                                rtn.append( "</td>" ).append( hybsBR ).append( "<td>" );
590                                                                hybsBR = "";
591                                                        }
592                                                        else {
593                                                                rtn.append( "<td>" );
594                                                        }
595                                                }
596                                                rtn.append( "<div class=\"expand1 " );
597
598                                                // 隠しメニュー用
599                                                if( guiFlg == 1 ) {
600                                                        rtn.append( "unpopular " );
601                                                        isClassHidden = true;                   // 6.0.2.5 (2014/10/31) refactoring
602                                                }
603
604                                                // rtn.append( "\" id=\"menu" + menuNo + "\">" );
605                                                // 4.3.3.0 (2008/10/01) useButton=true時は表示しない
606                                                rtn.append( "\" id=\"menu" + menuNo + "\" ");
607                                                if( useButton ){
608                                                        rtn.append( "style=\"display:none\"");
609                                                }
610                                                rtn.append( '>');               // 6.0.2.5 (2014/10/31) char を append する。
611                                        }
612                                        else{   // 4.2.1.0 (2008/04/11)expandしない場合にはspan要素で囲ってnon-expandクラスを指定。
613                                                rtn.append( "<span class=\"non-expand\">" );
614                                        }
615
616                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-6 ) );                      // 6.7.5.0 (2017/03/10) TILE表示
617                                        rtn.append( BR );
618                                        if( expand ) {
619                                                rtn.append( "</div>" );
620                                        }
621                                        else{   // 4.2.1.0 (2008/04/11)
622                                                rtn.append( "</span>");
623                                        }
624
625                                        isInClassify = true;
626                                }
627                                // 通常メニュー・隠しメニュー
628                                // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
629//                              else if( level >= 3 ) {
630//                                      if( isInClassify ) {
631                                else if( level >= 3 && isInClassify ) {
632                                                if( expand ) {
633                                                        rtn.append( "<div class=\"expand2 " );
634
635                                                        // 隠しメニュー用
636                                                        if( level == 4 ) {
637                                                                rtn.append( "unpopular " );
638                                                                isHiddenMenu = true;                    // 6.0.2.5 (2014/10/31) refactoring
639                                                        }
640
641                                                        // rtn.append( "\" id=\"menu" + menuNo + "_" + kmokuNo + "\">" );
642                                                        // 4.3.3.0 (2008/10/01) メニューを初期状態で開けるようにする
643                                                        // 6.0.2.5 (2014/10/31) char を append する。
644                                                        rtn.append( "\" id=\"menu" ).append( menuNo ).append( '_' ).append( kmokuNo ).append( "\" " );
645                                                        if( inlineStyle && level == 3 ) {
646                                                                rtn.append( " style=\"display:inline\"" );
647                                                        }
648                                                        rtn.append( '>' );              // 6.0.2.5 (2014/10/31) char を append する。
649                                                }
650
651                        //                      // 6.9.4.1 (2018/04/09) HYBS_BR 対応
652                        //                      if( "HYBS_BR".equals( guiInfos[i].getAddress() ) ) {                                    // 6.9.4.1 (2018/04/09) HYBS_BR は、アドレスに設定
653                        //                              rtn.append( BR );
654                        //                      }
655                        //                      else {
656//                      //                      // 画面IDが"HYBS_BR"の時は処理しない
657//                      //                      if( !"HYBS_BR".equals( gamenId ) ) {
658                                                        rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) );           // 5.5.2.5 (2012/05/21) イメージアイコン対応
659                        //                      }
660                                                rtn.append( BR );
661                                                if( expand ) {
662                                                        rtn.append( "</div>" );
663                                                }
664                                                kmokuNo++;
665//                                      }
666                                }
667
668                                rtn.append( CR );
669                                preLevel = level;
670                        }
671                }
672
673                // 終了処理
674                if( isHiddenMenu ) {                                                                            // 6.0.2.5 (2014/10/31) refactoring
675                        rtn.append( makeEllipses( menuNo,kmokuNo,3 ) );
676                }
677
678                if( isInFieldset ) {
679                        rtn.append( "</td></tr></table>" )                                              // 6.7.5.0 (2017/03/10)
680                                .append( FIELD_OUT )
681                                .append( "</div>" );
682                }
683
684                if( isClassHidden ) {                                                                           // 6.0.2.5 (2014/10/31) refactoring
685                        rtn.append( makeEllipses( menuNo,0,2 ) );
686                }
687
688                return rtn.toString();
689        }
690
691        /**
692         * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。
693         *
694         * @og.rev 4.0.0.0 (2005/01/31) 個人別のお気に入りメニューを作成します。
695         * @og.rev 4.0.0.0 (2007/10/31) 分類項目の廃止
696         * @og.rev 4.1.1.0 (2008/02/05) お気に入り情報はGEA09から取得するように変更
697         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
698         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
699         * @og.rev 6.9.9.1 (2018/08/27) お気に入り編集メニュー(GE0014→GFX000)変更。
700         *
701         * @return  個人別のお気に入りメニュー
702         * @og.rtnNotNull
703         */
704        private String makeFavoriteMenu() {
705
706                final UserInfo userInfo = getUser();
707                final Map<String,FavoriteGUIData> favoriteMap = userInfo.getFavoriteMap();
708
709                if( favoriteMap.isEmpty() ) { return ""; }
710
711                final ResourceManager resource = getResource(); // リソース参照
712                final String    largeClassify    = resource.getLabelData( "FAVORITE_MENU" ).getShortLabel(); // お気に入り
713                String  lastClassify     = "";                          // 前方画面の分類
714                int             menuNo                   = 99999;
715                int             kmokuNo                  = 0;
716
717                // fieldSetタグ、お気に入り編集画面リンクの出力
718//              final GUIInfo editFavorite = userInfo.getGUIInfo( "GE0014" );
719                final GUIInfo editFavorite = userInfo.getGUIInfo( "GFX000" );           // 6.9.9.1 (2018/08/27)
720
721                final OgBuilder rtn = new OgBuilder()
722                        .append( "<div class=\"expand1\"> "
723                                        , makeTagMenuString( null,null,largeClassify,null,1 )
724                                        , makeTagMenu( editFavorite,resource.getLabelData( "EDIT" ).getShortLabel(),2 )         // 5.5.2.5 (2012/05/21) イメージアイコン対応
725                                        , BR );
726
727                String thisClassify = null;
728//              String gamenId = null;
729                FavoriteGUIData favoriteGui = null;
730                // 4.3.4.4 (2009/01/01) findBugs警告対応
731                for( final Map.Entry<String, FavoriteGUIData> entry : favoriteMap.entrySet() ) {
732                        final String gamenId     = entry.getKey();
733                        favoriteGui = entry.getValue();
734                        final GUIInfo guiInfo = userInfo.getGUIInfo( gamenId );
735
736                        if( match   != null && !gamenId.matches( match  ) ) { continue; }
737                        if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
738
739                        thisClassify = favoriteGui.getClassify();
740                        if( !lastClassify.equals( thisClassify ) ) {
741                                menuNo++;
742                                kmokuNo = 0;
743                                rtn.appendIf( expand , "<div class=\"expand1\" id=\"menu" , String.valueOf( menuNo ) , "\">" )
744                                        .append( makeTagMenuString( null,null,thisClassify,thisClassify,2 ) )
745                                        .append( BR )
746                                        .appendIfCR( expand , "</div>" );
747                                lastClassify = thisClassify;
748                        }
749
750                        final String linkLabel = favoriteGui.getName();
751                        rtn.appendIf( expand
752                                                        , "<div class=\"expand2\" id=\"menu"
753                                                        , String.valueOf( menuNo ) , "_" , String.valueOf( kmokuNo ) , "\">" )
754                                .append( makeTagMenu( guiInfo,linkLabel,3 ) )           // 5.5.2.5 (2012/05/21) イメージアイコン対応
755                                .append( BR )
756                                .appendIfCR( expand , "</div>" );
757                        kmokuNo++;
758                }
759                return rtn.append( FIELD_OUT , "</div>" ).toString();
760        }
761
762        /**
763         * 折りたたみメニューで、非標準メニューの 表示に使う、"←・・・→" を作成します。
764         *
765         * @param       menuNo  階層番号
766         * @param       kmokuNo 階層項目番号
767         * @param       type    タイプ(1,2限定)
768         *
769         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
770         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
771         *
772         * @return  メニュー
773         * @og.rtnNotNull
774         */
775        private String makeEllipses( final int menuNo,final int kmokuNo,final int type ) {
776                final int tmpType = type-1; // 超暫定対応 4.0.0.0 (2007/10/31)
777                final String kmkNo = ( tmpType == 1 ) ? "" : "_" + kmokuNo ;
778
779                // 4.3.3.0 (2008/10/01) inlineStyleがtrueの場合は←・・・→をinlineで表示する
780                return new OgBuilder()
781                                .append( "<div class=\"expand"          , String.valueOf( tmpType ) )
782                                .append( " ellipses\" id=\"menu"        , String.valueOf( menuNo ) , kmkNo )
783                                .append( "\" " )
784                                .appendIf( inlineStyle , "style=\"display:inline\" " )                          // if
785                                .appendCR( ">" , makeTagMenuString( null,null,"←・・・→",null,type )
786                                                        , BR , "</div>" )
787                                .toString();
788        }
789
790        /**
791         * menuType="GROUP" 時に作成するグループメニュー。
792         *
793         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
794         * @og.rev 4.0.0.0 (2007/10/05) グループのコードリソースが存在しない場合
795         * @og.rev 4.2.2.0 (2008/05/14) buttonRequestがtrueの場合はTOPへのリンクを表示しない
796         * @og.rev 4.2.2.0 (2008/05/15) グループ絞込解除(GUI_ALL)の表示文字にラベルリソースを使う。
797         * @og.rev 5.0.0.3 (2009/09/22) グループが1件の場合に表示されないバグを修正
798         * @og.rev 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正
799         * @og.rev 5.9.7.1 (2016/04/06) GROPUにgroupsが効くようにする
800         * @og.rev 6.4.5.0 (2016/04/08) GROPUにgroupsが効くようにする(効率化、ループから出す)
801         * @og.rev 6.8.3.1 (2017/12/01) GROPUの表示順を、コードリソースの並び順にします。
802         *
803         * @return  メニュー
804         */
805        private String makeGroupMenu() {
806
807                // 画面のグループメニューのキャッシュを取得します。
808                String groupMenu ;
809                final String cacheKey  = HybsSystem.GUI_GR_MENU_CACHE_KEY + href + target ;
810                if( cache ) {
811                        groupMenu = (String)getSessionAttribute( cacheKey );
812                        if( groupMenu != null ) { return groupMenu; }   // キャッシュを返します。
813                }
814                else {
815                        removeSessionAttribute( cacheKey );
816                }
817
818                final UserInfo userInfo = getUser();
819
820                // 6.8.3.1 (2017/12/01) GROPUの表示順を、コードリソースの並び順にします。
821                final CodeData groupCode = getResource().getCodeData( "GROUPS" ) ;
822                final Set<String> groupSet = groupCode == null ? new LinkedHashSet<>()                          // 要素がセットに挿入された順序です(挿入順)。
823                                                                                                           : new TreeSet<>( (v1,v2) -> groupCode.getAddress( v1 ) - groupCode.getAddress( v2 ) );       // コードリソースの並び順
824
825                // そのユーザーで使用できる画面をすべてピックアップします。
826                // その上で、読取可能なメニューを含むグループを順番に Set にセットしていきます。
827                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
828
829                for( int i=0; i<guiInfos.length; i++ ) {
830                        if( guiInfos[i].isRead() ) {
831                                final String gamenId = guiInfos[i].getKey() ;
832                                if( match   != null && !gamenId.matches( match  ) ) { continue; }
833                                if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
834                                // 6.4.5.0 (2016/04/08) 元のループを、拡張for文に変更しただけ。
835                                final String[] guiGroups = StringUtil.csv2Array( guiInfos[i].getGroups() );
836                                for( final String grp : guiGroups ) { groupSet.add( grp ); }
837                        }
838                }
839
840                // 6.4.5.0 (2016/04/08) groupsの削除は、後でまとめて行う。
841                if( groups != null ) {
842                        for( final String grp : groups ) { groupSet.remove( grp ); }
843                }
844
845                // 5.0.0.3 (2009/09/22)
846                // 6.1.1.0 (2015/01/17) refactoring 。size()判定をisEmpty() にすると同時に、if...else を反転する。
847                if( groupSet.isEmpty() ) {
848                        groupMenu = "";
849                }
850                else {
851                        int sideTmpCnt = 1;
852                        final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
853                        rtn.append( "<tr>" );
854
855                        final String allMenu = getLabel( "ALL_MENU" ); // 4.2.2.0 (2008/05/15) ALLはラベルリソース使うように変更
856                        rtn.append( makeTagMenuString( href,target,allMenu,"GUI_ALL",-1 ) );
857                        if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); }
858                        sideTmpCnt++ ;
859
860                        final Iterator<String> ite = groupSet.iterator() ;
861                        if( groupCode != null ) {
862                                while( ite.hasNext() ) {
863                                        final String group = ite.next();
864                                        final int cdAdrs = groupCode.getAddress( group ) ;
865                                        // 4.0.0.0 (2007/10/05) グループのコードリソースが存在しない場合
866                                        String groupLabel = "";
867                                        if( cdAdrs >= 0 ) { groupLabel = groupCode.getLongLabel( cdAdrs ); }
868
869                                        // 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正
870                                        if( groupLabel.isEmpty() && group != null && group.length() > 0 ) {
871                                                groupLabel = group;
872                                        }
873
874                                        final String src = XHTMLTag.addUrlEncode( href,"group=" + group );
875                                        rtn.append( makeTagMenuString( src,target,groupLabel,group,-1 ) );
876                                        if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); }
877                                        sideTmpCnt++ ;
878                                }
879                        }
880
881                        if( ! imageOnly && ! buttonRequest ) { // 4.2.2.0 (2008/05/14) ボタンメニュー時はトップメニュー
882                                rtn.append( makeTagMenuString( JSP + "/index.jsp",target,"Top","GUI_TOP",-1 ) );
883                        }
884                        rtn.append( "</tr>" );
885
886                        // 画面のグループメニューのキャッシュをセットします。
887                        groupMenu = rtn.toString() ;
888                }
889
890                if( cache ) {
891                        setSessionAttribute( cacheKey,groupMenu );
892                }
893
894                return groupMenu;
895        }
896
897        /**
898         * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。
899         *
900         * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。
901         * @og.rev 4.0.0.0 (2007/10/31) 一旦廃止
902         * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応
903         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
904         * @og.rev 5.5.6.0 (2013/01/07) useDivOneLevelの折り返し方法変更
905         * @og.rev 6.2.6.0 (2015/06/19) QUERYに表示される1行メニュは、説明なしの画面名称のみ表示する。
906         * @og.rev 5.9.6.1 (2016/03/04) フレーム対応
907         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止 , gamenId の変数設定
908         *
909         * @return  メニュー
910         * @og.rtnNotNull
911         */
912        private String makeOneLevelMenu() {
913                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
914
915                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
916                if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); }
917
918                final UserInfo userInfo = getUser();
919
920                // 4.0.0 (2005/01/31)
921                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
922//              String gamenId  ;                       // 画面ID
923                int sideTmpCnt = 1;
924
925                boolean isInClassify = false;
926
927                for( int i=0; i<guiInfos.length; i++ ) {
928                        final String gamenId = guiInfos[i].getKey() ;                           // 6.9.4.1 (2018/04/09)
929                        final int level = guiInfos[i].getLevel();
930
931                        if( level == 2 ) {
932//                              isInClassify = selClassify.equals( guiInfos[i].getKey() );
933                                // 6.9.8.0 (2018/05/28) FindBugs:コンストラクタで初期化されていないフィールドを null チェックなしで null 値を利用している
934                                // makeOneLevelMenu() メソッドが呼ばれる条件に、selClassify != null があるのだが。
935//                              isInClassify = selClassify.equals( gamenId );
936                                isInClassify = gamenId.equals( selClassify );                   // 6.9.8.0 (2018/05/28) とりあえず比較方法を入れ替えます。
937                        }
938
939                        if( guiInfos[i].isRead() && level == 3 && isInClassify ) {              // 4.0.0 (2005/01/31)
940//                              gamenId = guiInfos[i].getKey() ;
941                                if( match   != null && !gamenId.matches( match  ) ) { continue; }
942                                if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
943
944                                final String guiLabel = guiInfos[i].getLabel();         // 6.2.6.0 (2015/06/19) 画面名称(title無)
945
946                                final String thisGamenId = getGUIInfoAttri( "KEY" );
947                                if( gamenId.equals( thisGamenId ) ) {
948                                        // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
949                                        if( useDivOneLevel ) {
950                                                rtn.append("<span class=\"design-onelevel\">").append( guiLabel ).append( "</span>" );
951                                        }
952                                        else {
953                                                rtn.append( '[' ).append( guiLabel ).append( "] " );            // 6.0.2.5 (2014/10/31) char を append する。
954                                        }
955                                }
956                                else {
957                                        // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
958                                        if( useDivOneLevel ) {
959                                                // 5.5.2.5 (2012/05/21) イメージアイコン対応
960                                                rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfos[i],guiLabel,-5 ) ).append( "</span>" ); // 5.9.6.1 
961                                        }
962                                        else {
963                                                rtn.append( makeTagMenu( guiInfos[i],guiLabel,-2 ) );           // 5.5.2.5 (2012/05/21) イメージアイコン対応
964                                        }
965                                }
966
967                                if( sideCount > 0 ) {
968                                        // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。
969                                        if( sideTmpCnt / sideCount >= maxCellCount ) {
970                                                //                                              rtn.append("・・・");
971                                                break;
972                                        }
973                                        // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。
974                                        // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
975                                        if( sideTmpCnt % sideCount == 0 ) {
976                                                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
977                                                // 6.0.2.5 (2014/10/31) refactoring: findBugs対応。分岐もコメントアウトする。
978                                //              if( useDivOneLevel ) {
979                                //                      rtn.append( BR ); // 5.6.0.0 (2013/01/07) BRにする(条件分岐は残しておく)
980                                //                      // rtn.append("<span style=\"clear: both;\" />");
981                                //              }
982                                //              else {
983                                                        rtn.append( BR );
984                                //              }
985                                        }
986                                        sideTmpCnt++ ;
987                                }
988                        }
989                }
990
991                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
992                if( useDivOneLevel ) {
993                        rtn.append("<span style=\"clear: both;\" ><!-- --></span></div>");      // 5.9.1.2 (2015/10/23)
994                }
995
996                return rtn.toString();
997        }
998
999        /**
1000         * 既存のページの次にアクセスされる画面郡のリンクを作成します。
1001         *
1002         * これは、現時点の画面に対して、次にアクセスされる画面の候補を
1003         * ピックアップしておく機能です。
1004         * 実際には、過去にアクセスされた結果より取得しています。
1005         * これは、ONELEVEL と置き換えることになる機能です。
1006         *
1007         * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加
1008         * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応
1009         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
1010         * @og.rev 6.2.6.0 (2015/06/19) QUERYに表示される1行メニュは、説明なしの画面名称のみ表示する。
1011         * @og.rev 6.3.1.0 (2015/06/28) useDivOneLevel がうまく動かなかったので、修正。
1012         * @og.rev 5.9.6.1 (2016/03/04) フレーム対応
1013         *
1014         * @return  メニュー
1015         * @og.rtnNotNull
1016         */
1017        private String makeNextguiMenu() {
1018                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
1019
1020                // 今、アクセスしている画面
1021                final GUIInfo thisGamen = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
1022                final String[] nextGuis = thisGamen.getNextGuiArray();
1023
1024                final UserInfo userInfo = getUser();
1025                int sideTmpCnt = 1;
1026
1027                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
1028                if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); }
1029
1030                GUIInfo guiInfo = null;
1031                for( int i=0; i<nextGuis.length; i++ ) {
1032                        guiInfo = userInfo.getGUIInfo( nextGuis[i] );
1033                        if( guiInfo == null ) { continue; }             // 存在しない、またはアクセス拒否の場合は、無視する。
1034
1035                        if( guiInfo.isRead() ) {
1036                                final String guiLabel = guiInfo.getLabel();             // 6.2.6.0 (2015/06/19) 画面名称(title無)
1037
1038                                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
1039                                if( useDivOneLevel ) {
1040                                        // 5.5.2.5 (2012/05/21) イメージアイコン対応
1041                                        rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfo,guiLabel,-5 ) ).append( "</span>" );
1042                                }
1043                                else {
1044                                        rtn.append( makeTagMenu( guiInfo,guiLabel,-2 ) );               // 5.5.2.5 (2012/05/21) イメージアイコン対応
1045                                }
1046
1047                                if( sideCount > 0 ) {
1048                                        // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。
1049                                        if( sideTmpCnt / sideCount >= maxCellCount ) {
1050                                                break;
1051                                        }
1052                                        // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。
1053                                        // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
1054                                        if( sideTmpCnt % sideCount == 0 ) {
1055                                                // 6.3.1.0 (2015/06/28) useDivOneLevel がうまく動かなかったので、修正。
1056                        //                      if( useDivOneLevel ) {
1057                        //                              rtn.append("<span style=\"clear: both;\" />");
1058                        //                      }
1059                        //                      else {
1060                                                        rtn.append( BR );
1061                        //                      }
1062                                        }
1063                                        sideTmpCnt++ ;
1064                                }
1065                        }
1066                }
1067
1068                // 5.5.2.3 (2012/05/15) useDivOneLevel 対応
1069                // 6.3.1.0 (2015/06/28) useDivOneLevel がうまく動かなかったので、修正。
1070                if( useDivOneLevel ) {
1071                        rtn.append("<span style=\"clear: both;\" /></div>");
1072                }
1073
1074                return rtn.toString();
1075        }
1076
1077        /**
1078         * メニューを表示する為のHTMLを作成します(マトリクスメニュー)。
1079         *
1080         * 分類まとめ、クラス色指定、最小行数設定、最大行数設定の機能があります。
1081         * 《分類まとめ》 最大行数設定(maxCellCount)に達したセルは、一つ右に新たにセルを作成
1082         * します。このとき、ヘッダーの CLASSIFY を同じにして、colspan でまとめます。
1083         * 《クラス色指定》ヘッダー毎に 順次 CLR0,CLR1,・・・・ というクラス属性を付与します。
1084         * ヘッダーには、MENU_H も出力されています。CLR0 は、大分類ごとに加算されていきますので、
1085         * 繰り返して同じ色を指定する場合は、CSSファイルでまとめて指定してください。
1086         * 《最小行数設定》minCellCount 属性を指定することで、1セルに含まれる最小行数を指定できます。
1087         * これは、セルに入れる &lt;br /&gt; の個数を指定することと同じです。
1088         * 《最大行数設定》maxCellCount 属性を指定することで、1セルに含まれる最大行数を指定できます。
1089         * 分類まとめでも説明しましたように、最大値をオーバーすると次のセルから書き始めます。
1090         *
1091         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
1092         * @og.rev 4.0.0.0 (2007/10/05) 分類のコードリソースが存在しない場合
1093         * @og.rev 5.2.3.0 (2010/12/01) sideCount対応
1094         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
1095         * @og.rev 5.5.5.3 (2012/08/17) th,tdにヘッダの画面IDをクラスとして出力
1096         * @og.rev 6.8.2.3 (2017/11/10) minCellCountの数が、一つ足りない事の修正
1097         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止 , gamenId の変数設定
1098         *
1099         * @return  マトリクスメニュー
1100         * @og.rtnNotNull
1101         */
1102        private String makeMatrixMenu() {
1103                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
1104
1105                final UserInfo userInfo = getUser();
1106
1107                // 4.0.0 (2005/01/31)
1108                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
1109//              String gamenId          ;                       // 画面ID
1110                String bkClassifyKey    = null;         // 分類コード(旧)
1111                String bkClassifyName   = null;         // 分類名称(旧)
1112                int        cellColorCnt = 0;            // MENU_H に 追加する CLR クラス属性の連番
1113
1114                String headGuikey = "";                         //  5.5.5.3 (2012/08/17) ヘッダのgamenId
1115
1116                final StringBuilder rtnH = new StringBuilder( BUFFER_LARGE );
1117                final StringBuilder rtnB = new StringBuilder( BUFFER_LARGE );
1118
1119                int level ;
1120                int preLevel = 0;
1121
1122                int lineTmpCnt = 0;                             // セル中の行カウント
1123                int cellTmpCnt = 0;                             // 1つの分類中のセルカウント
1124                int cellTmpAllCnt = 0;                  // 5.2.3.0 (2010/12/01) 該当行のセルカウント
1125
1126                boolean isInClassify  = false;  // 分類の中か?
1127                boolean isChangeLevel = false;  // 直リンク用(無理やり通常画面の階層として扱うので)
1128                boolean isDummyMENU_S = false;  // 5.2.3.0 (2010/12/01) sideCountブレーク時の大分類領域の出力可否
1129
1130                for( int i=0; i<guiInfos.length; i++ ) {
1131                        if( guiInfos[i].isRead() ) {            // 4.0.0 (2005/01/31)
1132                                final String gamenId = guiInfos[i].getKey() ;
1133                                if( match   != null && !gamenId.matches( match  ) ) { continue; }
1134                                if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
1135
1136                                // 処理すべき画面かのチェック
1137                                final int guiFlg = guiCheck( guiInfos, i );
1138                                if( guiFlg == 0 ) { continue; }
1139
1140                                level = guiInfos[i].getLevel();         // 4.0.0 (2005/01/31)
1141
1142                                // 大分類が来るまでは処理しない
1143                                if( level > 1 && rtnH == null ) { continue; }
1144
1145                                // 直リンクの場合、無理やり通常画面に変換
1146                                if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) {
1147                                        level = 3;
1148                                        if( !isChangeLevel ) {
1149                                                isChangeLevel = true;
1150                                                isInClassify = false;
1151                                        }
1152                                }
1153                                else {
1154                                        isChangeLevel = false;
1155                                }
1156
1157                                // 分類のブレイク処理
1158                                if( preLevel >= 3 && level < 3 || !isInClassify ) {                                                             // 6.9.7.0 (2018/05/14) PMD Useless parentheses.
1159                                        if(  lineTmpCnt != 0 ) {
1160                                                for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }             // 6.8.2.3 (2017/11/10)
1161                                                rtnB.append( "</td>" ).append( CR );
1162                                        }
1163
1164                                        if( bkClassifyKey != null ) {
1165                                                rtnH.append( "<th colspan=\"" ).append( cellTmpCnt ).append( "\" class=\"MENU_H CLR" )
1166                                                        .append( cellColorCnt ).append( ' ' ).append( headGuikey ).append( "\">" ); // 5.5.5.3 (2012/08/17)
1167                                                if( "_SPACE".equals( bkClassifyKey ) ) {
1168                                                        rtnH.append( ' ' );             // 6.0.2.5 (2014/10/31) char を append する。
1169                                                }
1170                                                else {
1171                                                        rtnH.append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) );
1172                                                }
1173                                                rtnH.append( "</th>" );
1174
1175                                                // 5.2.3.0 (2010/12/01) sideCount によるセルの改行
1176                                                cellTmpAllCnt += cellTmpCnt;
1177                                                if( sideCount > 0 && cellTmpAllCnt >= sideCount ) {
1178                                                        rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" );
1179
1180                                                        rtnH.setLength(0);              // 6.1.0.0 (2014/12/26) refactoring
1181                                                        rtnB.setLength(0);              // 6.1.0.0 (2014/12/26) refactoring
1182                                                        cellTmpAllCnt = 0;
1183                                                        isDummyMENU_S = true;   // 出力予約
1184                                                }
1185                                        }
1186
1187                                        bkClassifyKey = null;
1188                                        isInClassify = false;
1189                                        lineTmpCnt = 0;
1190                                        cellTmpCnt = 0;
1191                                }
1192
1193                                // 大分類(フィールドメニュー)
1194                                if( level == 1 ) {
1195                                        headGuikey = gamenId; // 5.5.5.3 (2012/08/17)
1196                                        if( preLevel > 0 ) {
1197                                                cellColorCnt++ ;
1198                                                rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" );
1199                                        }
1200
1201                                        rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S "+ headGuikey +"\">" )        // 5.5.5.3 (2012/08/17)
1202                                                .append( makeTagMenuString( null,null,guiInfos[i].getName(),gamenId,-3 ) )
1203                                                .append( "</td>" ).append( CR );
1204
1205                                        rtnH.setLength(0);              // 6.1.0.0 (2014/12/26) refactoring
1206                                        rtnB.setLength(0);              // 6.1.0.0 (2014/12/26) refactoring
1207                                        cellTmpAllCnt = 0;              // 5.2.3.0 (2010/12/01)
1208                                        isDummyMENU_S = false;  // 5.2.3.0 (2010/12/01) 出力予約解除
1209                                }
1210                                // 分類(直リンクの場合は、level=3で処理)
1211                                else if( level == 2 ) {
1212                                        isInClassify = true;
1213//                                      bkClassifyKey = guiInfos[i].getKey();
1214                                        bkClassifyKey = gamenId;                                                // 6.9.4.1 (2018/04/09)
1215                                        bkClassifyName = guiInfos[i].getName();
1216                                }
1217                                // 通常メニュー・隠しメニュー
1218                                else if( level >= 3 ) {
1219
1220                                        // 元のMENU_Sに戻り、rowspan を書き換える・・・のが邪魔くさいので、td のみ出力しておく。
1221                                        // 5.2.3.0 (2010/12/01) sideCount によるセルの改行
1222                                        if( isDummyMENU_S ) {
1223                                                rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S " )
1224                                                        .append( headGuikey ).append( "\"></td>" )      // 5.5.5.3 (2012/08/17)
1225                                                        .append( CR );
1226                                                isDummyMENU_S = false;          // 出力予約解除
1227                                        }
1228
1229                                        // 画面ID="HYBS_BR"の場合は、セルを変える。
1230//                                      if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) {
1231                                        if( "HYBS_BR".equals( guiInfos[i].getAddress() ) ) {                                    // 6.9.4.1 (2018/04/09) HYBS_BR は、アドレスに設定
1232                                                if( lineTmpCnt != 0 ) {
1233                                                        for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }             // 6.8.2.3 (2017/11/10)
1234                                                        lineTmpCnt = 0;
1235                                                }
1236                                        }
1237                                        // 通常画面
1238                                        else {
1239                                                if( lineTmpCnt == 0 ) {
1240                                                        rtnB.append( "<td class=\"MENU_B " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17)
1241                                                        cellTmpCnt++;
1242                                                }
1243
1244                                                rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-3 ) );             // 5.5.2.5 (2012/05/21) イメージアイコン対応
1245                                                lineTmpCnt++;
1246
1247                                                if( lineTmpCnt >= maxCellCount ) {
1248                                                        rtnB.append( "</td>" );
1249                                                        lineTmpCnt = 0;
1250                                                }
1251                                                else {
1252                                                        rtnB.append( BR );
1253                                                }
1254
1255                                                // 分類の中に入っていない通常画面
1256                                                if( !isInClassify ) {
1257                                                        bkClassifyKey = "_SPACE";
1258                                                        isInClassify = true;
1259                                                }
1260                                        }
1261                                }
1262
1263                                preLevel = level;
1264                        }
1265
1266                }
1267
1268                // 終了処理
1269                for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }             // 6.8.2.3 (2017/11/10)
1270                rtnB.append( "</td>" ).append( CR );
1271
1272                if( bkClassifyKey != null ) {
1273                        rtnH.append( "<th colspan=\"" ).append( cellTmpCnt )
1274                                .append( "\" class=\"MENU_H CLR" ) .append(  cellColorCnt )
1275                                .append( ' ' ).append(  headGuikey ).append( "\">" )                    // 5.5.5.3 (2012/08/17)
1276                                .append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) )
1277                                .append( "</th>" );
1278                }
1279
1280                rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" );
1281
1282                return rtn.toString();
1283        }
1284
1285        /**
1286         * メニューを表示する為のHTMLを作成します(マトリクスメニュー2)。
1287         *
1288         * マトリクスメニューをベースとした特別バージョンです。
1289         * 通常のマトリクスメニューからの変更点は以下の通りです。
1290         * ①大分類が表示されない
1291         *   ⇒ 変わりに、1行に表示されているセル数がsideCountで指定した数を超えた場合に
1292         *      自動的に改行されます。
1293         * ②画面リンクのターゲット
1294         *   ⇒ 自分自身のフレームに対してリンク先を表示します。
1295         *      リンク先は、通常メニュー構成ですが左メニューには該当する小分類の画面しか表示されません。
1296         * ③小分類でのリンク
1297         *   ⇒ 小分類をクリックした際に、通常のメニュー構成画面にリンクします。
1298         *      但し、②と同様に左メニューには該当する小分類の画面しか表示されません。
1299         *
1300         * @og.rev 4.2.1.0 (2008/04/01) 新規追加
1301         * @og.rev 4.2.1.1 (2008/05/02) カテゴリーリンクで一番上の画面のモードが-wとなっている場合に、
1302         *                               その画面が立ち上がってしまうバグを修正
1303         * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更
1304         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更)
1305         * @og.rev 5.5.5.3 (2012/08/17) ヘッダ部のgamenIdをth,tdのクラスに追加
1306         * @og.rev 6.8.2.3 (2017/11/10) minCellCountの数が、一つ足りない事の修正
1307         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止 , gamenId の変数設定
1308         *
1309         * @return  マトリクスメニュー
1310         * @og.rtnNotNull
1311         */
1312        private String makeMatrixMenu2() {
1313                final StringBuilder rtn = new StringBuilder( BUFFER_LARGE );
1314
1315                final UserInfo userInfo = getUser();
1316
1317                final GUIInfo[] guiInfos = userInfo.getGUIInfos();
1318//              String gamenId          ;                       // 画面ID
1319                String bkClassifyKey    = null;         // 分類コード(旧)
1320                String nextKey                  = null;         // 分類ボタンを押した時に最初の画面が開くようにする
1321                String bkClassifyName   = null;         // 分類名称(旧)
1322                final int          cellColorCnt = 0;            // MENU_H に 追加する CLR クラス属性の連番
1323
1324                final StringBuilder rtnH = new StringBuilder( BUFFER_LARGE );           // 分類部分の出力用
1325                final StringBuilder rtnB = new StringBuilder( BUFFER_LARGE );           // 実画面のリンク部分の出力用
1326
1327                int level ;
1328                int preLevel = 0;
1329
1330                int lineTmpCnt = 0;                             // セル中の行カウント
1331                int cellTmpCnt = 0;                             // 1つの分類中のセルカウント
1332                int cellTmpAllCnt = 0;                  // 該当行のセルカウント
1333
1334                boolean isInClassify = false;   // 分類の中か?
1335                boolean isChangeLevel = false;  // 直リンク用(無理やり通常画面の階層として扱うので)
1336
1337                String headGuikey = "" ;                // 5.5.5.3 (2012/08/17)
1338
1339                rtn.append( "<tr>" ).append( CR );
1340
1341                for( int i=0; i<guiInfos.length; i++ ) {
1342                        if( guiInfos[i].isRead() ) {            // 4.0.0 (2005/01/31)
1343                                final String gamenId = guiInfos[i].getKey() ;
1344                                if( match   != null && !gamenId.matches( match  ) ) { continue; }
1345                                if( unmatch != null && gamenId.matches( unmatch ) ) { continue; }
1346
1347                                // 処理すべき画面かのチェック
1348                                final int guiFlg = guiCheck( guiInfos, i );
1349                                if( guiFlg == 0 ) { continue; }
1350
1351                                level = guiInfos[i].getLevel();         // 4.0.0 (2005/01/31)
1352
1353                                // 直リンクの場合、無理やり通常画面に変換
1354                                if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) {
1355                                        level = 3;
1356                                        if( !isChangeLevel ) {
1357                                                isChangeLevel = true;
1358                                                isInClassify = false;
1359                                        }
1360                                }
1361                                else {
1362                                        isChangeLevel = false;
1363                                }
1364
1365                                // 分類のブレイク処理
1366                                if( preLevel >= 3 && level < 3 || !isInClassify ) {                                                             // 6.9.7.0 (2018/05/14) PMD Useless parentheses.
1367                                        if(  lineTmpCnt != 0 ) {
1368                                                for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }             // 6.8.2.3 (2017/11/10)
1369                                                //rtnB.append( "</td>" ).append( CR ); // 4.2.1.0 (2008/04/03) リスト
1370                                                rtnB.append( "</ul></div></td>" ).append( CR );
1371                                        }
1372
1373                                        if( bkClassifyKey != null ) {
1374                                                // 6.0.2.5 (2014/10/31) char を append する。
1375                                                rtnH.append( "<th colspan=\"" ).append( cellTmpCnt ).append( "\" class=\"MENU_H CLR" )
1376                                                        .append( cellColorCnt ).append( ' ' ).append( headGuikey ).append( "\">" );             // 5.5.5.3 (2012/08/17)
1377                                                if( "_SPACE".equals( bkClassifyKey ) ) {
1378                                                        rtnH.append( ' ' );                                     // 6.0.2.5 (2014/10/31) refactoring
1379                                                }
1380                                                else {
1381                                                        // 6.4.2.1 (2016/02/05) PMD refactoring.
1382                                                        final String classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey + "&amp;GAMENID="+nextKey;             // ボタンを押した場合に最初の画面が現れる
1383                                                        rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) );
1384                                                }
1385                                                rtnH.append( "</th>" );
1386
1387                                                cellTmpAllCnt += cellTmpCnt;
1388
1389                                                if( sideCount > 0 && cellTmpAllCnt >= sideCount ) {
1390                                                        rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" );
1391
1392                                                        rtnH.setLength(0);                              // 6.1.0.0 (2014/12/26) refactoring
1393                                                        rtnB.setLength(0);                              // 6.1.0.0 (2014/12/26) refactoring
1394                                                        cellTmpAllCnt = 0;
1395                                                }
1396                                        }
1397
1398                                        bkClassifyKey = null;
1399                                        nextKey           = null;
1400                                        isInClassify = false;
1401                                        lineTmpCnt = 0;
1402                                        cellTmpCnt = 0;
1403                                }
1404
1405                                // 5.5.5.3 (2012/08/17) 大分類(フィールドメニュー) 
1406                                if( level == 1 ) {
1407                                        headGuikey = gamenId; 
1408                                }
1409                                // 分類(直リンクの場合は、level=3で処理)
1410                                else if( level == 2 ) {
1411                                        isInClassify = true;
1412                                        if( guiInfos[i].isPulldown() ){ // 4.3.3.0 (2008/10/01) プルダウン化チェック
1413                                                excludeButton = true;
1414                                        }
1415                                        else{
1416                                                excludeButton = false;
1417                                        }
1418//                                      bkClassifyKey = guiInfos[i].getKey();
1419                                        bkClassifyKey = gamenId;                                        // 6.9.4.1 (2018/04/09)
1420                                        bkClassifyName = guiInfos[i].getName();
1421                                        for( int j=i+1; j<guiInfos.length; j++ ) {
1422                                                if( guiInfos[j] != null && guiInfos[j].isRead() ) {
1423                                                        nextKey = guiInfos[j].getKey();
1424                                                        break;
1425                                                }
1426                                        }
1427                                }
1428                                // 通常メニュー・隠しメニュー
1429                                else if( level >= 3 ) {
1430                                        // 画面ID="HYBS_BR"の場合は、セルを変える。
1431//                                      if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) {
1432                                        if( "HYBS_BR".equals( guiInfos[i].getAddress() ) ) {                                    // 6.9.4.1 (2018/04/09) HYBS_BR は、アドレスに設定
1433                                                if( lineTmpCnt != 0 ) {
1434                                                        for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }             // 6.8.2.3 (2017/11/10)
1435                                                        lineTmpCnt = 0;
1436                                                }
1437                                        }
1438                                        // 通常画面
1439                                        else {
1440                                                if( lineTmpCnt == 0 ) {
1441                                                        // rtnB.append( "<td class=\"MENU_B\">" );
1442                                                        // 4.2.1.0 (2008/04/03) リンクをリスト形式で出す案
1443                                                        rtnB.append( "<td class=\"MENU_B "+ headGuikey +"\"> <div class=\"gamen-menu-wrap\"><ul class=\"gamen-menu\">" ); // 5.5.5.3 (2012/08/17)
1444                                                        cellTmpCnt++;
1445                                                }
1446
1447                                                // 5.5.2.5 (2012/05/21) リストは、イメージを設定するので、メソッド側で付与します。
1448                                                rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-4 ) );             // 5.5.2.5 (2012/05/21) イメージアイコン対応
1449                                                lineTmpCnt++;
1450
1451                                                if( lineTmpCnt >= maxCellCount ) {
1452                                                        // rtnB.append( "</td>" );
1453                                                        rtnB.append( " </ul> </div></td>" ); // 4.2.1.0 (008/04/03) リスト
1454                                                        lineTmpCnt = 0;
1455                                                }
1456                                //              else {
1457                                //                      rtnB.append( BR ); // 4.2.1.0 (2008/04/03) リスト。改行不要。
1458                                //              }
1459
1460                                                // 分類の中に入っていない通常画面
1461                                                if( !isInClassify ) {
1462                                                        bkClassifyKey = "_SPACE";
1463                                                        isInClassify = true;
1464                                                }
1465                                        }
1466                                }
1467                                preLevel = level;
1468                        }
1469                }
1470
1471                // 終了処理
1472                // 4.3.3.0 (2008/10/01) 終了処理は0の時行はない
1473                if( lineTmpCnt != 0){
1474                        for( int j=lineTmpCnt; j<minCellCount; j++ ) { rtnB.append( BR ); }                     // 6.8.2.3 (2017/11/10)
1475                        rtnB.append( "</td>" ).append( CR );
1476                }
1477
1478                if( bkClassifyKey != null ) {
1479                        rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17)
1480
1481                        // 6.4.2.1 (2016/02/05) PMD refactoring.
1482                        final String classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey + "&amp;GAMENID="+nextKey;
1483                        rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) );
1484                        rtnH.append( "</th>" );
1485                }
1486
1487                rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" );
1488
1489                return rtn.toString();
1490        }
1491
1492        /**
1493         * タイプに応じたメニューを表示する為の文字列を作成します。
1494         * 引数の GUIInfo より、アクセスすべきメニューのhrefと、targetを求めます。
1495         * type = -3 (マトリクスメニュー) の場合だけ、タグ属性の target を使用します。
1496         *
1497         *  0:フィールドセットメニュー
1498         *  1:トップ階層(【分類名称】)
1499         *  2:選択階層(通常の折りたたみメニュー)
1500         *  3:選択非表示(通常は、隠してあります)
1501         *  -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
1502         *  -2:ラインメニュー([画面名称] )
1503         *  -3:マトリクスメニュー(一覧)
1504         *  -4:マトリクスメニュー2(一覧)
1505         *  -5:1レベル表示(後続処理は-3と同じ)
1506         *  -6:TILE表示時の選択階層(通常の折りたたみメニュー,2:と同じ)
1507         *
1508         * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え)
1509         * @og.rev 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行わない。
1510         * @og.rev 4.2.1.0 (2008/04/01) マトリクスメニュー2用のタグ作成処理追加
1511         * @og.rev 4.2.1.0 (2008/04/17) マトリクス2からの遷移先でボタンメニューにする処理
1512         * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更
1513         * @og.rev 4.3.3.7 (2008/11/22) https対応
1514         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。)
1515         * @og.rev 5.7.8.1 (2014/07/18) realAddress の "/" 対応
1516         * @og.rev 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
1517         * @og.rev 5.9.6.1 (2016/03/04) -5を追加。-3との違いはresult.jspに飛ばない事
1518         * @og.rev 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
1519         *
1520         * @param       guiInfo GUIInfoリンク
1521         * @param       bodyIn  BODY部(表示)
1522         * @param       type    タイプ
1523         *
1524         * @return  階層別メニュー文字列
1525         * @og.rtnNotNull
1526         */
1527        private String makeTagMenu( final GUIInfo guiInfo, final String bodyIn, final int type ) {
1528
1529                String href              = null;
1530                String tmpTarget = null;
1531                final  String gamenId   = guiInfo.getKey();             // 5.5.2.5 (2012/05/21) イメージアイコン対応
1532                int                       tmpType       = type;                                 // 5.9.6.1
1533
1534                if( guiInfo.getAddress() != null && guiInfo.getAddress().length() > 0 ) {
1535                        final String readAdrs = guiInfo.getRealAddress( "index.jsp" );
1536                        final String reqParam = getRequestParameter( guiInfo.getParam() );
1537                        href = XHTMLTag.addUrlEncode( readAdrs,reqParam );
1538                        tmpTarget = guiInfo.getTarget();
1539
1540                        // 4.3.3.7 (2008/11/22) https対応
1541                        // 5.7.8.1 (2014/07/18) realAddress の "/" 対応
1542                        final String kblink = guiInfo.getKblink();
1543                        if( ! readAdrs.startsWith( "http://" ) && ! readAdrs.startsWith( "https://" ) && !"/".equals( kblink ) ) {
1544                                if( type == -3 ) {
1545                                        tmpTarget = target;
1546                                        href = XHTMLTag.addUrlEncode( JSP + "/result.jsp",reqParam );   // 6.2.0.0 (2015/02/27)
1547                                }
1548                                else if( type == -4 ) {         // 4.2.1.0 (2008/04/01)
1549                                        tmpTarget = "_self";
1550                                        href = XHTMLTag.addUrlEncode( JSP + "/index.jsp",reqParam );    // 6.2.0.0 (2015/02/27)
1551                                        href = XHTMLTag.addUrlEncode( href,"classify=" + guiInfo.getClassify() );
1552                                }
1553                                else if( type == -5 ){          // 5.9.6.1 (2016/03/04)
1554                                        tmpTarget = target;
1555                                        tmpType = -3;
1556                                }
1557                                href = XHTMLTag.addUrlEncode( href,"GAMENID=" + gamenId );                      // 5.5.2.5 (2012/05/21) せっかくなので、利用する。
1558
1559                                // 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。
1560                                // 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行いません。
1561                                // 4.1.0.1 (2008/04/01) マトリクスメニュー2はマルチセッションチェックを行いません。
1562//                              if( multiSessionCheck && !guiInfo.getAddress().startsWith( ".." ) && type != -4 ) {
1563                                if( !guiInfo.getAddress().startsWith( ".." ) && type != -4 ) {          // 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
1564                                        href = XHTMLTag.addUrlEncode( href,mscKey );
1565                                }
1566                        }
1567                }
1568                // 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。)
1569                final String imgKey = guiInfo.getImageKey() ;
1570                return makeTagMenuString( href,tmpTarget,bodyIn,gamenId,imgKey,tmpType ) ; // 5.9.6.1
1571        }
1572
1573        /**
1574         * タイプに応じたメニューを表示する為の文字列を作成します。
1575         * 従来からのメソッドの引数のままで、新しい gamenId は、imgKey をそのままセットします。
1576         *
1577         *  0:フィールドセットメニュー
1578         *  1:トップ階層(【分類名称】)
1579         *  2:選択階層(通常の折りたたみメニュー)
1580         *  3:選択非表示(通常は、隠してあります)
1581         *  -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
1582         *  -2:ラインメニュー([画面名称] )
1583         *  -3:マトリクスメニュー(一覧)
1584         *  -4:マトリクスメニュー2(一覧)
1585         *  -5:1レベル表示(後続処理は-3と同じだが、絶対パスの場合は、画面リソースのtargetを使用する。)
1586         *  -6:TILE表示時の選択階層(通常の折りたたみメニュー,2:と同じ)
1587         *
1588         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。)
1589         *
1590         * @param       href    リンク
1591         * @param       target  ターゲット
1592         * @param       bodyIn  BODY部(表示)
1593         * @param       imgKey  imageファイルの検索キー
1594         * @param       type    タイプ
1595         *
1596         * @return  階層別メニュー文字列
1597         * @og.rtnNotNull
1598         */
1599        private String makeTagMenuString( final String href,final String target, final String bodyIn,
1600                                                                final String imgKey,final int type ) {
1601                return makeTagMenuString( href,target,bodyIn,imgKey,imgKey,type );      // gamenId の代わりに、imgKey をセットする。
1602        }
1603
1604        /**
1605         * タイプに応じたメニューを表示する為の文字列を作成します。
1606         *
1607         * タイプは、階層別になっていますが、マイナスは、内部で処理するための記号です。
1608         *
1609         *  0:フィールドセットメニュー
1610         *  1:トップ階層(【分類名称】)
1611         *  2:選択階層(通常の折りたたみメニュー)
1612         *  3:選択非表示(通常は、隠してあります)
1613         *  -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
1614         *  -2:ラインメニュー([画面名称] )
1615         *  -3:マトリクスメニュー(一覧)
1616         *  -4:マトリクスメニュー2(一覧)
1617         *  -5:1レベル表示(後続処理は-3と同じだが、絶対パスの場合は、画面リソースのtargetを使用する。)
1618         *  -6:TILE表示時の選択階層(通常の折りたたみメニュー,2:と同じ)
1619         *
1620         * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え)
1621         * @og.rev 4.0.0.0 (2007/11/28) switch文の中の二重コードを統一します。
1622         * @og.rev 4.2.1.0 (2008/04/01) ボタン形式のリンク対応、マトリクスメニュー2対応
1623         * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をここで行うようにする
1624         * @og.rev 4.3.5.0 (2009/02/01) switch の case で重複項目をまとめます。
1625         * @og.rev 5.1.4.0 (2010/03/01) onClick,onMouseOver,onMouseOutの処理は、外部のJavaScriptファイルで記述します。
1626         * @og.rev 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正
1627         * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応
1628         * @og.rev 5.4.4.4 (2012/02/15) ヘルプアイコンはimgKeyがnullでない場合のみとする
1629         * @og.rev 5.5.0.4 (2012/03/14) FAQ対応
1630         * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。)
1631         * @og.rev 5.5.4.2 (2012/07/13) JSP(/gf/jsp/) ではなく、CNTX(gf)+MENU_IMG(/jsp/menuImage/) で処理するように変更
1632         * @og.rev 6.2.2.0 (2015/03/27) BRと\nを相互に変換する処理を追加
1633         * @og.rev 6.2.2.3 (2015/04/10) htmlフィルターに、BR→改行処理機能を追加。
1634         * @og.rev 6.3.8.4 (2015/10/09) topMenu 内でのHelp機能を廃止します。
1635         * @og.rev 6.3.8.4 (2015/10/09) FileMap のコンストラクタ変更に伴う対応。
1636         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加
1637         * @og.rev 6.8.0.1 (2017/06/30) -5:1レベル表示追加(元は、相対パスのみ対応していたが、絶対パスにも対応)
1638         * @og.rev 6.8.1.6 (2017/09/29) imageOnly="true" で、イメージにリンクが付かないバグ修正。
1639         *
1640         * @param       href    リンク
1641         * @param       target  ターゲット
1642         * @param       bodyIn  BODY部(表示)
1643         * @param       gamenId 画面ID/グループIDなど
1644         * @param       imgKey  imageファイルの検索キー
1645         * @param       type    タイプ
1646         *
1647         * @return  階層別メニュー文字列
1648         * @og.rtnNotNull
1649         */
1650        private String makeTagMenuString( final String href,final String target, final String bodyIn,
1651                                                                final String gamenId,final String imgKey,final int type ) {
1652
1653                final String body ;
1654                final String img ;                      // 6.7.5.0 (2017/03/10) イメージを、【】の外に出す。
1655                String listStyle = "<li>";
1656                // 6.3.8.4 (2015/10/09) FileMap のコンストラクタ変更に伴う対応。
1657                // 最初に見つけたキーが優先されるので、画面IDのファイルを優先します。
1658                final String imgFile = imgFileMap.getFilename( gamenId,imgKey );        // 5.5.2.5 (2012/05/21) 属性名変更
1659                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
1660                if( imgFile == null ) {
1661                        img = "";
1662                        if( imageOnly && bodyIn != null && bodyIn.length() > 0 ) {
1663                                body = "<span title=\"" + StringUtil.htmlFilter( bodyIn,true ) + "\" >" + bodyIn.charAt(0) + "</span>" ;
1664                        }
1665                        else {
1666                                body = bodyIn ;
1667                        }
1668                }
1669                else {
1670                        if( imageOnly ) {
1671                                // 6.8.1.6 (2017/09/29) imageOnly="true" で、イメージにリンクが付かないバグ修正。リンクは、body に付く
1672                                img = "";
1673                                body = "<img src=\"" + imgFile + "\" class=\"ICON1\" title=\""
1674                                                         + StringUtil.htmlFilter( bodyIn,true ) + "\" />" ;
1675
1676                        }
1677                        // 5.5.2.5 (2012/05/21) -4(MATRIX Menu2)の場合は、<li style="list-style:url(画像URL);"> で処理する。
1678                        else if( type == -4 ) {
1679                                listStyle = "<li style=\"list-style:url(" + imgFile + ");\">" ;
1680                                body = bodyIn ;
1681                                img = "";
1682                        }
1683                        else {
1684                                // 6.7.5.0 (2017/03/10) TILE表示のレベル-6では、イメージ直後に BR を入れる。(暫定処置)
1685                                if( type == -6 ) {
1686                                        img = "<img src=\"" + imgFile + "\" class=\"ICON2\" /><br />" ;         // ICON2 + BR
1687                                }
1688                                else {
1689                                        img = "<img src=\"" + imgFile + "\" class=\"ICON1\" />" ;                       // ICON1
1690                                }
1691                                body = bodyIn;
1692                        }
1693                }
1694
1695                final String in ;
1696                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
1697                if( href == null ) {
1698                        in = body;
1699                }
1700                else {
1701                        if( useButton ) { // 4.2.1.0 (2008/04/01)
1702                                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
1703                                in = new TagBuffer( "button" )
1704                                                .add( "onclick" , "top."+target+".location.href=\'"+ href + "\';" )             // 5.1.4.0 (2010/03/01)
1705                                                .add( "class"   , "buttonMenu" )                // 4.2.1.0 (2008/04/03) classを追加
1706                                                .add( "id"              , gamenId )                             // 5.5.2.5 (2012/05/21) idを本当の画面IDで設定
1707                                                .addBody( body )
1708                                                .makeTag();
1709
1710                        }
1711                        else {
1712                                // 4.2.2.0 (2008/05/14) ボタン式にする場合はリクエスト変数付加
1713                                // 4.3.3.0 (2008/10/01) 強制プルダウン化の場合はfalseで渡す(excludeButton の値の反転)
1714                                final String href2 = buttonRequest 
1715                                                                                        ? XHTMLTag.addUrlEncode( href,"buttonRequest=" + !excludeButton)
1716                                                                                        : href ;
1717                                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
1718                                in = new TagBuffer( "a" )
1719                                                .add( "class"   , "buttonClassify" , buttonRequest )
1720                                                .add( "href"    , href2 )
1721                                                .add( "target"  , target )
1722                                                .addBody( body )
1723                                                .makeTag();
1724                        }
1725                }
1726
1727                // 6.7.5.0 (2017/03/10) イメージを、【】の外に出す。
1728                String rtn = null;
1729                switch( type ) {
1730                        // 6.9.8.0 (2018/05/28) FindBugs:switch 文の2つの case のために同じコードを使用しているメソッド
1731                        // 偶然同じになったのと、これを対応するとソースがみにくくなるので、このままとします。
1732                        case 1:  rtn = FIELD_IN + "<legend>" + img + in + "</legend>" ; break;  // 大分類
1733                        case 2:  rtn = img + "【" + in + "】"     ; break;                // 小分類・直リンク
1734                        case 3:                                                                                                 // 通常メニュー
1735                        case 4:  rtn = " " + img + in                   ; break;                // 隠れメニュー
1736                        case -1: rtn = "<td class=\"MENU_G " + gamenId + "\">" + img + in + "</td>" ; break;    // 5.5.2.5 (2012/05/21) グループメニュー
1737                        case -2: rtn = img + "[" + in + "] "    ; break;                // ラインメニュー
1738                        case -3: rtn = img + in                                 ; break;                // マトリクスメニュー
1739                        case -4: rtn = listStyle + in + "</li>" ; break;                // 4.2.1.0 (2008/04/03) リスト。リストのため■はいらない
1740                        case -5: rtn = img + in                                 ; break;                // 6.8.0.1 (2017/06/30) 1レベル表示絶対パス
1741                        case -6: rtn = img + "【" + in + "】"     ; break;                // 小分類・直リンク(TILE)
1742                        default :
1743                                rtn = "X_" + in ;  break;                                                       // 6.0.2.5 (2014/10/31) break追記
1744                }
1745
1746                return rtn ;
1747        }
1748
1749        /**
1750         * 【TAG】作成するメニューの種類[NORMAL/GROUP/ONELEVEL/NEXTGUI/MATRIX/MATRIX2]を指定します(初期値:NORMAL)。
1751         *
1752         * @og.tag
1753         * 作成するメニューには、複数の種類があります。
1754         * <table border="1" frame="box" rules="all" >
1755         *   <caption>メニューの種類</caption>
1756         *   <tr><th>種類    </th><th>説明  </th></tr>
1757         *   <tr><td>NORMAL  </td><td>通常の階層メニュー</td></tr>
1758         *   <tr><td>GROUP   </td><td>GROUPのみを取り出してリンクを作成します。(topMenuに利用)</td></tr>
1759         *   <tr><td>ONELEVEL</td><td>指定のclassify のメニューのみを取り出してリンクを作成します。(lineMenuに利用)</td></tr>
1760         *   <tr><td>NEXTGUI </td><td>既存のページの次にアクセスされる画面郡のリンクを作成します。</td></tr>
1761         *   <tr><td>MATRIX  </td><td>一覧表形式のメニューを作成します。(大分類付きマルチメニュー)</td></tr>
1762         *   <tr><td>MATRIX2 </td><td>一覧表形式のメニューを作成します。(大分類なしボタンメニュー)</td></tr>
1763         *   <tr><td>NONE    </td><td>表示しない(ヘッダーメニューを表示しない時などに使用)</td></tr>
1764         *   <tr><td>TILE    </td><td>イメージを使った全面アイコン画面</td></tr>
1765         * </table>
1766         *
1767         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1768         * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加
1769         * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。
1770         * @og.rev 6.3.8.3 (2015/10/03) NONE(表示しない) 追加(JavaDoc追記のみ)。
1771         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
1772         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加
1773         *
1774         * @param       type メニューの種類 [NORMAL/GROUP/ONELEVEL/NEXTGUI/MATRIX/MATRIX2/NONE/TILE]
1775         */
1776        public void setMenuType( final String type ) {
1777                menuType = nval( getRequestParameter( type ),menuType );
1778                if( ! check( menuType, MENU_TYPE_SET ) ) {
1779                        final String errMsg = "menuType に、指定できない種類の文字が指定されました。" + CR
1780                                                        + "menuType=[" + menuType + "] "                                                                + CR
1781                                                        + "menuType List=" + String.join( ", " , MENU_TYPE_SET ) ;
1782                        throw new HybsSystemException( errMsg );
1783                }
1784        }
1785
1786        /**
1787         * 【TAG】折り返しメニューを構築するかどうかを指定します(初期値:true)。
1788         *
1789         * @og.tag
1790         * trueを設定すると、JavaScriptによる折り返しメニューを構築します。
1791         * false の場合は、通常のHTMLのみで、階層メニューを構築します。
1792         * 初期値は、true(折り返しメニュー)です。
1793         *
1794         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1795         *
1796         * @param       flag 折り返しメニュー [true:する/false:しない]
1797         */
1798        public void setExpand( final String flag ) {
1799                expand = nval( getRequestParameter( flag ),expand );
1800        }
1801
1802        /**
1803         * 【TAG】表示対象となるグループをCSV形式で指定します。
1804         *
1805         * @og.tag
1806         * メニューの表示対象グループをCSV形式で複数指定できます。
1807         * 指定のグループのメニューだけが、表示対象になります。
1808         * メニューにも、複数のグループを指定できるため、1グループの指定で、
1809         * 複数のくくりを表示することも可能です。
1810         * グループを指定しない場合は、全グループが対象になります。
1811         * また、メニュー側にグループ指定がない場合は、グループ指定に
1812         * 関係なく、対象になります。
1813         * 初期値は、未指定(全メニューが対象)です。
1814         * 分解方法は、通常のパラメータ取得後に、CSV分解します。
1815         *
1816         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1817         *
1818         * @param       menuGroups 表示対象グループ (CSV形式)
1819         */
1820        public void setGroups( final String menuGroups ) {
1821                groups = StringUtil.csv2Array( getRequestParameter( menuGroups ) );
1822                if( groups.length == 0 ) { groups = null; }
1823        }
1824
1825        /**
1826         * 【TAG】表示対象となる分類(classify)を指定します。
1827         *
1828         * @og.tag
1829         * メニューの表示対象となる分類(classify)を指定することで、一まとまりの
1830         * メニューを作成します。これは、3段階メニューの最終メニューを求める場合に
1831         * 指定します。
1832         * 最終メニューは、画面上部に設ける予定のメニューで、上下フレーム分割での
1833         * 運用時に使用します。
1834         * 分類の指定がない場合は、すべてが表示対象になります。
1835         * 初期値は、未指定(全メニューが対象)です。
1836         *
1837         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1838         *
1839         * @param       classify 表示対象分類 (classify)
1840         */
1841        public void setClassify( final String classify ) {
1842                selClassify = nval( getRequestParameter( classify ),selClassify );
1843        }
1844
1845        /**
1846         * 【TAG】グループメニューの表示対象となるソース名(href)を指定します(初期値:menu.jsp)。
1847         *
1848         * @og.tag
1849         * GROUPメニューの表示対象となるソース名(href)を指定することで、
1850         * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて
1851         * 管理するのかを自由に設定できます。
1852         * 初期値は、menu.jspです。
1853         *
1854         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1855         *
1856         * @param       inHref 表示対象ソース名 (href)
1857         */
1858        public void setHref( final String inHref ) {
1859                href = nval( getRequestParameter( inHref ),href );
1860        }
1861
1862        /**
1863         * 【TAG】グループメニューの表示対象となるフレーム名(target)を指定します(初期値:MENU)。
1864         *
1865         * @og.tag
1866         * GROUPメニューの表示対象となるフレーム名(target)を指定することで、
1867         * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて
1868         * 管理するのかを自由に設定できます。
1869         * フレーム分割を行うと、変更箇所は、サブメニューのみになる為、動きに無駄が
1870         * なくなりますが、グループメニューの大きさが固定されてしまいます。
1871         * 自分自身にすると、グループメニューとサブメニューを一つのフレームに
1872         * 入れることで、更新時の画面のちらつきは発生しますが、無駄なスペースは
1873         * 省くことが可能になります。
1874         * 初期値は、MENU(通常のメニューフレーム)です。
1875         *
1876         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1877         *
1878         * @param       inTarget 表示対象フレーム名 (target)
1879         */
1880        public void setTarget( final String inTarget ) {
1881                target = nval( getRequestParameter( inTarget ),target );
1882        }
1883
1884        /**
1885         * 【TAG】グループメニューの表示に、画像のみかどうか[true:画像のみ/false:画像+ラベル]を指定します(初期値:false)。
1886         *
1887         * @og.tag
1888         * GROUPメニューの表示対象として、jsp/menuImage 以下に グループ名と同一の
1889         * 画像ファイルが存在する場合は、画像を使用します。
1890         * このフラグを、true に設定すると、画像のみを使用します。
1891         * false の場合は、画像+グループ名のラベルを使用します。
1892         * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、
1893         * マウスカーソルをオーバーすれば、名称がTips表示されます。
1894         * 画像が存在しない場合に、true(画像のみ)に設定した場合は、ラベルの最初の1文字
1895         * のみを出力します。
1896         * 初期値は、false(画像+ラベル)です。
1897         *
1898         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1899         *
1900         * @param       flag グループメニュー表示 [true:画像のみ/false:画像+ラベル]
1901         */
1902        public void setImageOnly( final String flag ) {
1903                imageOnly = nval( getRequestParameter( flag ),imageOnly );
1904        }
1905
1906        /**
1907         * 【TAG】グループメニューの表示対象となるメニューを横並びさせる数を指定します。
1908         *
1909         * @og.tag
1910         * GROUPメニューなどの表示を行う場合に、横方向に何個のメニューを表示させるかを
1911         * 指定します。例えば、画像のみのリンクと組み合わせれば、より、多くのグループを
1912         * 横方向に並べることで、小領域に多くの情報を詰めることが可能になります。
1913         * 0 を設定すると、横方向にのみ並べる(折り返さない)メニューを作ることが
1914         * 可能になります。
1915         * 初期値は、無制限です。
1916         *
1917         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1918         *
1919         * @param       count 横並び数
1920         */
1921        public void setSideCount( final String count ) {
1922                sideCount = nval( getRequestParameter( count ),sideCount );
1923        }
1924
1925        /**
1926         * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最小行数を指定します(初期値:8)。
1927         *
1928         * @og.tag
1929         * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、&lt;br /&gt;タグを挿入します。
1930         * このタグの挿入する個数を指定します。
1931         * この個数だけ、メニューの数があろうとなかろうと行を確保します。
1932         * 指定の値が、実際の行数より少ない場合は、実際の行数分だけ拡張されます。
1933         * 初期値は、8 です。
1934         *
1935         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1936         *
1937         * @param       count セル内最小行数
1938         * @see         #setMaxCellCount( String )
1939         */
1940        public void setMinCellCount( final String count ) {
1941                minCellCount = nval( getRequestParameter( count ),minCellCount );
1942        }
1943
1944        /**
1945         * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最大行数を指定します(初期値:8)。
1946         *
1947         * @og.tag
1948         * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、指定の行数で
1949         * 新たな セルを作成して、セルを横方向に連結します。
1950         * 初期値は、8 です。
1951         *
1952         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1953         *
1954         * @param       count セル内最大行数
1955         * @see         #setMinCellCount( String )
1956         */
1957        public void setMaxCellCount( final String count ) {
1958                maxCellCount = nval( getRequestParameter( count ),maxCellCount );
1959        }
1960
1961        /**
1962         * 【TAG】グループメニューのキャッシュを使用するかどうか[true/false]を指定します(初期値:true)。
1963         *
1964         * @og.tag
1965         * GROUPメニューの表示は、一旦作成すると、ほとんど書き換えることがありません。
1966         * 作成は、使用できる全メニューをスキャンして、その中からグループ属性をピックアップ
1967         * するという処理を行っている為、明らかに無駄な処理です。
1968         * そこで、jsp/index.jsp が実行された場合のみキャッシュをクリアして、内部では
1969         * キャッシュがなければ作成し、あればキャッシュを使うロジックになっています。
1970         * ここでは、キャッシュを使用するのか、毎回作成しなおすのかを指定します。
1971         * 対象として、jsp/menuImage 以下に グループ名と同一の
1972         * 画像ファイルが存在する場合は、画像を使用します。
1973         * このフラグを、true に設定すると、画像のみを使用します。
1974         * false の場合は、画像+グループ名のラベルを使用します。
1975         * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、
1976         * マウスカーソルをオーバーすれば、名称がTips表示されます。
1977         * 画像が存在しない場合は、たとえ、true(画像のみ)に設定しても、ラベルを出力します。
1978         * 初期値は、true(キャッシュする)です。
1979         *
1980         * @og.rev 4.0.0.0 (2005/01/31) 新規登録
1981         *
1982         * @param       flag キャッシュ可否 [true:キャッシュする/false:キャッシュしない]
1983         */
1984        public void setCache( final String flag ) {
1985                cache = nval( getRequestParameter( flag ),cache );
1986        }
1987
1988        /**
1989         * 【TAG】正判定(マッチする場合に、メニューに出す)条件を設定します。
1990         *
1991         * @og.tag
1992         * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。
1993         * これは、正規表現で表される引数と、画面IDがマッチする場合に、
1994         * メニューを表示させます。
1995         * マッチしない場合は、表示されません。
1996         * 何も指定しない場合は、ロールの判定みの行われます。
1997         *
1998         * @param   mt 正判定条件 (マッチする場合に、メニューに出す)
1999         */
2000        public void setMatch( final String mt ) {
2001                match = nval( getRequestParameter( mt ),match );
2002        }
2003
2004        /**
2005         * 【TAG】逆判定(マッチする場合に、メニューに出さない)条件を設定します。
2006         *
2007         * @og.tag
2008         * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。
2009         * これは、正規表現で表される引数と、画面IDがマッチする場合に、
2010         * メニューを表示させません。
2011         * マッチしない場合は、表示されます。
2012         * 何も指定しない場合は、ロールの判定みの行われます。
2013         *
2014         * @param   umt 逆判定条件 (マッチする場合に、メニューに出さない)
2015         */
2016        public void setUnmatch( final String umt ) {
2017                unmatch = nval( getRequestParameter( umt ),unmatch );
2018        }
2019
2020        /**
2021         * 【TAG】メニューに使用する画像ファイルのフォルダを指定します(初期値:{@og.value #MENU_IMG})。
2022         *
2023         * @og.tag
2024         * メニューに使用する画像ファイルのフォルダを指定します。
2025         * 画面IDのキーと一致する画像ファイルを使用します。
2026         * 初期値は、{@og.value #MENU_IMG} です。
2027         * /jspからのフォルダ指定が必要です。
2028         *
2029         * @og.rev 6.7.5.0 (2017/03/10) TILE表示追加(imageDir 属性追加)
2030         *
2031         * @param   dir メニューに使用する画像ファイルのフォルダ
2032         */
2033        public void setImageDir( final String dir ) {
2034                imageDir = nval( getRequestParameter( dir ),imageDir );
2035        }
2036
2037        /**
2038         * 【TAG】画面リンクにボタンを使用するかどうか[true/false]を指定します(初期値:false)。
2039         *
2040         * @og.tag
2041         * 画面リンクをボタンリンク形式で表示するかを指定します。
2042         * falseの場合は、通常のリンクになります。
2043         * 初期値は、false(通常リンク)です。
2044         *
2045         * @og.rev 4.2.1.0 (2008/04/01) 新規登録
2046         *
2047         * @param       flag ボタンリンク [true:ボタン形式リンク/false:通常リンク]
2048         */
2049        public void setUseButton( final String flag ) {
2050                useButton = nval( getRequestParameter( flag ),useButton );
2051        }
2052
2053        /**
2054         * 【TAG】マトリクスからの遷移先でボタンメニュー表示するかどうか[true/false]を指定します(初期値:false)。
2055         *
2056         * @og.tag
2057         * マトリクスメニューからの遷移先でボタンメニューを表示させるために
2058         * アドレスに付加するリクエスト変数を指定します。
2059         * trueにするとbuttonRequest=trueのリクエスト変数を付けます。
2060         * falseの場合はリクエスト変数を付けません。
2061         * 初期値は、false(プルダウン形式で表示)です。
2062         *
2063         * @og.rev 4.2.1.0 (2008/04/17) 新規登録
2064         *
2065         * @param       flag メニュー形式 [true:ボタン形式/false:通常形式]
2066         */
2067        public void setButtonRequest( final String flag ) {
2068                buttonRequest = nval( getRequestParameter( flag ),buttonRequest );
2069        }
2070
2071        /**
2072         * 【TAG】標準画面を初期状態で開いた状態で表示するかどうか[true/false]を指定します(初期値:false)。
2073         *
2074         * @og.tag
2075         * 通常expand=trueの状態では、メニューが折りたたまれています。
2076         * このinlineStyle属性をtrueにすると標準画面のスタイルにdisplay:inlineを
2077         * 付加する事で、初期状態でメニューが開いた状態になります。
2078         * expand=falseとの違いは、隠しメニュー及び分類の折りたたみ機能が利用できる事です。
2079         * 初期値は、false(折りたたまれた状態)です。
2080         *
2081         * @og.rev 4.3.3.0 (2008/10/01) 新規
2082         *
2083         * @param       flag メニュースタイル [true:開いた状態/false:閉じた状態]
2084         */
2085        public void setInlineStyle( final String flag ) {
2086                inlineStyle = nval( getRequestParameter( flag ),inlineStyle );
2087        }
2088
2089        /**
2090         * 【TAG】ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうか[true/false]を指定します(初期値:false)。
2091         *
2092         * @og.tag
2093         * ONELEVEL,NEXTGUI は、QUERY 画面の上部に表示される簡易メニューです。
2094         * この表記は、[画面リンク] 形式のテキスト表示されていますが、画面名称を固定長にするなどの処理を入れるため、
2095         * DIVでフォーマットします。
2096         * 作りは、出力される HTML を確認いただきたいと思います。
2097         * 全体を、&lt;div id="design-onelevel" &gt; で、囲い、画面名称は、&lt;span clas="design-onelevel" &gt; で、囲います。
2098         * これを、標準CSSで、固定幅と背景色、リンクの文字色など書き換えて、体裁を整えます。
2099         * 初期値は、false(従来と同じ)です。
2100         *
2101         * @og.rev 5.5.2.3 (2012/05/15) 新規追加
2102         *
2103         * @param       flag DIVタグ処理するか [true:DIVタグ処理をする/false:しない]
2104         */
2105        public void setUseDivOneLevel( final String flag ) {
2106                useDivOneLevel = nval( getRequestParameter( flag ),useDivOneLevel );
2107        }
2108
2109        /**
2110         * 画面オブジェクト一覧より、指定されたインデックスより後に実体となる画面ID
2111         * (直リンク、通常メニュー、隠しメニュー※改行メニューは除く)が存在するかを判定します。
2112         * グループスが指定されている場合は、グループで絞り込まれた結果に対して判定を行います。
2113         *
2114         * @og.rev 4.0.0.0 (2007/10/30) 新規追加
2115         * @og.rev 6.9.8.0 (2018/05/28) FindBugs 対応で、groupCheckの判定方法に、groups == null も入れる。
2116         *
2117         * @param guiInfos 画面オブジェクト一覧
2118         * @param idx 検索を開始するインデックス番号
2119         *
2120         * @return 0:実体画面が存在せず 1:全て隠しの分類 2:実体画面 or 通常画面を含む分類
2121         */
2122        private int guiCheck( final GUIInfo[] guiInfos, final int idx ) {
2123                int flg = 0;
2124
2125                // 実態探し
2126                if( levelCheck( guiInfos[idx] ) > 0 ) {
2127                        // グループメニューリンク時の処理
2128                        // 6.9.8.0 (2018/05/28) FindBugs 対応で、groupCheckの判定方法に、groups == null も入れる。
2129//                      if( groups == null ) { flg = 2; }
2130//                      else { flg = groupCheck( guiInfos[idx] ) ? 2 : 0; }
2131                        flg = groupCheck( guiInfos[idx] ) ? 2 : 0;
2132                }
2133                else {
2134                        for( int j=idx+1; j<guiInfos.length; j++ ) {
2135                                if( !guiInfos[j].isRead() ) { continue; }
2136                                if( flg > 1 || guiInfos[j].getLevel() <= guiInfos[idx].getLevel() ) { break; }
2137
2138                                // 6.9.8.0 (2018/05/28) FindBugs 対応で、groupCheckの判定方法に、groups == null も入れる。
2139//                              if( groups == null || groupCheck( guiInfos[j] ) ) {
2140                                if( groupCheck( guiInfos[j] ) ) {
2141                                        if( levelCheck( guiInfos[j] ) > 0 ) {
2142                                                flg = levelCheck( guiInfos[j] );
2143                                        }
2144                                }
2145                        }
2146                }
2147
2148                return flg;
2149        }
2150
2151        /**
2152         * 指定された画面IDが実体であるか(直リンク、通常メニュー、隠しメニュー※改行メニューは除く)を判定します。
2153         *
2154         * @og.rev 4.0.0.0 (2007/10/30) 新規追加
2155         * @og.rev 4.0.0.0 (2007/11/30) switch に default 追加
2156         * @og.rev 6.9.4.1 (2018/04/09) HYBS_BR の廃止
2157         *
2158         * @param guiInfo 画面オブジェクト
2159         *
2160         * @return 0:分類 1:実体画面(隠し) 2:実体画面(通常) or 直リンク
2161         */
2162        private int levelCheck( final GUIInfo guiInfo ) {
2163                int flg = 0;
2164
2165                final String adrs = guiInfo.getAddress();       // 6.9.4.1 (2018/04/09) HYBS_BR は、アドレスに設定
2166
2167                switch ( guiInfo.getLevel() ) {
2168                        case 2:
2169//                              final String adrs = guiInfo.getAddress();
2170                                if( adrs != null && adrs.length() > 0 ) {
2171                                        flg = 2;
2172                                }
2173                                break;
2174                        case 3:
2175//                              flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 2; break;
2176                                flg = "HYBS_BR".equals( adrs ) ? flg : 2; break;
2177                        case 4:
2178//                              flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 1; break;
2179                                flg = "HYBS_BR".equals( adrs ) ? flg : 1; break;
2180                        default :
2181                                flg = 0; break;
2182                }
2183
2184                return flg;
2185        }
2186
2187        /**
2188         * 指定された画面IDが設定されたグループスに含まれるかを判定します。
2189         *
2190         * groups == null か、または、画面IDが設定されたグループスに含まれる場合、true を返します。
2191         *
2192         * @og.rev 4.0.0.0 (2007/10/30) 新規追加
2193         * @og.rev 6.9.8.0 (2018/05/28) FindBugs 対応で、groupCheckの判定方法に、groups == null も入れる。
2194         *
2195         * @param guiInfo 画面オブジェクト
2196         *
2197         * @return groupsが nullか、グループスに含まれるかどうか
2198         */
2199        private boolean groupCheck( final GUIInfo guiInfo ) {
2200                // 6.9.8.0 (2018/05/28) FindBugs:コンストラクタで初期化されていないフィールドを null チェックなしで null 値を利用している
2201                if( groups == null ) { return true; }
2202                else {
2203                        boolean flg = false;
2204
2205                        for( int k=0; k<groups.length; k++ ) {
2206                                if( guiInfo.isGroupIn( groups[k] ) ) {
2207                                        flg = true;
2208                                        break;
2209                                }
2210                        }
2211
2212                        return flg;
2213                }
2214        }
2215
2216        /**
2217         * このオブジェクトの文字列表現を返します。
2218         * 基本的にデバッグ目的に使用します。
2219         *
2220         * @return このクラスの文字列表現
2221         * @og.rtnNotNull
2222         */
2223        @Override
2224        public String toString() {
2225                return ToString.title( this.getClass().getName() )
2226                                .println( "VERSION"                             ,VERSION                        )
2227                                .println( "menuType"                    ,menuType                       )
2228                                .println( "expand"                              ,expand                         )
2229                                .println( "groups"                              ,groups                         )
2230                                .println( "selClassify"                 ,selClassify            )
2231                                .println( "href"                                ,href                           )
2232                                .println( "target"                              ,target                         )
2233                                .println( "imageOnly"                   ,imageOnly                      )
2234                                .println( "sideCount"                   ,sideCount                      )
2235                                .println( "minCellCount"                ,minCellCount           )
2236                                .println( "maxCellCount"                ,maxCellCount           )
2237                                .println( "cache"                               ,cache                          )
2238                                .println( "mscKey"                              ,mscKey                         )
2239//                              .println( "multiSessionCheck"   ,multiSessionCheck      )       // 6.9.5.0 (2018/04/23) multiSessionCheck 廃止(true固定)
2240                                .println( "useButton"                   ,useButton                      )
2241                                .println( "buttonRequest"               ,buttonRequest          )
2242                                .println( "MENU_TYPE"                   ,MENU_TYPE_SET          )       // 6.4.3.4 (2016/03/11)
2243                                .println( "Other..."    ,getAttributes().getAttribute() )
2244                                .fixForm().toString() ;
2245        }
2246}