@Override
    public void load(final Runnable onSuccess, final ICallback<Pair<String, Throwable>> onFailure) {
      String paramName = PageObjectParamNameMap.getInstance().get(CourseSelection.class);
      final Integer courseId = pageParams.getInt(paramName);
      if (courseId == null) {
        onFailure.call(new Pair<String, Throwable>("No course id specified", null));
      } else {
        RPC.getCoursesAndProblemsService.getCourses(
            new AsyncCallback<Course[]>() {
              @Override
              public void onFailure(Throwable caught) {
                onFailure.call(new Pair<String, Throwable>("Could not load course", caught));
              }

              @Override
              public void onSuccess(Course[] result) {
                Course course = null;
                for (Course c : result) {
                  if (c.getId() == courseId.intValue()) {
                    course = c;
                    break;
                  }
                }
                if (course == null) {
                  onFailure.call(
                      new Pair<String, Throwable>("User is not registered for course", null));
                } else {
                  // Add CourseSelection to session, and continue
                  session.add(new CourseSelection(course, null));
                  onSuccess.run();
                }
              }
            });
      }
    }
    @Override
    public void load(final Runnable onSuccess, final ICallback<Pair<String, Throwable>> onFailure) {
      String paramName = PageObjectParamNameMap.getInstance().get(Problem.class);
      final Integer problemId = pageParams.getInt(paramName);
      if (problemId == null) {
        onFailure.call(new Pair<String, Throwable>("No problem id specified", null));
      } else {
        CourseSelection courseSelection = session.get(CourseSelection.class);
        RPC.getCoursesAndProblemsService.getProblems(
            courseSelection.getCourse(),
            new AsyncCallback<Problem[]>() {
              @Override
              public void onFailure(Throwable caught) {
                onFailure.call(new Pair<String, Throwable>("Could not get problem", caught));
              }

              public void onSuccess(Problem[] result) {
                Problem problem = null;
                for (Problem p : result) {
                  if (p.getProblemId().equals(problemId)) {
                    problem = p;
                    break;
                  }
                }
                if (problem == null) {
                  onFailure.call(new Pair<String, Throwable>("No such problem", null));
                } else {
                  // Add the Problem to the session and continue
                  session.add(problem);
                  onSuccess.run();
                }
              }
            });
      }
    }
    @Override
    public void load(final Runnable onSuccess, final ICallback<Pair<String, Throwable>> onFailure) {
      final Integer userId =
          pageParams.getInt(PageObjectParamNameMap.getInstance().get(UserSelection.class));
      if (userId == null) {
        onFailure.call(new Pair<String, Throwable>("No user id specified", null));
        return;
      }

      // Special case: if the requested user id is the logged-in user's id,
      // then we succeed trivially.  (A user can always access his/her
      // own information, such as a submission history.)
      User loggedInUser = session.get(User.class);
      if (loggedInUser.getId() == userId.intValue()) {
        GWT.log("User self-selection");
        UserSelection userSelection = new UserSelection();
        userSelection.setUser(loggedInUser);
        session.add(userSelection);
        onSuccess.run();
        return;
      }

      // General case: a user is being selected among all users in the course.

      // Users registered in the course should already have been loaded
      User[] regUserList = session.get(User[].class);

      // Check to see if the user is registered in the course
      for (User userInCourse : regUserList) {
        if (userInCourse.getId() == userId.intValue()) {
          // Huzzah!
          UserSelection userSelection = new UserSelection();
          userSelection.setUser(userInCourse);
          session.add(userSelection);
          onSuccess.run();
          return;
        }
      }

      // User is not registered in course
      onFailure.call(
          new Pair<String, Throwable>("User " + userId + " is not registered in the course", null));
    }