/*
* Copyright 2007 Zhang, Zheng <oldbig@gmail.com>
*
* This file is part of ZOJ.
*
* ZOJ 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 revision 3 of the License, or (at your option) any later revision.
*
* ZOJ 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 ZOJ. if not, see
* <http://www.gnu.org/licenses/>.
*/
package cn.edu.zju.acm.onlinejudge.action;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.edu.zju.acm.onlinejudge.bean.AbstractContest;
import cn.edu.zju.acm.onlinejudge.bean.Problem;
import cn.edu.zju.acm.onlinejudge.bean.UserPreference;
import cn.edu.zju.acm.onlinejudge.bean.UserProfile;
import cn.edu.zju.acm.onlinejudge.persistence.PersistenceException;
import cn.edu.zju.acm.onlinejudge.persistence.ProblemPersistence;
import cn.edu.zju.acm.onlinejudge.security.UserSecurity;
import cn.edu.zju.acm.onlinejudge.util.ContestManager;
import cn.edu.zju.acm.onlinejudge.util.PersistenceManager;
import cn.edu.zju.acm.onlinejudge.util.ConfigManager;
import cn.edu.zju.acm.onlinejudge.bean.request.ProblemCriteria;
/**
* ContextAdapter wraps configuration and session logic for the actions. It provides Java Bean like API to access
* session variables whose namespaces are configurable. A ContextAdapter instance is created in BaseAction and passed to
* various action implementations. It also holds the http request and response.
*
* @author Zhang, Zheng
* @version 2.0
*/
public class ContextAdapter {
/**
* USER_PROFILE_SESSION_KEY.
*/
public static final String USER_PROFILE_SESSION_KEY = "oj_user";
/**
* SECURITY_SESSION_KEY.
*/
public static final String SECURITY_SESSION_KEY = "oj_security";
/**
* PREFERENCE_SESSION_KEY.
*/
public static final String PREFERENCE_SESSION_KEY = "oj_user_preference";
public static UserSecurity defaultUserSecurity = null;
/**
* Represents the HTTP servlet request for this context. It is set from constructor and is never changed.
* ContextAdapter uses this to reference the server session for the user.
*/
private final HttpServletRequest request;
/**
* Represents the HTTP servlet response for this context. It is set from constructor and is never changed.
*/
private final HttpServletResponse response;
/**
* Constructor with both request and response. The constructor also pulls configuration from TopCoder Configuration
* Manager.
*
* @param request
* the http servlet request.
* @param response
* the http servlet response.
*
* @throws NullPointerException
* if either request or response is null
*/
public ContextAdapter(HttpServletRequest request, HttpServletResponse response) {
if (request == null) {
throw new NullPointerException("request should not be null.");
}
if (response == null) {
throw new NullPointerException("response should not be null.");
}
this.request = request;
this.response = response;
}
/**
* Get the http servlet request.
*
* @return http servlet request.
*/
public HttpServletRequest getRequest() {
return this.request;
}
/**
* Get the http servlet response.
*
* @return http servlet response.
*/
public HttpServletResponse getResponse() {
return this.response;
}
/**
* Get the UserProfile instance cached in session.
*
* @return the UserProfile for the context, null is returned if the attribute does not exist in the session.
*/
public UserProfile getUserProfile() {
Object obj = this.request.getSession().getAttribute(ContextAdapter.USER_PROFILE_SESSION_KEY);
if (obj instanceof UserProfile) {
return (UserProfile) obj;
} else {
return null;
}
}
/**
* Set the UserProfile instance to session.
*
* @param profile
* the profile.
*/
public void setUserProfile(UserProfile profile) {
this.request.getSession().setAttribute(ContextAdapter.USER_PROFILE_SESSION_KEY, profile);
}
/**
* Get operator.
*
* @return the operator.
*/
public String getOperator() {
UserProfile user = this.getUserProfile();
if (user == null) {
return "anoymouse";
} else {
return user.getHandle();
}
}
/**
* Get the UserSecurity instance cached in session.
*
* @return the UserSecurity for the context, null is returned if the attribute does not exist in the session.
*/
public UserSecurity getUserSecurity() throws PersistenceException {
Object obj = this.request.getSession().getAttribute(ContextAdapter.SECURITY_SESSION_KEY);
if (obj instanceof UserSecurity) {
return (UserSecurity) obj;
} else {
this.setUserSecurity(this.getDefaultUserSecurity());
return this.getDefaultUserSecurity();
}
}
/**
* Set the UserSecurity instance to session.
*
* @param security
* the user security.
*/
public void setUserSecurity(UserSecurity security) {
this.request.getSession().setAttribute(ContextAdapter.SECURITY_SESSION_KEY, security);
}
/**
* Get the UserPreference instance cached in session.
*
* @return the UserPreference for the context, null is returned if the attribute does not exist in the session.
*/
public UserPreference getUserPreference() {
Object obj = this.request.getSession().getAttribute(ContextAdapter.PREFERENCE_SESSION_KEY);
if (obj instanceof UserPreference) {
return (UserPreference) obj;
} else {
return null;
}
}
/**
* Set the UserPreference instance to session.
*
* @param preference
* the user preference.
*/
public void setUserPreference(UserPreference preference) {
this.request.getSession().setAttribute(ContextAdapter.PREFERENCE_SESSION_KEY, preference);
}
/**
* Set the object to session.
*
* @param key
* @param obj
*/
public void setSessionAttribute(String key, Object obj) {
this.request.getSession().setAttribute(key, obj);
}
/**
* Get the object from session.
*
* @param key
* @return obj
*/
public Object getSessionAttribute(String key) {
return this.request.getSession().getAttribute(key);
}
/**
* Set the object to request.
*
* @param key
* @param obj
*/
public void setAttribute(String key, Object obj) {
this.request.setAttribute(key, obj);
}
/**
* Get the object from request.
*
* @param key
* @return obj
*/
public Object getAttribute(String key) {
return this.request.getAttribute(key);
}
/**
* Get the string from request.
*
* @param key
* @return obj
*/
public String getStringAttribute(String key) {
Object obj = this.request.getAttribute(key);
if (obj instanceof String) {
return (String) obj;
}
return null;
}
public AbstractContest getContest() throws PersistenceException {
if (this.getAttribute("contest") instanceof AbstractContest) {
return (AbstractContest) this.getAttribute("contest");
}
long contestId = -1;
String stringId = null;
if (this.request.getParameter("contestId") != null) {
stringId = this.request.getParameter("contestId");
} else if (this.request.getParameter("id") != null) {
stringId = this.request.getParameter("id");
}
this.setAttribute("contestId", stringId);
if (stringId != null) {
try {
contestId = Long.parseLong(stringId);
} catch (NumberFormatException e) {}
}
if (contestId < 0) {
return null;
}
AbstractContest contest = ContestManager.getInstance().getContest(contestId);
this.setAttribute("contest", contest);
return contest;
}
public Problem getProblem() throws PersistenceException {
if (this.getAttribute("problem") instanceof Problem) {
return (Problem) this.getAttribute("problem");
}
long problemId = -1;
String stringCode = this.request.getParameter("problemCode");
String stringId = this.request.getParameter("problemId");
if(stringCode!=null)
{
ProblemCriteria pc=new ProblemCriteria();
pc.setContestId(new Long(ConfigManager.getDefaultProblemSetId()));
pc.setCode(stringCode);
ProblemPersistence problemPersistence = PersistenceManager.getInstance().getProblemPersistence();
List problems = problemPersistence.searchProblems(pc, 0,1);
if(problems.size()!=0)
{
problemId = ((Problem)(problems.get(0))).getId();
stringId=""+problemId;
}
}
this.setAttribute("problemId", stringId);
if (stringId != null) {
try {
problemId = Long.parseLong(stringId);
} catch (NumberFormatException e) {}
}
if (problemId < 0) {
return null;
}
Problem problem = ContestManager.getInstance().getProblem(problemId);
this.setAttribute("problem", problem);
return problem;
}
public List<Problem> getProblems() throws PersistenceException {
AbstractContest contest = this.getContest();
if (contest == null) {
return new ArrayList<Problem>();
}
return ContestManager.getInstance().getContestProblems(contest.getId());
}
protected List<AbstractContest> getAllProblemSets() throws PersistenceException {
return this.getCheckedContests(ContestManager.getInstance().getAllProblemsets());
}
protected List<AbstractContest> getAllContests() throws PersistenceException {
return this.getCheckedContests(ContestManager.getInstance().getAllContests());
}
protected List<AbstractContest> getAllCourses() throws PersistenceException {
return this.getCheckedContests(ContestManager.getInstance().getAllCourses());
}
protected List<AbstractContest> getCheckedContests(List<AbstractContest> contests) throws PersistenceException {
UserSecurity userSecurity = this.getUserSecurity();
List<AbstractContest> ret = new ArrayList<AbstractContest>();
for (AbstractContest contest : contests) {
if (userSecurity.canViewContest(contest.getId())) {
ret.add(contest);
}
}
return ret;
}
/**
* Checks whether user is logged in.
*
* @return
*/
public boolean isAdmin() throws PersistenceException {
return this.getUserSecurity().isSuperAdmin();
}
public UserSecurity getDefaultUserSecurity() throws PersistenceException {
if (ContextAdapter.defaultUserSecurity == null) {
synchronized (this) {
if (ContextAdapter.defaultUserSecurity == null) {
ContextAdapter.defaultUserSecurity = new UserSecurity(0);
ContextAdapter.defaultUserSecurity.importRole(PersistenceManager.getInstance()
.getAuthorizationPersistence()
.getRole(1));
}
}
}
return ContextAdapter.defaultUserSecurity;
}
public static void resetDefaultUserSecurity() {
ContextAdapter.defaultUserSecurity = null;
}
}