public ActionResult ExerciseSubmission(ExerciseSubmissionViewModel viewModel) { bool isStatic = false; //we can call static method with instance if (string.IsNullOrEmpty(viewModel.Content) || string.IsNullOrEmpty(viewModel.TypeName) || string.IsNullOrEmpty(viewModel.MethodName)) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var exercise = db.Exercises.FirstOrDefault(x => x.Id == viewModel.ExerciseId); if (exercise == null) { return(HttpNotFound()); } var submission = SaveSubmission(exercise, isStatic, viewModel); var taskFunctionResult = GetTaskFunction(isStatic, viewModel); if (taskFunctionResult.Exception == null) { var taskFunction = taskFunctionResult.TaskFunction; var testResults = RunTests(exercise, taskFunction); submission = UpdateSubmission(submission, testResults); } else { submission = UpdateSubmission(submission, taskFunctionResult.Exception); } return(Json(Url.Action("Submission", "Home", new { Id = submission.Id }, Request.Url.Scheme))); }
private Submission SaveSubmission(Exercise exercise, bool isStatic, ExerciseSubmissionViewModel viewModel) { var currentStudent = db.Students.FirstOrDefault(x => x.User.UserName == User.Identity.Name); var submission = new Submission { Exercise = exercise, Created = DateTime.Now, Student = currentStudent, SubmittedContent = new SubmittedContent { Content = viewModel.Content, IsStatic = isStatic, TypeName = viewModel.TypeName, MethodName = viewModel.MethodName } }; db.Submissions.Add(submission); db.SaveChanges(); return(submission); }
private (TaskFunction TaskFunction, Exception Exception) GetTaskFunction(bool isStatic, ExerciseSubmissionViewModel viewModel) { try { var creator = new AssemblyCreator(viewModel.Content, new[] { typeof(ILogger) }); var assembler = creator.CreateAssembly(); var type = assembler.GetType(viewModel.TypeName); if (type == null) { throw new NotSupportedException($"Type {viewModel.TypeName} not found."); } var method = type.GetMethod(viewModel.MethodName); if (method == null) { throw new NotSupportedException($"Method {viewModel.MethodName} not found."); } TaskFunction taskFunction; if (isStatic) { taskFunction = (parameters) => method.Invoke(null, parameters); } else { var instance = Activator.CreateInstance(type); taskFunction = (parameters) => method.Invoke(instance, parameters); } return(taskFunction, null); } catch (Exception exception) { return(null, exception); } }