@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();
                }
              }
            });
      }
    }
 /**
  * Check whether logged-in user is an instructor in the selected course.
  *
  * @param courseSelection the selected course
  * @param courseRegList course registrations for logged-in user
  * @return true if the logged-in user is an instructor in the selected course, false otherwise
  */
 private static boolean isInstructor(
     CourseSelection courseSelection, CourseAndCourseRegistration[] courseRegList) {
   boolean isInstructor = false;
   for (CourseAndCourseRegistration reg : courseRegList) {
     if (reg.getCourse().getId() == courseSelection.getCourse().getId()) {
       isInstructor = reg.getCourseRegistration().getRegistrationType().isInstructor();
       break;
     }
   }
   return isInstructor;
 }
    @Override
    public void activate(final Session session, final SubscriptionRegistrar subscriptionRegistrar) {

      UserSelection selectedUser = session.get(UserSelection.class);
      CourseSelection courseSelection = session.get(CourseSelection.class);

      // activate views
      statusMessageView.activate(session, subscriptionRegistrar);
      userProgressView.activate(session, subscriptionRegistrar);

      // Display top label (username and course)
      StringBuilder buf = new StringBuilder();
      buf.append("Progress for ");
      buf.append(selectedUser.getUser().getUsername());
      buf.append(" in ");
      buf.append(courseSelection.getCourse().getName());
      topLabel.setText(buf.toString());

      // Add back/logout handlers
      pageNavPanel.setLogoutHandler(new LogoutHandler(session));
      pageNavPanel.setBackHandler(new PageBackHandler(session));
    }
 public void loadProblemsForCourse(final CourseSelection courseSelection) {
   GWT.log(
       "Loading problems and submission receipts for course "
           + courseSelection.getCourse().getNameAndTitle());
   SessionUtil.loadProblemAndSubmissionReceiptsInCourse(page, courseSelection, page.getSession());
 }