package com.mossle.user.support;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.api.user.UserConnector;
import com.mossle.api.user.UserDTO;
import com.mossle.api.user.UserSyncConnector;
import com.mossle.core.page.Page;
import com.mossle.core.query.PropertyFilter;
import com.mossle.core.query.PropertyFilterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.Assert;
public class DatabaseUserConnector implements UserConnector {
private static Logger logger = LoggerFactory
.getLogger(DatabaseUserConnector.class);
private JdbcTemplate jdbcTemplate;
private UserSyncConnector userSyncConnector;
private Map<String, String> aliasMap = new HashMap<String, String>();
// ~
// private String sqlFindById = "select id as id,username as username,status as status,"
// + "nick_name as nick_name,email as email,mobile as mobile,user_repo_id as user_repo_ref"
// + " from USER_BASE where id=?";
private String sqlFindById = "SELECT AI.ID AS ID,AI.USERNAME AS USERNAME,AI.STATUS AS STATUS,"
+ "AI.NICK_NAME AS NICK_NAME,AI.DISPLAY_NAME AS DISPLAY_NAME,PI.EMAIL AS EMAIL,"
+ "PI.CELLPHONE AS MOBILE,1 AS USER_REPO_REF"
+ " FROM ACCOUNT_INFO AI LEFT JOIN PERSON_INFO PI ON AI.CODE=PI.CODE"
+ " WHERE AI.ID=?";
// private String sqlFindByUsername = "select ub.id as id,ub.username as username,ub.status as status,"
// + "nick_name as nick_name,email as email,mobile as mobile,user_repo_id as user_repo_ref"
// + " from USER_BASE ub where ub.username=? and ub.user_repo_id=?";
private String sqlFindByUsername = "SELECT AI.ID AS ID,AI.USERNAME AS USERNAME,AI.STATUS AS STATUS,"
+ "AI.NICK_NAME AS NICK_NAME,AI.DISPLAY_NAME AS DISPLAY_NAME,PI.EMAIL AS EMAIL,"
+ "PI.CELLPHONE AS MOBILE,AI.TENANT_ID AS USER_REPO_REF"
+ " FROM ACCOUNT_INFO AI LEFT JOIN PERSON_INFO PI ON AI.CODE=PI.CODE"
+ " WHERE AI.USERNAME=? AND AI.TENANT_ID=?";
private String sqlFindByRef = "SELECT UB.ID AS ID,UB.USERNAME AS USERNAME,UB.STATUS AS STATUS,"
+ "NICK_NAME AS NICK_NAME,EMAIL AS EMAIL,MOBILE AS MOBILE,USER_REPO_ID AS USER_REPO_REF"
+ " FROM ACCOUNT_INFO UB WHERE UB.REF=? AND UB.USER_REPO_ID=?";
private String sqlPagedQueryCount = "SELECT COUNT(*) FROM ACCOUNT_INFO";
private String sqlPagedQuerySelect = "SELECT AI.ID AS ID,AI.USERNAME AS USERNAME,AI.STATUS AS STATUS,"
+ "AI.NICK_NAME AS NICK_NAME,AI.DISPLAY_NAME AS DISPLAY_NAME,PI.EMAIL AS EMAIL,"
+ "PI.CELLPHONE AS MOBILE,1 AS USER_REPO_REF"
+ " FROM ACCOUNT_INFO AI LEFT JOIN PERSON_INFO PI ON AI.CODE=PI.CODE";
private String sqlFindByNickName = "SELECT ID AS ID,USERNAME AS USERNAME,STATUS AS STATUS,"
+ "NICK_NAME AS NICK_NAME,EMAIL AS EMAIL,MOBILE AS MOBILE,USER_REPO_ID AS USER_REPO_REF"
+ " FROM ACCOUNT_INFO WHERE NICK_NAME=?";
public UserDTO findById(String id) {
Assert.hasText(id, "user id should not be null");
try {
Map<String, Object> map = jdbcTemplate.queryForMap(sqlFindById, id);
return convertUserDTO(map);
} catch (EmptyResultDataAccessException ex) {
logger.debug(ex.getMessage(), ex);
logger.info("user[{}] is not exists.", id);
return null;
}
}
public UserDTO findByUsername(String username, String userRepoRef) {
if (username == null) {
logger.info("username is null");
return null;
}
username = username.toLowerCase();
try {
Map<String, Object> map = jdbcTemplate.queryForMap(
sqlFindByUsername, username, userRepoRef);
return convertUserDTO(map);
} catch (EmptyResultDataAccessException ex) {
logger.debug(ex.getMessage(), ex);
logger.info("user[{}, {}] is not exists.", username, userRepoRef);
if (userSyncConnector != null) {
UserDTO userDto = new UserDTO();
userDto.setRef(username);
userDto.setUsername(username);
userDto.setDisplayName(username);
userDto.setNickName(username);
userSyncConnector.updateUser(userDto);
return this.findByUsername(username, userRepoRef);
}
return null;
}
}
public UserDTO findByRef(String ref, String userRepoRef) {
try {
Map<String, Object> map = jdbcTemplate.queryForMap(sqlFindByRef,
ref, userRepoRef);
return convertUserDTO(map);
} catch (EmptyResultDataAccessException ex) {
logger.debug(ex.getMessage(), ex);
logger.info("user[{}, {}] is not exists.", ref, userRepoRef);
return null;
}
}
public Page pagedQuery(String userRepoRef, Page page,
Map<String, Object> parameters) {
Map<String, Object> parameterMap = this.convertAlias(parameters);
List<PropertyFilter> propertyFilters = PropertyFilter
.buildFromMap(parameterMap);
StringBuilder buff = new StringBuilder();
List<Object> paramList = new ArrayList<Object>();
boolean checkWhere = sqlPagedQuerySelect.toLowerCase().indexOf("where") == -1;
PropertyFilterUtils.buildConfigurations(propertyFilters, buff,
paramList, checkWhere);
logger.debug("propertyFilters : {}", propertyFilters);
logger.debug("buff : {}", buff);
logger.debug("paramList : {}", paramList);
logger.debug("checkWhere : {}", checkWhere);
String sql = buff.toString();
String countSql = sqlPagedQueryCount + " " + sql;
String selectSql = sqlPagedQuerySelect + " " + sql + " limit "
+ page.getStart() + "," + page.getPageSize();
logger.debug("countSql : {}", countSql);
logger.debug("selectSql : {}", selectSql);
Object[] params = paramList.toArray();
int totalCount = jdbcTemplate.queryForObject(countSql, Integer.class,
params);
List<Map<String, Object>> list = jdbcTemplate.queryForList(selectSql,
params);
List<UserDTO> userDtos = new ArrayList<UserDTO>();
for (Map<String, Object> map : list) {
userDtos.add(convertUserDTO(map));
}
page.setTotalCount(totalCount);
page.setResult(userDtos);
return page;
}
public UserDTO findByNickName(String nickName, String userRepoRef) {
try {
Map<String, Object> map = jdbcTemplate.queryForMap(
sqlFindByNickName, nickName);
return convertUserDTO(map);
} catch (EmptyResultDataAccessException ex) {
logger.debug(ex.getMessage(), ex);
logger.info("user[{}] is not exists.", nickName);
return null;
}
}
protected UserDTO convertUserDTO(Map<String, Object> map) {
if ((map == null) || map.isEmpty()) {
logger.info("user[{}] is null.", map);
return null;
}
logger.debug("{}", map);
UserDTO userDTO = new UserDTO();
userDTO.setId(convertString(map.get("id")));
userDTO.setUsername(convertString(map.get("username")));
userDTO.setNickName(convertString(map.get("nick_name")));
userDTO.setDisplayName(convertString(map.get("display_name")));
userDTO.setEmail(convertString(map.get("email")));
userDTO.setMobile(convertString(map.get("mobile")));
userDTO.setUserRepoRef(convertString(map.get("user_repo_ref")));
userDTO.setStatus("active".equals(map.get("status")) ? 1 : 0);
return userDTO;
}
public String convertString(Object value) {
if (value == null) {
return null;
}
if (value instanceof String) {
return (String) value;
}
return value.toString();
}
public Integer convertInt(Object value, Integer defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Number) {
return ((Number) value).intValue();
}
return Integer.parseInt(value.toString());
}
protected Map<String, Object> convertAlias(Map<String, Object> parameters) {
logger.debug("parameters : {}", parameters);
Map<String, Object> parameterMap = new HashMap<String, Object>();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String key = entry.getKey();
for (Map.Entry<String, String> aliasEntry : aliasMap.entrySet()) {
String aliasKey = "_" + aliasEntry.getKey();
String aliasValue = "_" + aliasEntry.getValue();
if (key.indexOf(aliasKey) != -1) {
key = key.replace(aliasKey, aliasValue);
break;
}
}
parameterMap.put(key, entry.getValue());
}
logger.debug("parameterMap : {}", parameterMap);
return parameterMap;
}
@Resource
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Resource
public void setUserSyncConnector(UserSyncConnector userSyncConnector) {
this.userSyncConnector = userSyncConnector;
}
public void setSqlFindById(String sqlFindById) {
this.sqlFindById = sqlFindById;
}
public void setSqlFindByUsername(String sqlFindByUsername) {
this.sqlFindByUsername = sqlFindByUsername;
}
public void setSqlFindByRef(String sqlFindByRef) {
this.sqlFindByRef = sqlFindByRef;
}
public void setAliasMap(Map<String, String> aliasMap) {
this.aliasMap = aliasMap;
}
public void setSqlPagedQuerySelect(String sqlPagedQuerySelect) {
this.sqlPagedQuerySelect = sqlPagedQuerySelect;
}
public void setSqlPagedQueryCount(String sqlPagedQueryCount) {
this.sqlPagedQueryCount = sqlPagedQueryCount;
}
}