##### 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.0;0

MemberDetailPage$1

0% | 0/9

0% | 0/6

0.0;0

MemberDetailPage$10

0% | 0/15

0% | 0/12

0.0;0

MemberDetailPage$2

0% | 0/3

N/A | N/A

0.0;0

MemberDetailPage$3

0% | 0/3

N/A | N/A

0.0;0

MemberDetailPage$4

0% | 0/3

0% | 0/2

0.0;0

MemberDetailPage$5

0% | 0/3

0% | 0/4

0.0;0

MemberDetailPage$6

0% | 0/5

0% | 0/2

0.0;0

MemberDetailPage$7

0% | 0/3

0% | 0/2

0.0;0

MemberDetailPage$8

0% | 0/71

0% | 0/70

0.0;0

MemberDetailPage$9

0% | 0/10

0% | 0/8

0.0;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

     }