com.liusoft.dlog4j.action.DlogAction.java Source code

Java tutorial

Introduction

Here is the source code for com.liusoft.dlog4j.action.DlogAction.java

Source

/*
 *  SiteAction.java
 *  
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *  
 *  Author: Winter Lau
 *  http://dlog4j.sourceforge.net
 */
package com.liusoft.dlog4j.action;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.htmlparser.Node;
import org.htmlparser.Parser;

import com.liusoft.dlog4j.DLOGUserManager;
import com.liusoft.dlog4j.Globals;
import com.liusoft.dlog4j.HtmlNodeFilters;
import com.liusoft.dlog4j.MailTransportQueue;
import com.liusoft.dlog4j.SessionUserObject;
import com.liusoft.dlog4j.UserLoginManager;
import com.liusoft.dlog4j.beans.FriendBean;
import com.liusoft.dlog4j.beans.UserBean;
import com.liusoft.dlog4j.dao.UserDAO;
import com.liusoft.dlog4j.formbean.FormBean;
import com.liusoft.dlog4j.formbean.UserForm;
import com.liusoft.dlog4j.util.DateUtils;
import com.liusoft.dlog4j.util.ImageUtils;
import com.liusoft.dlog4j.util.MailSender;
import com.liusoft.dlog4j.util.RequestUtils;
import com.liusoft.dlog4j.util.StringUtils;

/**
 * Action
 * @author Winter Lau
 */
public class DlogAction extends ActionBase {

    private final static Log log = LogFactory.getLog(DlogAction.class);

    /**
     * ?
     */
    public final static String PORTRAIT_PATH = "/uploads/portrait/";

    /**
     * ?
     */
    public final static int PORTRAIT_WIDTH = 155;

    /**
     * ?
     */
    public final static int PORTRAIT_HEIGHT = 200;

    public final static int MIN_SITENAME_LEN = 3;

    /**
     * ??
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    protected ActionForward doFetchPwd(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm uform = (UserForm) form;
        validateClientId(request, uform);
        ActionMessages msgs = new ActionMessages();
        do {
            if (StringUtils.isEmpty(uform.getName())) {
                msgs.add("name", new ActionMessage("error.username_empty"));
                break;
            }
            UserBean ubean = UserDAO.getUserByName(uform.getName());
            if (ubean == null) {
                msgs.add("name", new ActionMessage("error.user_not_found"));
                break;
            }
            if (ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("name", new ActionMessage("error.user_disabled"));
                break;
            }
            if (!StringUtils.isEmail(ubean.getEmail())) {
                msgs.add("name", new ActionMessage("error.email_format"));
                break;
            }
            //??
            int siteid = (ubean.getSite() != null) ? ubean.getSite().getId() : -1;
            sendPasswordNotify(request, siteid, ubean);
            msgs.add("name", new ActionMessage("mail.sent"));
            break;
        } while (true);

        if (!msgs.isEmpty())
            saveMessages(request, msgs);

        return mapping.findForward("fetchpwd");
    }

    /**
     * ?????
     * 
     * @param request
     * @param rbean
     * @throws Exception
     */
    protected void sendPasswordNotify(HttpServletRequest request, final int site_id, final UserBean ubean)
            throws Exception {

        //final String contextPath = request.getContextPath();
        final String urlPrefix = RequestUtils.getUrlPrefix(request);
        final String template = super.getPasswordTipTemplate();

        new Thread() {
            public void run() {
                try {
                    // ????
                    String notify_content = MessageFormat.format(template,
                            new String[] { ubean.getName(), ubean.getPassword(), urlPrefix });
                    Parser html = new Parser();
                    html.setEncoding(Globals.ENC_8859_1);
                    html.setInputHTML(notify_content);
                    Node[] nodes = html.extractAllNodesThatMatch(HtmlNodeFilters.titleFilter).toNodeArray();
                    String title = nodes[0].toPlainTextString();
                    MailSender sender = MailSender.getHtmlMailSender(null, 25, null, null);
                    sender.setSubject(title);
                    sender.setSendDate(new Date());
                    sender.setMailContent(notify_content);
                    sender.setMailTo(new String[] { ubean.getContactInfo().getEmail() }, "to");
                    MailTransportQueue queue = (MailTransportQueue) getServlet().getServletContext()
                            .getAttribute(Globals.MAIL_QUEUE);
                    // ??
                    queue.write(site_id, sender.getMimeMessage());
                    if (log.isDebugEnabled())
                        log.debug("Notification mail was written to the sending queue.");
                } catch (Exception e) {
                    log.error("send notification mail failed.", e);
                }
            }
        }.start();
    }

