@Override
  public Profile getProfile(int id) {
    Profile profile = profilePersister.get(id);

    if (profile == null) {
      throw new NotFoundException();
    }

    if (!authService.isUserAuthorized(ROLE_READER, profile)) {
      throw new NotAuthorizedException();
    }

    return profile;
  }
  @Override
  public StoryExport<StoryTellerCsv> exportStoryTellers(
      int profileId, Integer collectionId, Integer questionnaireId, int window) {
    try {
      int windowSize = 75;
      User user = userService.getUserForProfile(profileId);
      Profile userProfile = profilePersister.get(profileId);
      int organizationContext = userProfile.getOrganizationId();

      int accessMode = ACCESS_MODE_PRIVILEGED;
      if (authService.isSuperUser(user)) {
        accessMode = ACCESS_MODE_ROOT;
      }

      List<StoryTellerCsv> storyTellers = new ArrayList<StoryTellerCsv>();
      try {
        StoryTellersParams countParams =
            new StoryTellersParams(
                0,
                1,
                StorySortField.CREATED_OLD,
                false,
                collectionId,
                questionnaireId,
                accessMode,
                userService.getEffectiveSubject(user),
                null);
        int countStories = storyService.getStorytellerCount(countParams);

        // window starts at 0; bail out if we're asked for a window beyond what's available
        if (window * windowSize >= countStories) {
          return new StoryExport<StoryTellerCsv>(storyTellers, countStories);
        }

        try {
          SolrQuery sQuery = new SolrQuery("*:*");
          if (collectionId != null) {
            sQuery.addFilterQuery("collections:" + collectionId);
            sQuery.setSort("lastStoryDateByCollection_" + collectionId, SolrQuery.ORDER.desc);
          }

          if (questionnaireId != null) {
            sQuery.addFilterQuery("questionnaires:" + questionnaireId);
            sQuery.setSort("lastStoryDateByCollection_" + questionnaireId, SolrQuery.ORDER.desc);
          }

          if (!authService.isSuperUser(user)) {
            sQuery.addFilterQuery("readAuths:" + organizationContext);
          }

          sQuery.setRows(windowSize);
          sQuery.setStart(window * windowSize);

          QueryResponse result = solrPersonServer.query(sQuery);

          if (result.getResults().getNumFound() > 0) {
            for (SolrDocument entries : result.getResults()) {
              ProfileDocument doc = new ProfileDocument(entries);
              Profile profile = profilePersister.get(doc.getId());
              StoryTellerCsv storyTellerCsv = new StoryTellerCsv(doc, profile);

              storyTellers.add(storyTellerCsv);
            }
          }

          return new StoryExport<StoryTellerCsv>(storyTellers, countStories);
        } catch (Exception e) {
          throw new GeneralException(e);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

      return new StoryExport<StoryTellerCsv>(storyTellers, 0);
    } catch (NotLoggedInException e) {
      throw new GeneralException(e);
    }
  }