Coverage Report - jp.co.y_net.amm.page.MemberDetailPage
 
Classes in this File Line Coverage Branch Coverage Complexity
MemberDetailPage
0%
0/86
0%
0/30
0
MemberDetailPage$1
0%
0/9
0%
0/6
0
MemberDetailPage$10
0%
0/15
0%
0/12
0
MemberDetailPage$2
0%
0/3
N/A
0
MemberDetailPage$3
0%
0/3
N/A
0
MemberDetailPage$4
0%
0/3
0%
0/2
0
MemberDetailPage$5
0%
0/3
0%
0/4
0
MemberDetailPage$6
0%
0/5
0%
0/2
0
MemberDetailPage$7
0%
0/3
0%
0/2
0
MemberDetailPage$8
0%
0/71
0%
0/70
0
MemberDetailPage$9
0%
0/10
0%
0/8
0
 
 1  0
 package jp.co.y_net.amm.page;
 2  
 
 3  
 import jp.co.y_net.amm.AppSession;
 4  
 import jp.co.y_net.amm.AppSession.LoginUser;
 5  
 import jp.co.y_net.amm.common.AppStringUtils;
 6  
 import jp.co.y_net.amm.common.AppUtils;
 7  
 import jp.co.y_net.amm.common.CalcHash;
 8  
 import jp.co.y_net.amm.dao.AppDef;
 9  
 import jp.co.y_net.amm.dao.Org;
 10  
 import jp.co.y_net.amm.dao.Usr;
 11  
 
 12  
 import org.apache.commons.lang.StringUtils;
 13  
 import org.apache.wicket.RestartResponseException;
 14  
 import org.apache.wicket.ajax.AjaxRequestTarget;
 15  
 import org.apache.wicket.markup.html.basic.Label;
 16  
 import org.apache.wicket.markup.html.form.Button;
 17  
 import org.apache.wicket.markup.html.form.CheckBox;
 18  
 import org.apache.wicket.markup.html.form.Form;
 19  
 import org.apache.wicket.markup.html.form.PasswordTextField;
 20  
 import org.apache.wicket.markup.html.form.TextField;
 21  
 import org.apache.wicket.model.Model;
 22  
 import org.apache.wicket.model.PropertyModel;
 23  
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 24  
 
 25  
 
 26  
 /**
 27  
  * @author k_inaba
 28  
  */
 29  
 public class MemberDetailPage extends CommonFrameA {
 30  
     private static final long serialVersionUID = 1L;
 31  
     
 32  
     /*
 33  
      * 画面入力値
 34  
      */
 35  
     public String nameValue;
 36  
     public String mailValue;
 37  
     public String mail2Value;
 38  
     public String passwordValue;
 39  
     public String password2Value;
 40  
 //    public String fromdateValue;
 41  
 //    public String todateValue;
 42  
     public boolean stoploginValue;
 43  
     
 44  
     /*
 45  
      * 画面の状態
 46  
      */
 47  0
     private boolean completeMod = false;
 48  0
     private boolean completePwreset = false;
 49  0
     private boolean completeDel = false;
 50  
     
 51  
     /**
 52  
      * ログインチェック定義
 53  
      * @see jp.co.y_net.amm.page.AppPage#validateLogin()
 54  
      */
 55  
     @Override
 56  
     public boolean validateLogin() {
 57  0
         if(AppSession.get().isLogin()) {
 58  0
             if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)) {
 59  0
                 return true;
 60  
             }
 61  0
             if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関管理者)) {
 62  0
                 return true;
 63  
             }
 64  0
             if(AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関会員)) {
 65  0
                 return true;
 66  
             }
 67  
         }
 68  0
         return false;
 69  
     }
 70  
     
 71  
     
 72  0
     public MemberDetailPage(PageParameters pageParams) {
 73  
             
 74  
         /* 共通戻るリンクの設置 */
 75  0
         createCommonBackLinks();
 76  
 
 77  
         /* 画面固有の戻るボタンの設置 */
 78  0
         createBackLink(MemberListPage.class, "会員管理");
 79  
         
 80  
         /* フィードバックパネルの設置 */
 81  0
         createFeedbackPanel();
 82  
 
 83  
         
 84  
         /* 入力フォーム */
 85  0
         final Form<Void> form  = new Form<Void>("form");
 86  0
         form.setOutputMarkupId(true);
 87  0
         add(form);
 88  
         
 89  
         /* 初期表示エラーチェック ----------------------------------------------------------------------------------- */
 90  0
         form.setVisible(false); // Formはエラーチェックが完了するまで非表示とする。
 91  
         
 92  0
         String paramUsrid = pageParams.get("usrid").toString("");
 93  
         final Integer targetUserid;
 94  0
         if(StringUtils.isEmpty(paramUsrid)) {
 95  
             /* パラメータが指定されていなければ、ログインユーザの情報を対象とする */
 96  0
             if (isMember() || isOrgAdmin() || isSystemAdmin()) {
 97  0
                 targetUserid = AppSession.get().getLoginUser().getUsrid();
 98  0
             } else {
 99  0
                 error("パラメータ usrid がありません。");
 100  0
                 return; // ----------中断
 101  
             }
 102  
         } else {
 103  0
             targetUserid = AppUtils.toInteger(paramUsrid);
 104  
         }
 105  0
         final Usr targetUsr = usrDao.getByUsrid(targetUserid);
 106  0
         if(targetUsr == null) {
 107  0
             error("該当する利用者情報がありません。");
 108  0
             return; // ----------中断
 109  
             
 110  
         }
 111  0
         if(isSystemAdmin()) {
 112  
             /* 機関管理者が他機関の情報にアクセスしてはいけない */
 113  0
             LoginUser loginUser = AppSession.get().getLoginUser();
 114  0
             if(AppUtils.equals(loginUser.getOrgid(), targetUsr.getOrgid()) == false && isSystemAdmin() == false) {
 115  0
                 error("該当する情報を扱う権限がありません。");
 116  0
                 return; // ----------中断
 117  
             }
 118  
         }
 119  
         
 120  0
         final LoginUser loginUser  = AppSession.get().getLoginUser();
 121  0
         if(loginUser == null) {
 122  0
             error("ログイン情報が取得できません。");
 123  0
             return;
 124  
         }
 125  0
         final Integer loginUserId = loginUser.getUsrid();
 126  
         
 127  
         
 128  
         /* 組織の管理者は 登録情報編集画面を使用するため、会員詳細ページへリンクさせない */
 129  0
         if(Usr.ROLE_管理者 == targetUsr.getOrgrole()) {
 130  0
             throw new RestartResponseException(OrgDetailPage.class);
 131  
         }
 132  
         
 133  
         
 134  
         
 135  0
         if(hasInputError()) return; // ----------エラーがあれば中止
 136  0
         form.setVisible(true);
 137  
 
 138  
 
 139  
         
 140  
         /* Form内の設定 ----------------------------------------------------------------------------------------------*/
 141  
         
 142  
         /* 完了メッセージ */
 143  0
         Model<String> resultMessageModel = new Model<String>() {
 144  
             @Override
 145  
             public String getObject() {
 146  0
                 if(completeMod) {
 147  0
                     return "会員情報を変更しました。";
 148  
                 }
 149  0
                 if(completePwreset) {
 150  0
                     return "パスワード登録用のメールを送りました。";
 151  
                 }
 152  0
                 if(completeDel) {
 153  0
                     return "会員情報を削除しました。";
 154  
                 }
 155  0
                 return "";
 156  
             }
 157  
         };
 158  0
         final Label resutlMessage = new Label("resutlMessage", resultMessageModel);
 159  0
         form.add(resutlMessage);
 160  
         
 161  
         /* 入力コンポーネントの設定 ----------------------------------------------------------------------------------*/
 162  
         
 163  0
         nameValue = targetUsr.getName();
 164  0
         mailValue = targetUsr.getLoginid();
 165  0
         stoploginValue = AppUtils.toBoolean(targetUsr.getStoplogin());
 166  
         
 167  
         /* 名前 */
 168  0
         TextField<String> name = new TextField<String>("name", new PropertyModel<String>(this, "nameValue"));
 169  0
         form.add(name);
 170  
         /* メールアドレス */
 171  0
         TextField<String> mail = new TextField<String>("mail", new PropertyModel<String>(this, "mailValue"));
 172  0
         form.add(mail);
 173  
         /* メールアドレス確認用 */
 174  0
         TextField<String> mail2 = new TextField<String>("mail2", new PropertyModel<String>(this, "mail2Value"));
 175  0
         form.add(mail2);
 176  
         
 177  
         /* パスワード */
 178  0
         final PasswordTextField password = new PasswordTextField("password", new PropertyModel<String>(this, "passwordValue")){
 179  
             @Override
 180  
             public boolean isVisible() {
 181  
                 /* ログインユーザ自身の情報でなければ画面から変更できない */
 182  0
                 return isLoginUser(targetUsr);
 183  
             }
 184  
         };
 185  0
         password.setRequired(false);
 186  0
         form.add(password);
 187  
         
 188  
         /* パスワード確認用 */
 189  0
         PasswordTextField password2 = new PasswordTextField("password2", new PropertyModel<String>(this, "password2Value")){
 190  
             @Override
 191  
             public boolean isVisible() {
 192  
                 /* ログインユーザ自身の情報でなければ画面から変更できない */
 193  0
                 return isLoginUser(targetUsr);
 194  
             }
 195  
         };
 196  0
         password2.setRequired(false);
 197  0
         form.add(password2);
 198  
         
 199  
         /* 利用可能期間FROM~TO */
 200  0
         Org 所属する組織 = orgDao.getByOrgid(targetUsr.getOrgid());
 201  0
         String fromtodateStr = 所属する組織.getFromTodate_Disp();
 202  
 
 203  0
         Label fromtodate = new Label("fromtodate", Model.of(fromtodateStr)){
 204  
             @Override
 205  
             public boolean isVisible() {
 206  0
                 return StringUtils.isEmpty(getDefaultModelObjectAsString()) == false;
 207  
             }
 208  
             
 209  
         };
 210  0
         form.add(fromtodate);
 211  
 
 212  
         /* ログイン停止 */
 213  0
         final Model<Boolean> stoploginModel = Model.of(stoploginValue);
 214  0
         CheckBox stoplogin = new CheckBox("stoplogin", stoploginModel){
 215  
             @Override
 216  
             public boolean isVisible() {
 217  
                 /* 一般会員変更不可 */
 218  0
                 return isSystemAdmin() || isOrgAdmin();
 219  
             }
 220  
         };
 221  0
         form.add(stoplogin);
 222  
 
 223  
         /* 表示コンポーネントの設定 ----------------------------------------------------------------------------------*/
 224  
         
 225  
         /* 所属機関 */
 226  0
         final Org org = orgDao.getByOrgid(targetUsr.getOrgid());
 227  0
         form.add(new Label("orgname", org.getName()){
 228  
             @Override
 229  
             public boolean isVisible() {
 230  0
                 if(org.isPersonalOrg()) { // 個人の場合は非表示
 231  0
                     return false;
 232  
                 }
 233  0
                 return true;
 234  
             }
 235  
         });
 236  
         
 237  
         /* 最終ログイン日時 */
 238  0
         form.add(new Label("lastlogin" , targetUsr.getLastlogindate_Disp()));
 239  
         
 240  
         /* 状態 */
 241  0
         form.add(new Label("status", targetUsr.getStatus_Disp()));
 242  
         
 243  
         
 244  
         /* 上位者によるメールアドレス変更のメッセージ */
 245  0
         form.add(new Label("msgpwreset", "※ メールアドレスを変更するとパスワードがリセットされます。") {
 246  
             @Override
 247  
             public boolean isVisible() {
 248  
                 /* パスワード欄から変更できない場合はパスワードリセット */
 249  0
                 return password.isVisible() == false;
 250  
             }
 251  
         });
 252  
         
 253  
         
 254  
         /* パスワード情報 */
 255  0
         PasswordInfoPanel passwordInfoPanel = new PasswordInfoPanel("PasswordInfoPanel", 
 256  0
                 targetUsr,
 257  0
                 isSystemAdmin());
 258  0
         form.add(passwordInfoPanel);
 259  
         
 260  
         /* 処理ボタン定義 --------------------------------------------------------------------------------------------*/
 261  
         
 262  
         /*
 263  
          * 【会員情報変更】
 264  
          */
 265  0
         Button btnSubmitMod = new ConfirmAjaxButton("btnSubmitMod") {
 266  
             @Override
 267  
             String getConfirmMessage() {
 268  0
                 return "更新します。";
 269  
             }
 270  
             @Override
 271  
             boolean executeBefore() {
 272  
                 /* 入力値変換 */
 273  0
                 nameValue = AppStringUtils.trim(nameValue);
 274  0
                 mailValue = AppStringUtils.trimHalf(mailValue);
 275  0
                 mail2Value = AppStringUtils.trimHalf(mail2Value);
 276  0
                 passwordValue = AppStringUtils.trimHalf(passwordValue);
 277  0
                 password2Value = AppStringUtils.trimHalf(password2Value);
 278  0
                 if(isSystemAdmin() || isOrgAdmin()) {
 279  0
                     stoploginValue = stoploginModel.getObject();
 280  
                 }
 281  0
                 boolean isメールアドレスが変更されている = (mailValue.equals(targetUsr.getLoginid()) == false);
 282  0
                 boolean isパスワード欄が入力されている = (StringUtils.isEmpty(passwordValue) == false);
 283  
                 
 284  
                 /* 入力値検査 */
 285  0
                 validItem(nameValue, "氏名", 1, 512);
 286  
                 
 287  0
                 if(isメールアドレスが変更されている){
 288  0
                     validItemMail(mailValue, "メールアドレス");
 289  0
                     validItemMail(mail2Value, "メールアドレス確認用");
 290  
                 }
 291  0
                 if (isパスワード欄が入力されている) {
 292  0
                     validItemAscii(passwordValue, "パスワード", 8, 16);
 293  0
                     validItemAscii(password2Value, "パスワード確認用", 8, 16);
 294  
                 }
 295  
 
 296  0
                 if(hasInputError()) return false; // ここまででエラーチェック
 297  
 
 298  0
                 if(isメールアドレスが変更されている){
 299  0
                     if(mailValue.equals(mail2Value) == false) {
 300  0
                         error("メールアドレスが一致しません。");
 301  
                     }
 302  
                     
 303  0
                     if(mailAddressCheck.exist(mailValue)) {
 304  0
                         error("このメールアドレスは既に使用されています。");
 305  
                     }
 306  
                 }
 307  0
                 if(isパスワード欄が入力されている) {
 308  0
                     if(passwordValue.equals(password2Value) == false) {
 309  0
                         error("パスワードが一致しません。");
 310  
                     }
 311  
                 }
 312  0
                 if(hasInputError()) return false; // ここまででエラーチェック
 313  
                 
 314  
                 /*
 315  
                  * パスワードの変更について
 316  
                  *  メールアドレスが変更されている場合は、パスワードの変更が必須である。
 317  
                  *  パスワード欄が入力できるのは変更対象の情報が、ログインユーザ本人であるときのみ。
 318  
                  *  パスワード欄が入力できない場合(代表者や運営管理者による変更)は、パスワードリセットを実施する。
 319  
                  */
 320  
 //                boolean パスワードリセットが必要 = false;
 321  0
                 if(isメールアドレスが変更されている) {
 322  0
                     if(isLoginUser(targetUsr) ) {
 323  
                         /* 変更対象の情報が、ログインユーザ本人 */
 324  0
                         if(isパスワード欄が入力されている) {
 325  
                             // 正しい
 326  
                         } else {
 327  0
                             error("メールアドレスを変更する場合は、パスワードも設定してください。");
 328  
                         }
 329  
                         
 330  0
                     } else if(isSystemAdmin() || isOrgAdmin()) {
 331  
                         /* パスワード欄が入力できない場合(代表者や運営管理者による変更) */
 332  
 //                        パスワードリセットが必要 = true;
 333  
                     } else {
 334  
                         /* 通常想定されない条件 */
 335  0
                         error("メールアドレスを変更することはできません。");
 336  
                     }
 337  
                 }
 338  
                 
 339  0
                 if(hasInputError()) return false; // ここまででエラーチェック
 340  
                 
 341  0
                 return true;
 342  
             }
 343  
             
 344  
             @Override
 345  
             void executeAfter(AjaxRequestTarget target) {
 346  
                 /* データアクセス 代表者による会員情報変更  */
 347  
                 
 348  0
                 boolean isメールアドレスが変更されている = (mailValue.equals(targetUsr.getLoginid()) == false);
 349  0
                 boolean isパスワード欄が入力されている = (StringUtils.isEmpty(passwordValue) == false);
 350  
                 
 351  0
                 if(isメールアドレスが変更されている){
 352  0
                     targetUsr.setLoginid(mailValue);
 353  
                 }
 354  0
                 if(isパスワード欄が入力されている) {
 355  0
                     String pwhash = CalcHash.passowrdHash(passwordValue, targetUsr.getLoginid());
 356  0
                     targetUsr.setPwhash(pwhash);
 357  0
                     targetUsr.setModpwdate(AppUtils.createNowLong()); // パスワード変更日時
 358  
                 }
 359  
                 
 360  0
                 if(isメールアドレスが変更されている 
 361  0
                         && isパスワード欄が入力されている == false) {
 362  
                     /* 代表者や運営管理者によるメールアドレスだけの変更 */
 363  0
                     targetUsr.setPwhash("");
 364  0
                     targetUsr.setModpwdate(AppUtils.createNowLong()); // パスワード変更日時
 365  
                 }
 366  
                 
 367  0
                 targetUsr.setName(nameValue);
 368  0
                 if(stoploginValue) {
 369  0
                     targetUsr.setStoplogin(AppDef.TRUE);
 370  0
                 } else {
 371  0
                     targetUsr.setStoplogin(AppDef.FLASE);
 372  
                 }
 373  
                 
 374  0
                 usrDao.update(targetUsr, loginUserId); // 【更新処理】
 375  
                 
 376  
                 
 377  
                 /* 本人以外がメールアドレスを変更していたらパスワードリセット */
 378  0
                 boolean パスワードリセットが必要 = false;
 379  0
                 if(isメールアドレスが変更されている) {
 380  0
                     if(isSystemAdmin() || isOrgAdmin()) {
 381  
                         /* パスワード欄が入力できない場合(代表者や運営管理者による変更) */
 382  0
                         パスワードリセットが必要 = true;
 383  
                     }
 384  
                 }
 385  0
                 if(パスワードリセットが必要) {
 386  0
                     doパスワードリセット(targetUserid, passwordTicketManager, mailValue);
 387  
                 }
 388  
                 
 389  
                 /*
 390  
                  * 状態遷移
 391  
                  */
 392  0
                 completeMod = true;
 393  
                 
 394  
                 
 395  
                 /* TODO ログインユーザのメールアドレスかパスワードが変更されたら、自動ログアウトさせる */
 396  0
                 if(isパスワード欄が入力されている && isLoginUser(targetUsr)) {
 397  
                     /* APIログアウト相当の実施 */
 398  0
                     logout.execute(AppSession.get().getLoginUser().getLoginid());
 399  
                     
 400  
                     /* セッション無効化 */
 401  0
                     AppSession session = (AppSession) getSession();
 402  0
                     session.invalidateNow();
 403  
                     
 404  
                     // TODO 次のメッセージを出すことができない。
 405  0
                     error("パスワードが変更されたためログアウトしました。新たらしいパスワードでログインしてください。");
 406  
                     
 407  0
                     setResponsePage(LoginPage.class);
 408  
                 }
 409  
                 
 410  
                 /* 画面コンポーネントを更新する */
 411  0
                 target.add(form);
 412  
                 
 413  0
             }
 414  
             @Override
 415  
             public boolean isVisible() {
 416  
                 /* 完了後の状態ならボタンを表示しない */
 417  0
                 return completeMod == false && completePwreset == false && completeDel == false;
 418  
             }
 419  
         };
 420  0
         form.add(btnSubmitMod);
 421  
         
 422  
         /*
 423  
          * 【パスワードリセット】
 424  
          */
 425  0
         Button btnSubmitPwreset = new ConfirmAjaxButton("btnSubmitPwreset") {
 426  
             @Override
 427  
             String getConfirmMessage() {
 428  0
                 return "パスワードリセットします。";
 429  
             }
 430  
             @Override
 431  
             void executeAfter(AjaxRequestTarget target) {
 432  
                 
 433  0
                 doパスワードリセット(targetUserid, passwordTicketManager, mailValue);
 434  
                 
 435  
                 
 436  
                 /* 完了状態へ遷移 */
 437  0
                 completePwreset = true;
 438  
                 
 439  
                 /* 画面コンポーネントを更新する */
 440  0
                 target.add(form);
 441  0
             }
 442  
 
 443  
             @Override
 444  
             public boolean isVisible() {
 445  
                 /* パスワード変更欄が表示されていれば、パスワードリセットボタンは表示しない */
 446  0
                 if(password.isVisible()) {
 447  0
                     return false;
 448  
                 }
 449  
                 
 450  
                 /* 完了後の状態ならボタンを表示しない */
 451  0
                 return completeMod == false && completePwreset == false && completeDel == false;
 452  
             }
 453  
         };
 454  0
         form.add(btnSubmitPwreset);
 455  
         
 456  
         /*
 457  
          * 【会員情報削除】
 458  
          */
 459  0
         Button btnSubmitDel = new ConfirmAjaxButton("btnSubmitDel") {
 460  
             @Override
 461  
             String getConfirmMessage() {
 462  0
                 return "削除します。";
 463  
             }
 464  
             @Override
 465  
             String getConfirmMessageStrong() {
 466  0
                 return "本当によろしいですか?";
 467  
             }
 468  
             @Override
 469  
             void executeAfter(AjaxRequestTarget target) {
 470  
                 
 471  
                 /* データアクセス 機関管理者による会員情報削除 */
 472  0
                 targetUsr.退会処理();
 473  0
                 usrDao.update(targetUsr, loginUserId); // 【更新処理】
 474  
                 
 475  
                 /* 外部APIに退会者のログインIDを通知 */
 476  0
                 AppUtils.callDeleteNotice(targetUsr);
 477  
                 
 478  
                 /* 完了状態へ遷移 */
 479  0
                 completeDel = true;
 480  
                 
 481  
                 /* 画面コンポーネントを更新する */
 482  0
                 target.add(form);
 483  0
             }
 484  
             @Override
 485  
             public boolean isVisible() {
 486  
                 /* 運営管理者、代表者以外には表示しない */
 487  0
                 if(isSystemAdmin() == false && isOrgAdmin() == false) {
 488  0
                     return false;
 489  
                 }
 490  
                 /* 自分自身の情報は削除できない */
 491  0
                 if(isLoginUser(targetUsr)) {
 492  0
                     return false;
 493  
                 }
 494  
                 
 495  
                 /* 完了後の状態ならボタンを表示しない */
 496  0
                 return completeMod == false && completePwreset == false && completeDel == false;
 497  
             }
 498  
         };
 499  0
         form.add(btnSubmitDel);
 500  0
     }
 501  
 
 502  
 
 503  
 
 504  
 
 505  
 
 506  
 
 507  
 
 508  
 }