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 * {@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以下:下位階層(通常の選択メニューとして、1段下げて表示されます。)
200         * です。
201         * なお、これらの意味は、実際にメニューを作成/表示するクラスに依存します。
202         *
203         * @return      画面の表示順
204         */
205        public int getLevel() {
206                return level;
207        }
208
209        /**
210         * 画面の階層番号(レベル)をアップします。
211         *
212         * これは、レベルが3の場合(階層時の隠しメニュー)をレベル2に
213         * することで、常に見えているメニューに格上げします。
214         * 具体的には、設定値が隠しメニューの場合に、アクセスするとレベル2へ格上げ
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         * この2文字ずつのセットが、各ロールに対応付けられたアクセス制御になります。
319         * ロールが、AAA|BBB|CCC|DDD で、モードが mw|mr|-r|-w であれば、
320         * AAA は、mw , BBB は、mr ,CCC は、-r ,DDD は -w と設定されたことになります。
321         * 特別に、2文字のみ登録された場合は、全ロールが同一モードに設定
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 (または0ストリング)の場合は, 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 (または0ストリング)の場合は, 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         * この画面へのアクセス回数を、+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 );       // 画面カラム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}