Package jp.co.nskint.uq.pd.signage.page

Source Code of jp.co.nskint.uq.pd.signage.page.UserPage

/**
*
*/
package jp.co.nskint.uq.pd.signage.page;

import java.util.Iterator;
import java.util.List;

import jp.co.nskint.uq.pd.signage.meta.UserMeta;
import jp.co.nskint.uq.pd.signage.model.Administrator;
import jp.co.nskint.uq.pd.signage.model.Editor;
import jp.co.nskint.uq.pd.signage.model.Layout;
import jp.co.nskint.uq.pd.signage.model.Manager;
import jp.co.nskint.uq.pd.signage.model.TimeLine;
import jp.co.nskint.uq.pd.signage.model.User;
import jp.co.nskint.uq.pd.signage.service.UserService;
import jp.co.nskint.uq.pd.signage.validator.StringValidator;

import org.slim3.controller.Navigation;
import org.slim3.controller.validator.Validators;
import org.slim3.datastore.Datastore;
import org.slim3.util.ApplicationMessage;

import scenic3.annotation.ActionPath;
import scenic3.annotation.Default;
import scenic3.annotation.Page;
import scenic3.annotation.RequestParam;
import scenic3.annotation.Var;

import com.google.appengine.api.datastore.Key;

/**
* ユーザ情報(共通) 操作系画面
*
* @author NAGASAWA takahiro <tnagasaw@nskint.co.jp>
*/
@Page("/user")
public class UserPage extends BaseUserPage<UserService> {

    private UserService service = new UserService();

    /*
     * (非 Javadoc)
     *
     * @see jp.co.nskint.uq.pd.signage.page.BaseUserPage#getService()
     */
    @Override
    public UserService getService() {
        return service;
    }

    /**
     * ユーザ情報の削除
     *
     * @param uid
     *            ユーザID
     */
    @ActionPath("{uid}/remove")
    public Navigation remove(@Var("uid") String uid) {
        putEnteringLog();
        Key key = UserService.createKey(uid);
        User user = Datastore.get(UserMeta.get(), key);
        if (checkAdmin()
            || checkManager()
            && user instanceof Editor
            && ((Editor) user)
                .getManagerRef()
                .getModel()
                .equals(getLoginUser())) {
            if (user instanceof Manager) {
                // 代表者の場合は、付随する情報も削除する。
                Manager man = (Manager) user;


                    // レイアウト情報を削除
                    List<Layout> layouts =
                        man.getLayoutListRef().getModelList();
                    for (Layout layout : layouts) {
                        Datastore.delete(layout.getId());
                    }

                    List<TimeLine> timelines =
                        man.getTimelineRef().getModelList();
                    for (TimeLine timeline : timelines) {
                        // タイムライン情報を削除
                        Datastore.delete(timeline.getId());
                    }

                // 編集者情報を削除
                List<Editor> editors = man.getEditorListRef().getModelList();
                for (Iterator<Editor> iterator = editors.iterator(); iterator
                    .hasNext();) {
                    Editor editor = iterator.next();
                    Datastore.delete(editor.getUid());
                }
            }
            // ユーザ情報を削除
            Datastore.delete(key);
            return redirect("/menu");
        }
        errors.put("page", ApplicationMessage.get("error.authority"));
        return forward("error.jsp");
    }

    /**
     * ユーザ情報の編集。 ユーザの種類によって、処理を振り分ける。
     *
     * @param uid
     *            ユーザID
     */
    @ActionPath("{uid}/edit")
    public Navigation edit(@Var("uid") String uid) {
        putEnteringLog();
        Key key = UserService.createKey(uid);
        User user = Datastore.get(UserMeta.get(), key);
        User loginUser = getLoginUser();
        if (user instanceof Administrator && checkAdmin()) {
            // 管理者のみ、管理者情報の編集
            return redirect("/admin/" + uid + "/edit");
        } else if (user instanceof Manager
            && (checkAdmin() || loginUser.equals(user))) {
            // 管理者か本人の場合のみ代表者情報の編集
            return redirect("/manager/" + uid + "/edit");
        } else if (user instanceof Editor
            && (checkAdmin() || loginUser.equals(user) || checkManager()
                && ((Editor) user).getManagerRef().getModel().equals(loginUser))) {
            // 管理者か、本人か、所属する代表者の場合のみ
            // 編集者情報の編集
            return redirect("/editor/" + uid + "/edit");
        }
        errors.put("page", ApplicationMessage.get("error.authority"));
        return redirect("/error.jsp");
    }

    /**
     * パスワードの初期化
     *
     * @param uid
     *            ユーザID
     */
    @ActionPath("{uid}/initPassword")
    public Navigation initPassword(@Var("uid") String uid) {
        putEnteringLog();
        if (checkAdmin()) {
            // 管理者のみ、パスワード初期化が可能
            Key key = UserService.createKey(uid);
            User user = Datastore.get(UserMeta.get(), key);
            // ユーザ登録メール送信
            user.setPassword("");
            if (!sendConfirmationMail(user)) {
                return forward("/error.jsp");
            }
            Datastore.put(user);
        }
        return redirect("/menu");
    }

    /**
     * パスワード更新画面表示
     *
     * @param uid
     *            ユーザID
     */
    @ActionPath("{uid}/password")
    public Navigation password(@Var("uid") String uid) {
        putEnteringLog();
        logger.finest("uid : " + uid);
        try {
            User user = service.get(uid);
            User loginUser = getLoginUser();
            logger.finest("loginUser uid : " + loginUser.getUid().getName());
            logger.finest("equal? : " + user.equals(loginUser));
            if (user != null && user.equals(loginUser)) {
                // 本人しか変更できない
                request.setAttribute("user", user);
                return forward("/user/password.jsp");
            } else {
                errors.put("page", ApplicationMessage.get("error.authority"));
                return forward("/error.jsp");
            }
        } finally {
            putExitingLog();
        }
    }

