// This sets the metString that holds the extended time info for the user
  private String extractMetaString(PublishedAssessmentFacade publishedAssessment) {
    short itemNum = 1;
    String meta = null;
    String extendedTimeData =
        publishedAssessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum);
    while ((extendedTimeData != null) && (!extendedTimeData.equals(""))) {

      String[] extendedTimeItems = extendedTimeData.split("[|]");

      // Get target user/group value
      String target = extendedTimeItems[0];

      // If it's a group determine if user is a member
      boolean isMember = isUserInGroup(target);

      String userId = AgentFacade.getAgentString();
      if (target.equals(userId) || isMember) {
        meta = extendedTimeData;
      }
      itemNum++;
      extendedTimeData =
          publishedAssessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum);
    }
    return meta;
  }
 // Depending on the scope the assessment info sometimes is not initialized.
 private boolean assessmentInitialized(PublishedAssessmentFacade publishedAssessment) {
   if (publishedAssessment == null) return false;
   if (publishedAssessment.getStartDate() != null) return true;
   if (publishedAssessment.getDueDate() != null) return true;
   if (publishedAssessment.getRetractDate() != null) return true;
   if (publishedAssessment.getTimeLimit() != null) return true;
   return false;
 }
  public ExtendedTimeService(PublishedAssessmentFacade publishedAssessment) {
    PublishedAssessmentService assessmentService = new PublishedAssessmentService();
    PublishedAssessmentFacade metaPublishedAssessment =
        assessmentService.getPublishedAssessmentQuick(
            publishedAssessment.getPublishedAssessmentId().toString());
    if (!assessmentInitialized(publishedAssessment)) {
      publishedAssessment = metaPublishedAssessment;
    }
    authzGroupService = ComponentManager.get(AuthzGroupService.class);

    // Grab the site id from the publishedAssessment because the user may
    // not be in a site
    // if they're taking the test via url.
    PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService();
    String pubId = publishedAssessment.getPublishedAssessmentId().toString();
    siteId = publishedAssessmentService.getPublishedAssessmentSiteId(pubId);

    this.metaString = extractMetaString(metaPublishedAssessment);
    this.hasExtendedTime = (metaString != null);
    if (this.hasExtendedTime) {
      this.timeLimit = extractExtendedTime();
      this.startDate = determineDate(1, publishedAssessment.getStartDate(), publishedAssessment);
      this.dueDate = determineDate(2, publishedAssessment.getDueDate(), publishedAssessment);
      this.retractDate =
          determineDate(3, publishedAssessment.getRetractDate(), publishedAssessment);
    } else {
      this.timeLimit = 0;
      this.startDate = publishedAssessment.getStartDate();
      this.dueDate = publishedAssessment.getDueDate();
      this.retractDate = publishedAssessment.getRetractDate();
    }
  }
  public void processAction(ActionEvent ae) throws AbortProcessingException {
    FacesContext context = FacesContext.getCurrentInstance();

    // #1 - read the assessmentId from the form
    String publishedAssessmentId =
        (String)
            FacesContext.getCurrentInstance()
                .getExternalContext()
                .getRequestParameterMap()
                .get("publishedAssessmentId");
    log.debug("publishedAssessmentId = " + publishedAssessmentId);

    // #2 -  and use it to set author bean, goto removeAssessment.jsp
    PublishedAssessmentBean publishedAssessmentBean =
        (PublishedAssessmentBean) ContextUtil.lookupBean("publishedassessment");

    PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService();
    PublishedAssessmentFacade publishedAssessment =
        publishedAssessmentService.getPublishedAssessmentInfoForRemove(
            Long.valueOf(publishedAssessmentId));
    if (publishedAssessment != null) {
      // #3 - permission checking before proceeding - daisyf
      AuthorBean author = (AuthorBean) ContextUtil.lookupBean("author");

      AuthorizationBean authzBean = (AuthorizationBean) ContextUtil.lookupBean("authorization");
      if (!authzBean.isUserAllowedToDeleteAssessment(
          publishedAssessmentId, publishedAssessment.getCreatedBy(), true)) {
        String err =
            (String)
                ContextUtil.getLocalizedString(
                    "org.sakaiproject.tool.assessment.bundle.AuthorMessages",
                    "denied_delete_other_members_assessment_error");
        context.addMessage(null, new FacesMessage(err));
        author.setOutcome("author");
        return;
      }

      author.setOutcome("confirmRemovePublishedAssessment");

      publishedAssessmentBean.setAssessmentId(publishedAssessmentId);
      publishedAssessmentBean.setTitle(
          FormattedText.convertFormattedTextToPlaintext(publishedAssessment.getTitle()));
    } else {
      log.warn("publishedAssessment is null");
    }
  }
  public void processAction(ActionEvent ae) throws AbortProcessingException {
    FacesContext context = FacesContext.getCurrentInstance();
    // Map reqMap = context.getExternalContext().getRequestMap();
    // Map requestParams = context.getExternalContext().getRequestParameterMap();

    AssessmentBean assessmentBean = (AssessmentBean) ContextUtil.lookupBean("assessmentBean");
    String assessmentId = assessmentBean.getAssessmentId();

    SectionBean sectionBean = (SectionBean) ContextUtil.lookupBean("sectionBean");
    // create an assessment based on the title entered and the assessment
    // template selected
    // #1 - read from form editpart.jsp
    String title =
        TextFormat.convertPlaintextToFormattedTextNoHighUnicode(log, sectionBean.getSectionTitle())
            .trim();
    if (title == null || title.equals("")) {
      String err =
          ContextUtil.getLocalizedString(
              "org.sakaiproject.tool.assessment.bundle.AuthorMessages", "empty_part_title_error");
      context.addMessage(null, new FacesMessage(err));
      sectionBean.setOutcome("editPart");
      return;
    }

    String description = sectionBean.getSectionDescription();
    String sectionId = sectionBean.getSectionId();

    AuthorBean author = (AuthorBean) ContextUtil.lookupBean("author");
    isEditPendingAssessmentFlow = author.getIsEditPendingAssessmentFlow();

    // #1a. prepare sectionBean
    AssessmentService assessmentService = null;
    SectionFacade section = null;

    // permission check
    String creator;
    if (isEditPendingAssessmentFlow) {
      assessmentService = new AssessmentService();
      AssessmentFacade af = assessmentService.getBasicInfoOfAnAssessment(assessmentId);
      creator = af.getCreatedBy();
    } else {
      PublishedAssessmentService pubService = new PublishedAssessmentService();
      assessmentService = pubService;
      PublishedAssessmentFacade paf = pubService.getSettingsOfPublishedAssessment(assessmentId);
      creator = paf.getCreatedBy();
    }

    AuthorizationBean authzBean = (AuthorizationBean) ContextUtil.lookupBean("authorization");
    if (!authzBean.isUserAllowedToEditAssessment(
        assessmentId, creator, !isEditPendingAssessmentFlow)) {
      String err =
          ContextUtil.getLocalizedString(
              "org.sakaiproject.tool.assessment.bundle.AuthorMessages",
              "denied_edit_assessment_error");
      context.addMessage(null, new FacesMessage(err));
      sectionBean.setOutcome("editPart");
      return;
    }

    if (isEditPendingAssessmentFlow) {
      EventTrackingService.post(
          EventTrackingService.newEvent(
              "sam.assessment.revise",
              "siteId=" + AgentFacade.getCurrentSiteId() + ", sectionId=" + sectionId,
              true));
    } else {
      EventTrackingService.post(
          EventTrackingService.newEvent(
              "sam.pubassessment.revise",
              "siteId=" + AgentFacade.getCurrentSiteId() + ", sectionId=" + sectionId,
              true));
    }

    boolean addItemsFromPool = false;

    sectionBean.setOutcome("editAssessment");

    if ((sectionBean.getType().equals("2")) && (sectionBean.getSelectedPool().equals(""))) {

      String selectedPool_err =
          ContextUtil.getLocalizedString(
              "org.sakaiproject.tool.assessment.bundle.AuthorMessages", "selectedPool_error");
      context.addMessage(null, new FacesMessage(selectedPool_err));
      sectionBean.setOutcome("editPart");
      return;
    }

    if (isEditPendingAssessmentFlow
        && !("".equals(sectionBean.getType()))
        && ((SectionDataIfc.RANDOM_DRAW_FROM_QUESTIONPOOL.toString())
            .equals(sectionBean.getType()))) {
      addItemsFromPool = true;

      if (validateItemsDrawn(sectionBean)) {
        section = getOrAddSection(assessmentService, assessmentId, sectionId);
      } else {
        sectionBean.setOutcome("editPart");
        return;
      }
    } else {
      section = getOrAddSection(assessmentService, assessmentId, sectionId);
    }

    if (section == null) {
      log.info("section == null - Should not come to here. Simply return.");
      log.info("assessmentId =" + assessmentId);
      log.info("sectionId =" + sectionId);
      return;
    }
    log.debug("**** section title =" + section.getTitle());
    log.debug("**** title =" + title);

    // title, description, and question ordering are editable for both pending and publish
    // assessments
    if (title != null) section.setTitle(title);
    section.setDescription(description);
    if (!("".equals(sectionBean.getQuestionOrdering())))
      section.addSectionMetaData(
          SectionDataIfc.QUESTIONS_ORDERING, sectionBean.getQuestionOrdering());

    if (isEditPendingAssessmentFlow) {
      if (!("".equals(sectionBean.getKeyword())))
        section.addSectionMetaData(
            SectionMetaDataIfc.KEYWORDS,
            TextFormat.convertPlaintextToFormattedTextNoHighUnicode(log, sectionBean.getKeyword()));

      if (!("".equals(sectionBean.getObjective())))
        section.addSectionMetaData(
            SectionMetaDataIfc.OBJECTIVES,
            TextFormat.convertPlaintextToFormattedTextNoHighUnicode(
                log, sectionBean.getObjective()));

      if (!("".equals(sectionBean.getRubric())))
        section.addSectionMetaData(
            SectionMetaDataIfc.RUBRICS,
            TextFormat.convertPlaintextToFormattedTextNoHighUnicode(log, sectionBean.getRubric()));

      if (!("".equals(sectionBean.getType()))) {
        section.addSectionMetaData(SectionDataIfc.AUTHOR_TYPE, sectionBean.getType());
        if ((SectionDataIfc.RANDOM_DRAW_FROM_QUESTIONPOOL.toString())
            .equals(sectionBean.getType())) {
          if ((sectionBean.getNumberSelected() != null)
              && !("".equals(sectionBean.getNumberSelected()))) {
            section.addSectionMetaData(
                SectionDataIfc.NUM_QUESTIONS_DRAWN, sectionBean.getNumberSelected());
          }

          if (!("".equals(sectionBean.getSelectedPool()))) {
            section.addSectionMetaData(
                SectionDataIfc.POOLID_FOR_RANDOM_DRAW, sectionBean.getSelectedPool());
            String poolname = "";
            QuestionPoolService qpservice = new QuestionPoolService();
            QuestionPoolFacade poolfacade =
                qpservice.getPool(
                    new Long(sectionBean.getSelectedPool()), AgentFacade.getAgentString());
            if (poolfacade != null) {
              poolname = poolfacade.getTitle();
            }
            section.addSectionMetaData(SectionDataIfc.POOLNAME_FOR_RANDOM_DRAW, poolname);
          }

          section.addSectionMetaData(
              SectionDataIfc.RANDOMIZATION_TYPE, sectionBean.getRandomizationType());
        }
      }

      if (addItemsFromPool) {
        boolean hasRandomPartScore = false;
        Double score = null;
        String requestedScore = sectionBean.getRandomPartScore();
        if (requestedScore != null && !requestedScore.equals("")) {
          hasRandomPartScore = true;
          score = new Double(requestedScore);
        }
        boolean hasRandomPartDiscount = false;
        Double discount = null;
        String requestedDiscount = sectionBean.getRandomPartDiscount();
        if (requestedDiscount != null && !requestedDiscount.equals("")) {
          hasRandomPartDiscount = true;
          discount = new Double(requestedDiscount);
        }

        if (hasRandomPartScore && score != null) {
          section.addSectionMetaData(SectionDataIfc.POINT_VALUE_FOR_QUESTION, score.toString());
        } else {
          section.addSectionMetaData(SectionDataIfc.POINT_VALUE_FOR_QUESTION, "");
        }

        if (hasRandomPartDiscount && discount != null) {
          section.addSectionMetaData(
              SectionDataIfc.DISCOUNT_VALUE_FOR_QUESTION, discount.toString());
        } else {
          section.addSectionMetaData(SectionDataIfc.DISCOUNT_VALUE_FOR_QUESTION, "");
        }
      }
    }

    assessmentService.saveOrUpdateSection(section);

    if (addItemsFromPool) {
      // update random questions from question pool
      int success =
          assessmentService.updateRandomPoolQuestions(
              assessmentService.getSection(section.getSectionId().toString()));
      if (success != AssessmentService.UPDATE_SUCCESS) {
        if (success == AssessmentService.UPDATE_ERROR_DRAW_SIZE_TOO_LARGE) {
          // shouldn't get here since there is a check, but might as well verify
          String err =
              ContextUtil.getLocalizedString(
                  "org.sakaiproject.tool.assessment.bundle.AuthorMessages", "qdrawn_error");
          context.addMessage(
              null,
              new FacesMessage(
                  err
                      + " "
                      + section.getSectionMetaDataByLabel(SectionDataIfc.NUM_QUESTIONS_DRAWN)));
        }
      }
    }

    // added by daisyf, 10/10/06
    updateAttachment(
        section.getSectionAttachmentList(), sectionBean.getAttachmentList(), section.getData());

    // #2 - goto editAssessment.jsp, so reset assessmentBean
    AssessmentIfc assessment =
        assessmentService.getAssessment(Long.valueOf(assessmentBean.getAssessmentId()));
    assessmentBean.setAssessment(assessment);
    assessmentService.updateAssessmentLastModifiedInfo(assessment);

    EventTrackingService.post(
        EventTrackingService.newEvent(
            "sam.assessment.revise",
            "siteId=" + AgentFacade.getCurrentSiteId() + ", sectionId=" + section.getSectionId(),
            true));
  }