/*******************************************************************************
* 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.dao.impl.couch;
import java.util.ArrayList;
import java.util.List;
import jp.aegif.nemaki.dao.PrincipalDaoService;
import jp.aegif.nemaki.dao.impl.couch.connector.ConnectorPool;
import jp.aegif.nemaki.model.Group;
import jp.aegif.nemaki.model.User;
import jp.aegif.nemaki.model.couch.CouchGroup;
import jp.aegif.nemaki.model.couch.CouchNodeBase;
import jp.aegif.nemaki.model.couch.CouchUser;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.ektorp.ViewQuery;
import org.springframework.stereotype.Component;
/**
* Dao Service for Principal(User/Group) Implementation for CouchDB
*
* @author linzhixing
*/
@Component
public class PrincipalDaoServiceImpl implements
PrincipalDaoService {
private ConnectorPool connectorPool;
private static final Log log = LogFactory.getLog(PrincipalDaoServiceImpl.class);
private static final String DESIGN_DOCUMENT = "_design/_repo";
public PrincipalDaoServiceImpl() {
}
@Override
public User getUser(String repositoryId, String nodeId) {
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("users").key(nodeId);
List<CouchUser> l = connectorPool.get(repositoryId).queryView(query, CouchUser.class);
if (CollectionUtils.isEmpty(l))
return null;
return l.get(0).convert();
}
@Override
public User getUserById(String repositoryId, String userId) {
CouchUser cu = getUserByIdInternal(repositoryId, userId);
if (cu == null) {
return null;
} else {
User u = cu.convert();
return u;
}
}
private CouchUser getUserByIdInternal(String repositoryId, String userId) {
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("usersById").key(userId);
List<CouchUser> l = connectorPool.get(repositoryId).queryView(query, CouchUser.class);
if (CollectionUtils.isEmpty(l))
return null;
return l.get(0);
}
@Override
public List<User> getUsers(String repositoryId) {
List<User> users = new ArrayList<User>();
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("usersById");
List<CouchUser> l = connectorPool.get(repositoryId).queryView(query, CouchUser.class);
for (CouchUser c : l) {
User u = c.convert();
users.add(u);
}
return users;
}
@Override
public List<User> getAdmins(String repositoryId) {
List<User> admins = new ArrayList<User>();
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("admin");
List<CouchUser> l = connectorPool.get(repositoryId).queryView(query, CouchUser.class);
if (CollectionUtils.isEmpty(l))
return null;
for (CouchUser c : l) {
User u = c.convert();
admins.add(u);
}
return admins;
}
@Override
public Group getGroup(String repositoryId, String nodeId) {
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("groups").key(nodeId);
List<CouchGroup> l = connectorPool.get(repositoryId).queryView(query, CouchGroup.class);
if (CollectionUtils.isEmpty(l))
return null;
return l.get(0).convert();
}
@Override
public Group getGroupById(String repositoryId, String groupId) {
CouchGroup cg = getGroupByIdInternal(repositoryId, groupId);
if (cg == null) {
return null;
} else {
Group g = cg.convert();
return g;
}
}
private CouchGroup getGroupByIdInternal(String repositoryId, String groupId) {
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("groupsById").key(groupId);
List<CouchGroup> l = connectorPool.get(repositoryId).queryView(query, CouchGroup.class);
if (CollectionUtils.isEmpty(l))
return null;
return l.get(0);
}
@Override
public List<Group> getGroups(String repositoryId) {
List<Group> groups = new ArrayList<Group>();
ViewQuery query = new ViewQuery().designDocId(DESIGN_DOCUMENT)
.viewName("groupsById");
List<CouchGroup> l = connectorPool.get(repositoryId).queryView(query, CouchGroup.class);
for (CouchGroup c : l) {
Group g = c.convert();
groups.add(g);
}
return groups;
}
@Override
public User createUser(String repositoryId, User user) {
CouchUser cu = new CouchUser(user);
connectorPool.get(repositoryId).create(cu);
User created = cu.convert();
return created;
}
@Override
public Group createGroup(String repositoryId, Group group) {
CouchGroup cg = new CouchGroup(group);
connectorPool.get(repositoryId).create(cg);
Group created = cg.convert();
return created;
}
@Override
public User updateUser(String repositoryId, User user) {
CouchUser cd = connectorPool.get(repositoryId).get(CouchUser.class, user.getId());
// Set the latest revision for avoid conflict
CouchUser update = new CouchUser(user);
update.setRevision(cd.getRevision());
connectorPool.get(repositoryId).update(update);
User u = update.convert();
return u;
}
@Override
public Group updateGroup(String repositoryId, Group group) {
CouchGroup cd = connectorPool.get(repositoryId).get(CouchGroup.class, group.getId());
// Set the latest revision for avoid conflict
CouchGroup update = new CouchGroup(group);
update.setRevision(cd.getRevision());
connectorPool.get(repositoryId).update(update);
Group g = update.convert();
return g;
}
@Override
public void delete(String repositoryId, Class<?> clazz, String principalId){
CouchNodeBase cnb = connectorPool.get(repositoryId).get(CouchNodeBase.class, principalId);
connectorPool.get(repositoryId).delete(cnb);
}
public void setConnectorPool(ConnectorPool connectorPool) {
this.connectorPool = connectorPool;
}
}