    /**
     * ?
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @usage http://localhost/dlog/user.do?sid=1&uid=223&eventSubmit_AddFriend&fromPage=xxxx
     * @ajax_enabled
     */
    protected ActionForward doAddFriend(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        FormBean fbean = (FormBean) form;
        validateClientId(request, fbean);
        String msg = null;
        //?
        SessionUserObject loginUser = super.getLoginUser(request, response, false);
        if (loginUser != null) {
            int friendId = RequestUtils.getParam(request, "uid", -1);
            UserBean friend = UserDAO.getUserByID(friendId);
            if (friend == null)
                msg = getMessage(request, null, "error.user_not_found", new Integer(friendId));
            else if (friendId == loginUser.getId())
                msg = getMessage(request, null, "error.cannot_add_myself");
            else {
                FriendBean fb = new FriendBean();
                fb.setAddTime(new Date());
                fb.setFriend(friend);
                fb.setOwner(loginUser.getId());
                fb.setType(FriendBean.TYPE_GENERAL);
                fb.setRole(FriendBean.ROLE_GENERAL);
                UserDAO.addFriend(fb);
                msg = getMessage(request, null, "error.friend_added", new Integer(friendId));
            }
        } else
            msg = getMessage(request, null, "error.user_not_login");
        return msgbox(mapping, form, request, response, msg, fbean.getFromPage());
    }

    /**
     * (???)
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @param s_other_id
     * @return
     * @throws Exception
     * @ajax_enabled
     */
    protected ActionForward doBlockUser(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm fbean = (UserForm) form;
        super.validateClientId(request, fbean);
        String msg = null;
        //?
        SessionUserObject loginUser = super.getLoginUser(request, response, false);
        if (loginUser != null) {
            String s_id = String.valueOf(fbean.getId());
            if (UserDAO.isUserInBlackList(loginUser.getId(), fbean.getId())) {
                msg = getMessage(request, null, "error.user_already_in_block", s_id);
            } else {
                UserDAO.addBlackList(loginUser.getId(), fbean.getId(), 0);
                msg = getMessage(request, null, "error.user_added_to_block", s_id);
            }
        } else
            msg = getMessage(request, null, "error.user_not_login");
        request.setAttribute("msg", msg);
        return makeForward(mapping.findForward("blacklist"), fbean.getSid());
    }

    /**
     * ?(???)
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * http://localhost/dlog/user.do?sid=1&uid=223&eventSubmit_DelFriend
     */
    protected ActionForward doUnblockUser(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        FormBean fbean = (FormBean) form;
        validateClientId(request, fbean);
        String msg = null;
        //?
        SessionUserObject loginUser = super.getLoginUser(request, response, false);
        if (loginUser != null) {
            String[] uids = request.getParameterValues("uid");
            UserDAO.deleteBlacklist(loginUser.getId(), uids);
            msg = getMessage(request, null, "error.user_delete_from_block", "");
        } else
            msg = getMessage(request, null, "error.user_not_login");
        return msgbox(mapping, form, request, response, msg, fbean.getFromPage());
    }

    /**
     * ?
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * http://localhost/dlog/user.do?sid=1&uid=223&eventSubmit_DelFriend
     */
    protected ActionForward doDelFriend(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        FormBean fbean = (FormBean) form;
        validateClientId(request, fbean);
        String msg = null;
        //?
        SessionUserObject loginUser = super.getLoginUser(request, response, false);
        if (loginUser != null) {
            String[] uids = request.getParameterValues("uid");
            int er = UserDAO.deleteFriend(loginUser.getId(), uids);
            if (er > 0)
                msg = getMessage(request, null, "error.friend_deleted");
        } else
            msg = getMessage(request, null, "error.user_not_login");
        return msgbox(mapping, form, request, response, msg, fbean.getFromPage());
    }

