package com.justdebugit.thrift.example.raw;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.thrift.TException;
import com.google.common.base.Objects;
import com.google.common.collect.Sets;
import com.justdebugit.thrift.generated.DifferentSourceDetectedException;
import com.justdebugit.thrift.generated.UserInfo;
import com.justdebugit.thrift.generated.UserManagerService;
public class UserManagerServiceImpl implements UserManagerService.Iface{
//所有注册用户
static ConcurrentMap<Integer, UserInfo> map = new ConcurrentHashMap<Integer, UserInfo>();
static ConcurrentMap<Integer, Set<UserInfo>> friendsMap = new ConcurrentHashMap<Integer, Set<UserInfo>>();
static{
UserInfo userInfo = new UserInfo(1);
userInfo.score = 10.2;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
stringBuilder.append("a");
}
userInfo.name = stringBuilder.toString();
UserInfo userInfo2 = new UserInfo(userInfo);
userInfo2.setName("test2");
userInfo2.setUid(2);
UserInfo userInfo3 = new UserInfo(userInfo);
userInfo3.setUid(3);
userInfo3.setName("test3");
map.put(1, userInfo);
map.put(2, userInfo2);
map.put(3, userInfo3);
friendsMap.put(1, Sets.newHashSet(userInfo2,userInfo3));
friendsMap.put(2, Sets.newHashSet(userInfo));
}
@Override
public UserInfo get(int uid) throws TException {
return map.get(uid);
}
@Override
public void put(int uid, UserInfo info) throws TException {
map.put(uid, info);
}
@Override
public Set<UserInfo> getMyFriends(int uid) throws TException {
return friendsMap.get(uid);
}
@Override
public void defriend(int uid1, int uid2) throws TException {
Set<UserInfo> list = friendsMap.get(uid1);
if (list!=null) {
synchronized (list) {
UserInfo info = map.get(uid2);
if (info==null) {
throw new TException("user "+uid2 +" is not exist");
}
list.remove(info);
}
}
}
@Override
public boolean addfriend(int uid1, int uid2) throws TException {
Set<UserInfo> list = friendsMap.get(uid1);
if (list!=null) {
synchronized (list) {
UserInfo info = map.get(uid2);
if (info==null) {
throw new TException("user "+uid2 +" is not exist");
}
list.add(info);
}
}else {
friendsMap.putIfAbsent(uid1, Sets.<UserInfo>newHashSet());
return false;
}
return true;
}
@Override
public int compare(int uid1, int uid2)
throws DifferentSourceDetectedException, TException {
UserInfo userInfo1 = map.get(uid1);
UserInfo userInfo2 = map.get(uid2);
if (userInfo1==null||userInfo2==null) {
throw new TException("user not found");
}
if (!Objects.equal(userInfo1.getSource(), userInfo2.getSource())) {
throw new DifferentSourceDetectedException(uid1, uid2, "not same source");
}
return userInfo1.getScore() > userInfo2.getScore()?uid1:uid2;
}
}