package jp.aegif.nemaki.cmis.factory.auth.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import jp.aegif.nemaki.businesslogic.PrincipalService;
import jp.aegif.nemaki.cmis.factory.auth.Token;
import jp.aegif.nemaki.cmis.factory.auth.TokenService;
import jp.aegif.nemaki.cmis.factory.info.RepositoryInfoMap;
import jp.aegif.nemaki.model.User;
import jp.aegif.nemaki.util.PropertyManager;
import jp.aegif.nemaki.util.constant.PropertyKey;
public class TokenServiceImpl implements TokenService{
private static final Log log = LogFactory
.getLog(TokenServiceImpl.class);
private PropertyManager propertyManager;
private PrincipalService principalService;
private RepositoryInfoMap repositoryInfoMap;
private TokenMap tokenMap = new TokenMap();
private Map<String, List<String>> admins = new HashMap<String, List<String>>();
private class TokenMap {
private Map<String, Map<String, Map<String, Token>>> map = new HashMap<String, Map<String,Map<String,Token>>>();
private Token get(String app, String repositoryId, String userName){
Map<String, Map<String, Token>> appMap = map.get(app);
if(appMap == null){
log.warn(String.format("No such app(%s) regitered for AuthToken", app));
return null;
}else{
Map<String, Token> repoMap = appMap.get(repositoryId);
if(repoMap == null){
log.warn(String.format("No such repositoryId(%s) registered for AuthToken", repositoryId));
return null;
}else{
return repoMap.get(userName);
}
}
}
private Token set(String app, String repositoryId, String userName){
Map<String, Map<String, Token>> appMap = map.get(app);
if(appMap == null){
map.put(app, new HashMap<String, Map<String, Token>>());
appMap = map.get(app);
}
Map<String, Token> repoMap = appMap.get(repositoryId);
if(repoMap == null){
appMap.put(repositoryId, new HashMap<String, Token>());
repoMap = appMap.get(repositoryId);
}
String token = UUID.randomUUID().toString();
long expiration = System.currentTimeMillis() + Long.valueOf(propertyManager.readValue(PropertyKey.AUTH_TOKEN_EXPIRATION));
repoMap.put(userName, new Token(userName, token, expiration));
return repoMap.get(userName);
}
}
public void init() {
for(String key : repositoryInfoMap.keys()){
//extract admin ids
List<User>admins = principalService.getAdmins(key);
List<String>userIds = new ArrayList<String>();
if(CollectionUtils.isNotEmpty(admins)){
for(User admin : admins){
userIds.add(admin.getUserId());
}
}
this.admins.put(key, userIds);
}
}
@Override
public Token getToken(String app, String repositoryId, String userId) {
return tokenMap.get(app, repositoryId, userId);
}
@Override
public Token setToken(String app, String repositoryId, String userId) {
return tokenMap.set(app,repositoryId, userId);
}
@Override
public boolean isAdmin(String repositoryId, String userId){
return admins.get(repositoryId).contains(userId);
}
public void setPropertyManager(PropertyManager propertyManager) {
this.propertyManager = propertyManager;
}
public void setPrincipalService(PrincipalService principalService) {
this.principalService = principalService;
}
public void setRepositoryInfoMap(RepositoryInfoMap repositoryInfoMap) {
this.repositoryInfoMap = repositoryInfoMap;
}
}