/******************************************************************************* * Copyright (c) 2013 aegif. * * This file is part of NemakiWare. * * NemakiWare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NemakiWare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with NemakiWare. * If not, see <http://www.gnu.org/licenses/>. * * Contributors: * linzhixing(https://github.com/linzhixing) - initial API and implementation ******************************************************************************/ package jp.aegif.nemaki.businesslogic.impl; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import jp.aegif.nemaki.businesslogic.PrincipalService; import jp.aegif.nemaki.cmis.factory.info.RepositoryInfo; import jp.aegif.nemaki.cmis.factory.info.RepositoryInfoMap; import jp.aegif.nemaki.dao.PrincipalDaoService; import jp.aegif.nemaki.model.Group; import jp.aegif.nemaki.model.User; import jp.aegif.nemaki.util.constant.PrincipalId; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Principal(User / Group) Service implementation. * */ public class PrincipalServiceImpl implements PrincipalService { private static final Log log = LogFactory.getLog(PrincipalServiceImpl.class); private RepositoryInfoMap repositoryInfoMap; private PrincipalDaoService principalDaoService; @Override public List<User> getUsers(String repositoryId) { //refresh to cope with new user without restarting the server List<User> users = principalDaoService.getUsers(repositoryId); return users; } @Override public List<Group> getGroups(String repositoryId) { //refresh to cope with new group without restarting the server List<Group> groups = principalDaoService.getGroups(repositoryId); return groups; } @Override public Set<String> getGroupIdsContainingUser(String repositoryId, String userId) { String anonymous = getAnonymous(repositoryId); String anyone = getAnyone(repositoryId); Set<String> groupIds = new HashSet<String>(); //Anonymous user doesn't belong to any group, even to Anyone. if(userId.equals(anonymous)){ return groupIds; } List<Group> groups = getGroups(repositoryId); for (Group g : groups) { if ( containsUserInGroup(repositoryId, userId, g) ) { groupIds.add(g.getGroupId()); } } groupIds.add(anyone); return groupIds; } private boolean containsUserInGroup(String repositoryId, String userId, Group group) { log.debug("$$ group:" + group.getName()); if ( group.getUsers().contains(userId)) return true; for(String groupId: group.getGroups() ) { log.debug("$$ subgroup: " + groupId); Group g = this.getGroupById(repositoryId, groupId); boolean result = containsUserInGroup(repositoryId, userId, g); if ( result ) return true; } return false; } @Override public Group getGroupById(String repositoryId, String groupId) { return principalDaoService.getGroupById(repositoryId, groupId); } @Override public User getUserById(String repositoryId, String id) { return principalDaoService.getUserById(repositoryId, id); } @Override public synchronized void createUser(String repositoryId, User user) { //UserID uniqueness List<String> principalIds = getPrincipalIds(repositoryId); if(principalIds.contains(user.getUserId())){ log.error("userId=" + user.getUserId() + " already exists."); } principalDaoService.createUser(repositoryId, user); } @Override public synchronized void updateUser(String repositoryId, User user) { principalDaoService.updateUser(repositoryId, user); } @Override public synchronized void deleteUser(String repositoryId, String id) { principalDaoService.delete(repositoryId, User.class, id); } @Override public synchronized void createGroup(String repositoryId, Group group) { //GroupID uniqueness List<String> principalIds = getPrincipalIds(repositoryId); if(principalIds.contains(group.getGroupId())){ log.error("groupId=" + group.getGroupId() + " already exists."); } principalDaoService.createGroup(repositoryId, group); } @Override public synchronized void updateGroup(String repositoryId, Group group) { principalDaoService.updateGroup(repositoryId, group); } @Override public synchronized void deleteGroup(String repositoryId, String id) { principalDaoService.delete(repositoryId, Group.class, id); } private List<String> getPrincipalIds(String repositoryId){ String anonymous = getAnonymous(repositoryId); String anyone = getAnyone(repositoryId); List<String> principalIds = new ArrayList<String>(); //UserId List<User> users = principalDaoService.getUsers(repositoryId); for(User u : users){ if(principalIds.contains(u.getUserId())){ log.warn("userId=" + u.getUserId() + " is duplicate in the database."); } principalIds.add(u.getUserId()); } //GroupId List<Group> groups = principalDaoService.getGroups(repositoryId); for(Group g : groups){ if(principalIds.contains(g.getGroupId())){ log.warn("groupId=" + g.getGroupId() + " is duplicate in the database."); } principalIds.add(g.getGroupId()); } //Anonymous if(principalIds.contains(anonymous)){ log.warn("CMIS 'anonymous':" + anonymous + " should have not been registered in the database."); } principalIds.add(anonymous); if(principalIds.contains(PrincipalId.ANONYMOUS_IN_DB)){ log.warn("CMIS 'anonymous':" + anonymous + " should have not been registered in the database.(For system use)"); } principalIds.add(PrincipalId.ANONYMOUS_IN_DB); //Anyone if(principalIds.contains(anyone) ){ log.warn("CMIS 'anyone': " + anyone + " should have not been registered in the database."); } principalIds.add(anyone); if(principalIds.contains(PrincipalId.ANYONE_IN_DB)){ log.warn("CMIS 'anyone':" + PrincipalId.ANYONE_IN_DB + " should have not been registered in the database.(For system use)"); } principalIds.add(PrincipalId.ANYONE_IN_DB); return principalIds; } @Override public List<User> getAdmins(String repositoryId) { return principalDaoService.getAdmins(repositoryId); } public void setPrincipalDaoService(PrincipalDaoService principalDaoService) { this.principalDaoService = principalDaoService; } @Override public String getAnonymous(String repositoryId) { RepositoryInfo info = repositoryInfoMap.get(repositoryId); return info.getPrincipalIdAnonymous(); } @Override public String getAnyone(String repositoryId) { RepositoryInfo info = repositoryInfoMap.get(repositoryId); return info.getPrincipalIdAnyone(); } public void setRepositoryInfoMap(RepositoryInfoMap repositoryInfoMap) { this.repositoryInfoMap = repositoryInfoMap; } }