package org.butor.dbauth.model;
import java.util.List;
import org.butor.auth.common.AuthData;
import org.butor.auth.common.AuthModel;
import org.butor.auth.common.AuthServices;
import org.butor.auth.common.ListAuthDataCriteria;
import org.butor.auth.common.auth.Auth;
import org.butor.auth.common.auth.AuthKey;
import org.butor.auth.common.auth.ListAuthCriteria;
import org.butor.auth.common.auth.ListUserAuthFuncCriteria;
import org.butor.auth.common.auth.SecData;
import org.butor.auth.common.func.Func;
import org.butor.auth.dao.AuthDao;
import org.butor.auth.dao.DataDao;
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;
public class DefaultAuthModel implements AuthServices, AuthModel {
private AuthDao authDao;
private DataDao dataDao;
@Override
public void hasAccess(Context ctx, String system, String func, AccessMode am) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandler<Object> handler = ctx.getResponseHandler();
boolean has = hasAccess(system, func, am, cra);
handler.addRow(has);
}
@Override
public void listAuthFunc(Context ctx) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandlerHelper.addList(authDao.listAuthFunc(cra),
ctx.getResponseHandler());
}
@Override
public void listAuthData(Context ctx, ListAuthDataCriteria criteria) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandlerHelper.addList(listAuthData(criteria, cra),
ctx.getResponseHandler());
}
@Override
public void listAuth(Context ctx, ListAuthCriteria criteria) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandlerHelper.addList(listAuth(criteria, cra),
ctx.getResponseHandler());
}
@Override
public List<Auth> listAuth(ListAuthCriteria criteria, CommonRequestArgs cra) {
return authDao.listAuth(criteria, cra);
}
@Override
public void listUserAuthFunc(Context ctx, ListUserAuthFuncCriteria criteria) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandlerHelper.addList(authDao.listUserAuthFunc(criteria, cra),
ctx.getResponseHandler());
}
public void setAuthDao(AuthDao authDao) {
this.authDao = authDao;
}
@Override
public boolean hasAccess(String system, String func, AccessMode am, CommonRequestArgs cra) {
return authDao.hasAccess(system, func, am, cra);
}
@Override
public List<Func> listAuthFunc(CommonRequestArgs cra) {
return authDao.listAuthFunc(cra);
}
@Override
public List<AuthData> listAuthData(ListAuthDataCriteria criteria, CommonRequestArgs cra) {
return authDao.listAuthData(criteria, cra);
}
@Override
public void readAuth(Context ctx, int authId) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandler<Object> handler = ctx.getResponseHandler();
handler.addRow(readAuth(authId, cra));
}
@Override
public Auth readAuth(int authId, CommonRequestArgs cra) {
Auth auth = authDao.readAuth(authId, cra);
if (auth != null && auth.getDataId() != null && auth.getDataId() > -1) {
SecData criteria = new SecData();
criteria.setDataId(auth.getDataId());
auth.setData(dataDao.listData(criteria, cra));
}
return auth;
}
@Override
@Transactional
public void createAuth(Context ctx, Auth auth) {
CommonRequestArgs cra = ctx.getRequest();
AuthKey key = createAuth(auth, cra);
ctx.getResponseHandler().addRow(key);
}
@Override
public AuthKey createAuth(Auth auth, CommonRequestArgs cra) {
// all occurrences of data must have the same dataId.
// get the first generated one and set it to others
long dataId = -1;
if (auth.getData() != null) {
for (SecData sd : auth.getData()) {
dataDao.validateData(sd);
if (dataId != -1 ) {
sd.setDataId(dataId);
}
dataId = dataDao.insertData(sd, cra);
}
}
auth.setDataId(dataId);
AuthKey ak = authDao.insertAuth(auth, cra);
if (ak == null) {
ApplicationException.exception(CommonMessageID.NOT_FOUND.getMessage().setSysId("sec"));
}
return ak;
}
@Override
@Transactional
public void updateAuth(Context ctx, Auth auth) {
CommonRequestArgs cra = ctx.getRequest();
AuthKey key = updateAuth(auth, cra);
ctx.getResponseHandler().addRow(key);
}
@Override
public AuthKey updateAuth(Auth auth, CommonRequestArgs cra) {
Auth oldAuth = readAuth(auth.getAuthId(), cra);
if (oldAuth == null) {
ApplicationException.exception(DAOMessageID.UPDATE_FAILURE.getMessage());
}
if (auth.getStartDate() != null && auth.getEndDate() != null &&
auth.getStartDate().after(auth.getEndDate())) {
ApplicationException.exception(CommonMessageID.INVALID_ARG.getMessage("End date").setSysId("sec"));
}
long dataId = oldAuth.getDataId() != null ? oldAuth.getDataId().longValue() : -1;
dataId = dataDao.updateData(dataId, auth.getData(), cra);
if (auth.getData() != null && auth.getData().size() == 0) {
dataId = -1; // no data bundle attached to authorization.
}
auth.setDataId(dataId);
AuthKey ak = authDao.updateAuth(auth, cra);
if (ak == null) {
ApplicationException.exception(CommonMessageID.NOT_FOUND.getMessage().setSysId("sec"));
}
return ak;
}
@Override
@Transactional
public void deleteAuth(Context ctx, AuthKey ak) {
CommonRequestArgs cra = ctx.getRequest();
deleteAuth(ak, cra);
}
@Override
public void deleteAuth(AuthKey ak, CommonRequestArgs cra) {
Auth oldAuth = readAuth(ak.getAuthId(), cra);
if (oldAuth == null) {
ApplicationException.exception(DAOMessageID.UPDATE_FAILURE.getMessage());
}
authDao.deleteAuth(ak, cra);
if (oldAuth.getData() != null) {
dataDao.deleteData(oldAuth.getDataId(), cra);
}
}
@Override
public List<SecData> listData(SecData criteria, CommonRequestArgs cra) {
return dataDao.listData(criteria, cra);
}
public void updateData(long dataId, List<SecData> data, CommonRequestArgs cra) {
dataDao.updateData(dataId, data, cra);
}
public void setDataDao(DataDao dataDao) {
this.dataDao = dataDao;
}
}