package com.dgex.offspring.user.internal;
import java.util.ArrayList;
import java.util.List;
import nxt.util.Convert;
import org.apache.log4j.Logger;
import org.eclipse.e4.core.services.events.IEventBroker;
import com.dgex.offspring.nxtCore.core.AccountHelper;
import com.dgex.offspring.nxtCore.service.IAccount;
import com.dgex.offspring.nxtCore.service.INxtService;
import com.dgex.offspring.user.service.IUser;
import com.dgex.offspring.user.service.IUserService;
public class UserServiceImpl implements IUserService {
static Logger logger = Logger.getLogger(UserServiceImpl.class);
private IEventBroker broker = null;
private INxtService nxt = null;
private final ArrayList<IUser> users;
private IUser activeUser = null;
public UserServiceImpl() {
users = new ArrayList<IUser>();
}
@Override
public void initialize(IEventBroker broker, INxtService nxt) {
this.nxt = nxt;
this.broker = broker;
}
@Override
public List<IUser> getUsers() {
return users;
}
@Override
public IUser createUser(String name, String passphrase, String accountNo) {
IUser user = null;
for (IUser u : users) {
if (accountNo.equals(u.getAccount().getStringId())) {
user = u;
break;
}
}
if (user == null) {
IAccount account;
if (passphrase != null) {
account = nxt.unlock(passphrase);
}
else {
account = new AccountHelper(nxt, Convert.parseUnsignedLong(accountNo
.trim()));
}
user = new UserImpl(name, account);
users.add(user);
broker.send(IUserService.TOPIC_USER_CREATED, user);
account.startForging();
}
return user;
}
@Override
public void setActiveUser(IUser user) {
logger.trace("setActiveUser old=" + activeUser + " new=" + user);
broker.send(IUserService.TOPIC_BEFORE_ACTIVEUSER_CHANGED, user);
activeUser = user;
broker.send(IUserService.TOPIC_ACTIVEUSER_CHANGED, user);
}
@Override
public IUser getActiveUser() {
return activeUser;
}
@Override
public IUser findUserByAccount(IAccount account) {
return findUser(account.getId());
}
@Override
public IUser findUser(Long accountId) {
for (IUser user : users) {
if (user.getAccount().getId().equals(accountId)) {
return user;
}
}
return null;
}
@Override
public void removeUser(IUser user) {
if (users.contains(user)) {
broker.send(IUserService.TOPIC_BEFORE_USER_REMOVED, user);
users.remove(user);
broker.send(IUserService.TOPIC_USER_REMOVED, user);
if (user.equals(activeUser))
setActiveUser(null);
}
}
@Override
public void removeAllUsers() {
IUser[] list = users.toArray(new IUser[users.size()]);
for (int i = 0; i < list.length; i++) {
removeUser(list[i]);
}
}
@Override
public IUser getUser(IAccount account) {
for (IUser user : users) {
if (user.getAccount().equals(account))
return user;
}
return null;
}
}