    /**
     * 
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @see com.liusoft.dlog4j.action.UserAction#doLogin(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse)
     */
    protected ActionForward doLogin(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        int own_site_id = -1;
        UserForm user = (UserForm) form;
        validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();
        if (StringUtils.isEmpty(user.getName()))
            msgs.add("username", new ActionMessage("error.username_empty"));
        else if (StringUtils.isEmpty(user.getPassword()))
            msgs.add("password", new ActionMessage("error.password_empty"));
        else {
            UserBean ubean = DLOGUserManager.getUserByName(user.getName());
            if (ubean == null || !StringUtils.equals(ubean.getPassword(), user.getPassword()))
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
            else if (ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("password", new ActionMessage("error.user_disabled"));
            } else {
                // 
                UserLoginManager.loginUser(request, response, ubean, user.getKeepDays());
                own_site_id = ubean.getOwnSiteId();
            }
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("login");
        }

        String fromPage = user.getFromPage();

        if (StringUtils.isNotEmpty(fromPage))
            return new ActionForward(fromPage, true);

        if (user.getSid() > 0)
            return makeForward(mapping.findForward("main"), user.getSid());

        if (own_site_id < 1)
            return mapping.findForward("home");

        return makeForward(mapping.findForward("home"), own_site_id);

    }

    /**
     * COOKIE
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    protected ActionForward doLogout(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response, String fromPage) throws Exception {

        //
        UserLoginManager.logoutUser(request, response);

        if (StringUtils.isNotEmpty(fromPage))
            return new ActionForward(fromPage, true);
        return mapping.findForward("home");
    }

    private static String g_portrait_path;
    private static String g_portrait_uri;

    /**
     * ??
     */
    private synchronized void initPortraitPath() {
        if (g_portrait_uri != null)
            return;
        g_portrait_uri = getServlet().getInitParameter("portrait_base_uri");
        String portrait_path = this.getServlet().getInitParameter("portrait_base_path");

        if (portrait_path.startsWith(Globals.LOCAL_PATH_PREFIX))
            g_portrait_path = portrait_path.substring(Globals.LOCAL_PATH_PREFIX.length());
        else if (portrait_path.startsWith("/"))
            g_portrait_path = getServlet().getServletContext().getRealPath(portrait_path);
        else
            g_portrait_path = portrait_path;
        if (!g_portrait_path.endsWith(File.separator))
            g_portrait_path += File.separator;
    }