    /**
     * パスワード更新
     *
     * @param uid
     *            ユーザID
     * @param oldPassword
     *            旧パスワード
     * @param newPassword
     *            新パスワード
     * @param newPassword2
     *            新パスワード2
     */
    @ActionPath("{uid}/updatePassword")
    public Navigation updatePassword(@Var("uid") String uid,
            @RequestParam("oldPassword") String oldPassword,
            @RequestParam("newPassword") String newPassword,
            @RequestParam("newPassword2") String newPassword2) {
        putEnteringLog();
        try {
            logger.finest("uid : " + uid +"  password : " + oldPassword + " / " + newPassword + " / " + newPassword2);
            User user = service.get(uid);
            if (user != null && user.equals(getLoginUser())) {
                // 本人しか変更できない
                Validators v = new Validators(request);
                logger.finest("old password : " + user.getPassword());
                // パスワードが空なら古いパスワードのチェックはしない。
                if (null != oldPassword) {
                    v.add("oldPassword", new StringValidator(user.getPassword()));
                }
                v.add(
                    "newPassword",
                    v.required(),
                    v.minlength(VALID_MIN_PASSWD),
                    v.maxlength(VALID_MAX_PASSWD),
                    new StringValidator(oldPassword, true));
                v.add("newPassword2", v.required(), new StringValidator(
                    newPassword));

                if (v.validate()) {
                    // パスワード更新
                    service.savePassword(uid, newPassword);

                    // ログイン状態にする
                    setLoginUser(user);
                    logger.finest("User : " + uid);
                    logger.finest("Password : " + newPassword);
                    return redirect("/menu");
                } else {
                    logger.finest("User : " + uid);
                    logger.finest("invalid password.");
                    request.setAttribute("user", user);
                    return forward("/user/password.jsp");
                }
            } else {
                logger.fine("user " + uid + " is not registered.");
                errors.put("page", ApplicationMessage.get("error.authority"));
               
                return forward("/error.jsp");
            }
        } finally {
            putExitingLog();
        }
    }

    /**
     * ユーザ情報登録完了
     */
    @ActionPath("{uid}/initial/{key}")
    public Navigation complete(@Var("uid") String uid, @Var("key") String key) {
        putEnteringLog();
        try {
            User user = service.get(uid);
            this.logger.finest("initial " + key + " / " + user.getInitialKey());
            if (user != null && user.getInitialKey().equals(key)) {
                setLoginUser(user);
                return forward("/user/" + uid + "/password");
            } else {
                errors.put(
                    "page",
                    ApplicationMessage.get("error.invalid_initialkey"));
            }
            return forward("/error.jsp");
        } finally {
            putExitingLog();
        }
    }

    // /**
    // * ユーザ情報の表示
    // *
    // * @param uid
    // * ユーザID
    // */
    // @ActionPath("{uid}")
    // public Navigation view(@Var("uid") String uid) {
    // final String methodName =
    // Thread.currentThread().getStackTrace()[1].getMethodName();
    // logger.entering(this.getClass().getName(), methodName);
    // User user = service.get(uid);
    //
    // try {
    // if (user != null) {
    // User loginUser = getLoginUser();
    // super.request.setAttribute("user", user);
    // if (user instanceof Manager) {
    // // ユーザが提供者の場合
    // if (checkAdmin() || user.equals(loginUser)) {
    // // 管理者か本人しか表示できない
    // return forward("/manager/view.jsp");
    // }
    // errors.put(
    // "page",
    // ApplicationMessage.get("error.authority"));
    // } else if (user instanceof Editor) {
    // // ユーザが編集者の場合
    // Editor editor = (Editor) user;
    // if (checkAdmin()
    // || user.equals(loginUser)
    // || editor.getManagerRef().getModel().equals(loginUser)) {
    // // 管理者か本人か代表者しか表示できない
    // return forward("/user/view.jsp");
    // }
    // errors.put(
    // "page",
    // ApplicationMessage.get("error.authority"));
    // } else if (user instanceof Administrator) {
    // // ユーザが管理者の場合
    // if (checkAdmin()) {
    // return forward("/user/view.jsp");
    // }
    // errors.put(
    // "page",
    // ApplicationMessage.get("error.authority"));
    // } else {
    // // その他のユーザの場合
    // errors.put(
    // "page",
    // ApplicationMessage.get("error.invalid_user"));
    // }
    // }
    // return forward("/error.jsp");
    // } finally {
    // logger.entering(this.getClass().getName(), methodName);
    // }
    // }

    /**
     * デフォルト表示画面(
     *
     * @return
     */
    @Default
    public Navigation index() {
        putEnteringLog();
        try {
            if (checkAdmin() || checkManager()) {
                request.setAttribute(
                    "title",
                    ApplicationMessage.get("title.user_list"));
                List<? extends User> users;
                if (checkAdmin()) {
                    users = Datastore.query(UserMeta.get()).asList();
                } else  {
                    users = ((Manager)getLoginUser()).getEditorListRef().getModelList();
                }
                request.setAttribute("users", users);
                return forward("/user/list.jsp");
            }
            errors.put("page", ApplicationMessage.get("error.authority"));
            return forward("error.jsp");
        } finally {
            putExitingLog();
        }
    }

}
TOP

Related Classes of jp.co.nskint.uq.pd.signage.page.UserPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.