/*
* Copyright (c) 2008-2016 Computer Network Information Center (CNIC), Chinese Academy of Sciences.
*
* This file is part of Duckling project.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package cn.vlabs.umt.ui.rest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactory;
import cn.vlabs.commons.principal.UserPrincipal;
import cn.vlabs.duckling.api.umt.rmi.exception.ErrorCode;
import cn.vlabs.duckling.api.umt.rmi.userv7.SearchField;
import cn.vlabs.duckling.api.umt.rmi.userv7.SearchScope;
import cn.vlabs.duckling.api.umt.rmi.userv7.UMTUser;
import cn.vlabs.rest.ServiceException;
import cn.vlabs.rest.server.annotation.RestMethod;
import cn.vlabs.umt.common.util.CommonUtils;
import cn.vlabs.umt.services.account.ICoreMailClient;
import cn.vlabs.umt.services.user.LoginService;
import cn.vlabs.umt.services.user.UserService;
import cn.vlabs.umt.services.user.bean.CoreMailUserInfo;
import cn.vlabs.umt.services.user.bean.LoginNameInfo;
import cn.vlabs.umt.services.user.bean.User;
import cn.vlabs.umt.services.user.bean.UserField;
import cn.vlabs.umt.services.user.bean.UsernamePasswordCredential;
import cn.vlabs.umt.services.user.exception.InvalidUserNameException;
import cn.vlabs.umt.services.user.service.IUserLoginNameService;
import cn.vlabs.umt.ui.UMTContext;
public class RestUserServiceV7Impl {
private static Logger LOGGER =Logger.getLogger(RestUserServiceV7Impl.class);
private UserService service;
private LoginService loginService;
private IUserLoginNameService loginNameService;
private ICoreMailClient coreMailclient;
public RestUserServiceV7Impl(){
BeanFactory factory = UMTContext.getFactory();
service = (UserService)factory.getBean(UserService.BEAN_ID);
loginService = (LoginService)factory.getBean(LoginService.BEAN_ID);
loginNameService=(IUserLoginNameService)factory.getBean(IUserLoginNameService.BEAN_ID);
coreMailclient=ICoreMailClient.getInstance();
}
@RestMethod("createUser")
public void createUser(UMTUser user) throws ServiceException{
int rtnCode=service.isUsed(user.getCstnetId());
if (rtnCode==UserService.USER_NAME_DOMAIN_NOT_ALLOWD){
throw new ServiceException(ErrorCode.DOMAIN_NOT_ALLOWD,"此域名不允许注册");
}else if(rtnCode!=UserService.USER_NAME_UNUSED){
throw new ServiceException(ErrorCode.USER_EXIST,"用户已存在");
}
try {
service.create(toUser(user),LoginNameInfo.STATUS_ACTIVE);
} catch (InvalidUserNameException e) {
throw new ServiceException(ServiceException.ERROR_INTERNAL_ERROR,"不合法的用户名:"+user.getUmtId());
}
}
@RestMethod("createUsers")
public List<UMTUser> createUsers(List<UMTUser> users) throws ServiceException{
int index=0;
for(UMTUser umtUser:users){
try {
String orgPassword=umtUser.getPassword();
User user=toUser(umtUser);
int rtnCode=service.isUsed(user.getCstnetId());
if (rtnCode!=UserService.USER_NAME_UNUSED){
users.set(index++,umtUser);
continue;
}
service.create(user,LoginNameInfo.STATUS_ACTIVE);
umtUser=toUMTUser(user);
umtUser.setPassword(orgPassword);
users.set(index++,umtUser);
} catch (InvalidUserNameException e) {
throw new ServiceException(ServiceException.ERROR_INTERNAL_ERROR,"不合法的用户名:"+umtUser.getUmtId());
}
}
return users;
}
@RestMethod("getUser")
public UMTUser getUMTUserByUmtId(String umtId){
User umtUser = service.getUserByUmtId(umtId);
return toUMTUser(umtUser);
}
@RestMethod("getUmtUsers")
public List<UMTUser> getUMTUsers(List<String> umtIds){
List<User> umtUser = service.getUsersByUmtId(umtIds);
List<UMTUser> result=new ArrayList<UMTUser>();
if(umtUser==null){
return result;
}
for(User user:umtUser){
result.add(toUMTUser(user));
}
return result;
}
@RestMethod("getUserByLoginName")
public UMTUser getUMTUserByLogiName(String loginName){
User umtUser=service.getUserByLoginName(loginName);
if(umtUser==null){
CoreMailUserInfo coreMailUserInfo=coreMailclient.getCoreMailUserInfo(loginName);
if(coreMailUserInfo==null){
return null;
}
return toUMTUser(coreMailUserInfo.getUser());
}
return toUMTUser(umtUser);
}
@RestMethod("isExist")
public boolean[] isExist(Collection<String> usernames) {
if (usernames==null||usernames.size()==0){
return new boolean[0];
}
String[] users = toArray(usernames);
boolean[] results=new boolean[usernames.size()];
Set<String> exists = service.isExist(users);
if (exists!=null){
int i=0;
for (String username:usernames){
results[i]=exists.contains(username);
i++;
}
}
return results;
}
private String[] toArray(Collection<String> usernames){
String[] users = new String[usernames.size()];
int i=0;
for (String username:usernames){
users[i]=username;
i++;
}
return users;
}
@RestMethod("search")
public List<UMTUser> search(String keyword, int offset, int count, String orderBy, boolean isAscendent){
if (keyword==null || keyword.equals("")){
return new ArrayList<UMTUser>();
}
keyword = keyword.replaceAll("%", "");
if(count<=0)
{
count = Integer.MAX_VALUE;
}
if (offset<=0)
{
offset=0;
}
UserField field = UserField.cstnetId;
if (UMTUser.FIELD_CSTNET_ID.equals(orderBy)){
field = UserField.cstnetId;
}
if (UMTUser.FIELD_TRUE_NAME.equals(orderBy)){
field = UserField.trueName;
}
Collection<User> users = new ArrayList<User>();
users.addAll(coreMailclient.searchByKeyword(keyword,"all", SearchField.CSTNET_ID, offset, count));
users.addAll(coreMailclient.searchByKeyword(keyword,"all", SearchField.DOMAIN, offset, count));
users.addAll(coreMailclient.searchByKeyword(keyword,"all", SearchField.TRUE_NAME, offset, count));
Collection<User> umtUsers=service.search(keyword, offset, count, field, isAscendent);
if(umtUsers!=null){
users.addAll(umtUsers);
}
ArrayList<UMTUser> rusers = new ArrayList<UMTUser>();
Set<String> repeat=new HashSet<String>();
if(users!=null&&!users.isEmpty()){
for(User user:users){
if(repeat.contains(user.getCstnetId())){
continue;
}
repeat.add(user.getCstnetId());
rusers.add(toUMTUser(user));
}
}
return rusers;
}
@RestMethod("login")
public UserPrincipal login(String userName, String password){
User princ= loginService.loginAndReturnPasswordType(new UsernamePasswordCredential(userName, password)).getUser();
if(princ==null){
return null;
}else{
return princ.getUserPrincipal();
}
}
@RestMethod("searchCount")
public int searchCount(String keyword){
return service.searchCount(keyword);
}
@RestMethod("updateUser")
public void updateUser(UMTUser user) throws ServiceException {
if(!CommonUtils.isNull(user.getPassword())){
LOGGER.error("password is not allowed changed");
}else{
updateUserWithoutPwd(user);
}
}
@RestMethod("updateUserWithoutPwd")
public synchronized void updateUserWithoutPwd(UMTUser user) throws ServiceException {
if (service.isUsed(user.getCstnetId())==UserService.USER_NAME_USED){
User localUser=service.getUserByLoginName(user.getCstnetId());
if(localUser!=null){
localUser.setTrueName(user.getTruename());
service.update(localUser, false);
return;
}
CoreMailUserInfo coreMailUserInfo=coreMailclient.getCoreMailUserInfo(user.getCstnetId());
User coreMailUser=coreMailUserInfo.getUser();
if(coreMailUser!=null){
try {
service.create(coreMailUser, LoginNameInfo.STATUS_ACTIVE);
}catch (InvalidUserNameException e) {
throw new ServiceException(ErrorCode.USER_EXIST, "要创建的用户已存在");
}
}else{
throw new ServiceException(ErrorCode.USER_NOT_FOUND, "要更新的用户未找到");
}
coreMailUser.setTrueName(user.getTruename());
service.update(coreMailUser, false);
}else{
throw new ServiceException(ErrorCode.USER_NOT_FOUND, "要更新的用户未找到");
}
}
@RestMethod("searchByKeyword")
public List<UMTUser> searchByKeyword(String keyWord,SearchScope scope,SearchField field,int offset,int size){
return searchByKeyword(keyWord, "all", scope, field, offset, size);
}
/**
* 根据关键字搜索
* */
@RestMethod("searchByKeywordAndDomain")
public List<UMTUser> searchByKeyword(String keyWord,String domain,SearchScope scope,SearchField field,int offset,int size){
Collection<User> result=null;
if(CommonUtils.isNull(keyWord)){
return null;
}
if(CommonUtils.isNull(keyWord)){
return null;
}
switch(scope){
case UMT:{
keyWord=keyWord.replaceAll("%", "\\%").replaceAll("_", "\\_");
result=service.searchUmtOnly(keyWord, offset, size);
break;
}
case CORE_MAIL:{
result=(Collection<User>)coreMailclient.searchByKeyword(keyWord,domain, field, offset, size);
break;
}
}
List<UMTUser> finalResult=null;
if(result!=null){
finalResult=new ArrayList<UMTUser>();
for(User u:result){
finalResult.add(toUMTUser(u));
}
}
return finalResult;
}
/**
* 生成umtId并返回
* */
@RestMethod("generateUmtId")
public synchronized String[] generateUmtId(List<String> cstnetIds)throws Exception{
if(CommonUtils.isNull(cstnetIds)){
return new String[]{};
}
String[] umtIds=new String[cstnetIds.size()];
int index=0;
for(String cstnetId:cstnetIds){
String lower=cstnetId.toLowerCase();
User user=service.getUserByLoginName(lower);
if(user==null&&coreMailclient.isUserExt(lower)){
user=coreMailclient.getCoreMailUserInfo(lower).getUser();
service.create(user, LoginNameInfo.STATUS_ACTIVE);
}
if(user!=null){
umtIds[index]=user.getUmtId();
}
index++;
}
return umtIds;
}
/**
* 判断域名是否存在
* */
@RestMethod("domainExist")
public boolean domainExist(String domainName){
return coreMailclient.domainExist(domainName);
}
private UMTUser toUMTUser(User user){
if (user!=null){
UMTUser umtUser= new UMTUser();
umtUser.setCstnetId(user.getCstnetId().toLowerCase());
umtUser.setUmtId(user.getUmtId());
umtUser.setSecondaryEmails(user.getSecondaryEmails());
umtUser.setSecurityEmail(user.getSecurityEmail());
umtUser.setTruename(user.getTrueName());
if(CommonUtils.isNull(user.getTrueName())){
umtUser.setTruename(user.getCstnetId().substring(0,user.getCstnetId().indexOf("@")));
}
umtUser.setAuthBy(user.getType());
if(user.isCoreMailOrUc()){
umtUser.setCstnetIdStatus(LoginNameInfo.STATUS_ACTIVE);
}else{
LoginNameInfo nameInfo=loginNameService.getALoginNameInfo(user.getId(), user.getCstnetId());
umtUser.setCstnetIdStatus(nameInfo==null?null:nameInfo.getStatus());
}
return umtUser;
}
return null;
}
private User toUser(UMTUser user){
User u = new User();
u.setUmtId(user.getUmtId());
u.setCstnetId(user.getCstnetId().toLowerCase());
u.setPassword(user.getPassword());
u.setTrueName(user.getTruename());
return u;
}
}