/// <summary> /// 从给定的题目句柄创建新的数据模型对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public static ProblemDisplayModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemDisplayModel model = new ProblemDisplayModel(); Markdown markdown = new Markdown(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.Description = markdown.Transform(data.Description); model.InputDescription = markdown.Transform(data.InputDescription); model.OutputDescription = markdown.Transform(data.OutputDescription); model.InputExample = markdown.Transform(data.InputExample); model.OutputExample = markdown.Transform(data.OutputExample); model.Hint = markdown.Transform(data.Hint); model.Source = data.Source; model.Author = data.Author; model.TimeLimit = data.TimeLimit; model.MemoryLimit = data.MemoryLimit; model.IsSpecialJudge = data.IsSpecialJudge; } return(model); }
// GET: Archieve/Modify public ActionResult Modify() { if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AcceesDenied")); } if (string.IsNullOrEmpty(Request.QueryString["id"])) { // 缺少题目 ID。 return(Redirect("~/Error/ProblemNotExist")); } ; // 查询题目信息。 ProblemHandle handle = ProblemArchieveManager.Default.GetProblemById(Request.QueryString["id"]); if (handle == null) { // 题目不存在于数据库中。 return(Redirect("~/Error/ProblemNotExist")); } ProblemDetailModel model = ProblemDetailModel.FromProblemHandle(handle); return(View(model)); }
/// <summary> /// 从给定的题目句柄创建 ProblemDetailModel 类的新实例。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public static ProblemDetailModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemDetailModel model = new ProblemDetailModel(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.Description = data.Description; model.InputDescription = data.InputDescription; model.OutputDescription = data.OutputDescription; model.InputExample = data.InputExample; model.OutputExample = data.OutputExample; model.Hint = data.Hint; model.Source = data.Source; model.Author = data.Author; model.UserGroupName = UsergroupConvert.ConvertToString(data.AuthorizationGroup); } return(model); }
/// <summary> /// 解析指定 ProblemHandle 对象的全局统一定位符(URL)。 /// </summary> /// <param name="entry">待解析的 ProblemHandle 对象。</param> /// <returns>给定 ProblemHandle 对象所对应的全局统一定位符(URL)。</returns> /// <exception cref="ArgumentNullException"/> /// <exception cref="InvalidProblemException"/> public string Get(ProblemHandle entry) { if (entry == null) { throw new ArgumentNullException(nameof(entry)); } ProblemUrlResolverRule rule = GetRule(entry.ProblemId); if (rule == null) { throw new InvalidProblemException(entry); } // 解析对应的掩码项得到给定 ProblemEntry 的全局统一定位符。 /* * * MaskTokenReader reader = new MaskTokenReader(rule.Mask); * MaskTokenHandler[] handlers = new MaskTokenHandlers[] { * ... * }; * * MaskInterpreter interpreter = new MaskInterpreter(reader, handlers); * return interpreter.Interpret(); * */ }
// GET: Archieve/Environment?id={ProblemID} public ActionResult Environment() { // 检查用户权限。 if (!UserSession.IsAuthorized(Session) || !UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } if (string.IsNullOrEmpty(Request.QueryString["id"])) { return(Redirect("~/Archieve")); } ProblemHandle handle = ProblemArchieveManager.Default.GetProblemById(Request.QueryString["id"]); if (handle == null) { return(Redirect("~/Error/ProblemNotExist")); } ProblemEnvironmentModel model = ProblemEnvironmentModel.FromProblemHandle(handle); return(View(model)); }
// GET: Archieve/ShowProblem?id=... public ActionResult ShowProblem(string id = null) { if (id == null) { return(Redirect("~/Archieve")); } ProblemHandle handle = new ProblemHandle(id); if (handle.IsNativeProblem) { return(View()); } else { // 解析远程 OJ 题目 URL。 IProblemUrlResolver resolver = ProblemUrlResolverFactory.GetUrlResolverFor(handle); if (resolver == null) { // 没有此题目来源 OJ 的 URL 解析器。 return(Redirect("~/Error/OJNotSupported")); } else { return(Redirect(resolver.Resolve(handle))); } } }
public ActionResult ProblemDetail() { string problemId = Request.QueryString["id"]; if (string.IsNullOrEmpty(problemId)) { return(QueryResult(1, "Problem ID required.")); } ProblemHandle problemHandle = ProblemArchieveManager.Default.GetProblemById(problemId); if (problemHandle == null) { return(QueryResult(2, "No such problem.")); } // 检查用户操作权限。 UserHandle userHandle = UserSession.IsAuthorized(Session) ? new UserHandle(UserSession.GetUsername(Session)) : null; if (!ProblemAuthorization.GetUserAccess(problemHandle, userHandle).HasFlag(DataAccess.Read)) { return(QueryResult(3, "Access denied.")); } return(QueryResult(ProblemDisplayModel.FromProblemHandle(problemHandle))); }
public ActionResult AddProblem(ProblemDetailModel model) { // 检查参数。 if (string.IsNullOrEmpty(Request.QueryString["id"])) { return(Redirect("~/Contest")); } int contestId; if (!int.TryParse(Request.QueryString["id"], out contestId)) { return(Redirect("~/Contest")); } if (!ContestManager.Default.IsContestExist(contestId)) { return(Redirect("~/Contest")); } // 验证数据模型。 if (!TryValidateModel(model)) { ViewBag.TitleErrorMessage = ModelStateHelper.GetFirstError(ModelState, "Title"); return(View(model)); } ContestHandle contestHandle = new ContestHandle(contestId); using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, false)) { // 验证用户操作权限。 if (!UserSession.IsAuthorized(Session) || string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(Redirect("~/Error/AccessDenied")); } // 在题目库中创建题目。 ProblemHandle problemHandle = ProblemArchieveManager.Default.CreateProblem( contestData.PeekNextProblemId()); model.ResetNullStrings(); model.SaveTo(problemHandle); // 为避免死锁,该句不应放置在下面的 using 块中。 using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, false)) { problemData.ContestId = contestId; problemData.AuthorizationGroup = UserGroup.Guests; } // 将创建的题目添加至当前比赛中。 contestData.AddProblem(problemHandle); } return(Redirect($"~/Contest/Show?id={contestId}")); }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(3); int result; if (!int.TryParse(numericId, out result)) { throw new InvalidProblemException(handle);//不合法 } return("http://acm.hdu.edu.cn/showproblem.php?pid=" + result); }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(3); int result; if (!int.TryParse(numericId, out result)) { throw new InvalidProblemException(handle);//不合法 } return("http://poj.org/problem?id=" + result); }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(4); int result; if (!int.TryParse(numericId, out result)) { throw new InvalidProblemException(handle);//不合法 } return("http://www.lydsy.com/JudgeOnline/problem.php?id=" + result); }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(3); int result; if (!int.TryParse(numericId, out result)) { throw new InvalidProblemException(handle);//不合法 } return("http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=" + result); }
/// <summary> /// 检查给定的用户能否访问给定的题目。 /// </summary> /// <param name="problemHandle">题目句柄。</param> /// <param name="userHandle">用户句柄。若当前会话尚未活动登录用户,传入 null。</param> /// <returns>一个值,该值只是给定身份权限的用户能否访问给定的题目。</returns> /// <exception cref="ArgumentNullException"/> public static DataAccess GetUserAccess(ProblemHandle problemHandle, UserHandle userHandle) { if (problemHandle == null) { throw new ArgumentNullException(nameof(problemHandle)); } /* * 检查顺序如下: * 1. 用户为管理员; * 2. 题目为比赛题目; * 3. 用户用户组权限低于题目要求的最低用户组权限。 * */ // 检查用户是否为管理员身份。 if (userHandle != null && UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserAuthorization.GetUserGroup(userHandle))) { return(DataAccess.ReadWrite); } using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true)) { if (problemData.ContestId != -1) { // 比赛题目。 if (userHandle == null) { return(DataAccess.None); } ContestHandle contestHandle = ContestManager.Default.QueryContestById(problemData.ContestId); return(ContestAuthorization.GetUserAccess(contestHandle, userHandle)); } else { // 主题目库题目 UserGroup usergroup = (userHandle == null) ? UserGroup.Guests : UserAuthorization.GetUserGroup(userHandle); if (UserAuthorization.CheckAccessRights(problemData.AuthorizationGroup, usergroup)) { return(DataAccess.Read); } else { return(DataAccess.None); } } } }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(3); string nameXu = numericId.Substring(6); numericId = numericId.Substring(0, 6); int result; if (!int.TryParse(numericId, out result) || !(nameXu[0] >= 'A' && nameXu[0] <= 'Z')) { throw new InvalidProblemException(handle);//不合法 } return("http://codeforces.com/gym/" + result + "/problem/" + nameXu); }
// GET: Archieve/TestSet?id={ProblemID} public ActionResult TestSet() { // 执行用户身份验证。 if (!UserSession.IsAuthorized(Session)) { return(Redirect("~/Error/AccessDenied")); } // 检查查询参数。 if (string.IsNullOrEmpty(Request.QueryString["id"])) { return(Redirect("~/Archieve")); } string problemId = Request.QueryString["id"]; ProblemHandle problemHandle = ProblemArchieveManager.Default.GetProblemById(problemId); if (problemHandle == null) { // 给定的题目不存在。 return(Redirect("~/Archieve")); } using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true)) { // 执行进一步身份验证。 if (problemData.ContestId == -1) { if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } } else { ContestHandle contestHandle = new ContestHandle(problemData.ContestId); using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, true)) { if (string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(Redirect("~/Error/AccessDenied")); } } } } // TODO: 完成 Archieve/TestSet 控制器逻辑。 return(View()); }
/// <summary> /// 解析给定题目句柄的源 OJ 信息。 /// </summary> /// <param name="handle">要解析的题目句柄。</param> /// <returns>一个 OJSystem 枚举值,表示给定题目句柄的源 OJ 信息。</returns> /// <exception cref="ArgumentNullException"/> public static OJSystem Resolve(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } foreach (KeyValuePair <string, OJSystem> map in ms_prefixes) { if (handle.ProblemId.StartsWith(map.Key, StringComparison.CurrentCultureIgnoreCase)) { return(map.Value); } } return(OJSystem.BIT); }
public ActionResult AddArchieveProblem(FormCollection form) { // 验证参数。 if (string.IsNullOrEmpty(Request.QueryString["contestId"]) || string.IsNullOrEmpty(form["ProblemId"])) { return(new ContentResult()); } string problemId = form["ProblemId"]; int contestId; if (!int.TryParse(Request.QueryString["contestId"], out contestId)) { return(new ContentResult()); } if (!ProblemArchieveManager.Default.IsProblemExist(problemId) || !ContestManager.Default.IsContestExist(contestId)) { return(new ContentResult()); } using (ContestDataProvider contestData = ContestDataProvider.Create(new ContestHandle(contestId), false)) { // 检查用户操作权限。 if (!UserSession.IsAuthorized(Session) || string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(new ContentResult()); } // 执行操作。 // 创建源题目的精确副本到当前比赛中。 ProblemHandle newProblemHandle = ProblemArchieveManager.Default.CloneProblem( contestData.PeekNextProblemId(), problemId); using (ProblemDataProvider problemData = ProblemDataProvider.Create(newProblemHandle, false)) { problemData.ContestId = contestId; } contestData.AddProblem(newProblemHandle); } return(new ContentResult()); }
/// <summary> /// 根据给定的题目句柄返回 IProblemUrlResolver 原型对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <returns>题目 URL 解析器原型对象。若工厂类中没有注册对应的原型对象,返回 null。</returns> /// <exception cref="ArgumentNullException"/> public static IProblemUrlResolver GetUrlResolverFor(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } OJSystem oj = ProblemOriginResolver.Resolve(handle); if (ms_prototypes.ContainsKey(oj)) { return(ms_prototypes[oj]); } else { return(null); } }
public ActionResult Add(ProblemDetailModel model) { if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { // 用户权限不足。 return(Redirect("~/Error/AccessDenied")); } // 检查数据模型验证状态。 bool hasError = false; TryValidateModel(model); if (ModelState.ContainsKey("Id") && ModelState["Id"].Errors.Count > 0) { hasError = true; ViewBag.ProblemIdErrorMessage = ModelState["Id"].Errors[0].ErrorMessage; } if (ModelState.ContainsKey("Title") && ModelState["Title"].Errors.Count > 0) { hasError = true; ViewBag.TitleErrorMessage = ModelState["Title"].Errors[0].ErrorMessage; } if (hasError) { return(View(model)); } string problemId = "BIT" + model.ProblemId; if (ProblemArchieveManager.Default.IsProblemExist(problemId)) { ViewBag.ProblemIdErrorMessage = "Problem with the same ID already exist in the archieve."; return(View(model)); } // 在题目库中创建新题目。 ProblemHandle handle = ProblemArchieveManager.Default.CreateProblem(problemId); model.SaveTo(handle); return(Redirect("~/Archieve")); }
public ActionResult Environment(ProblemEnvironmentModel model) { // 检查操作权限。 if (!UserSession.IsAuthorized(Session) || !UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } if (!TryValidateModel(model)) { if (ModelState["TimeLimit"] != null && ModelState["TimeLimit"].Errors.Count > 0) { ViewBag.TimeLimitErrorMessage = ModelState["TimeLimit"].Errors[0].ErrorMessage; } if (ModelState["MemoryLimit"] != null && ModelState["MemoryLimit"].Errors.Count > 0) { ViewBag.MemoryLimitErrorMessage = ModelState["MemoryLimit"].Errors[0].ErrorMessage; } return(View(model)); } if (string.IsNullOrEmpty(Request.Form["ProblemId"])) { return(Redirect("~/Archieve")); } // 更新数据库数据。 ProblemHandle handle = ProblemArchieveManager.Default.GetProblemById(model.ProblemId); if (handle == null) { return(Redirect("~/Error/ProblemNotExist")); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.TimeLimit = model.TimeLimit; data.MemoryLimit = model.MemoryLimit; data.IsSpecialJudge = model.UseSpecialJudge; } return(Redirect(string.Format("~/Archieve/ShowProblem?id={0}", model.ProblemId))); }
/// <summary> /// 从给定的题目句柄创建 ProblemEnvironmentModel 数据对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <returns>从给定题目句柄创建的 ProblemEnvironmentModel 对象。</returns> /// <exception cref="ArgumentNullException"/> public static ProblemEnvironmentModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemEnvironmentModel model = new ProblemEnvironmentModel(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.TimeLimit = data.TimeLimit; model.MemoryLimit = data.MemoryLimit; model.UseSpecialJudge = data.IsSpecialJudge; } return(model); }
/// <summary> /// 从给定的题目句柄创建 ProblemInfoModel 对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <returns>从给定的题目句柄创建的 ProblemInfoModel 对象。</returns> /// <exception cref="ArgumentNullException"/> public static ProblemBriefModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { return(new ProblemBriefModel() { ProblemId = handle.ProblemId, Title = data.Title, Categories = data.GetCategories(), TotalSubmissions = data.TotalSubmissions, TotalAccepted = data.AcceptedSubmissions, AuthorizationGroup = data.AuthorizationGroup, }); } }
/// <summary> /// 将当前对象中的数据写入给定的题目中。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public void SaveTo(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.Title = Title; data.Description = Description; data.InputDescription = InputDescription; data.OutputDescription = OutputDescription; data.InputExample = InputExample; data.OutputExample = OutputExample; data.Hint = Hint; data.Source = Source; data.Author = Author; data.AuthorizationGroup = UsergroupConvert.ConvertFromString(UserGroupName); } }
/// <summary> /// 将当前数据模型对象中的数据存入给定的题目数据提供器。 /// </summary> /// <param name="data">要存入的题目数据提供器。</param> /// <exception cref="ArgumentNullException"/> /// <exception cref="InvalidOperationException"/> public void SaveTo(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.Title = Title; data.Description = Description; data.InputDescription = InputDescription; data.OutputDescription = OutputDescription; data.InputExample = InputExample; data.OutputExample = OutputExample; data.Hint = Hint; data.Source = Source; data.Author = Author; data.TimeLimit = TimeLimit; data.MemoryLimit = MemoryLimit; data.IsSpecialJudge = IsSpecialJudge; } }
public string Resolve(ProblemHandle handle) { string numericId = handle.ProblemId.Substring(2); int adress = 0; while (numericId[adress] >= '0' && numericId[adress] <= '9') { adress++; } if (adress == 0) { throw new InvalidProblemException(handle);//不合法 } string nameXu = numericId.Substring(adress); numericId = numericId.Substring(0, adress); int result; if (!int.TryParse(numericId, out result) || !(nameXu[0] >= 'A' && nameXu[0] <= 'Z')) { throw new InvalidProblemException(handle);//不合法 } return("http://codeforces.com/problemset/problem/" + result + "/" + nameXu); }
public ActionResult Modify(ProblemDetailModel model) { if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } // 验证模型。 bool hasError = false; TryValidateModel(model); if (ModelState["Title"] != null && ModelState["Title"].Errors.Count > 0) { hasError = true; ViewBag.TitleErrorMessage = ModelState["Title"].Errors[0].ErrorMessage; } if (hasError) { return(View(model)); } // 查询题目实体。 ProblemHandle handle = ProblemArchieveManager.Default.GetProblemById(model.ProblemId); if (handle == null) { return(Redirect("~/Error/ProblemNotExist")); } // 写入修改后的数据。 model.ResetNullStrings(); model.SaveTo(handle); return(Redirect("~/Archieve")); }
/// <summary> /// 使用触发异常的题目句柄初始化 ProblemAlreadyExistException 类的新实例。 /// </summary> /// <param name="entry">触发此异常的题目句柄。</param> public ProblemAlreadyExistException(ProblemHandle entry) : base(entry, $"题目 \"{entry.ProblemId}\" 已经存在于数据库中。") { }
/// <summary> /// 使用触发异常的题目句柄以及自定义异常消息初始化 ProblemAlreadyExistException 类的新实例。 /// </summary> /// <param name="entry">触发此异常的题目句柄。</param> /// <param name="message">自定义异常消息。</param> public ProblemAlreadyExistException(ProblemHandle entry, string message) : base(entry, message) { }
/// <summary> /// 使用给定的 ProblemEntry 对象初始化 InvalidProblemException 的新实例。 /// </summary> /// <param name="entry">要使用的 ProblemEntry 对象。</param> public InvalidProblemException(ProblemHandle entry) : base(entry, $"编号为 {entry.ProblemId} 的题目无效。") { }
/// <summary> /// 使用给定的 ProblemEntry 对象和异常消息初始化 InvalidProblemException 的新实例。 /// </summary> /// <param name="entry">要使用的 ProblemEntry 对象。</param> /// <param name="message">产生该异常的异常消息。</param> public InvalidProblemException(ProblemHandle entry, string message) : base(entry, message) { }