package org.xcolab.view.pages.contestmanagement.utils;
import org.springframework.stereotype.Component;
import org.xcolab.client.contest.ContestClientUtil;
import org.xcolab.client.contest.exceptions.ContestNotFoundException;
import org.xcolab.client.contest.pojo.Contest;
import org.xcolab.view.util.entity.portlet.RequestParamUtil;
import org.xcolab.util.exceptions.InternalException;
import org.xcolab.view.taglibs.xcolab.interfaces.TabContext;
import org.xcolab.view.taglibs.xcolab.interfaces.TabPermissions;
import javax.servlet.http.HttpServletRequest;
@Component
public class ContestsContextImpl implements TabContext {
private static final String CONTEXT_ATTRIBUTE_PREFIX = "_proposalsPortlet_";
private static final String CONTEXT_INITIALIZED_ATTRIBUTE =
CONTEXT_ATTRIBUTE_PREFIX + "contextInitialized";
private static final String PERMISSIONS_ATTRIBUTE = CONTEXT_ATTRIBUTE_PREFIX + "permissions";
private static final String CONTEST_ATTRIBUTE = CONTEXT_ATTRIBUTE_PREFIX + "contest";
private static final String CONTEST_WRAPPED_ATTRIBUTE =
CONTEXT_ATTRIBUTE_PREFIX + "contestWrapped";
private static final String CONTEST_ID_PARAM = "contestId";
public ContestsContextImpl() {
}
@Override
public Contest getContest(HttpServletRequest request) {
return getAttribute(request, CONTEST_ATTRIBUTE, Contest.class);
}
@Override
public TabPermissions getPermissions(HttpServletRequest request) {
return getAttribute(request, PERMISSIONS_ATTRIBUTE, TabPermissions.class);
}
private <T> T getAttribute(HttpServletRequest request, String attributeName, Class<T> clasz) {
Object contextInitialized = request.getAttribute(CONTEXT_INITIALIZED_ATTRIBUTE);
if (contextInitialized == null) {
init(request);
}
//noinspection unchecked
return (T) request.getAttribute(attributeName);
}
private void init(HttpServletRequest request) {
final Long contestId = RequestParamUtil.getLong(request, CONTEST_ID_PARAM);
if (contestId > 0) {
Contest contest;
try {
contest = ContestClientUtil.getContest(contestId);
} catch (ContestNotFoundException e) {
throw new InternalException(e);
}
if (contest != null) {
request.setAttribute(CONTEST_ATTRIBUTE, contest);
request.setAttribute(CONTEST_WRAPPED_ATTRIBUTE, (contest));
request.setAttribute(PERMISSIONS_ATTRIBUTE,
new ContestPermissions(request, contest));
}
} else {
request.setAttribute(PERMISSIONS_ATTRIBUTE, new ContestManagementPermissions(request));
}
request.setAttribute(CONTEXT_INITIALIZED_ATTRIBUTE, true);
}
}