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