    /**
     * (WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_birth.vm
     */
    protected ActionForward doUpdateBirth(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            boolean update = false;
            if (StringUtils.isNotEmpty(user.getSbirth())) {
                try {
                    int birth = Integer.parseInt(user.getSbirth());
                    int year = birth / 10000;
                    int month = (birth % 10000) / 100;
                    int date = birth % 100;
                    long lbirth = DateUtils.getDateBegin(year, month, date).getTime().getTime();
                    ubean.setBirth(new java.sql.Date(lbirth));
                    System.out.println("=================  new birth is " + ubean.getBirth());
                    update = true;
                } catch (Exception e) {
                }
            }
            if (update) {
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * ??(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_email.vm
     */
    protected ActionForward doUpdateEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            ubean.setEmail(user.getEmail());
            try {
                DLOGUserManager.update(ubean);
                //session
                UserLoginManager.updateLoginUser(request, ubean);
            } catch (Exception e) {
                msgs.add("result", new ActionMessage("error.database", e.getMessage()));
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * (WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_sex.vm
     */
    protected ActionForward doUpdateSex(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (ubean.getSex() != user.getSex()) {
                if (user.getSex() == UserBean.SEX_FEMALE || user.getSex() == UserBean.SEX_MALE
                        || user.getSex() == UserBean.SEX_UNKNOWN) {
                    ubean.setSex(user.getSex());
                    try {
                        DLOGUserManager.update(ubean);
                        // session
                        UserLoginManager.updateLoginUser(request, ubean);
                    } catch (Exception e) {
                        msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                    }
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * ?(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_pwd.vm
     */
    protected ActionForward doUpdatePwd(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (!StringUtils.equals(user.getPassword2(), ubean.getPassword())) {
                ubean.setPassword(user.getPassword2());
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * (WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_resume.vm
     */
    protected ActionForward doUpdateResume(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (!StringUtils.equals(user.getResume(), ubean.getResume())) {
                String resume = super.autoFiltrate(null, StringUtils.extractText(user.getResume()));
                ubean.setResume(resume);
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * MSN(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_msn.vm
     */
    protected ActionForward doUpdateMSN(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (!StringUtils.equals(user.getMsn(), ubean.getMsn())) {
                ubean.setMsn(user.getMsn());
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * ?(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_homepage.vm
     */
    protected ActionForward doUpdateHomePage(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (!StringUtils.equals(user.getHomePage(), ubean.getHomePage())) {
                ubean.setHomePage(user.getHomePage());
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * QQ(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_qq.vm
     */
    protected ActionForward doUpdateQQ(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (!StringUtils.equals(user.getQq(), ubean.getQq()) && StringUtils.isNumeric(user.getQq())) {
                ubean.setQq(user.getQq());
                try {
                    DLOGUserManager.update(ubean);
                    //session
                    UserLoginManager.updateLoginUser(request, ubean);
                } catch (Exception e) {
                    msgs.add("result", new ActionMessage("error.database", e.getMessage()));
                }
            }
            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    /**
     * 
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    protected ActionForward doUpdate(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();
        // ??
        user.validateUserForm(request, msgs, false);

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            ubean.setNickname(super.autoFiltrate(null, user.getNickname()));
            if (user.getBirth() != null && user.getBirth().before(new Date()))
                ubean.setBirth(user.getBirth());
            else if (ubean.getBirth() != null)
                ubean.setBirth(null);
            ubean.setSex(user.getSex());
            if (StringUtils.isNotEmpty(user.getResume()))
                ubean.setResume(super.autoFiltrate(null, StringUtils.extractText(user.getResume())));
            else
                ubean.setResume(null);
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword2())
                    && StringUtils.isNotEmpty(user.getPassword2()))
                ubean.setPassword(user.getPassword2());
            if (StringUtils.isNotEmpty(user.getEmail()))
                ubean.setEmail(user.getEmail());
            else
                ubean.setEmail(null);
            if (StringUtils.isNotEmpty(user.getHomePage()))
                ubean.setHomePage(user.getHomePage());
            else
                ubean.setHomePage(null);
            if (StringUtils.isNotEmpty(user.getMobile()))
                ubean.setMobile(user.getMobile());
            else
                ubean.setMobile(null);
            if (StringUtils.isNotEmpty(user.getMsn()))
                ubean.setMsn(user.getMsn());
            else
                ubean.setMsn(null);
            if (StringUtils.isNotEmpty(user.getQq()))
                ubean.setQq(user.getQq());
            else
                ubean.setQq(null);
            if (!StringUtils.equals(ubean.getProvince(), user.getProvince()))
                ubean.setProvince(user.getProvince());

            if (!StringUtils.equals(ubean.getCity(), user.getCity()))
                ubean.setCity(user.getCity());

            if (user.getRemovePortrait() == 1)
                ubean.setPortrait(null);
            else {
                String portrait_uri = handleUserPortrait(ubean.getId(), user.getPortrait());
                if (StringUtils.isNotEmpty(portrait_uri))
                    ubean.setPortrait(portrait_uri);
            }
            try {
                DLOGUserManager.update(ubean);
                //session
                UserLoginManager.updateLoginUser(request, ubean);
            } catch (Exception e) {
                msgs.add("result", new ActionMessage("error.database", e.getMessage()));
            }

            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

    private String getPortraitPath(String uri) {
        initPortraitPath();
        StringBuffer path = new StringBuffer(g_portrait_path);
        path.append(StringUtils.replace(uri, "/", File.separator));
        return path.toString();
    }

    private final static Object sync_portrait_upload = new Object();

    /**
     * ??
     * @param pFile
     * @return
     * @throws IOException 
     */
    private String handleUserPortrait(int userid, FormFile pFile) throws IOException {
        if (pFile == null)
            return null;
        //????
        String extendName = StringUtils.getFileExtend(pFile.getFileName());
        if (StringUtils.isEmpty(extendName))
            return null;
        //??
        if (!ImageUtils.isImage(extendName))
            return null;
        extendName = extendName.toLowerCase();
        //?
        StringBuffer fileName = new StringBuffer();
        fileName.append(userid / 10000);
        fileName.append('/');
        fileName.append(userid);
        fileName.append('.');
        fileName.append(extendName);
        String img_path = getPortraitPath(fileName.toString());
        File img = new File(img_path);
        File img_dir = img.getParentFile();
        if (!img_dir.exists()) {
            synchronized (sync_portrait_upload) {
                if (!img_dir.mkdirs())
                    throw new IOException("Cannot make directory: " + img_dir.getParent());
            }
        }
        //????
        BufferedImage orig_portrait = (BufferedImage) ImageIO.read(pFile.getInputStream());
        int preview_width = Math.min(PORTRAIT_WIDTH, orig_portrait.getWidth());
        int preview_height = Math.min(PORTRAIT_HEIGHT, orig_portrait.getHeight());
        if (preview_width != orig_portrait.getWidth() || preview_height != orig_portrait.getHeight()) {
            ImageUtils.createPreviewImage(pFile.getInputStream(), img_path, preview_width, preview_height);
        } else {
            ImageUtils.writeToFile(pFile, img_path);
        }
        return fileName.toString();
    }

    /**
     * 
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @see com.liusoft.dlog4j.action.UserAction#doCreate(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse)
     */
    protected ActionForward doCreateUser(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();
        // ??
        user.validateUserForm(request, msgs, true);
        if (msgs.isEmpty()) {
            UserBean ubean = user.formToBean();
            try {
                ubean.setLastAddr(request.getRemoteAddr());
                ubean.setMobile(RequestUtils.getRequestMobile(request));
                ubean.setResume(super.filterScriptAndStyle(ubean.getResume()));
                DLOGUserManager.create(ubean);
                // 
                UserLoginManager.loginUser(request, response, ubean, user.getKeepDays());
            } catch (Exception e) {
                msgs.add("result", new ActionMessage("error.database", e.getMessage()));
            }
        } else {
            saveMessages(request, msgs);
            return mapping.findForward("reg");
        }

        String fromPage = user.getFromPage();

        if (StringUtils.isNotEmpty(fromPage))
            return new ActionForward(fromPage, true);

        if (user.getSid() > 0)
            return makeForward(mapping.findForward("main"), user.getSid());

        return mapping.findForward("home");
    }

    /**
     * ?(WML)
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     * @wml_only modify_portrait.vm
     */
    protected ActionForward doUpdatePortrait(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        UserForm user = (UserForm) form;
        super.validateClientId(request, user);
        ActionMessages msgs = new ActionMessages();

        while (msgs.isEmpty()) {
            UserBean loginUser = super.getLoginUser(request, response);
            if (loginUser == null) {
                msgs.add("user", new ActionMessage("error.user_not_login"));
                break;
            }
            if (loginUser.getId() != user.getId()) {
                msgs.add("user", new ActionMessage("error.access_deny"));
                break;
            }
            UserBean ubean = UserDAO.getUserByID(user.getId());
            if (ubean == null || ubean.getStatus() != UserBean.STATUS_NORMAL) {
                msgs.add("id", new ActionMessage("error.user_not_available", new Integer(user.getId())));
                break;
            }
            if (!StringUtils.equals(ubean.getPassword(), user.getPassword())) {
                msgs.add("password", new ActionMessage("error.user_auth_failed"));
                break;
            }
            if (user.getRemovePortrait() == 1)
                ubean.setPortrait(null);
            else {
                String portrait_uri = handleUserPortrait(ubean.getId(), user.getPortrait());
                if (StringUtils.isNotEmpty(portrait_uri))
                    ubean.setPortrait(portrait_uri);
            }
            try {
                DLOGUserManager.update(ubean);
                //session
                UserLoginManager.updateLoginUser(request, ubean);
            } catch (Exception e) {
                msgs.add("result", new ActionMessage("error.database", e.getMessage()));
            }

            break;
        }

        if (!msgs.isEmpty()) {
            saveMessages(request, msgs);
            return mapping.findForward("edituser");
        }

        StringBuffer ext = new StringBuffer();
        ext.append("uid=");
        ext.append(user.getId());
        return makeForward(mapping.findForward("viewuser"), user.getSid(), ext.toString());
    }

}