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 java.sql.SQLException; 019import java.util.ArrayList; 020import java.util.Arrays; 021import java.util.HashMap; 022import java.util.List; 023import java.util.Map; 024import java.util.Set; 025 026import org.opengion.fukurou.db.DBSimpleTable; 027import org.opengion.fukurou.db.DBUtil; 028import org.opengion.fukurou.util.ApplicationInfo; 029import org.opengion.fukurou.util.Cleanable; 030import org.opengion.fukurou.util.HybsEntry; 031import org.opengion.fukurou.util.LogWriter; 032import org.opengion.hayabusa.common.HybsSystem; 033import org.opengion.hayabusa.common.HybsSystemException; 034import org.opengion.hayabusa.common.UserSummary; 035import org.opengion.hayabusa.db.DBEditConfig; 036import org.opengion.hayabusa.db.DBEditConfigManager; 037 038/** 039 * ユーザー情報の取得の為のインターフェースを実装したクラスです。 040 * 041 * ログイン時のパスワードのチェックや,国名の識別ID,ポータルページのURLなど 042 * 個人情報を管理させます。 043 * 特に,画面アクセス時の権限やメールの送信,各画面にユーザー情報を表示したり, 044 * エラー時のログファイル,テンポラリディレクトリなども管理します。 045 * 046 * {@USER.XXXX} で、XXXX 部に、UserInfo オブジェクトで定義されている 047 * 属性情報を取り出すことが出来ます。 048 * 049 * 以下の値は UserInfo オブジェクトの項目から取得します。 050 * ・JNAME ユーザー日本語名称 051 * ・ID ユーザーID 052 * ・INFO ユーザー情報(ユーザーID:日本語名称) 053 * ・LANG 言語 054 * ・ROLES ロール 055 * ・IPADDRESS IPアドレス 056 * ・LOGINTIME ログイン時刻 057 * ・LASTACCESS 最終アクセス画面ID 058 * 059 * 以下の値はあらかじめ、動的に作成されます。 060 * ・YMD 8byte の今日のシステム日付 061 * ・YMDH 14byte の今日のシステム日時 062 * 063 * それ以外は,外部より設定された値です。 064 * 従来は、USER.IDNO はUSER.ID が5Byte以上の時のみ先頭1文字を除いたユーザーIDとして 065 * オブジェクト項目からの取得でしたが、現在は初期値として設定してあります。 066 * 外部より再設定可能になっています。 067 * 068 * @og.group リソース管理 069 * 070 * @version 4.0 071 * @author Kazuhiko Hasegawa 072 * @since JDK5.0, 073 */ 074public class UserInfo implements UserSummary , Cleanable { 075 private static final long serialVersionUID = 568120130913L ; // 5.6.8.1 (2013/09/13) 076 077 // ユーザーリソースのキー指定読み込みのクエリー 078 private static final String QUERY_PARAM = HybsSystem.sys( "USER_PARAMETER_SQL" ); 079 080 /** 5.6.8.1 (2013/09/13) 最終リクエスト情報のユーザー永続化情報(GE20)へのセーブに使用するキーの接頭語 */ 081 private static final String LAST_REQUEST_DATA_SUFIX = "LAST_REQUEST_" ; 082 083 // アクセス統計テーブル(GE15)への接続先を、リソースの接続先より取得します。 084 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); 085 086 //private static final String YOYAKU = "|JNAME|ID|INFO|LANG|ROLES|IPADDRESS|LOGINTIME|LASTACCESS|YMD|YMDH|" ; 087 private static final String YOYAKU = "|JNAME|ID|INFO|LANG|ROLES|IPADDRESS|LOGINTIME|LASTACCESS|YMD|YMDH|LASTGAMENNM" ; // 4.4.0.1 (2009/08/08) 088 089 private final boolean useAccessTable = HybsSystem.sysBool( "USE_ACCESS_TOKEI_TABLE" ); 090// private final String accessPastDays = HybsSystem.sys( "ACCESS_TOKEI_PAST_DAYS" ); // 4.1.0.1 (2008/01/31) 091 092 private final String userID ; 093// private final String lang ; 094 private String lang ; // 5.1.4.0 (2010/03/01) lang を書き換え可能とする。 095 private final String jname ; 096 private final String roles ; 097 private final String droles ; // 4.4.0.0 (2009/08/02) データロール対応 098// private final String[] userRoles ; 099 private final String ipAddress ; 100 private final long loginTime ; 101 private final Map<String,String> attribute ; 102 private final RoleMode roleMode ; // ロールズとモードを管理するオブジェクト 103 private final DataRole dataRole ; // データロールを管理するオブジェクト 104 105// private final boolean isRootRole ; // 4.3.0.0 (2008/07/04) 廃止 106 private final int hashcode ; // 3.5.6.0 (2004/06/18) 107 private Map<String,GUIInfo> guiMap ; // 4.0.0 (2005/01/31) 108 private boolean isInfoSet = false; // 4.0.0 (2005/01/31) 109 private long usedTime = 0L; // 4.0.0 (2005/01/31) 110 private final Map<String,String> paramMap = new HashMap<String,String>(); 111 private final Object guiLock = new Object(); 112 private final String systemId ; 113 private Map<String,FavoriteGUIData> favoriteGuiMap = null; // 4.1.1.0 (2008/01/22) 114 private Set<String> forbidAddrSet = null; // 5.2.0.0 (2010/09/01) 115 private final DBEditConfigManager editMgr = new DBEditConfigManager(); // 5.3.6.0 (2011/06/01) 116 117 private final Map<String,String> lastRequestMap = new HashMap<String,String>(); // 5.6.8.1 (2013/09/13) 118 119 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 120 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 121 122 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 123 private final ApplicationInfo appInfo; 124 125 // ユーザー永続化情報(GE20)テーブル 読み込み用SQL 126 // 4.3.4.0 (2008/12/01) ROLE='*'も検索できるようにする 127 // 5.3.6.0 (2011/06/01) USERID='*'も検索できるようにする 128 private static final String QUERY_GE20 = "select PARAM_ID,PARAM from GE20" 129 + " where SYSTEM_ID = ? and USERID in ( ?, '*' )" 130 + " and ROLES in ( ?, '*' ) and FGJ = '1'" 131 + " order by USERID,ROLES"; 132 133 // 4.3.4.0 (2008/12/01) ユーザー永続化情報(GE20)にセーブ時に存在チェックを行うためのSQL 134 // 4.3.4.4 (2009/01/01) private static を付加 135 private static final String QUERY_GE20_KEY = "select KBSET from GE20" 136 + " where SYSTEM_ID = ? and USERID = ?" 137 + " and ROLES = ? and PARAM_ID = ? and FGJ = '1'"; 138 139 // 5.2.3.0 (2010/12/01) アクセス履歴管理 140 private GUIInfo lastGuiInfo = null; 141 142 /** 143 * コンストラクター 144 * 145 * @og.rev 3.0.0.1 (2003/02/14) ユーザー毎のエンコード指定方法を廃止します。 146 * @og.rev 3.1.3.0 (2003/04/10) ユーザー情報から、エンコード情報を削除する。 147 * @og.rev 3.4.0.3 (2003/09/10) "root","manager","admin" のロールを、すべて root 権限を与える。 148 * @og.rev 3.8.5.3 (2006/06/30) USE_USER_IDNO_C_SAPLESS を判定条件に加える。 149 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 150 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 151 * @og.rev 4.4.0.0 (2009/08/02) データロール対応 152 * @og.rev 5.3.6.0 (2011/06/01) ユーザー永続化情報(GE20)の読み込みをUserInfoFactoryから移動 153 * 154 * @param userID ユーザー 155 * @param lang 言語 156 * @param jname 日本語名称 157 * @param roles ロール 158 * @param droles データロール 159 * @param systemId システムID 160 * @param ipAddress IPアドレス 161 * @param appInfo アプリ情報オブジェクト 162 */ 163 public UserInfo( final String userID , 164 final String lang , 165 final String jname , 166 final String roles , 167 final String droles , // 4.4.0.0 (2009/08/02) 168 final String systemId , 169 final String ipAddress , 170 final ApplicationInfo appInfo ) { 171 this.userID = userID ; 172 this.lang = lang ; 173 this.jname = jname ; 174 this.roles = roles ; 175 this.droles = droles ; // 4.4.0.0 (2009/08/02) 176 this.systemId = systemId ; 177// userRoles = StringUtil.csv2Array( roles,HybsSystem.GUI_DELIMITER ); 178 this.roleMode = RoleMode.newInstance( roles ); // 4.3.0.0 (2008/07/04) ロールモード 179 this.dataRole = DataRole.newInstance( droles, systemId, appInfo ); // 4.4.0.0 (2009/08/02) 180 this.ipAddress = ipAddress ; 181 this.appInfo = appInfo ; 182 loginTime = System.currentTimeMillis(); 183 usedTime = loginTime; 184 attribute = new HashMap<String,String>(); 185 186 // 3.4.0.3 (2003/09/10) "root","manager","admin" のロールを、すべて root 権限を与える。 187 // 4.3.0.0 (2008/07/04) 廃止 188// isRootRole = "root".equals( roles ) || "manager".equals( roles ) || "admin".equals( roles ) ; 189 190 // 3.5.6.0 (2004/06/18) hashCode を計算しておきます。 191 hashcode = (int)(loginTime^(loginTime>>>32)) ; 192 193 // 3.8.1.2 (2005/12/19) USER.IDNO をAttributeにセットする。 194 // 3.8.5.3 (2006/06/30) USE_USER_IDNO_C_SAPLESS を判定条件に加える。 195 boolean IDNO_C_SAPLESS = HybsSystem.sysBool( "USE_USER_IDNO_C_SAPLESS" ); 196 String idno = ( userID.length() > 5 && IDNO_C_SAPLESS ) ? userID.substring(1) : userID ; 197 attribute.put( "IDNO",idno ) ; // コンストラクタ内なので、同期処理は入れていません。 198 199 // ユーザーパラメータなどの初期設定を行います。 200 initLoad() ; 201 202 // 5.3.6.0 (2011/06/01) ユーザー永続化情報(GE20)からDBに保存されたUserInfo情報を読み出します。 203 dbLoad(); 204 205 // 5.3.6.0 (2011/06/01) Edit情報の一覧を作成します。 206 makeEditConfigMap(); 207 } 208 209 /** 210 * ユーザーパラメータを取得します。 211 * ユーザーパラメーターは、通常、GE16 テーブルより取得します。 212 * 取得するSQL文は、SystemData の USER_PARAMETER_SQL に記述しておきます。 213 * ユーザーパラメータに、値が存在しない場合は、システムリソースより 214 * 取得します。 215 * 216 * @param key パラメータキー 217 * 218 * @return パラメータ値(ユーザーパラメータになければ、システムリソースより取得 219 */ 220 public String getParameter( final String key ) { 221 String val = null; 222 if( key != null ) { 223 synchronized( paramMap ) { 224 val = paramMap.get( key ); 225 } 226 if( val == null ) { val = HybsSystem.sys( key ); } 227 } 228 return val; 229 } 230 231 /** 232 * ユーザーログイン時刻を取得します。 233 * 234 * @return ログイン時刻 235 */ 236 public long getLoginTime() { 237 return loginTime; 238 } 239 240 /** 241 * ユーザーのログインIPアドレスを取得します。 242 * 243 * @return IPアドレス 244 * 245 */ 246 public String getIPAddress() { 247 return ipAddress; 248 } 249 250 /** 251 * ユーザーを取得します。 252 * 253 * @return ユーザー 254 * 255 */ 256 public String getUserID() { 257 return userID; 258 } 259 260 /** 261 * ユーザー情報ロケール(言語)を取得します。 262 * 263 * @return ロケール(言語) 264 */ 265 public String getLang() { 266 return lang ; 267 } 268 269 /** 270 * ユーザー情報ロケール(言語)をセットします。 271 * 272 * @og.rev 5.1.4.0 (2010/03/01) lang を書き換え可能とする。 273 * 274 * @param newLang ロケール(言語) 275 */ 276 public void setLang( final String newLang ) { 277 lang = newLang ; 278 } 279 280 /** 281 * ユーザー情報 名称(日本語)を取得します。 282 * 283 * @return 名称(日本語) 284 */ 285 public String getJname() { 286 return jname ; 287 } 288 289 /** 290 * ユーザー情報 ロール(役割)を取得します。 291 * 292 * @return ロール(役割) 293 */ 294 public String getRoles() { 295 return roles ; 296 } 297 298 /** 299 * ロールモード情報を取得します。 300 * 301 * @og.rev 4.3.0.0 (2008/07/04) 新規追加 302 * 303 * @return ロールモード情報 304 */ 305 public RoleMode getRoleMode() { 306 return roleMode ; 307 } 308 309 /** 310 * オブジェクトの識別子として,ユーザー情報を返します。 311 * 312 * @return ユーザー情報 313 */ 314 public String getInfo() { 315 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 316 rtn.append( userID ).append( " : " ); 317 rtn.append( jname ).append( HybsSystem.CR ); 318 return rtn.toString(); 319 } 320 321 /** 322 * UserInfoの属性文字列を登録します。 323 * 324 * 予約文字(JNAME,ID,INFO,LANG,ROLES,IPADDRESS,LOGINTIME,LASTACCESS,YMD,YMDH,LASTGAMENNM)を 325 * 登録しようとした場合は、エラーにします。 326 * 327 * ※ 属性文字列キーが不正の場合、HybsSystemException が、throw されます。 328 * 329 * @param key キー 330 * @param value 値 331 * @param save ユーザー永続化情報(GE20)に情報を保存するか 332 */ 333 public void setAttribute( final String key,final String value, final boolean save ) { 334 setAttribute( key, value, save, false ); 335 } 336 337 /** 338 * UserInfoの属性文字列を登録します。 339 * 340 * 予約文字(JNAME,ID,INFO,LANG,ROLES,IPADDRESS,LOGINTIME,LASTACCESS,YMD,YMDH,LASTGAMENNM)を 341 * 登録しようとした場合は、エラーにします。 342 * 343 * ※ 属性文字列キーが不正の場合、HybsSystemException が、throw されます。 344 * 345 * @og.rev 3.5.6.0 (2004/06/18) synchronized をattribute に行います。 346 * @og.rev 4.3.4.0 (2008/12/01) ユーザー永続化情報(GE20)へ登録するかのフラグを追加 347 * @og.rev 5.3.6.0 (2011/06/01) ユーザー永続化情報(GE20)へ登録時に全ユーザー公開するかのフラグを追加 348 * @og.rev 5.6.8.1 (2013/09/13) 値が null、またはゼロ文字列の場合、処理しません。 349 * @og.rev 5.7.2.2 (2014/01/24) 値が null、またはゼロ文字列の場合でも処理します。(5.6.8.1 以前に戻します) 350 * 351 * @param key キー 352 * @param value 値 353 * @param save ユーザー永続化情報(GE20)に情報を保存するか 354 * @param common ユーザー永続化情報(GE20)に保存した情報を全ユーザー公開するか 355 */ 356// public void setAttribute( final String key,final String value ) { 357// public void setAttribute( final String key,final String value, final boolean save ) { 358 private void setAttribute( final String key,final String value, final boolean save, final boolean common ) { 359 if( key != null && YOYAKU.indexOf( "|" + key + "|" ) < 0 ) { 360 // 5.6.8.1 (2013/09/13) 値が null、またはゼロ文字列の場合、処理しません。 361 // 5.7.2.2 (2014/01/24) 値が null、またはゼロ文字列の場合でも処理します。(5.6.8.1 以前に戻します) 362// if( value != null && value.length() > 0 ) { 363 synchronized( attribute ) { 364 attribute.put( key,value ) ; 365 } 366 367 // 4.3.4.0 (2008/12/01) 追加 368 if( save ) { 369 savePermanently( key ,value, common ); 370 } 371// } 372 } 373 else { 374 String errMsg = "属性文字列キーが不正です。 key=[" + key + "]" 375 + HybsSystem.CR 376 + "null または予約語(" + YOYAKU + ") は指定できません。"; 377 throw new HybsSystemException( errMsg ); 378 } 379 } 380 381 /** 382 * ユーザーのロールが、"root" 権限があるかどうか、返します。 383 * 384 * "root" 権限とは、ロールが、"root","manager","admin" のいずれかの場合。 385 * 386 * @og.rev 3.4.0.3 (2003/09/10) 新規追加 387 * @og.rev 4.3.0.0 (2008/07/04) 廃止 388 * 389 * @return "root" 権限かどうか 390 */ 391// public boolean isRoot() { 392// return isRootRole ; 393// } 394 395 /** 396 * UserInfoの属性文字列を取得します。 397 * 398 * 以下の値は UserInfo オブジェクトの項目から取得します。 399 * <pre> 400 * ・JNAME ユーザー日本語名称 401 * ・ID ユーザーID 402 * ・IDNO (初期値)USER.ID が5Byte以上の時のみ先頭1文字を除いたユーザーID 403 * ・INFO ユーザー情報(ユーザーID:日本語名称) 404 * ・LANG 言語 405 * ・ROLES ロール 406 * ・IPADDRESS IPアドレス 407 * ・LOGINTIME ログイン時刻 408 * ・LASTACCESS 最終アクセス画面ID 409 * ・LASTGAMENNM 最終アクセス画面名 410 * 411 * 以下の値はあらかじめ、動的に作成されます。 412 * ・YMD 8byte の今日のシステム日付 413 * ・YMDH 14byte の今日のシステム日時 414 * </pre> 415 * 416 * それ以外は,外部より設定された値です。 417 * 418 * @og.rev 2.1.0.2 (2002/11/07) USER.IDNO の返す値をUSER.ID が5Byte以上の時のみ、 419 * 先頭1文字を除いた値を返す様に変更。それ以外は、USER.IDを返す。 420 * 421 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 ENCODE 追加 422 * @og.rev 3.1.3.0 (2003/04/10) ユーザー情報から、エンコード情報を削除する。 423 * @og.rev 3.5.4.2 (2003/12/15) ENAME,MAILTO、MAILUSERID、MAILPASSWD、GROUP、PROJECTを削除する。 424 * @og.rev 3.5.6.0 (2004/06/18) synchronized をattribute に行います。 425 * @og.rev 3.6.0.0 (2004/09/17) PASSWD を削除する。 426 * @og.rev 3.8.1.2 (2005/12/19) USER.IDNO を削除する。(外部設定可能にするため) 427 * @og.rev 3.8.7.0 (2006/12/15) ApplicationInfoオブジェクトから最終アクセス画面を取得 428 * @og.rev 4.4.0.0 (2009/08/02) データロール属性対応 429 * @og.rev 4.4.0.1 (2009/08/08) LASTGAMENNM追加 430 * 431 * @param key キー 432 * 433 * @return UserInfoの属性文字列 434 */ 435 public String getAttribute( final String key ) { 436 if( key == null ) { return null; } 437 String rtn = null; 438 439 if( key.equalsIgnoreCase( "JNAME" ) ) { rtn = jname; } 440 else if( key.equalsIgnoreCase( "ID" ) ) { rtn = userID; } 441 else if( key.equalsIgnoreCase( "INFO" ) ) { rtn = getInfo(); } 442 else if( key.equalsIgnoreCase( "LANG" ) ) { rtn = lang; } 443 else if( key.equalsIgnoreCase( "ROLE" ) ) { rtn = roles; } 444 else if( key.equalsIgnoreCase( "ROLES" ) ) { rtn = roles; } 445 else if( key.equalsIgnoreCase( "DROLES" ) ) { rtn = droles; } // 4.4.0.0 (2009/08/02) 446 else if( key.equalsIgnoreCase( "IPADDRESS" ) ) { rtn = ipAddress; } 447 else if( key.equalsIgnoreCase( "LOGINTIME" ) ) { 448 rtn = HybsSystem.getDate( loginTime ); 449 } 450 else if( key.equalsIgnoreCase( "LASTACCESS" ) ) { // 3.8.7.0 (2006/12/15) 451 if( appInfo != null ) { rtn = appInfo.getGamenId(); } 452 } 453 else if( key.equalsIgnoreCase( "YMD" ) ) { 454 rtn = HybsSystem.getDate( "yyyyMMdd" ); 455 } 456 else if ( key.equalsIgnoreCase( "LASTGAMENNM" ) ){ // 4.4.0.1 (2009/08/08) 457 if( appInfo != null && appInfo.getGamenId() != null){ 458 if( getGUIInfo( appInfo.getGamenId() ) != null){ 459 rtn = getGUIInfo( appInfo.getGamenId() ).getName(); 460 } 461 } 462 } 463 else if( key.equalsIgnoreCase( "YMDH" ) ) { 464 rtn = HybsSystem.getDate( "yyyyMMddHHmmss" ); 465 } 466 else { 467 synchronized( attribute ) { 468 rtn = attribute.get( key ) ; 469 } 470 } 471 return rtn ; 472 } 473 474 /** 475 * UserInfoの属性文字列の内部情報を返します。 476 * この内部情報の中には、UserInfo 自身の管理情報も含めます。 477 * 独自管理キーは、JNAME,ID,IDNO,INFO,LANG,ROLES,IPADDRESS,LOGINTIME,LASTACCESS,LASTGAMENNM です。 478 * 479 * それ以外は,外部より設定された値です。 480 * 481 * @og.rev 4.0.0.0 (2004/12/31) 新規作成 482 * @og.rev 4.4.0.1 (2009/08/08) LASTGAMENNM追加 483 * 484 * @return 属性文字列のHybsEntryオブジェクト配列 485 */ 486 public HybsEntry[] getEntrys() { 487 List<HybsEntry> list = new ArrayList<HybsEntry>(); 488 489 list.add( new HybsEntry( "JNAME" , getAttribute( "JNAME" ) ,"ユーザー日本語名称" ) ); 490 list.add( new HybsEntry( "ID" , getAttribute( "ID" ) ,"ユーザーID" ) ); 491 list.add( new HybsEntry( "IDNO" , getAttribute( "IDNO" ) ,"USER.ID が5Byte以上の時のみ先頭1文字を除いたユーザーID" ) ); 492 list.add( new HybsEntry( "INFO" , getAttribute( "INFO" ) ,"ユーザー情報(ユーザーID:日本語名称)" ) ); 493 list.add( new HybsEntry( "LANG" , getAttribute( "LANG" ) ,"言語" ) ); 494 list.add( new HybsEntry( "ROLES" , getAttribute( "ROLES" ) ,"ロールズ" ) ); 495 list.add( new HybsEntry( "IPADDRESS" , getAttribute( "IPADDRESS" ) ,"IPアドレス" ) ); 496 list.add( new HybsEntry( "LOGINTIME" , getAttribute( "LOGINTIME" ) ,"ログイン時刻" ) ); 497 list.add( new HybsEntry( "LASTACCESS" , getAttribute( "LASTACCESS" ) ,"最終アクセス画面ID" ) ); 498 list.add( new HybsEntry( "LASTGAMENNM" , getAttribute( "LASTGAMENNM") ,"最終アクセス画面名" ) ); // 4.4.0.1 (2009/08/08) 499 list.add( new HybsEntry( "YMD" , getAttribute( "YMD" ) ," 8byte の今日のシステム日付" ) ); 500 list.add( new HybsEntry( "YMDH" , getAttribute( "YMDH" ) ,"14byte の今日のシステム日時" ) ); 501 502 synchronized( attribute ) { 503 String[] keys = attribute.keySet().toArray( new String[attribute.size()] ); 504 Arrays.sort( keys ); 505 for( int i=0; i<keys.length; i++ ) { 506 list.add( new HybsEntry( keys[i],getAttribute( keys[i] ) ) ); 507 } 508 } 509 return list.toArray( new HybsEntry[list.size()] ); 510 } 511 512 /** 513 * UserInfoの属性文字列を削除します。 514 * 515 * @param key キー 516 * @param save ユーザー永続化情報(GE20)から情報を削除するか 517 */ 518 public void removeAttribute( final String key, final boolean save ) { 519 removeAttribute( key, save, false ); 520 } 521 522 /** 523 * UserInfoの属性文字列を削除します。 524 * 525 * @og.rev 3.5.6.0 (2004/06/18) synchronized をattribute に行います。 526 * @og.rev 5.3.6.0 (2011/06/01) ユーザー永続化情報(GE20)から削除するかのフラグを追加 527 * 528 * @param key キー 529 * @param save ユーザー永続化情報(GE20)から情報を削除するか 530 * @param common ユーザー永続化情報(GE20)から情報削除時、全ユーザー公開情報を削除するか 531 */ 532 private void removeAttribute( final String key, final boolean save, final boolean common ) { 533 synchronized( attribute ) { 534 attribute.remove( key ) ; 535 } 536 537 if( save ) { 538 deletePermanently( key, common ); 539 } 540 } 541 542 /** 543 * ユーザー個別の画面オブジェクトのマップをセットします。 544 * 545 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 546 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 547 * @og.rev 4.1.1.0 (2008/01/29) 画面の格上げとお気に入りマップ作成はクラスUserAccessTableに依頼 548 * @og.rev 5.2.0.0 (2010/09/01) アクセス禁止アドレスによる不正アクセス防止機能追加 549 * 550 * @param newGuiMap 画面オブジェクトのマップ 551 * @param newForbidAddrSet アクセス禁止アドレスセット 552 */ 553// public void setGUIMap( final Map<String,GUIInfo> newGuiMap ) { 554 public void setGUIMap( final Map<String,GUIInfo> newGuiMap, final Set<String> newForbidAddrSet ) { 555 if( newGuiMap != null ) { 556 synchronized( guiLock ) { 557 guiMap = newGuiMap ; 558 forbidAddrSet = newForbidAddrSet; 559 favoriteGuiMap = UserAccessTable.makeAccessDB( guiMap,systemId,userID,lang ); 560 isInfoSet = true; 561 } 562 } 563 } 564 565 /** 566 * ユーザー個別の画面オブジェクトを取得します。 567 * アクセスできない画面IDが指定されたときは、null が返ります。 568 * 569 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 570 * @og.rev 5.2.0.0 (2010/09/01) guiMap の null 判定を追加 571 * 572 * @param gamenId 画面ID 573 * 574 * @return 画面オブジェクト 575 */ 576 public GUIInfo getGUIInfo( final String gamenId ) { 577 synchronized( guiLock ) { 578 if( guiMap != null) { // 5.2.0.0 (2010/09/01) guiMap の null 判定 579 return guiMap.get( gamenId ); 580 } 581 else { 582 return null; // 5.2.0.0 (2010/09/01) 583 } 584 } 585 } 586 587 /** 588 * ユーザー個別の画面オブジェクトのマップを取得します。 589 * 590 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 591 * @og.rev 5.2.0.0 (2010/09/01) guiMap の null 判定を追加 592 * 593 * @return 画面オブジェクトの配列 594 */ 595 public GUIInfo[] getGUIInfos() { 596 synchronized( guiLock ) { 597 if( guiMap != null) { // 5.2.0.0 (2010/09/01) guiMap の null 判定 598 return guiMap.values().toArray( new GUIInfo[ guiMap.size() ] ) ; 599 } 600 else { 601 return null; // 5.2.0.0 (2010/09/01) 602 } 603 } 604 } 605 606 /** 607 * アクセスが許可されているアドレスかどうかをチェックします。 608 * 609 * チェックの方法は、ブラックリスト方式です。 610 * 画面リソースに登録された一覧の内、そのユーザーが許可されていないアドレスに 611 * 対してのみfalseが返ります。 612 * 画面リソースに登録されていないアドレスや、アドレスにURLの区切り文字(/)が 613 * 含まれている場合はチェックされません。(trueが返ります) 614 * 615 * @og.rev 5.2.0.0 (2010/09/01) 新規追加 616 * 617 * @param addr チェック対象のアドレス 618 * 619 * @return アクセスが許可されているアドレスかどうか 620 */ 621 public boolean isValidAddr( final String addr ) { 622 synchronized( guiLock ) { 623 return ( forbidAddrSet == null || !forbidAddrSet.contains( addr ) ); 624 } 625 } 626 627 /** 628 * ユーザー個別のお気に入り画面オブジェクトのマップを取得します。 629 * 630 * @og.rev 4.1.1.0 (2008/01/31) 新規追加 631 * 632 * @return お気に入り画面オブジェクトのマップ 633 */ 634 public Map<String,FavoriteGUIData> getFavoriteMap() { 635 return favoriteGuiMap; 636 } 637 638 /** 639 * 画面オブジェクトのマップがセット済みかどうかを取得します。 640 * 641 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 642 * 643 * @return 画面オブジェクトのマップがセット済みかどうか(true:セット済み / false:未セット) 644 */ 645 public boolean isGUIInfoSet() { 646 return isInfoSet ; 647 } 648 649 /** 650 * 指定のユーザーロールに対する最終的なアクセス条件を取得します。 651 * アクセス条件は、複数あるユーザーロールの中で、最大のアクセス条件を算出します。 652 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) の3つのロール/モードが設定されている場合、 653 * ユーザーが、AAA だけの場合は、-r ですが、AAA|BBB を持っている場合は、-w になります。 654 * さらに、BBB|CCC と持っている場合は、(-w:書き込み許可)と(mr:メニューから読取許可)の 655 * 権限により、mw:メニューからの書き込み許可が与えられます。 656 * モード指定がある場合は、AND演算になります。 657 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) と BBB|CCC(-r) の場合、(-r)+(-w)+(mr)*(-r)=-w に 658 * なります。ロールは、OR ですが、モードは、同一ロールでのAND になります。 659 * 実際には、メニュー表示の可否は、ポップアップ系によく用いられますので、上記のような 660 * 許可が実際にあるかどうかは不明ですが、すべてのモードのOR条件での結合になります。 661 * 662 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 663 * 664 * @param other ロールモード 665 * 666 * @return アクセスビット 667 */ 668 public byte getAccessBitMode( final RoleMode other ) { 669 return roleMode.getAccessBitMode( other ); 670 } 671 672 /** 673 * 指定のユーザーロールに対する最終的なアクセス条件を取得します。 674 * 675 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 676 * 677 * @param roles ロール文字列 678 * 679 * @return アクセスビット 680 */ 681// public byte getAccessBitMode( final String roles ) { 682// return roleMode.getAccessBitMode( RoleMode.newInstance( roles ) ); 683// } 684 685 /** 686 * このユーザーの権限で、指定のロールが許可されているかどうかを判定します。 687 * 688 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 689 * @og.rev 4.3.0.1 (2008/08/11) ロールチェック時の引数間違い、是正 690 * 691 * @param role チェックを行うロール 692 * 693 * @return アクセスできる(true)/出来ない(false) 694 */ 695 public boolean isAccess( final String role ) { 696 if( role == null || role.length() == 0 ) { 697 return true; 698 } 699 700// return ( roleMode.getAccessBitMode( RoleMode.newInstance( roles ) ) > 0 ); 701 return ( roleMode.getAccessBitMode( RoleMode.newInstance( role ) ) > 0 ); // 4.3.0.1 (2008/08/11) 702 } 703 704 /** 705 * このユーザーの権限で、指定のロールが許可されているかどうかを判定します。 706 * 707 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 708 * 709 * @param otherRoles チェックを行うロール 710 * 711 * @return アクセスできる(true)/出来ない(false) 712 */ 713//// public boolean isAccess( final String role ) { 714// public boolean isAccess( final String otherRoles ) { 715// // ユーザーがルートか、指定のロールが無い場合は、無制限アクセス可能 716//// if( isRootRole || role == null || role.length() == 0 ) { 717// if( otherRoles == null || otherRoles.length() == 0 ) { 718// return true; 719// } 720// 721// // ユーザーロールが無い場合は、アクセス不許可 722// if( roles == null || roles.length() == 0 ) { 723// return false; 724// } 725// 726// // 4.3.0.0 (2008/07/04) ロールモードマルチ対応 727// RoleMode otherRoleMode = RoleMode.newInstance( otherRoles ); 728// byte bit = roleMode.getAccessBitMode( otherRoleMode ); 729// 730// return bit > 0 ; 731// 732//// // ユーザーロールが無い場合は、アクセス不許可 733//// if( userRoles == null || userRoles.length == 0 ) { 734//// return false; 735//// } 736//// 737//// String[] otherRoles = StringUtil.csv2Array( role,HybsSystem.GUI_DELIMITER ); 738//// for( int g=0; g<otherRoles.length; g++ ) { 739//// if( otherRoles[g] != null ) { 740//// for( int u=0; u<userRoles.length; u++ ) { 741//// if( otherRoles[g].equalsIgnoreCase( userRoles[u] ) ) { 742//// return true; 743//// } 744//// } 745//// } 746//// } 747//// return false; 748// } 749 750 /** 751 * 初期化(クリア)します(org.opengion.fukurou.util.Cleanable の実装)。 752 * 画面オブジェクトのマップをクリアし、セット済みフラグを未セットに設定します。 753 * システムリソースの USE_ACCESS_TOKEI_TABLE が true の場合は、 754 * 画面アクセス状況を、アクセス統計テーブル(GE15)に書き込みます。 755 * ユーザー単位のパラメータは、システムリソースの USER_PARAMETER_SQL で 756 * 定義された値を検索して、取り込みます。 757 * 758 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 759 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 760 * @og.rev 5.6.8.1 (2013/09/13) lastRequestMap を ユーザー永続化情報(GE20) に書き込みます。 761 */ 762 public void clear() { 763 if( useAccessTable && isInfoSet ) { saveGUIAccessInfo(); } 764 initLoad() ; 765 766 saveLastRequestValues(); // 5.6.8.1 (2013/09/13) lastRequestMap を ユーザー永続化情報(GE20) に書き込みます。 767 } 768 769 /** 770 * ユーザーパラメータを取得します。 771 * 画面オブジェクトのマップをクリアし、セット済みフラグを未セットに設定します。 772 * ユーザー単位のパラメータは、システムリソースの USER_PARAMETER_SQL で 773 * 定義された値を検索して、取り込みます。 774 * 775 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 776 */ 777 private void initLoad() { 778 779 // ユーザーパラメータの取得 780 if( QUERY_PARAM != null && QUERY_PARAM.length() > 0 ) { 781 String[] args = new String[] { systemId,userID }; 782 // 画面ID,操作,プログラムID 783 if( appInfo != null ) { 784 // 画面ID,操作,プログラムID 785 appInfo.setModuleInfo( "UserInfo",null,"initLoad" ); 786 } 787 String[][] vals = DBUtil.dbExecute( QUERY_PARAM,args,appInfo,DBID ); 788 789 synchronized( paramMap ) { 790 paramMap.clear(); 791 for( int i=0; i<vals.length; i++ ) { 792 String key = vals[i][0]; 793 String val = vals[i][1]; 794 if( val != null && val.length() == 0 ) { continue; } 795 paramMap.put( key,val ); 796 } 797 } 798 } 799 } 800 801 /** 802 * ユーザー永続化情報(GE20)からDBに保存されたUserInfoのパラメーターを取得します。 803 * 804 * ここでは、キーの先頭が、LAST_REQUEST_DATA_SUFIX(="LAST_REQUEST_")文字列が、 805 * 付いている物だけ lastRequestMap マップに設定します。(分けて管理します) 806 * 807 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 808 * @og.rev 5.6.8.1 (2013/09/13) setAttribute メソッドではなく、直接 Mapに登録します。 809 * @og.rev 5.7.2.2 (2014/01/24) 値が null、またはゼロ文字列の場合でも処理します。(5.6.8.1 以前に戻します) 810 * 811 * ※ コンストラクタのみで呼ばれるため、synchronized は入れていません。 812 * @see #LAST_REQUEST_DATA_SUFIX 813 */ 814 private void dbLoad() { 815 // ユーザー永続化情報(GE20)テーブル読み込み 816 String[] argsGe20 = new String[] { systemId,userID,roles }; 817 String[][] valsGe20 = DBUtil.dbExecute( QUERY_GE20,argsGe20,appInfo,DBID ); 818 819 for( int i=0; i<valsGe20.length; i++ ) { 820 // 4.3.4.0 (2008/12/01) ユーザー永続化情報(GE20)から読み込んでいるので、当然保存しない 821// setAttribute( valsGe20[i][0], valsGe20[i][1], false ); 822 String key = valsGe20[i][0]; 823 String val = valsGe20[i][1]; 824 if( key != null && key.length() > 0 ) { 825 if( key.startsWith( LAST_REQUEST_DATA_SUFIX ) ) { 826 // val が null かどうかは問わない 827 lastRequestMap.put( key.substring( LAST_REQUEST_DATA_SUFIX.length() ) , val ); 828 } 829 else { 830 // val が null の場合は、登録しない。 831 // 5.7.2.2 (2014/01/24) 値が null、またはゼロ文字列の場合でも処理します。(5.6.8.1 以前に戻します) 832// if( val != null && val.length() > 0 ) { 833 attribute.put( key,val ) ; 834// } 835 } 836 } 837 } 838 } 839 840 /** 841 * 属性一覧からEDIT設定情報をオブジェクト化し、画面ID毎のマップに登録します。 842 * 843 * ※ コンストラクタのみで呼ばれるため、synchronized は入れていません。 844 * 845 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 846 */ 847 private void makeEditConfigMap() { 848 String[] keys = attribute.keySet().toArray( new String[0] ); 849 String[][] keySet = DBEditConfig.getKeySet( keys ); 850 if( keySet != null ) { 851 for( String[] set : keySet ) { 852 String guikey = set[0]; 853 String editName = set[1]; 854 String[] editKeys = DBEditConfig.getEditKeys( guikey, editName ); 855 String[] editVals = new String[editKeys.length]; 856 for( int i=0; i<editKeys.length; i++ ) { 857 editVals[i] = attribute.get( editKeys[i] ); 858 } 859 editMgr.addEditConfig( guikey, editName, new DBEditConfig( editVals ) ); 860 } 861 } 862 } 863 864 /** 865 * 引数の画面で登録されているエディット設定を配列で返します。 866 * 返される配列は、エディット名順にソートされた状態で返されます。 867 * 868 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 869 * 870 * @param guikey 画面ID 871 * 872 * @return エディット設定(配列) 873 */ 874 public DBEditConfig[] getEditConfigs( final String guikey ) { 875 return editMgr.getEditConfigs( guikey ); 876 } 877 878 /** 879 * 画面ID、エディット名よりエディット設定オブジェクトを返します。 880 * また、ここで指定されたエディット名がこの画面での選択済みエディットとして登録されます。 881 * 882 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 883 * 884 * @param guikey 画面ID 885 * @param editName エディット名 886 * 887 * @return エディット配列 888 */ 889 public DBEditConfig getEditConfig( final String guikey, final String editName ) { 890 if( editName != null ) { 891 String selEditName = getSelectedEdit( guikey ); 892 if( !editName.equals( selEditName ) ) { 893 setSelectedEdit( guikey, editName ); 894 } 895 } 896 // else { 897 // setSelectedEdit( guikey, null ); 898 // } 899 return editMgr.getEditConfig( guikey, editName ); 900 } 901 902 /** 903 * 指定の画面ID、エディット名でエディット設定オブジェクトを追加します。 904 * 既に登録されている場合は、既存のエディット情報を更新します。 905 * 906 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 907 * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 908 * 909 * @param guikey 画面ID 910 * @param editName エディット名 911 * @param config エディット設定オブジェクト 912 */ 913 public void addEditConfig( final String guikey, final String editName, final DBEditConfig config ) { 914 if( config == null ) { return; } 915 916 boolean isCommon = config.isCommon(); 917 String[] editKeys = DBEditConfig.getEditKeys( guikey, editName ); 918 String[] editVals = config.getEditVals(); 919 920 // 個別設定の場合、同じキーで共通情報が存在していた場合はエラーとする。 921 if( !isCommon && isExistValue( editKeys[0], "*", "*" ) ) { 922// String msg = "同じ編集名で共通設定されているため個別編集を保存できません。"; 923// throw new HybsSystemException( msg ); 924 String errMsg = "同じ編集名で共通設定されているため個別編集を保存できません。"; 925 throw new HybsSystemException( errMsg ); // 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 926 } 927 // 共通設定の場合、同じキーで個別情報が存在していた場合はエラーとする。 928 if( isCommon && isExistValue( editKeys[0], userID, "*" ) ) { 929// String msg = "同じ編集名で個別設定されているため共通編集を保存できません。"; 930// throw new HybsSystemException( msg ); 931 String errMsg = "同じ編集名で個別設定されているため共通編集を保存できません。"; 932 throw new HybsSystemException( errMsg ); // 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 933 } 934 935 editMgr.addEditConfig( guikey, editName, config ); 936 for( int i=0; i<editKeys.length; i++ ) { 937 if( editVals[i] != null && editVals[i].length() > 0 ) { 938 setAttribute( editKeys[i], editVals[i], true, isCommon ); 939 } 940 else { 941 removeAttribute( editKeys[i], true, isCommon ); 942 } 943 } 944 } 945 946 /** 947 * 指定の画面ID、エディット名のエディット設定を削除します。 948 * 949 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 950 * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 951 * 952 * @param guikey 画面ID 953 * @param editName エディット名 954 */ 955 public void deleteEditConfig( final String guikey, final String editName ) { 956 DBEditConfig config = editMgr.deleteEditConfig( guikey, editName ); 957 if( config != null ) { 958 boolean isCommon = config.isCommon(); 959 String[] editKeys = DBEditConfig.getEditKeys( guikey, editName ); 960 // エディット設定が存在しない場合エラー。 961 if( !isExistValue( editKeys[0], ( isCommon ? "*" : userID ), "*" ) ) { 962// String msg = "エディット設定が存在しません。"; 963// throw new HybsSystemException( msg ); 964 String errMsg = "エディット設定が存在しません。"; 965 throw new HybsSystemException( errMsg ); // 5.7.1.2 (2013/12/20) msg ⇒ errMsg 変更 966 } 967 for( int i=0; i<editKeys.length; i++ ) { 968 removeAttribute( editKeys[i], true, isCommon ); 969 } 970 } 971 972 // if( editName != null ) { 973 // String selEditName = getSelectedEdit( guikey ); 974 // if( !editName.equals( selEditName ) ) { 975 // setSelectedEdit( guikey, null ); 976 // } 977 // } 978 } 979 980 /** 981 * 指定の画面IDに対して選択済みのエディット名を登録します。 982 * 983 * なお、メモリやDBへの書き込みを考慮し、editName が null か、 984 * ゼロ文字列 の場合は、登録しません。 985 * 986 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 987 * @og.rev 5.7.2.2 (2014/01/24) 引数の editName が null か、ゼロ文字列 の場合は、登録しません。 988 * 989 * @param guikey 画面ID 990 * @param editName エディット名 991 */ 992 public void setSelectedEdit( final String guikey, final String editName ) { 993 if( editName != null && editName.length() > 0 ) { // 5.7.2.2 (2014/01/24) 994 setAttribute( "EDIT_NAME_SELECTED_" + guikey, editName, true ); 995 } 996 } 997 998 /** 999 * 指定の画面IDに対して選択済みのエディット名を返します。 1000 * 1001 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 1002 * 1003 * @param guikey 画面ID 1004 * 1005 * @return 選択済みエディット名 1006 */ 1007 public String getSelectedEdit( final String guikey ) { 1008 return getAttribute( "EDIT_NAME_SELECTED_" + guikey ); 1009 } 1010 1011 /** 1012 * 最後に使用されたリクエスト変数の値を、Mapを読み取って登録します。 1013 * 1014 * 読み取り対象は、先に lastRequestMap に登録済みのキーだけです。 1015 * そのため、{@LAST.XXXX} で値を要求されたときに、キーが 1016 * 登録されていない場合は、キーだけ(値 nullで)登録しておきます。 1017 * 1018 * @og.rev 5.6.8.1 (2013/09/13) 新規追加 1019 * 1020 * @param reqMap リクエスト変数のMap 1021 */ 1022 public void setLastRequestMap( final Map<String,String[]> reqMap ) { 1023 if( reqMap != null ) { 1024 synchronized( lastRequestMap ) { 1025 for( String key : lastRequestMap.keySet() ) { 1026 String[] vals = reqMap.get( key ); 1027 if( vals != null ) { 1028 String val = null; 1029 for( int i=0; i<vals.length; i++ ) { 1030 val = vals[i]; 1031 if( ! "0".equals( val ) ) { break; } // チェックボックス対応 1032 } 1033 lastRequestMap.put( key, val ); // val は、null もあり得る。 1034 } 1035 } 1036 } 1037 } 1038 } 1039 1040 /** 1041 * 最後に使用されたリクエスト変数の値を、設定します。 1042 * 1043 * この処理は、{@LAST.XXXX} は、リクエスト値があれば、それが優先的に 1044 * 使われます。 1045 * 1046 * @og.rev 5.6.8.1 (2013/09/13) 新規追加 1047 * 1048 * @param key リクエストキー 1049 * @param val 設定値 1050 */ 1051 public void setLastRequestValue( final String key,final String val ) { 1052 if( key != null && key.length() > 0) { 1053 synchronized( lastRequestMap ) { 1054 lastRequestMap.put( key, val ); 1055 } 1056 } 1057 } 1058 1059 /** 1060 * 最後に使用されたリクエスト変数の値を、取得します。 1061 * 1062 * 画面で簡素に使用できるように、少し特殊な処理を行います。 1063 * query 画面で {@LAST.XXXX} を呼ぶと、lastRequestMap にキーがなければ、 1064 * キーだけ先に追加します。あれば、値を取得するだけです。 1065 * そして、result画面で command="NEW" の場合のみ、リクエスト情報のMapから、 1066 * lastRequestMap に持っているキーで(NULLでない場合は)上書きセットします。 1067 * キャッシュ量を減らすことと、処理の対象キーを減らす意味を持っています。 1068 * 1069 * @og.rev 5.6.8.1 (2013/09/13) 新規追加 1070 * 1071 * @param key リクエストキー 1072 * @return 設定値 1073 */ 1074 public String getLastRequestValue( final String key ) { 1075 String rtn = null; 1076 if( key != null && key.length() > 0) { 1077 synchronized( lastRequestMap ) { 1078 if( lastRequestMap.containsKey( key ) ) { // キーを持っているかどうかを判定 1079 rtn = lastRequestMap.get( key ); 1080 } 1081 else { 1082 lastRequestMap.put( key, null ); // キーだけ登録しておく。 1083 } 1084 } 1085 } 1086 return rtn ; 1087 } 1088 1089 /** 1090 * lastRequestMap を ユーザー永続化情報(GE20) に書き込みます。 1091 * 1092 * clear() 処理が実行された場合に、まとめて ユーザー永続化情報(GE20) に書き込みます。 1093 * タイミング的には、saveGUIAccessInfo() メソッドと同じですが、saveGUIAccessInfo() は、 1094 * 書き込む条件( useAccessTable && isInfoSet ) があります。 1095 * セーブする時には、他の属性と区別するため、接頭語 LAST_REQUEST_DATA_SUFIX(="LAST_REQUEST_") を 1096 * キーに付けて渡します。 1097 * 1098 * 読み取りは、dbLoad() で、attribute と同じタイミングで、コンストラクタで、行います。 1099 * 1100 * @og.rev 5.6.8.1 (2013/09/13) 新規追加 1101 * 1102 * @see #clear() 1103 * @see #dbLoad() 1104 */ 1105 private void saveLastRequestValues() { 1106 int cnt = 0; 1107 synchronized( lastRequestMap ) { 1108 for( String key : lastRequestMap.keySet() ) { 1109 String val = lastRequestMap.get( key ); 1110 // 内部処理的には冗長だが、実行頻度が少ないので、許す。 1111 savePermanently( LAST_REQUEST_DATA_SUFIX + key,val,false ); 1112 } 1113 cnt = lastRequestMap.size(); 1114 } 1115// System.out.println(); 1116 System.out.println( " [" + userID + "] 最終リクエスト情報({@LAST.XXXX})を、(GE20)に、[" + cnt + "]件、登録しました。" ); 1117 } 1118 1119 /** 1120 * アクセスログ取得の為,ApplicationInfoオブジェクトを返します。 1121 * 1122 * @og.rev 3.8.7.0 (2006/12/15) 新規追加 1123 * 1124 * @param gamenId 実行中の画面ID 1125 * @param prgId 実行中のプログラムID 1126 * 1127 * @return ApplicationInfoオブジェクト 1128 */ 1129 public ApplicationInfo getApplicationInfo( final String gamenId,final String prgId ) { 1130 if( appInfo != null ) { 1131 // 画面ID,操作,プログラムID 1132 appInfo.setModuleInfo( gamenId,null,prgId ); 1133 } 1134 return appInfo; 1135 } 1136 1137 /** 1138 * 自然比較メソッド 1139 * インタフェース Comparable の 実装です。 1140 * ユーザーの順序は、ユーザーID そのものの順序であらわされます。 1141 * 同一ユーザーの場合は,ログインタイムの順番になります。 1142 * 1143 * @og.rev 5.1.8.0 (2010/07/01) UserSummary の Comparable を型設定 1144 * 1145 * @param object 比較対象のObject 1146 * 1147 * @return このオブジェクトが指定されたオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数 1148 */ 1149 @Override 1150 public int compareTo( final UserSummary object ) { 1151// if( object instanceof UserInfo ) { 1152// int test1 = userID.compareTo( ((UserInfo)object).getUserID() ); 1153 int test1 = userID.compareTo( object.getUserID() ); 1154 if( test1 == 0 ) { 1155// test1 = (int)( loginTime - ((UserInfo)object).getLoginTime() ) ; 1156 test1 = (int)( loginTime - object.getLoginTime() ) ; 1157 } 1158 return test1; 1159// } 1160// throw new ClassCastException(); 1161 } 1162 1163 /** 1164 * このオブジェクトと他のオブジェクトが等しいかどうかを示します。 1165 * インタフェース Comparable の 実装に関連して、再定義しています。 1166 * ユーザーは、ユーザーIDが等しく、かつ ログイン時刻が同一の場合に、 1167 * 等しいと判断されます。 1168 * 1169 * @param object 比較対象の参照オブジェクト 1170 * 1171 * @return 引数に指定されたオブジェクトとこのオブジェクトが等しい場合は true、そうでない場合は false 1172 */ 1173 @Override 1174 public boolean equals( final Object object ) { 1175 if( object instanceof UserInfo ) { 1176 return ( userID.equals( ((UserInfo)object).getUserID() ) && 1177 loginTime == ( ((UserInfo)object).getLoginTime() ) ); 1178 } 1179 return false ; 1180 } 1181 1182 /** 1183 * オブジェクトのハッシュコード値を返します。 1184 * このメソッドは、java.util.Hashtable によって提供されるような 1185 * ハッシュテーブルで使用するために用意されています。 1186 * equals( Object ) メソッドをオーバーライトした場合は、hashCode() メソッドも 1187 * 必ず 記述する必要があります。 1188 * ここでは、ログイン時刻(long 値)の上位 32 ビットと下位 32 ビットの排他的論理和 1189 * を求めています。 1190 * (int)(this.longValue()^(this.longValue()>>>32)) 1191 * 1192 * ※ hashCode の 同一オブジェクトには同一ハッシュコードという規則と 1193 * 発生頻度,ランダム性を考慮すれば、ログイン時刻そのもの(long)の 1194 * ハッシュコードでも運用上は全く問題ないと考えられます。 1195 * 1196 * @og.rev 3.5.6.0 (2004/06/18) 新規追加 1197 * 1198 * @return このオブジェクトのハッシュコード値 1199 * 1200 */ 1201 @Override 1202 public int hashCode() { 1203 return hashcode ; 1204 } 1205 1206 /** 1207 * オブジェクトの識別子として,詳細なユーザー情報を返します。 1208 * 1209 * @return 詳細なユーザー情報 1210 */ 1211 @Override 1212 public String toString() { 1213 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 1214 rtn.append( "userID :" ).append( userID ).append( HybsSystem.CR ); 1215 rtn.append( "lang :" ).append( lang ).append( HybsSystem.CR ); 1216 rtn.append( "jname :" ).append( jname ).append( HybsSystem.CR ); 1217 rtn.append( "roles :" ).append( roles ).append( HybsSystem.CR ); 1218 rtn.append( "IPAddress:" ).append( ipAddress ).append( HybsSystem.CR ); 1219 rtn.append( "loginTime:" ).append( loginTime ).append( HybsSystem.CR ); 1220 return rtn.toString(); 1221 } 1222 1223 // saveGUIAccessInfo() メソッドでしか使用しない、定数宣言 1224 private static final int C_SYSTEM_ID = 0 ; 1225 private static final int C_USERID = 1 ; 1226 private static final int C_USERADRS = 2 ; 1227 private static final int C_HOSTADRS = 3 ; 1228 private static final int C_GUIKEY = 4 ; 1229 private static final int C_DYLOGIN = 5 ; 1230 private static final int C_DYLOGOUT = 6 ; 1231 private static final int C_USED_TIME = 7 ; 1232 private static final int C_CNT_ACCESS = 8 ; 1233 private static final int C_CNT_ERROR = 9 ; 1234 private static final int C_CNT_READ = 10 ; 1235 private static final int C_CNT_WRITE = 11 ; 1236 private static final int C_TM_TOTAL_QUERY = 12 ; 1237 private static final int C_TM_MAX_QUERY = 13 ; 1238 private static final int C_MAX_QUERY = 14 ; 1239 private static final int C_FGJ = 15 ; 1240 private static final int C_DYSET = 16; 1241 private static final int C_DYUPD = 17; 1242 private static final int C_USRSET = 18; 1243 private static final int C_USRUPD = 19; 1244 private static final int C_PGUPD = 20; 1245 1246 /** 1247 * ユーザー個別の画面オブジェクトの明細情報をアクセス統計テーブル(GE15)に登録します。 1248 * 1249 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 1250 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 1251 * @og.rev 4.0.0.0 (2007/10/05) SQLServer 互換性の為、SUBSTRB を廃止します。 1252 * @og.rev 4.1.1.0 (2008/01/30) ユーザーアクセス画面管理テーブルに画面の最終アクセス時間を更新 1253 * @og.rev 5.0.2.0 (2009/11/01) 作成・更新日付がセットされていないバグを修正 1254 * @og.rev 5.2.3.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 1255 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 1256 */ 1257 private void saveGUIAccessInfo() { 1258 // if( !useAccessTable || !isInfoSet ) { return ; } 1259 1260 final GUIInfo[] infos ; 1261 synchronized( guiLock ) { 1262 infos = getGUIInfos() ; 1263 guiMap = null; 1264 isInfoSet = false; 1265 } 1266 1267 long crntTime = System.currentTimeMillis(); 1268 1269 String[] names = new String[] { "SYSTEM_ID","USERID","USERADRS","HOSTADRS","GUIKEY","DYLOGIN","DYLOGOUT", 1270 "USED_TIME","CNT_ACCESS","CNT_ERROR","CNT_READ","CNT_WRITE", 1271// "TM_TOTAL_QUERY","TM_MAX_QUERY","MAX_QUERY","FGJ" }; 1272 "TM_TOTAL_QUERY","TM_MAX_QUERY","MAX_QUERY","FGJ","DYSET","DYUPD","USRSET","USRUPD","PGUPD" }; 1273 String[] values = new String[names.length]; 1274 1275 values[C_SYSTEM_ID ] = HybsSystem.sys( "SYSTEM_ID" ); 1276 values[C_USERID ] = userID; 1277 values[C_USERADRS ] = ipAddress; 1278 values[C_HOSTADRS ] = HybsSystem.sys( "HOST_ADRS" ); 1279 values[C_GUIKEY ] = ""; 1280 values[C_DYLOGIN ] = HybsSystem.getDate( loginTime,"yyyyMMddHHmmss" ); 1281 values[C_DYLOGOUT ] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1282 values[C_USED_TIME ] = String.valueOf( Math.round( (crntTime-usedTime) / 1000.0d ) ); // 秒に変換 1283 values[C_CNT_ACCESS ] = "0"; 1284 values[C_CNT_ERROR ] = "0"; 1285 values[C_CNT_READ ] = "0"; 1286 values[C_CNT_WRITE ] = "0"; 1287 values[C_TM_TOTAL_QUERY ] = "0"; 1288 values[C_TM_MAX_QUERY ] = "0"; 1289 values[C_MAX_QUERY ] = ""; 1290 values[C_FGJ ] = "1"; 1291 values[C_DYSET ] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1292 values[C_DYUPD ] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1293 values[C_USRSET ] = "userInfo"; 1294 values[C_USRUPD ] = "userInfo"; 1295 values[C_PGUPD ] = "userInfo"; 1296 1297 usedTime = crntTime ; 1298 1299 DBSimpleTable dbTable = new DBSimpleTable( names ); 1300 // 画面ID,操作,プログラムID 1301 getApplicationInfo( "UserInfo","saveGUI" ); 1302 dbTable.setApplicationInfo( appInfo ); // 3.8.7.0 (2006/12/15) 1303 dbTable.setConnectionID( DBID ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 1304 dbTable.setTable( "GE15" ); 1305 // 4.0.0.0 (2007/10/05) SQLServer 互換性の為、CLOB化します。 1306 // dbTable.addConstrain( names[C_MAX_QUERY],"SUBSTRB(?,1,4000)" ); 1307 1308 boolean okFlag = false; 1309 try { 1310 dbTable.startInsert(); 1311 1312 // UserInfo に関する情報の登録 1313 dbTable.execute( values ); 1314 1315 // GUIInfo に関する情報の登録 1316 if( infos != null ) { 1317 values[C_USED_TIME] = "0"; // USED_TIME をクリアしておきます。 1318 String logoutTime = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1319 for( int i=0; i<infos.length; i++ ) { 1320 GUIAccessCount access = infos[i].getGUIAccessCount(); 1321 int cnt = access.getAccessCount(); 1322 if( cnt > 0 ) { 1323 values[C_GUIKEY ] = access.getKey(); 1324 values[C_CNT_ACCESS ] = String.valueOf( cnt ); 1325 values[C_CNT_ERROR ] = String.valueOf( access.getErrorCount() ); 1326 values[C_CNT_READ ] = String.valueOf( access.getReadCount() ); 1327 values[C_CNT_WRITE ] = String.valueOf( access.getWriteCount() ); 1328 values[C_TM_TOTAL_QUERY ] = String.valueOf( access.getQueryTime() ); 1329 values[C_TM_MAX_QUERY ] = String.valueOf( access.getMaxQueryTime() ); 1330 values[C_MAX_QUERY ] = access.getMaxQuery(); 1331 // dbTable.addValues( values ); 1332 dbTable.execute( values ); 1333 // 4.1.1.0(2008/01/28)画面アクセス時間の更新 1334 // 5.2.3.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 1335 String keys = infos[i].getNextGuiKeys(); 1336// UserAccessTable.updateLastAccessTime( systemId,userID,access.getKey(),logoutTime ); 1337 UserAccessTable.updateLastAccessTime( systemId,userID,access.getKey(),logoutTime,keys ); 1338 } 1339 } 1340 } 1341 okFlag = true; 1342 } 1343 catch (SQLException ex) { 1344 LogWriter.log( " [" + userID + "] アクセス統計テーブル(GE15)登録時にエラーが発生しました" ); 1345 LogWriter.log( ex.getMessage() ); 1346 } 1347 finally { 1348 int cnt = dbTable.close( okFlag ); 1349// System.out.println(); 1350 System.out.println( " [" + userID + "] アクセス統計テーブル(GE15)に、[" + cnt + "]件、追加しました。" ); 1351 } 1352 } 1353 1354 // ユーザー永続化情報(GE20)設定でしか使用しない変数の宣言 1355 private static final int C_GE20_SYSTEM_ID = 0; 1356 private static final int C_GE20_USERID = 1; 1357 private static final int C_GE20_ROLES = 2; 1358 private static final int C_GE20_PARAM_ID = 3; 1359 private static final int C_GE20_PARAM = 4; 1360 private static final int C_GE20_KBSET = 5; 1361 private static final int C_GE20_FGJ = 6; 1362 private static final int C_GE20_DYSET = 7; 1363 private static final int C_GE20_DYUPD = 8; 1364 private static final int C_GE20_USRSET = 9; 1365 private static final int C_GE20_USRUPD = 10; 1366 private static final int C_GE20_PGUPD = 11; 1367 1368 private static final int GE20_KBSET_READONLY = 1; 1369 private static final int GE20_KBSET_WRITABLE = 2; 1370 1371 // ロールは全て*で登録する。アプリケーションから動的に登録される値を、 1372 // ロール単位設定しても、ロール変更時に整合性が合わない可能性大なので、 1373 // UserInfoで設定する場合は、全てのロールで有効とする。 1374 private static final String GE20_ROLES = "*"; 1375 1376 /** 1377 * userInfoにセットされた値/キーをDBに登録します。 1378 * 既にキーが存在している場合は、既存データを更新し、なければ追加します。 1379 * 1380 * @og.rev 5.3.6.0 (2011/06/01) 全ユーザー情報として保存できるように対応 1381 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 1382 * 1383 * @param key キー 1384 * @param value 値 1385 * @param isCommon ユーザーID='*'(全ユーザー公開)として登録するかどうか 1386 */ 1387// private void savePermanently( final String key, final String value ) { 1388 private void savePermanently( final String key, final String value, final boolean isCommon ) { 1389 1390 // 追加変更時に共通でセットされる値を設定 1391 String[] names = new String[] { "SYSTEM_ID","USERID","ROLES","PARAM_ID","PARAM","KBSET" 1392 ,"FGJ","DYSET","DYUPD","USRSET","USRUPD","PGUPD" }; 1393 String[] values = new String[names.length]; 1394 values[C_GE20_SYSTEM_ID ] = HybsSystem.sys( "SYSTEM_ID" ); 1395// values[C_GE20_USERID ] = userID; 1396 values[C_GE20_USERID ] = ( isCommon ? "*" : userID ); 1397 values[C_GE20_ROLES ] = GE20_ROLES; 1398 values[C_GE20_PARAM_ID ] = key; 1399 values[C_GE20_PARAM ] = value; 1400 values[C_GE20_KBSET ] = String.valueOf( GE20_KBSET_WRITABLE ); 1401 values[C_GE20_FGJ ] = "1"; 1402 values[C_GE20_DYSET ] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1403 values[C_GE20_DYUPD ] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 1404 values[C_GE20_USRSET ] = userID; 1405 values[C_GE20_USRUPD ] = userID; 1406 values[C_GE20_PGUPD ] = "UserInfo"; 1407 1408 // 画面ID,操作,プログラムID 1409 getApplicationInfo( "UserInfo","registValueToDB" ); 1410 1411 DBSimpleTable dbTable = new DBSimpleTable( names ); 1412 dbTable.setApplicationInfo( appInfo ); // 3.8.7.0 (2006/12/15) 1413 dbTable.setConnectionID( DBID ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 1414 dbTable.setTable( "GE20" ); 1415 1416 boolean okFlag = false; 1417 try { 1418// if( isExistValue( key, GE20_ROLES ) ) { 1419 if( isExistValue( key, ( isCommon ? "*" : userID ), GE20_ROLES ) ) { 1420 String where = "SYSTEM_ID = [SYSTEM_ID] and USERID = [USERID] and ROLES = [ROLES] and PARAM_ID = [PARAM_ID] and FGJ='1'"; 1421 dbTable.setWhere( where ); 1422 dbTable.startUpdate(); 1423 } 1424 else { 1425 dbTable.startInsert(); 1426 } 1427 dbTable.execute( values ); 1428 okFlag = true; 1429 } 1430 catch ( SQLException ex ) { 1431 throw new HybsSystemException( "ユーザー永続化情報(GE20)設定時にエラーが発生しました", ex ); 1432 } 1433 finally { 1434 dbTable.close( okFlag ); 1435 } 1436 } 1437 1438 /** 1439 * userInfoから削除された値/キーをDBからも削除します。 1440 * 1441 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 1442 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 1443 * 1444 * @param key キー 1445 * @param isCommon ユーザーID='*'(全ユーザー公開)から削除するかどうか 1446 */ 1447 private void deletePermanently( final String key, final boolean isCommon ) { 1448 1449 // 追加変更時に共通でセットされる値を設定 1450 String[] names = new String[] { "SYSTEM_ID","USERID","ROLES","PARAM_ID" }; 1451 String[] values = new String[names.length]; 1452 values[C_GE20_SYSTEM_ID ] = HybsSystem.sys( "SYSTEM_ID" ); 1453 values[C_GE20_USERID ] = ( isCommon ? "*" : userID ); 1454 values[C_GE20_ROLES ] = GE20_ROLES; 1455 values[C_GE20_PARAM_ID ] = key; 1456 1457 // 画面ID,操作,プログラムID 1458 getApplicationInfo( "UserInfo","deleteValueFromDB" ); 1459 1460 DBSimpleTable dbTable = new DBSimpleTable( names ); 1461 dbTable.setApplicationInfo( appInfo ); 1462 dbTable.setConnectionID( DBID ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 1463 dbTable.setTable( "GE20" ); 1464 1465 boolean okFlag = false; 1466 try { 1467 String where = "SYSTEM_ID = [SYSTEM_ID] and USERID = [USERID] and ROLES = [ROLES] and PARAM_ID = [PARAM_ID] and FGJ='1'"; 1468 dbTable.setWhere( where ); 1469 dbTable.startDelete(); 1470 dbTable.execute( values ); 1471 okFlag = true; 1472 } 1473 catch ( SQLException ex ) { 1474 throw new HybsSystemException( "ユーザー永続化情報(GE20)削除時にエラーが発生しました", ex ); 1475 } 1476 finally { 1477 dbTable.close( okFlag ); 1478 } 1479 } 1480 1481 /** 1482 * ユーザー永続化情報(GE20)に該当のキーが存在するかをチェックします。 1483 * 1484 * @og.rev 5.3.6.0 (2011/06/01) 全ユーザー情報として保存できるように対応 1485 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 1486 * 1487 * @param key キー 1488 * @param userid ユーザーID 1489 * @param roles ロール 1490 * 1491 * @return true:存在している/false:存在していない 1492 */ 1493// private boolean isExistValue( final String key, final String roles ) { 1494 private boolean isExistValue( final String key, final String userid, final String roles ) { 1495// String[] args = { HybsSystem.sys( "SYSTEM_ID" ), userID, roles, key }; 1496 String[] args = { HybsSystem.sys( "SYSTEM_ID" ), userid, roles, key }; 1497 1498 // 画面ID,操作,プログラムID 1499 getApplicationInfo( "UserInfo","isExistValue" ); 1500 1501// String[][] rtn = DBUtil.dbExecute( QUERY_GE20_KEY, args, appInfo ); 1502 String[][] rtn = DBUtil.dbExecute( QUERY_GE20_KEY, args, appInfo, DBID ); // 5.5.5.1 (2012/08/07) 1503 if( rtn == null || rtn.length == 0 ) { 1504 return false; 1505 } 1506 else if( rtn[0].length > 0 ) { 1507 if( String.valueOf( GE20_KBSET_READONLY ).equals( rtn[0][0] ) ) { 1508 throw new HybsSystemException( "読み取り専用情報のため、書き込みできません" ); 1509 } 1510 else { 1511 return true; 1512 } 1513 } 1514 else { 1515 throw new HybsSystemException( "ユーザー永続化情報(GE20)検索時にエラーが発生しました。" ); 1516 } 1517 } 1518 1519 /** 1520 * 指定されたカラムキーに対応するデータの条件式を返します。 1521 * 1522 * @og.rev 4.4.0.0 (2009/08/02) 新規追加 1523 * 1524 * @param clm カラム名 1525 * 1526 * @return データの条件式 1527 */ 1528 public String getDataCondition ( final String clm ) { 1529 return dataRole.getCondition( clm ); 1530 } 1531 1532 /** 1533 * このユーザーでアクセスされた画面オブジェクトを設定します。 1534 * 1535 * これは、画面アクセスの履歴(順番)を管理する機能に使います。 1536 * 1537 * @og.rev 5.2.3.0 (2010/12/01) 新規追加 1538 * 1539 * @param guiInfo 画面オブジェクト 1540 */ 1541 public void setAccessGui( final GUIInfo guiInfo ) { 1542 if( lastGuiInfo != null && guiInfo != null ) { 1543 lastGuiInfo.setNextGuiKey( guiInfo.getKey() ); 1544 } 1545 lastGuiInfo = guiInfo ; // 最後にアクセスした GUIInfo を設定 1546 } 1547}