    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.resource;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.fukurou.util.StringUtil;
    021import org.opengion.fukurou.util.HybsEntry;
    022
    023import java.util.List;
    024import java.util.ArrayList;
    025import java.util.Set;
    026import java.util.LinkedHashSet;
    027
    028/**
    029 * 画面情報の取得の為のインターフェースです。
    030 *
    031 * {&#064;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 */
    062public 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         画面データオブジェクトID
    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         * 　0:予約階層(将来的にタブブラウザ対応時に使用
    197         * 　1:トップ階層(通常のメニューの分類として表示されます。)
    198         * 　2:選択階層(通常の折りたたみメニューの画面選択時に使用されます。)
    199         * 　3以下:下位階層(通常の選択メニューとして、１段下げて表示されます。)
    200         * です。
    201         * なお、これらの意味は、実際にメニューを作成/表示するクラスに依存します。
    202         *
    203         * @return      画面の表示順
    204         */
    205        public int getLevel() {
    206                return level;
    207        }
    208
    209        /**
    210         * 画面の階層番号(レベル)をアップします。
    211         *
    212         * これは、レベルが３の場合(階層時の隠しメニュー)をレベル２に
    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 プルダウン化の場合true
    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"      ) , "画面カラムID" ) );
    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         * この画面へのアクセス回数を、＋１します。
    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         * エラー発生時の件数を＋１します。
    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 );       // 画面カラムID
    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}