package org.butor.dbauth.model;
import java.util.List;
import org.butor.auth.common.AuthMessageID;
import org.butor.auth.common.desc.Desc;
import org.butor.auth.common.desc.DescKey;
import org.butor.auth.common.group.Group;
import org.butor.auth.common.group.GroupItem;
import org.butor.auth.common.group.GroupItemKey;
import org.butor.auth.common.group.GroupKey;
import org.butor.auth.common.group.GroupServices;
import org.butor.auth.dao.AuthDao;
import org.butor.auth.dao.DescDao;
import org.butor.auth.dao.GroupDao;
import org.butor.dao.DAOMessageID;
import org.butor.json.CommonRequestArgs;
import org.butor.json.service.Context;
import org.butor.json.service.ResponseHandler;
import org.butor.json.service.ResponseHandlerHelper;
import org.butor.utils.AccessMode;
import org.butor.utils.ApplicationException;
import org.butor.utils.CommonMessageID;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.base.Strings;
public class DefaultGroupModel implements GroupServices {
private GroupDao groupDao;
private DescDao descDao;
private AuthDao authDao;
private String systemId;
private String secFunc;
@Override
public void listGroup(Context<Group> ctx, String member, String func) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandler<Group> rh = ctx.getResponseHandler();
List<Group> list = groupDao.listGroup(member, func, cra);
ResponseHandlerHelper.addList(list, rh);
}
@Override
public void readGroup(Context<Group> ctx, String groupId) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandler<Group> rh = ctx.getResponseHandler();
Desc desc = descDao.readDesc(new GroupKey(groupId), cra);
if (desc == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
Group group = new Group();
group.setId(groupId);
group.setDescription(desc.getDescription());
group.setRevNo(desc.getRevNo());
group.setStamp(desc.getStamp());
group.setUserId(group.getUserId());
group.setItems(groupDao.readGroup(groupId, cra));
rh.addRow(group);
}
@Override
@Transactional
public void createGroup(Context<Group> ctx, Group group) {
CommonRequestArgs cra = ctx.getRequest();
if (Strings.isNullOrEmpty(group.getId())) {
ApplicationException.exception(
CommonMessageID.MISSING_ARG.getMessage("groupId"));
}
if (Strings.isNullOrEmpty(group.getDescription())) {
ApplicationException.exception(
CommonMessageID.MISSING_ARG.getMessage("description"));
return;
}
List<GroupItem> items = group.getItems();
Desc desc = new Desc();
desc.setDescription(group.getDescription());
desc.setId(group.getId());
desc.setIdType("group");
DescKey dk = descDao.insertDesc(desc, cra);
if (dk == null) {
ApplicationException.exception(
CommonMessageID.SERVICE_FAILURE.getMessage());
return;
}
for (GroupItem item : items) {
item.setGroupId(group.getId());
GroupItemKey uk = groupDao.insertItem(item, cra);
if (uk == null) {
ApplicationException.exception(
CommonMessageID.SERVICE_FAILURE.getMessage());
return;
}
}
}
@Override
@Transactional
public void updateGroup(Context<Group> ctx, Group group) {
CommonRequestArgs cra = ctx.getRequest();
if (!authDao.hasAccess(systemId, secFunc, AccessMode.WRITE, cra)) {
ApplicationException.exception(DAOMessageID.UNAUTHORIZED.getMessage());
}
if (Strings.isNullOrEmpty(group.getId())) {
ApplicationException.exception(
CommonMessageID.MISSING_ARG.getMessage("groupId"));
}
if (Strings.isNullOrEmpty(group.getDescription())) {
ApplicationException.exception(
CommonMessageID.MISSING_ARG.getMessage("description"));
return;
}
group.setIdType("group");
DescKey dk = descDao.updateDesc(group, cra);
if (dk == null) {
ApplicationException.exception(
CommonMessageID.SERVICE_FAILURE.getMessage());
return;
}
groupDao.updateGroup(group, cra);
}
public void setGroupDao(GroupDao groupDao) {
this.groupDao = groupDao;
}
@Override
@Transactional
public void deleteGroup(Context<Group> ctx, GroupKey groupKey) {
CommonRequestArgs cra = ctx.getRequest();
if (!authDao.hasAccess(systemId, secFunc, AccessMode.WRITE, cra)) {
ApplicationException.exception(DAOMessageID.UNAUTHORIZED.getMessage());
}
groupKey.setIdType("group");
if (groupDao.isGroupRefered(groupKey.getId(), cra)) {
ResponseHandler<Group> rh = ctx.getResponseHandler();
rh.addMessage(AuthMessageID.CANNOT_DELETE_REFERED_GROUP.getMessage());
return;
}
descDao.deleteDesc(groupKey, cra);
groupDao.deleteGroup(groupKey, cra);
}
public void setDescDao(DescDao descDao) {
this.descDao = descDao;
}
public void setAuthDao(AuthDao authDao) {
this.authDao = authDao;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public void setSecFunc(String secFunc) {
this.secFunc = secFunc;
}
}