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&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&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&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&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}