001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.hayabusa.resource;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.fukurou.util.StringUtil;
021    import org.opengion.fukurou.util.HybsEntry;
022    
023    import java.util.List;
024    import java.util.ArrayList;
025    import java.util.Set;
026    import java.util.LinkedHashSet;
027    
028    /**
029     * 画面æƒ??の取得ã?為のインターフェースですã?
030     *
031     * {@GUI.XXXX} で、XXXX 部に、GUIInfo オブジェクトで定義されてã�?‚‹
032     * 属æ?æƒ??を取りå?すことがå?来ますã?
033     *
034     * ・KEY           画面ID
035     * ・ADDRESS       実行アドレス
036     * ・REALADDRESS   実行実アドレス
037     * ・SEQUENCE      表示é ?
038     * ・GROUPS        メニュグルーãƒ?
039     * ・CLASSIFY      メニュåˆ?¡?
040     * ・LEVEL         メニュ階層番号
041     * ・LABEL         画面名称
042     * ・NAME          画面名称(=SNAME)
043     * ・SNAME         画面名称(short)
044     * ・LNAME         画面名称(long)
045     * ・ROLES         ロールズ
046     * ・MODE          アクセスモードå?(mr,mw,-r,-w のç¾??)
047     * ・TARGET        ターゲãƒ?ƒˆ
048     * ・PARAM         設定å?(パラメータ)
049     * ・KBLINK        リンク区åˆ?
050     * ・DESCRIPTION   概要説æ˜?
051     * ・IMAGEKEY      イメージキー
052     * ・DYUPD         更新日æ™?
053     * ・ISREAD        読取り許可[true/false]
054     * ・ISWRITE       書込み許可[true/false]
055     *
056     * @og.group リソース管ç�?
057     *
058     * @version  4.0
059     * @author   Kazuhiko Hasegawa
060     * @since    JDK5.0,
061     */
062    public final class GUIInfo implements Comparable<GUIInfo> {       // 4.3.3.6 (2008/11/15) Generics警告対å¿?
063    
064            private static final String YOYAKU = "|KEY|ADDRESS|REALADDRESS|SEQUENCE"
065                                                                                    + "|GROUPS|CLASSIFY|LEVEL|LABEL|NAME"
066                                                                                    + "|SNAME|LNAME|ROLES|MODE|TARGET"
067    //                                                                              + "|PARAM|KBLINK|DESCRIPTION|" ;
068    //                                                                              + "|PARAM|KBLINK|DESCRIPTION|DYUPD|" ;
069                                                                                    + "|PARAM|KBLINK|DESCRIPTION|DYUPD|IMAGEKEY|" ;         // 5.5.2.5 (2012/05/21) イメージアイコン
070    
071            private final GUIData   guiData ;
072            private final LabelData labelData ;
073            private final String[]  groupKeys ;
074    
075            private final boolean   menuFlag  ;             // メニューへの表示可否属æ?
076            private final boolean   writeFlag ;             // 書き込み許可属æ?
077    //      private final boolean   fileDFlag ;             // 4.3.0.0 (2008/07/04) ファイル出力許可属æ?
078    //      private final boolean   fileUFlag ;             // 4.3.0.0 (2008/07/04) ファイル入力許可属æ?
079            private final byte              bitMode ;               // ビットモーãƒ?UserInfo åŠ?‘³済み)
080            private final boolean   pulldownFlag;   // 4.3.3.0 (2008/10/01) 強制プルãƒ?‚¦ン化属æ?
081    
082            private final GUIAccessCount accessCount ;              // こã?画面へのアクセス統計を管ç�?�—ますã?
083    
084            private int   level = 0;
085    
086            private final Set<String> nextGui = new LinkedHashSet<String>();    // 5.2.3.0 (2010/12/01) アクセス履歴管ç�?
087    
088            /**
089             * コンストラクター
090             *
091             * 引数の bitMode は、UserInfo とåŠ?‘³済み
092             *
093             * @og.rev 4.3.0.0 (2008/07/04) ファイル入出力制御追åŠ?
094             * @og.rev 4.3.3.0 (2008/10/01) 強制プルãƒ?‚¦ンモード追åŠ?
095             *
096             * @param       guiData         画面ãƒ??タオブジェクãƒ?D
097             * @param       labelData       ラベルãƒ??タオブジェクãƒ?
098             * @param       bitMode ビットモードé?åˆ?"--:000","-r:001","-w:010","mr:101","mw:110" に対応した数å­?0,1,2,5,6)
099             */
100            public GUIInfo( final GUIData   guiData ,
101                                            final LabelData labelData ,
102                                            final byte              bitMode ) {
103                    this.guiData    = guiData;
104                    this.labelData  = labelData;
105                    groupKeys               = StringUtil.csv2Array( guiData.getGroups() );
106    
107                    menuFlag        = RoleMode.isMenu( bitMode );
108                    writeFlag       = RoleMode.isWrite( bitMode );
109                    pulldownFlag = RoleMode.isPulldown( bitMode ); // 4.3.3.0 (2008/10/01)
110    //              fileDFlag       = RoleMode.isDownload( bitMode );
111    //              fileUFlag       = RoleMode.isUpload( bitMode );
112                    accessCount = new GUIAccessCount( guiData.getGuiKey() ) ;
113                    this.bitMode = bitMode ;
114    
115                    level = guiData.getGuiLevel();
116            }
117    
118            /**
119             * 画面æƒ?? 画面ID を取得しますã?
120             *
121             * @return      画面ID
122             */
123            public String getKey() {
124                    return guiData.getGuiKey();
125            }
126    
127            /**
128             * 実行アドレスæƒ??を取得しますã?
129             *
130             * @return      実行アドレス
131             */
132            public String getAddress() {
133                    return guiData.getAddress();
134            }
135    
136            /**
137             * トップからã?実行アドレスæƒ??を取得しますã?
138             * コンãƒ?‚­スト名とリンク区åˆ?±žæ?を利用して、サーバã?トップからã?アドレスã‚?
139             * 返しますã?ただしã?GUIリソースに、http://??またã?ã€???から始まるアドレスは
140             * そã?まま、なにも変換せずに返しますã?
141             * 実アドレスには、param属æ?のæƒ??を付加しますã?param属æ?は、接続文字を用ã�?�šに
142             * そã?まま連結されますã?でã€?index.jsp?AAA=XX&amp;BBB=YY とã�?�†感じで "/" から
143             * はじめますã?
144             *
145             * http://AAAA  � http://AAAA
146             * ../../AAAA/  � ../../AAAA/
147             * AAAA         â‡? /CONTEXT_NAME/KBLINK/AAAA/    param なã�?
148             * AAAA         â‡? /CONTEXT_NAME/KBLINK/AAAA/index.jsp?AAA=XX&amp;BBB=YY  param あり
149             *
150             * @og.rev 3.5.5.0 (2004/03/12) 新規追åŠ?
151             * @og.rev 4.0.0.0 (2005/01/31) param属æ?追åŠ?
152             *
153             * @return      実行実アドレス
154             */
155            public String getRealAddress() {
156                    return guiData.getRealAddress();
157            }
158    
159            /**
160             * トップからã?実行アドレスæƒ??を取得しますã?
161             * コンãƒ?‚­スト名とリンク区åˆ?±žæ?を利用して、サーバã?トップからã?アドレスã‚?
162             * 返しますã?ただしã?GUIリソースに、http://??またã?ã€???から始まるアドレスは
163             * そã?まま、なにも変換せずに返しますã?
164             * 実アドレスには、param属æ?のæƒ??を付加しますã?param属æ?は、接続文字を用ã�?�šに
165             * そã?まま連結されますã?でã€?index.jsp?AAA=XX&amp;BBB=YY とã�?�†感じで "/" から
166             * はじめますã?
167             * またã?アドレスのæœ?¾Œがスラãƒ?‚·ュ(/)で終äº?�—てã�?‚‹場合ã?、page属æ?を追åŠ?�—ますã?
168             *
169             * http://AAAA  � http://AAAA
170             * ../../AAAA/  � ../../AAAA/
171             * AAAA         â‡? /CONTEXT_NAME/KBLINK/AAAA/    param なã�?
172             * AAAA         â‡? /CONTEXT_NAME/KBLINK/AAAA/index.jsp?AAA=XX&amp;BBB=YY  param あり
173             *
174             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?param属æ?追åŠ?
175             *
176             * @param    page          実行ã?ージ(index.jsp など)
177             *
178             * @return      実行実アドレス
179             */
180            public String getRealAddress( final String page ) {
181                    return guiData.getRealAddress( page );
182            }
183    
184            /**
185             * 画面の表示é ?‚’取得しますã?
186             *
187             * @return      画面の表示é ?
188             */
189            public int getSequence() {
190                    return guiData.getSeqno();
191            }
192    
193            /**
194             * 画面の階層番号(レベル)を取得しますã?
195             * 画面階層はã€?
196             * ã€?:予ç´?šŽ層(å°?�¥çš?�«タブブラウザ対応時に使用
197             * ã€?:トップ階層(通常のメニューのåˆ?¡žとして表示されますã?)
198             * ã€?:選択階層(通常の折りたたみメニューの画面選択時に使用されますã?)
199             * ã€?以ä¸?下位階層(通常の選択メニューとしてã€?¼‘段下げて表示されますã?)
200             * ですã?
201             * なおã?これらã?意味は、実際にメニューを作æ?/表示するクラスに依存しますã?
202             *
203             * @return      画面の表示é ?
204             */
205            public int getLevel() {
206                    return level;
207            }
208    
209            /**
210             * 画面の階層番号(レベル)をアãƒ??しますã?
211             *
212             * これは、レベルが3ã?場å�?階層時ã?éš?�—メニュー)をレベル?’に
213             * することで、常に見えてã�?‚‹メニューに格上げしますã?
214             * 具体的には、設定å?が隠しメニューの場合に、アクセスするとレベル?’へ格上げ
215             * することで、å?人単位でã€?�Ž去の履歴に応じたメニュー配置が可能になりますã?
216             */
217            public void setLevelUp() {
218    //              if( level == 3 ) { level = 2; }
219                    if( level == 4 ) { level = 3; } // 4.0.0.0 (2007/10/30)
220            }
221    
222            /**
223             * 画面æƒ?? メニュグループã?オリジナルキー を取得しますã?
224             * メニュグループã?、カンマ区åˆ?‚Šでè¤?•°登録できますã?
225             *
226             * @return      メニュåˆ?¡žã?キー
227             */
228            public String getGroups() {
229                    return guiData.getGroups();
230            }
231    
232            /**
233             * æŒ?®šã?æ–?­—å?がグループに含まれてã�?‚‹かどã�?�‹を判定しますã?
234             * メニュグループã?、カンマ区åˆ?‚Šでè¤?•°登録できますã?で、そのã�?�¡の
235             * どれかに含まれてã�?‚Œば、true を返しますã?
236             * こã?メニューそã?もã?に、グループがæŒ?®šされてã�?�ªã�??合ã?ã€?
237             * ãƒ?ƒ•ォルトグループとã�?�†扱ã�?�§、true を返しますã?
238             * 引数がã?null またã?、ゼロæ–?­—å?の場合も、同様に、true を返しますã?
239             *
240             * @param       group   判定するグルーãƒ?
241             *
242             * @return      グループに含まれてã�?‚‹かどã�?�‹
243             */
244            public boolean isGroupIn( final String group ) {
245                    if( groupKeys.length == 0 || group == null || group.length() == 0 ) {
246                            return true;
247                    }
248    
249                    for( int i=0; i<groupKeys.length; i++ ) {
250                            if( group.equals( groupKeys[i] ) ) {
251                                    return true;
252                            }
253                    }
254                    return false;
255            }
256    
257            /**
258             * 画面æƒ?? メニュåˆ?¡žã?オリジナルキー を取得しますã?
259             *
260             * @return      メニュåˆ?¡žã?キー
261             */
262            public String getClassify() {
263                    return guiData.getClassify();
264            }
265    
266            /**
267             * 画面æƒ?? 画面名称 を取得しますã?
268             * これは、加工前ã?ラベルリソースに登録されてã�?‚‹値ですã?
269             *
270             * @return      画面名称
271             */
272            public String getLabel() {
273                    return labelData.getLabel();
274            }
275    
276            /**
277             * 画面æƒ?? 画面名称(short) を取得しますã?
278             * こã?名称は、チãƒ??表示付きのæ–?­—å?を返しますã?
279             *
280             * @return      画面名称(short)
281             */
282            public String getName() {
283                    return labelData.getShortLabel();
284            }
285    
286            /**
287             * 画面æƒ?? 画面名称(long) を取得しますã?
288             * こã?名称は、チãƒ??表示付きのæ–?­—å?を返しますã?
289             *
290             * @return      画面名称(long)
291             */
292            public String getLongName() {
293                    return labelData.getLongLabel();
294            }
295    
296            /**
297             * 画面æƒ?? ロール を取得しますã?
298             * ロールは、AAA|BBB|CCC と『|』ã?区åˆ?‚Šæ–?­—でè¤?•°登録できますã?
299             * ユーザーのロール(こちらも、XXX|YYY|AAAとè¤?•°登録可能)とマッチすã‚?
300             * ロールがあれã?、その画面のアクセス許可がありますã?
301             * 読み書きと、メニュー表示は、アクセスモードでæŒ?®šしますã?
302             *
303             * @return      ロール
304             */
305            public String getRoles() {
306                    return guiData.getRoles();
307            }
308    
309            /**
310             * アクセスモードを取得しますã?
311             *
312             * r,w,_ を各ロール毎に設定しますã?
313             * mr:メニューよりアクセスできる読取専用画面ですã?登録ボタンは表示されませんã€?
314             * mw:メニューよりアクセスできる登録編é›?”»面ですã?表示もしますã?
315             * -r:メニューに現れませんがã?アクセスすることは可能ですã?読取専用ã€?
316             * -w:メニューに現れませんがã?アクセスすることは可能ですã?読み書きå?来ますã?
317             *
318             * こã??’文字ずつのセãƒ?ƒˆがã?å�?ƒ­ールに対応付けられたアクセス制御になりますã?
319             * ロールがã?AAA|BBB|CCC|DDD で、モードが mw|mr|-r|-w であればã€?
320             * AAA は、mw , BBB は、mr ?ŒCCC はã€?r ?ŒDDD は -w と設定されたことになりますã?
321             * 特別にã€?¼’文字ã?み登録されたå?合ã?、å?ロールが同ä¸?ƒ¢ードに設å®?
322             * されたとみなしますã?
323             *
324             * @return      ロール毎ã?アクセスモードå?(mr,mw,-r,-w のç¾??)
325             */
326            public String getMode() {
327                    return guiData.getMode();
328            }
329    
330            /**
331             * 画面を表示する時ã?ターゲãƒ?ƒˆ属æ?を取得しますã?
332             *
333             * @return      ターゲãƒ?ƒˆ
334             */
335            public String getTarget() {
336                    return guiData.getTarget();
337            }
338    
339            /**
340             * 画面を表示する時ã?パラメータ属æ?を取得しますã?
341             *
342             * @return      パラメータ
343             */
344            public String getParam() {
345                    return guiData.getParam();
346            }
347    
348            /**
349             * リンク区åˆ?±žæ?を取得しますã?
350             *
351             * @og.rev 3.4.0.0 (2003/09/01) リンク区åˆ?KBLINK)属æ?を追åŠ??
352             *
353             * @return      リンク区åˆ?
354             */
355            public String getKblink() {
356                    return guiData.getKblink();
357            }
358    
359            /**
360             * 概要説明属æ?を取得しますã?
361             * 概要説明が設定されてã�?�ªã�??合ã?、longName を返しますã?
362             *
363             * @og.rev 3.5.6.5 (2004/08/09) 概要説æ˜?DESCRIPTION)属æ?を追åŠ??
364             *
365             * @return      概要説æ˜?
366             */
367            public String getDescription() {
368                    return labelData.getDescription() ;
369            }
370    
371            /**
372             * 更新日時を取得しますã?
373             *
374             * @og.rev 5.3.3.0 (2011/03/01) 新規作æ?
375             *
376             * @return      更新日æ™?
377             */
378            public String getDyupd() {
379                    return guiData.getDyupd();
380            }
381    
382            /**
383             * イメージアイコンのキーを返しますã?
384             *
385             * 画面にアイコンを追åŠ?�™るå?合ã?jsp/menuImage フォルãƒ?�«、画面ID と同じ名称の
386             * 画像ファイルを置くå¿?¦�がありますã?
387             * 本来は、画面リソース(GEA11)に、カラãƒ?‚’追åŠ?�—て対応すべきですが、互換性の関係よりã?
388             * PARAM 属æ?で、所定ã?キーを登録することで使えるようにしますã?
389             * こã?、PARAMは、画面アドレスの引数(たとえã?、command=NEW など)を使ã�?�Ÿめã?パラメータですがã€?
390             * アイコン割り当て(IMAGE_KEY=XXXX)を使用することで、XXXX をキーとして使ã�?�¾すã?
391             * IMAGE_KEY=XXXX が指定されなã�??合ã?、画面IDがã?imageKey として返されますã?
392             *
393             * @og.rev 5.5.2.5 (2012/05/21) 新規追åŠ?
394             *
395             * @return      イメージアイコンのキー
396             */
397            public String getImageKey() {
398                    return guiData.getImageKey();
399            }
400    
401            /**
402             * ロールモード情報を取得しますã?
403             *
404             * @og.rev 4.3.0.0 (2008/07/04) 新規追åŠ?
405             *
406             * @return      ロールモーãƒ?
407             */
408            public RoleMode getRoleMode() {
409                    return guiData.getRoleMode() ;
410            }
411    
412            /**
413             * リードアクセス(読取り許可)の 可否ã‚?チェãƒ?‚¯しますã?
414             * アクセスチェãƒ?‚¯は、画面のロールをユーザーの
415             * それと比è¼?�—て条件が含まれてã�?‚‹かどã�?�‹を確認しますã?
416             * 条件ã�?null (またã??�ストリング)の場合ã?, true となりますã?
417             * 条件の判断は、AND 条件ですã?
418             * さらに、その他ã?条件部åˆ?‚’判断して、OR 条件で先ã?結果と突き合わせますã?
419             * ユーザーのロールがã? "root" の場合ã?,rw 属æ?のみのチェãƒ?‚¯で判断しますã?
420             *
421             * @og.rev 3.5.4.0 (2003/11/25) 引数にロールズを渡しますã?
422             *
423             * @return  アクセスOK?štrue  アクセス拒否?šfalse
424             */
425            public boolean isRead() {
426                    return menuFlag;
427            }
428    
429            /**
430             * ライトアクセス(書込み許可)の 可否ã‚?チェãƒ?‚¯しますã?
431             * アクセスチェãƒ?‚¯は、画面のロールをユーザーの
432             * それと比è¼?�—て条件が含まれてã�?‚‹かどã�?�‹を確認しますã?
433             * 条件ã�?null (またã??�ストリング)の場合ã?, true となりますã?
434             * 条件の判断は、AND 条件ですã?
435             * さらに、その他ã?条件部åˆ?‚’判断して、OR 条件で先ã?結果と突き合わせますã?
436             * ユーザーのロールがã? "root" の場合ã?,rw 属æ?のみのチェãƒ?‚¯で判断しますã?
437             *
438             * @og.rev 3.5.4.0 (2003/11/25) 引数にロールズを渡しますã?
439             *
440             * @return  アクセスOK?štrue  アクセス拒否?šfalse
441             */
442            public boolean isWrite() {
443                    return writeFlag;
444            }
445    
446            /**
447             * ボタンメニューにプルãƒ?‚¦ンを指定するã?かをチェãƒ?‚¯しますã?
448             *
449             * @og.rev 4.3.3.0 (2008/10/01) 新規作æ?
450             *
451             * @return プルãƒ?‚¦ン化ã?場å�?rue
452             */
453            public boolean isPulldown() {
454                    return pulldownFlag;
455            }
456    
457            /**
458             * æŒ?®šã?ユーザーロールに対するビット条件を取得しますã?
459             * こã? bitMode は、すでにユーザー単位に作æ?されたå?ですã?
460             *
461             * @og.rev 4.3.0.0 (2008/07/04) ロールモードã?ルチ対å¿?
462             *
463             * @return アクセスビッãƒ?
464             */
465            public byte getBitMode() {
466                    return bitMode;
467            }
468            
469            /**
470             * FAQがGE80に関連画面IDとして存在してã�?‚‹かどã�?�‹
471             * 
472             * @og.rev 5.6.4.3 (2013/05/25) 追åŠ?
473             *
474             * @return      FAQの存在
475             */
476            public boolean isFaq() {
477                    return guiData.isFaq();
478            }
479    
480            /**
481             * ファイル出åŠ?ファイル出力許可)の 可否ã‚?チェãƒ?‚¯しますã?
482             * ファイル出力ã?、画面個ã?に設定できる フロãƒ?ƒ”ーアイコンを制御するのに
483             * 使用しますã?
484             * ユーザーと画面のロールを比è¼?�—て条件が含まれてã�?‚‹かどã�?�‹を確認しますã?
485             *
486             * @og.rev 4.3.0.0 (2008/07/04) 新規追åŠ?
487             *
488             * @return  ファイル出力許可?štrue  ファイル出力不可?šfalse
489             */
490    //      public boolean isFileDownload() {
491    //              return fileDFlag;
492    //      }
493    
494            /**
495             * ファイル入åŠ?ファイル入力許可)の 可否ã‚?チェãƒ?‚¯しますã?
496             * ファイル入力ã?、画面個ã?に設定できる フロãƒ?ƒ”ーアイコンを制御するのに
497             * 使用しますã?
498             * ユーザーと画面のロールを比è¼?�—て条件が含まれてã�?‚‹かどã�?�‹を確認しますã?
499             *
500             * @og.rev 4.3.0.0 (2008/07/04) 新規追åŠ?
501             *
502             * @return  ファイル入力許可?štrue  ファイル入力不可?šfalse
503             */
504    //      public boolean isFileUpload() {
505    //              return fileUFlag;
506    //      }
507    
508            /**
509             * GUIInfoの属æ?æ–?­—å?を取得しますã?
510             *
511             * ・KEY           画面ID
512             * ・ADDRESS       実行アドレス
513             * ・REALADDRESS   実行実アドレス
514             * ・SEQUENCE      表示é ?
515             * ・GROUPS        メニュグルーãƒ?
516             * ・CLASSIFY      メニュåˆ?¡?
517             * ・LEVEL         メニュ階層番号
518             * ・LABEL         画面名称
519             * ・NAME          画面名称(=SNAME)
520             * ・SNAME         画面名称(short)
521             * ・LNAME         画面名称(long)
522             * ・ROLES         ロール
523             * ・MODE          アクセスモードå?(mr,mw,-r,-w のç¾??)
524             * ・TARGET        ターゲãƒ?ƒˆ
525             * ・PARAM         設定å?(パラメータ)
526             * ・KBLINK        リンク区åˆ?
527             * ・DESCRIPTION   概要説æ˜?
528             * ・IMAGEKEY      イメージキー
529             * ・DYUPD         更新日æ™?
530             * ・ISREAD        読取り許可[true/false]
531             * ・ISWRITE       書込み許可[true/false]
532             *
533             * @og.rev 3.4.0.0 (2003/09/01) リンク区åˆ?KBLINK)属æ?を追åŠ??
534             * @og.rev 3.5.5.0 (2004/03/12) 実行実アドレス(REALADDRESS)属æ?を追åŠ??
535             * @og.rev 3.5.6.5 (2004/08/09) 概要説æ˜?DESCRIPTION)属æ?を追åŠ??
536             * @og.rev 4.0.0.0   (2005/11/30) ISREAD,ISWRITE 属æ?を追åŠ??
537             * @og.rev 5.3.3.0 (2011/03/01) 更新日時を追åŠ?
538             * @og.rev 5.5.2.5 (2012/05/21) IMAGEKEY 追åŠ?
539             * @og.rev 5.6.4.3 (2013/05/25) FAQ追åŠ?
540             *
541             * @param       key     キー
542             *
543             * @return      属æ?æ–?­—å?の値
544             */
545            public String getAttribute( final String key ) {
546                    if( key == null ) { return null; }
547                    final String rtn ;
548    
549                    if(      key.equalsIgnoreCase( "KEY"         ) ) { rtn = getKey(); }
550                    else if( key.equalsIgnoreCase( "GUICLM"      ) ) { rtn = labelData.getKey(); }
551                    else if( key.equalsIgnoreCase( "ADDRESS"     ) ) { rtn = getAddress(); }
552                    else if( key.equalsIgnoreCase( "REALADDRESS" ) ) { rtn = getRealAddress(); }
553                    else if( key.equalsIgnoreCase( "SEQUENCE"    ) ) { rtn = String.valueOf( getSequence() ); }
554                    else if( key.equalsIgnoreCase( "GROUPS"      ) ) { rtn = getGroups(); }
555                    else if( key.equalsIgnoreCase( "CLASSIFY"    ) ) { rtn = getClassify(); }
556                    else if( key.equalsIgnoreCase( "LEVEL"       ) ) { rtn = String.valueOf( getLevel() ); }
557                    else if( key.equalsIgnoreCase( "LABEL"       ) ) { rtn = getLabel(); }
558                    else if( key.equalsIgnoreCase( "NAME"        ) ) { rtn = getName(); }
559                    else if( key.equalsIgnoreCase( "SNAME"       ) ) { rtn = getName(); }
560                    else if( key.equalsIgnoreCase( "LNAME"       ) ) { rtn = getLongName(); }
561                    else if( key.equalsIgnoreCase( "ROLE"        ) ) { rtn = getRoles(); }
562                    else if( key.equalsIgnoreCase( "ROLES"       ) ) { rtn = getRoles(); }
563                    else if( key.equalsIgnoreCase( "MODE"        ) ) { rtn = getMode(); }
564                    else if( key.equalsIgnoreCase( "TARGET"      ) ) { rtn = getTarget(); }
565                    else if( key.equalsIgnoreCase( "PARAM"       ) ) { rtn = getParam(); }
566                    else if( key.equalsIgnoreCase( "KBLINK"      ) ) { rtn = getKblink(); }
567                    else if( key.equalsIgnoreCase( "DESCRIPTION" ) ) { rtn = getDescription(); }    // 3.5.6.5 (2004/08/09)
568                    else if( key.equalsIgnoreCase( "IMAGEKEY"    ) ) { rtn = getImageKey(); }               // 3.5.6.5 (2004/08/09)
569                    else if( key.equalsIgnoreCase( "DYUPD"       ) ) { rtn = getDyupd(); }                  // 5.5.2.5 (2012/05/21)
570                    else if( key.equalsIgnoreCase( "ISREAD"      ) ) { rtn = String.valueOf( isRead() ); }  // 4.0.0 (2005/11/30)
571                    else if( key.equalsIgnoreCase( "ISWRITE"     ) ) { rtn = String.valueOf( isWrite() ); } // 4.0.0 (2005/11/30)
572                    else if( key.equalsIgnoreCase( "FAQ"         ) ) { rtn = String.valueOf(isFaq()); } // 5.6.4.3 (2013/05/24)
573                    else {
574                            String errMsg = "属æ?æ–?­—å?キーが不正ですã? key=[" + key + "]"
575                                                    + HybsSystem.CR
576                                                    + "予ç´?ª?" + YOYAKU + ") 以外ã?æŒ?®šできませんã€? ;
577                            throw new HybsSystemException( errMsg );
578                    }
579                    return rtn ;
580            }
581    
582            /**
583             * GUIInfoの属æ?æ–?­—å?のå†?ƒ¨æƒ??を返しますã?
584             * こã?å†?ƒ¨æƒ??の中には、getAttribute( String ) で取得できる管ç�?ƒ…報ですã?
585             *
586             * @og.rev 4.0.0.0 (2004/12/31) 新規作æ?
587             * @og.rev 5.3.3.0 (2011/03/01) 更新日時を追åŠ?
588             * @og.rev 5.5.2.5 (2012/05/21) IMAGEKEY 追åŠ?
589             *
590             * @return      属æ?æ–?­—å?のHybsEntryオブジェクトé?åˆ?
591             */
592            public HybsEntry[] getEntrys() {
593                    List<HybsEntry> list = new ArrayList<HybsEntry>();
594    
595                    list.add( new HybsEntry( "GUI.KEY"         , getAttribute( "KEY"         ) , "画面ID" ) );
596                    list.add( new HybsEntry( "GUI.GUICLM"      , getAttribute( "GUICLM"      ) , "画面カラãƒ?D" ) );
597                    list.add( new HybsEntry( "GUI.ADDRESS"     , getAttribute( "ADDRESS"     ) , "実行アドレス" ) );
598                    list.add( new HybsEntry( "GUI.REALADDRESS" , getAttribute( "REALADDRESS" ) , "実行実アドレス" ) );
599                    list.add( new HybsEntry( "GUI.SEQUENCE"    , getAttribute( "SEQUENCE"    ) , "表示é ? ) );
600                    list.add( new HybsEntry( "GUI.GROUPS"      , getAttribute( "GROUPS"      ) , "メニュグルーãƒ? ) );
601                    list.add( new HybsEntry( "GUI.CLASSIFY"    , getAttribute( "CLASSIFY"    ) , "メニュåˆ?¡? ) );
602                    list.add( new HybsEntry( "GUI.LEVEL"       , getAttribute( "LEVEL"       ) , "メニュ階層番号" ) );
603                    list.add( new HybsEntry( "GUI.LABEL"       , getAttribute( "LABEL"       ) , "画面名称" ) );
604                    list.add( new HybsEntry( "GUI.NAME"        , getAttribute( "NAME"        ) , "画面名称(=SNAME)" ) );
605                    list.add( new HybsEntry( "GUI.SNAME"       , getAttribute( "SNAME"       ) , "画面名称(short)" ) );
606                    list.add( new HybsEntry( "GUI.LNAME"       , getAttribute( "LNAME"       ) , "画面名称(long)" ) );
607                    list.add( new HybsEntry( "GUI.ROLES"       , getAttribute( "ROLES"       ) , "ロール" ) );
608                    list.add( new HybsEntry( "GUI.MODE"        , getAttribute( "MODE"        ) , "アクセスモードå?(mr,mw,-r,-w のç¾??)" ) );
609                    list.add( new HybsEntry( "GUI.TARGET"      , getAttribute( "TARGET"      ) , "ターゲãƒ?ƒˆ" ) );
610                    list.add( new HybsEntry( "GUI.PARAM"       , getAttribute( "PARAM"       ) , "パラメータ" ) );
611                    list.add( new HybsEntry( "GUI.KBLINK"      , getAttribute( "KBLINK"      ) , "リンク区åˆ? ) );
612                    list.add( new HybsEntry( "GUI.DESCRIPTION" , getAttribute( "DESCRIPTION" ) , "概要説æ˜? ) );
613                    list.add( new HybsEntry( "GUI.IMAGEKEY"    , getAttribute( "IMAGEKEY"    ) , "イメージキー" ) );        // 5.5.2.5 (2012/05/21)
614                    list.add( new HybsEntry( "GUI.DYUPD"       , getAttribute( "DYUPD"       ) , "更新日æ™? ) );             // 5.3.3.0 (2011/03/01)
615                    list.add( new HybsEntry( "GUI.ISREAD"      , getAttribute( "ISREAD"      ) , "読取り許可[true/false]" ) );
616                    list.add( new HybsEntry( "GUI.ISWRITE"     , getAttribute( "ISWRITE"     ) , "書込み許可[true/false]" ) );
617    
618                    return list.toArray( new HybsEntry[list.size()] );
619            }
620    
621            /**
622             * ãƒ??タベã?ス検索した数と、掛かった時é–?ms)をã?セãƒ?ƒˆしますã?
623             * これは、セキュリãƒ?‚£上ã?監視フラグで、不å¿?¦�に、大量ã?
624             * ãƒ??タが検索されたå?合や、不正なãƒ??タアクセスがあるかどã�?�‹ã‚?
625             * 監視するためã?統計情報を取得しますã?
626             * 画面オブジェクトã?、各ユーザー毎に作æ?されてã�?‚‹ため、å?ã€??
627             * ユーザーæ¯?画面毎ã?アクセス状況を見ることが可能になりますã?
628             *
629             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
630             *
631             * @param  cnt ãƒ??タベã?ス検索した数
632             * @param  time ãƒ??タベã?ス検索した数
633             * @param  query そã?ときã?SQLæ–?
634             */
635            public void addReadCount( final int cnt,final long time,final String query ) {
636                    accessCount.addReadCount( cnt,time,query );
637            }
638    
639            /**
640             * ãƒ??タベã?ス登録した数と、掛かった時é–?ms)をã?セãƒ?ƒˆしますã?
641             * これは、セキュリãƒ?‚£上ã?監視フラグで、不å¿?¦�に、大量ã?
642             * ãƒ??タが登録されたå?合や、不正なãƒ??タアクセスがあるかどã�?�‹ã‚?
643             * 監視するためã?統計情報を取得しますã?
644             * 画面オブジェクトã?、各ユーザー毎に作æ?されてã�?‚‹ため、å?ã€??
645             * ユーザーæ¯?画面毎ã?アクセス状況を見ることが可能になりますã?
646             *
647             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
648             *
649             * @param  cnt ãƒ??タベã?ス登録した数
650             * @param  time ãƒ??タベã?ス検索した数
651             * @param  query そã?ときã?SQLæ–?
652             */
653            public void addWriteCount( final int cnt,final long time,final String query ) {
654                    accessCount.addWriteCount( cnt,time,query );
655            }
656    
657            /**
658             * こã?画面へのアクセス回数をã??‹1しますã?
659             * アクセス回数は、このメソãƒ?ƒ‰の呼び出し回数のことですã?
660             * 現状では、result.jsp 画面でセãƒ?ƒˆすることで、アクセス数ã‚?
661             * 数えることにしますã?
662             *
663             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
664             *
665             */
666            public void addAccessCount() {
667    //              if( level == 3 ) { level = 2; }
668                    if( level == 4 ) { level = 3; } // 4.0.0.0 (2007/10/30)
669                    accessCount.addAccessCount();
670            }
671    
672            /**
673             * エラー発生時の件数を+1しますã?
674             * これは、エラー発生時に呼び出すことで、エラー件数をチェãƒ?‚¯することã�?
675             * 可能になりますã?
676             * ä¸?ˆ¬にエラーには、予期するエラー(å¿??入力登録漏れç­?と、予期しなã�?‚¨ラー
677             * がありますが、ここでは、Java の Exceptionが発生する予期しなã�?‚¨ラーの
678             * 件数をカウントしますã?
679             *
680             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
681             *
682             */
683            public void addErrorCount() {
684                    accessCount.addErrorCount();
685            }
686    
687            /**
688             * こã?画面のアクセス統計オブジェクトを取得しますã?
689             *
690             * @og.rev 4.0.0.0 (2005/01/31) 新規追åŠ?
691             *
692             * @return      アクセス統計オブジェクãƒ?
693             */
694            public GUIAccessCount getGUIAccessCount() {
695                    return accessCount;
696            }
697    
698            /**
699             * こã?画面の次にアクセスされた画面IDをセãƒ?ƒˆしますã?
700             *
701             * これは、画面アクセスの履歴(é ?•ª)を管ç�?�™る機è?を提供しますã?
702             * 自åˆ??身の次にアクセスされる画面IDのé›?�ˆを管ç�?�™ることで
703             * QUERY画面上部のショートカãƒ?ƒˆリンクに、次に使用する画面の
704             * リンクを用意することが可能になりますã?
705             *
706             * @og.rev 5.2.3.0 (2010/12/01) アクセス履歴管ç�?
707             *
708             * @param       guiKey  こã?画面の次にアクセスされた画面ID
709             */
710            public void setNextGuiKey( final String guiKey ) {
711                    // 自åˆ??身の場合ã?、セãƒ?ƒˆしなã�??
712                    if( guiKey != null && !guiKey.equals( getKey() ) ) {
713                            synchronized( nextGui ) {
714                                    // 再挿入を避けてã�?‚‹のは、å?ç�?™‚間をè€??してã�?‚‹ã�?�‘。意味があるかは不æ?ã€?
715                                    if( !nextGui.contains( guiKey ) ) {
716                                            nextGui.add( guiKey ) ;
717                                    }
718                            }
719                    }
720            }
721    
722            /**
723             * こã?画面の次にアクセスされた画面IDのCSVæ–?­—å?を取得しますã?
724             *
725             * これは、画面アクセスの履歴(é ?•ª)をカンマ区åˆ?‚Šæ–?­—å?で取り出しますã?
726             * アクセス履歴を外部記æ?媒体に出力するå?合に使用しますã?
727             *
728             * @og.rev 5.2.3.0 (2010/12/01) アクセス履歴管ç�?
729             *
730             * @return      こã?画面の次にアクセスされた画面IDのCSVæ–?­—å?
731             */
732            public String getNextGuiKeys() {
733                    StringBuilder buf = new StringBuilder();
734                    synchronized( nextGui ) {
735                            for( String key : nextGui ) {
736                                    buf.append( key ).append( "," );
737                            }
738                    }
739                    return buf.toString();
740            }
741    
742            /**
743             * こã?画面の次にアクセスされた画面IDのæ–?­—å?配å?で取得しますã?
744             *
745             * これは、画面アクセスの履歴(é ?•ª)を文字å?配å?で取り出しますã?
746             *
747             * @og.rev 5.2.3.0 (2010/12/01) アクセス履歴管ç�?
748             *
749             * @return      こã?画面の次にアクセスされた画面IDのæ–?­—å?配å?
750             */
751            public String[] getNextGuiArray() {
752                    final String[] rtnAry ;
753                    synchronized( nextGui ) {
754                            rtnAry = nextGui.toArray( new String[nextGui.size()] );
755                    }
756    
757                    return rtnAry ;
758            }
759            
760            /**
761             * 自然比è¼?ƒ¡ソãƒ?ƒ‰
762             * インタフェース Comparable の 実è£?�«関連して、å?定義してã�?�¾すã?
763             * 登録されたシーケンス(画面の表示é ?で比è¼?�—ますã?
764             * equals メソãƒ?ƒ‰では、キーの同ä¸??のみにç�?›®して判定してã�?�¾すã?
765             * こã?比è¼?�§はã€?運用上同ä¸?‚­ーは発生しませんã�?たとえ同ä¸?‚­ーが存在した
766             * としてもã?そã?比è¼??が同じになることを保証してã�?�¾せんã€?
767             *
768             * @param   other 比è¼?¯¾象のObject
769             *
770             * @return  こã?オブジェクトがæŒ?®šされたオブジェクトより小さã�??合ã?è²??整数、等しã�??合ã?ゼロ、大きい場合ã?正の整数
771             * @throws  ClassCastException 引数ã�?GUIInfo ではなã�??å�?
772             * @throws  IllegalArgumentException 引数ã�?null の場å�?
773             */
774    //      public int compareTo( final Object object ) {
775            public int compareTo( final GUIInfo other ) {           // 4.3.3.6 (2008/11/15) Generics警告対å¿?
776    //              if( object == null ) {
777                    if( other == null ) {
778                            String errMsg = "引数がã?null ですã?" ;
779                            throw new IllegalArgumentException( errMsg );
780                    }
781                    return getSequence() - other.getSequence();             // 4.3.3.6 (2008/11/15) Generics警告対å¿?
782    
783    //              if( object instanceof GUIInfo ) {
784    //                      return getSequence() - ((GUIInfo)object).getSequence();         // 表示é ?
785    //              }
786    //              String errMsg = "引数ã�?GUIInfo オブジェクトではありませんã€? ;
787    //              throw new ClassCastException( errMsg );
788            }
789    
790            /**
791             * こã?オブジェクトと他ã?オブジェクトが等しã�?�‹どã�?�‹を示しますã?
792             * 画面は、画面IDが等しければ、è¨?ªžや表示é ?�«関係なく同ä¸?�¨みなされますã?
793             * GUIInfo は、ユーザー個別に扱われ、そのグループには、key は唯ä¸?�§、かつ
794             * 同ä¸?¨?ªžå?で扱われるオブジェクトã?為、同ä¸?�¨みなしますã?
795             *
796             * @param   object 比è¼?¯¾象の参ç?オブジェクãƒ?
797             *
798             * @return      引数にæŒ?®šされたオブジェクトとこã?オブジェクトが等しã�??合ã? true、そã�?�§なã�??合ã? false
799             */
800            @Override
801            public boolean equals( final Object object ) {
802                    if( object instanceof GUIInfo ) {
803                            return getKey().equals( ((GUIInfo)object).getKey() );
804                    }
805                    return false ;
806            }
807    
808            /**
809             * オブジェクトã?ハッシュコードå?を返しますã?
810             * こã?メソãƒ?ƒ‰は、java.util.Hashtable によって提供されるような
811             * ハッシュãƒ??ブルで使用するために用意されてã�?�¾すã?
812             * equals( Object ) メソãƒ?ƒ‰をオーバã?ライトしたå?合ã?、hashCode() メソãƒ?ƒ‰ã‚?
813             * å¿?�š 記述するå¿?¦�がありますã?
814             * こã?実è£?�§は、getKey().hashCode() と同å?を返しますã?
815             *
816             * @return  こã?オブジェクトã?ハッシュコードå?
817             */
818            @Override
819            public int hashCode() {
820                    return getKey().hashCode() ;
821            }
822    
823            /**
824             * オブジェクトã?識別子として?Œ詳細な画面æƒ??を返しますã?
825             *
826             * @og.rev 3.4.0.0 (2003/09/01) リンク区åˆ?KBLINK)属æ?を追åŠ??
827             * @og.rev 3.5.5.0 (2004/03/12) 実行アドレス(ADDRESS)属æ?を追åŠ??
828             * @og.rev 5.3.3.0 (2011/03/01) 更新日時を追åŠ?
829             * @og.rev 5.5.2.5 (2012/05/21) IMAGEKEY 追åŠ?
830             *
831             * @return  詳細な画面æƒ??
832             */
833            @Override
834            public String toString() {
835                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
836                    rtn.append( "key        :").append( getKey()           ).append( HybsSystem.CR );       // 画面ID
837                    rtn.append( "lvlclm     :").append( labelData.getKey() ).append( HybsSystem.CR );       // 画面カラãƒ?D
838                    rtn.append( "address    :").append( getAddress()       ).append( HybsSystem.CR );       // 実行アドレス
839                    rtn.append( "sequence   :").append( getSequence()      ).append( HybsSystem.CR );       // 表示é ?
840                    rtn.append( "groups     :").append( getGroups()        ).append( HybsSystem.CR );       // メニュグルーãƒ?
841                    rtn.append( "classify   :").append( getClassify()      ).append( HybsSystem.CR );       // メニュåˆ?¡?
842                    rtn.append( "level      :").append( getLevel()         ).append( HybsSystem.CR );       // 階層レベル
843                    rtn.append( "name       :").append( getName()          ).append( HybsSystem.CR );       // 画面名称
844                    rtn.append( "longName   :").append( getLongName()      ).append( HybsSystem.CR );       // 画面名称(long)
845                    rtn.append( "roles      :").append( getRoles()         ).append( HybsSystem.CR );       // ロール
846                    rtn.append( "mode       :").append( getMode()          ).append( HybsSystem.CR );       // アクセスモーãƒ? "rwrwrw"
847                    rtn.append( "target     :").append( getTarget()        ).append( HybsSystem.CR );       // ターゲãƒ?ƒˆ
848                    rtn.append( "kblink     :").append( getKblink()        ).append( HybsSystem.CR );       // リンク区åˆ?
849                    rtn.append( "description:").append( getDescription()   ).append( HybsSystem.CR );       // 概要説æ˜?
850                    rtn.append( "imageKey   :").append( getImageKey()      ).append( HybsSystem.CR );       // イメージキー 5.5.2.5 (2012/05/21)
851                    rtn.append( "dyupd      :").append( getDyupd()         ).append( HybsSystem.CR );       // 更新日æ™?
852                    return rtn.toString();
853            }
854    }