com.ace.erp.service.sys.impl.UserServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.ace.erp.service.sys.impl.UserServiceImpl.java

Source

/**
 * Copyright (c) 2009-2015 http://demi-panda.com
 *
 * Licensed 
 */
package com.ace.erp.service.sys.impl;

import com.ace.erp.annotation.BaseComponent;
import com.ace.erp.entity.sys.*;
import com.ace.erp.exception.AceException;
import com.ace.erp.persistence.sys.OrganizationMapper;
import com.ace.erp.persistence.sys.RoleMapper;
import com.ace.erp.persistence.sys.UserMapper;
import com.ace.erp.service.sys.GenericService;
import com.ace.erp.service.sys.UserService;
import com.ace.erp.utils.Md5Utils;
import com.ace.erp.utils.TimeUtils;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * Created with ace.
 * User: denghp
 * Date: 11/25/13
 * Time: 10:15 PM
 */
public class UserServiceImpl extends AbstractService<User, Integer> implements UserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    @BaseComponent
    private UserMapper userMapper;

    @Autowired
    private CacheManager ehcacheManager;

    @Autowired
    private OrganizationMapper organizationMapper;

    @Autowired
    private RoleMapper roleMapper;

    private Cache loginRecordCache;

    @Value(value = "${user.password.maxRetryCount}")
    private int maxRetryCount = 10;

    public void setMaxRetryCount(int maxRetryCount) {
        this.maxRetryCount = maxRetryCount;
    }

    @PostConstruct
    public void init() {
        loginRecordCache = ehcacheManager.getCache("loginRecordCache");
    }

    /**
     * ?
     * @param user
     * @return
     * @throws com.ace.erp.exception.AceException
     */
    public User save(User user) throws AceException {
        user.randomSalt();
        user.setPassword(encryptPassword(user.getUsername(), user.getPassword(), user.getSalt()));
        if (user.getCreateTime() == null) {
            user.setCreateTime(DateTime.now().toString(TimeUtils.DATETIME_NORMAL_FORMAT));
        } else {
            user.setCreateTime("2013-10-17");
        }
        super.save(user);
        logger.info("insert successfully, user {}", user);
        return user;
    }

    /**
     * ?
     * @param user
     * @return
     * @throws AceException
     */
    public User saveUserOrOrganization(User user) throws AceException {
        user.randomSalt();
        user.setPassword(encryptPassword(user.getUsername(), user.getPassword(), user.getSalt()));
        if (user.getCreateTime() == null) {
            user.setCreateTime(DateTime.now().toString(TimeUtils.DATETIME_NORMAL_FORMAT));
        }
        //step1 
        super.save(user);
        UserOrganization userOrganization = null;
        //step2 ??
        //TODO
        Organization organization = user.getOrganizationList() == null ? null : user.getOrganizationList().get(0);
        if (organization == null) {
            organization = new Organization(user.getUsername(), 1, 2);
            organizationMapper.save(organization);
        } else {
            organizationMapper.save(organization);
        }
        userOrganization = new UserOrganization(user, organization);
        //step3 ???
        userMapper.saveUserOrganization(userOrganization);
        //step4 ???
        //TODO ????,??
        Role role = roleMapper.getSysAdminRole();
        userMapper.saveUserRoles(new UserRoles(user, role, organization));
        logger.info("insert successfully, user {}", user);
        return user;
    }

    public User getUserByEmail(String email) {
        return userMapper.getUserByEmail(email);
    }

    public User getUserByMobilePhoneNumber(String mobilePhone) {
        return userMapper.getByMobilePhoneNumber(mobilePhone);
    }

    public User getUser(String userName) {
        return userMapper.getUserByName(userName);
    }

    public User login(String username, String password) throws AceException {
        User user = userMapper.getUserByName(username);
        if (user == null || Boolean.TRUE.equals(user.getDeleted())) {
            logger.warn("{} login failed, user is not exists!!!", username);
            throw new AceException.UserNotFoundException();
        }
        if (user.getStatus() == UserStatus.blocked) {
            logger.warn("{} login failed, user is blocked!", username);
            throw new AceException.UserBlockedException();
        }
        //??
        validate(user, password);
        if (user.getStatus() == UserStatus.blocked) {
            logger.warn("{} loginError user is blocked!", username);
            throw new AceException.UserBlockedException();
        }

        return user;
    }

    //TODO
    public boolean changePassword(Long userId, String password) {

        return false; //To change body of implemented methods use File | Settings | File Templates.
    }

    public User getUserByName(String username) {
        return userMapper.getUserByName(username);
    }

    public void validate(User user, String password) throws AceException {
        String username = user.getUsername();

        int retryCount = 0;

        Element cacheElement = loginRecordCache.get(username);
        if (cacheElement != null) {
            retryCount = (Integer) cacheElement.getObjectValue();
            if (retryCount >= maxRetryCount) {
                logger.info("{} passwordError password error, retry limit exceed! password: {},max retry count {}",
                        new Object[] { username, password, maxRetryCount });
                throw AceException.create(
                        AceException.Code.get(AceException.Code.USER_PASSWORD_RETRY_COUNT.intValue()),
                        "" + maxRetryCount);
            }
        }

        if (!matches(user, password)) {
            loginRecordCache.put(new Element(username, ++retryCount));
            logger.info("{} passwordError password error! password: {} retry count: {}",
                    new Object[] { username, password, retryCount });
            throw new AceException.UserPasswordNotMatchException();
        } else {
            clearLoginRecordCache(username);
        }
    }

    public boolean matches(User user, String newPassword) {
        return user.getPassword().equals(encryptPassword(user.getUsername(), newPassword, user.getSalt()));
    }

    public void clearLoginRecordCache(String username) {
        loginRecordCache.remove(username);
    }

    public List<User> getAllUser() {
        return userMapper.getList();
    }

    public List<Role> getUserRoleList(Integer userId) {
        User user = userMapper.getUserRoleList(userId);
        return user == null ? null : user.getRoleList();
    }

    /**
     * ?MD5
     *
     * @param username
     * @param password
     * @param salt
     * @return
     */
    public String encryptPassword(String username, String password, String salt) {
        return Md5Utils.hash(username + password + salt);
    }

    @Override
    public void saveUserRoles(UserRoles userRoles) throws AceException {
        try {
            userMapper.saveUserRoles(userRoles);
        } catch (Exception ex) {
            logger.error("saveUserRoles error {}", ex.getMessage(), ex);
            throw AceException.create(AceException.Code.SYSTEM_ERROR,
                    "?.");
        }
    }

    @Override
    public void saveUserOrganization(UserOrganization userOrganization) throws AceException {
        if (userOrganization == null) {
            throw AceException.create(AceException.Code.BAD_REQUEST,
                    "??.");
        }
        try {
            userMapper.saveUserOrganization(userOrganization);
        } catch (Exception ex) {
            logger.error("saveUserOrganization error {}", ex.getMessage(), ex);
            throw AceException.create(AceException.Code.SYSTEM_ERROR,
                    "??.");
        }
    }
}