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(); } }
/** * Standard process action method. * * @param event ActionEvent * @throws AbortProcessingException */ public void processAction(ActionEvent event) throws AbortProcessingException { log.debug("QuestionScore LISTENER."); QuestionScoresBean bean = (QuestionScoresBean) ContextUtil.lookupBean("questionScores"); // Reset the search field String defaultSearchString = ContextUtil.getLocalizedString( "org.sakaiproject.tool.assessment.bundle.EvaluationMessages", "search_default_student_search_string"); bean.setSearchString(defaultSearchString); // we probably want to change the poster to be consistent String publishedId = ContextUtil.lookupParam("publishedId"); AuthorizationBean authzBean = (AuthorizationBean) ContextUtil.lookupBean("authorization"); AssessmentBean assessmentBean = (AssessmentBean) ContextUtil.lookupBean("assessmentBean"); PublishedAssessmentService pubService = new PublishedAssessmentService(); Long pubId = new Long(publishedId); String assessmentOwner = pubService.getPublishedAssessmentOwner(pubId); if (!authzBean.isUserAllowedToGradeAssessment(publishedId, assessmentOwner, true)) { throw new IllegalArgumentException( "QuestionScoreListener unauthorized attempt to get scores for " + publishedId); } if (!questionScores(publishedId, bean, false)) { throw new RuntimeException("failed to call questionScores."); } }
/** * Update the grading of the assessment. * * @param ag the assessment grading. * @param g the Gradebook Service * @throws java.lang.Exception */ public void updateExternalAssessmentScore(AssessmentGradingIfc ag, GradebookService g) throws Exception { boolean testErrorHandling = false; // log.info("GradebookService instance=" + g); PublishedAssessmentService pubService = new PublishedAssessmentService(); GradingService gradingService = new GradingService(); PublishedAssessmentIfc pub = (PublishedAssessmentIfc) gradingService.getPublishedAssessmentByAssessmentGradingId( ag.getAssessmentGradingId().toString()); String gradebookUId = pubService.getPublishedAssessmentOwner(pub.getPublishedAssessmentId()); if (gradebookUId == null) { return; } // SAM-1562 We need to round the float score and covert to a double -DH float fScore = MathUtils.round(ag.getFinalScore(), 2); Double score = Float.valueOf(fScore).doubleValue(); log.info("rounded: " + ag.getFinalScore() + " to: " + score.toString()); g.updateExternalAssessmentScore( gradebookUId, ag.getPublishedAssessmentId().toString(), ag.getAgentId(), score); if (testErrorHandling) { throw new Exception("Encountered an error in update ExternalAssessmentScore."); } }
private void setMaxDisplayedScoreRows(QuestionScoresBean bean, boolean isValueChange) { PublishedAssessmentService pubService = new PublishedAssessmentService(); String itemId = ContextUtil.lookupParam("itemId"); if (ContextUtil.lookupParam("newItemId") != null && !ContextUtil.lookupParam("newItemId").trim().equals("")) { itemId = ContextUtil.lookupParam("newItemId"); } Long itemType = pubService.getItemType(itemId); // For audiio question, default the paging number to 5 if (isValueChange) { if (itemType.equals(Long.valueOf("7"))) { bean.setAudioMaxDisplayedScoreRows(bean.getMaxDisplayedRows()); bean.setHasAudioMaxDisplayedScoreRowsChanged(true); } else { bean.setOtherMaxDisplayedScoreRows(bean.getMaxDisplayedRows()); } } else { if (itemType.equals(Long.valueOf("7"))) { if (bean.getHasAudioMaxDisplayedScoreRowsChanged()) { bean.setMaxDisplayedRows(bean.getAudioMaxDisplayedScoreRows()); } else { bean.setMaxDisplayedRows(5); bean.setAudioMaxDisplayedScoreRows(5); } } else { bean.setMaxDisplayedRows(bean.getOtherMaxDisplayedScoreRows()); } } }
public void updateExternalAssessmentScores( Long publishedAssessmentId, final Map studentUidsToScores, GradebookService g) throws Exception { boolean testErrorHandling = false; PublishedAssessmentService pubService = new PublishedAssessmentService(); String gradebookUId = pubService.getPublishedAssessmentOwner(publishedAssessmentId); if (gradebookUId == null) { return; } g.updateExternalAssessmentScores( gradebookUId, publishedAssessmentId.toString(), studentUidsToScores); if (testErrorHandling) { throw new Exception("Encountered an error in update ExternalAssessmentScore."); } }
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"); } }
private void populateSections( PublishedAssessmentIfc publishedAssessment, QuestionScoresBean bean, TotalScoresBean totalBean, ArrayList scores, PublishedAssessmentService pubService) { ArrayList sections = new ArrayList(); log.debug( "questionScores(): populate sctions publishedAssessment.getSectionArraySorted size = " + publishedAssessment.getSectionArraySorted().size()); Iterator iter = publishedAssessment.getSectionArraySorted().iterator(); int i = 1; while (iter.hasNext()) { SectionDataIfc section = (SectionDataIfc) iter.next(); ArrayList items = new ArrayList(); PartData part = new PartData(); boolean isRandomDrawPart = pubService.isRandomDrawPart( publishedAssessment.getPublishedAssessmentId(), section.getSectionId()); part.setIsRandomDrawPart(isRandomDrawPart); part.setPartNumber("" + i); part.setId(section.getSectionId().toString()); if (isRandomDrawPart) { if (section.getSectionMetaDataByLabel(SectionDataIfc.NUM_QUESTIONS_DRAWN) != null) { int numberToBeDrawn = Integer.parseInt( section.getSectionMetaDataByLabel(SectionDataIfc.NUM_QUESTIONS_DRAWN)); part.setNumberQuestionsDraw(numberToBeDrawn); } PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService(); HashSet itemSet = publishedAssessmentService.getPublishedItemSet( publishedAssessment.getPublishedAssessmentId(), section.getSectionId()); section.setItemSet(itemSet); } else { GradingService gradingService = new GradingService(); HashSet itemSet = gradingService.getItemSet( publishedAssessment.getPublishedAssessmentId(), section.getSectionId()); section.setItemSet(itemSet); } Iterator iter2 = section.getItemArraySortedForGrading().iterator(); int j = 1; while (iter2.hasNext()) { ItemDataIfc item = (ItemDataIfc) iter2.next(); PartData partitem = new PartData(); partitem.setPartNumber("" + j); partitem.setId(item.getItemId().toString()); log.debug("* item.getId = " + item.getItemId()); partitem.setLinked(true); // Iterator iter3 = scores.iterator(); items.add(partitem); j++; } log.debug("questionScores(): items size = " + items.size()); part.setQuestionNumberList(items); sections.add(part); i++; } log.debug("questionScores(): sections size = " + sections.size()); bean.setSections(sections); }
/** * This will populate the QuestionScoresBean with the data associated with the particular * versioned assessment based on the publishedId. * * @todo Some of this code will change when we move this to Hibernate persistence. * @param publishedId String * @param bean QuestionScoresBean * @return boolean */ public boolean questionScores( String publishedId, QuestionScoresBean bean, boolean isValueChange) { log.debug("questionScores()"); try { PublishedAssessmentService pubService = new PublishedAssessmentService(); PublishedItemService pubItemService = new PublishedItemService(); // get the PublishedAssessment based on publishedId QuestionScoresBean questionBean = (QuestionScoresBean) ContextUtil.lookupBean("questionScores"); PublishedAssessmentIfc publishedAssessment = questionBean.getPublishedAssessment(); if (publishedAssessment == null) { publishedAssessment = pubService.getPublishedAssessment(publishedId); questionBean.setPublishedAssessment(publishedAssessment); } // build a hashMap (publishedItemId, publishedItem) HashMap publishedItemHash = pubService.preparePublishedItemHash(publishedAssessment); log.debug("questionScores(): publishedItemHash.size = " + publishedItemHash.size()); // build a hashMap (publishedItemTextId, publishedItemText) HashMap publishedItemTextHash = pubService.preparePublishedItemTextHash(publishedAssessment); log.debug("questionScores(): publishedItemTextHash.size = " + publishedItemTextHash.size()); HashMap publishedAnswerHash = pubService.preparePublishedAnswerHash(publishedAssessment); // re-attach session and load all lazy loaded parent/child stuff // Set<Long> publishedAnswerHashKeySet = publishedAnswerHash.keySet(); // // for (Long key : publishedAnswerHashKeySet) { // AnswerIfc answer = (AnswerIfc) publishedAnswerHash.get(key); // // if (!Hibernate.isInitialized(answer.getChildAnswerSet())) { // pubItemService.eagerFetchAnswer(answer); // } // } log.debug("questionScores(): publishedAnswerHash.size = " + publishedAnswerHash.size()); HashMap agentResultsByItemGradingIdMap = new HashMap(); GradingService delegate = new GradingService(); TotalScoresBean totalBean = (TotalScoresBean) ContextUtil.lookupBean("totalScores"); if (ContextUtil.lookupParam("sortBy") != null && !ContextUtil.lookupParam("sortBy").trim().equals("")) bean.setSortType(ContextUtil.lookupParam("sortBy")); String itemId = ContextUtil.lookupParam("itemId"); if (ContextUtil.lookupParam("newItemId") != null && !ContextUtil.lookupParam("newItemId").trim().equals("") && !ContextUtil.lookupParam("newItemId").trim().equals("null")) itemId = ContextUtil.lookupParam("newItemId"); if (ContextUtil.lookupParam("sortAscending") != null && !ContextUtil.lookupParam("sortAscending").trim().equals("")) { bean.setSortAscending( Boolean.valueOf(ContextUtil.lookupParam("sortAscending")).booleanValue()); } String which = bean.getAllSubmissions(); if (which == null && totalBean.getAllSubmissions() != null) { // use totalscore's selection which = totalBean.getAllSubmissions(); bean.setAllSubmissions(which); } totalBean.setSelectedSectionFilterValue( bean.getSelectedSectionFilterValue()); // set section pulldown if (bean.getSelectedSARationaleView() == null) { // if bean.showSARationaleInLine is null, then set inline to be // the default bean.setSelectedSARationaleView(QuestionScoresBean.SHOW_SA_RATIONALE_RESPONSES_INLINE); } if ("true".equalsIgnoreCase(totalBean.getAnonymous())) { boolean groupRelease = publishedAssessment .getAssessmentAccessControl() .getReleaseTo() .equals(AssessmentAccessControl.RELEASE_TO_SELECTED_GROUPS); if (groupRelease) { totalBean.setSelectedSectionFilterValue( TotalScoresBean.RELEASED_SECTIONS_GROUPS_SELECT_VALUE); } else { totalBean.setSelectedSectionFilterValue(TotalScoresBean.ALL_SECTIONS_SELECT_VALUE); } } bean.setPublishedId(publishedId); Date dueDate = null; HashMap map = getItemScores(Long.valueOf(publishedId), Long.valueOf(itemId), which, isValueChange); log.debug("questionScores(): map .size = " + map.size()); ResourceLoader rb = null; ArrayList allscores = new ArrayList(); Iterator keyiter = map.keySet().iterator(); while (keyiter.hasNext()) { allscores.addAll((ArrayList) map.get(keyiter.next())); } log.debug("questionScores(): allscores.size = " + allscores.size()); // / // now we need filter by sections selected ArrayList scores = new ArrayList(); // filtered list Map useridMap = totalBean.getUserIdMap(TotalScoresBean.CALLED_FROM_QUESTION_SCORE_LISTENER); bean.setUserIdMap(useridMap); log.debug("questionScores(): useridMap.size = " + useridMap.size()); /* * if ("true".equalsIgnoreCase(totalBean.getAnonymous())){ // skip * section filter if it is anonymous grading, SAK-4395, * scores.addAll(allscores); } */ if (totalBean.getReleaseToAnonymous()) { // skip section filter if it's published to anonymous users scores.addAll(allscores); } else { Iterator allscores_iter = allscores.iterator(); // get the Map of all users(keyed on userid) belong to the // selected sections while (allscores_iter.hasNext()) { // AssessmentGradingData data = (AssessmentGradingData) // allscores_iter.next(); ItemGradingData idata = (ItemGradingData) allscores_iter.next(); // String agentid = // idata.getAssessmentGrading().getAgentId(); String agentid = idata.getAgentId(); // now we only include scores of users belong to the // selected sections if (useridMap.containsKey(agentid)) { scores.add(idata); } } } log.debug("questionScores(): scores.size = " + scores.size()); Iterator iter = scores.iterator(); ArrayList agents = new ArrayList(); log.debug("questionScores(): calling populateSections "); populateSections( publishedAssessment, bean, totalBean, scores, pubService); // set up the Q1, Q2... links if (!iter.hasNext()) { // this section has no students log.debug("questionScores(): this section has no students"); bean.setAgents(agents); bean.setAllAgents(agents); bean.setTotalPeople(Integer.toString(bean.getAgents().size())); bean.setAnonymous(totalBean.getAnonymous()); // return true; } // List them by item and assessmentgradingid, so we can // group answers by item and save them for update use. HashMap scoresByItem = new HashMap(); while (iter.hasNext()) { ItemGradingData idata = (ItemGradingData) iter.next(); ItemTextIfc pubItemText = (ItemTextIfc) publishedItemTextHash.get(idata.getPublishedItemTextId()); AnswerIfc pubAnswer = (AnswerIfc) publishedAnswerHash.get(idata.getPublishedAnswerId()); ArrayList temp = (ArrayList) scoresByItem.get(idata.getAssessmentGradingId() + ":" + idata.getPublishedItemId()); if (temp == null) temp = new ArrayList(); // Very small numbers, so bubblesort is fast Iterator iter2 = temp.iterator(); ArrayList newList = new ArrayList(); boolean added = false; while (iter2.hasNext()) { ItemGradingData tmpData = (ItemGradingData) iter2.next(); ItemTextIfc tmpPublishedText = (ItemTextIfc) publishedItemTextHash.get(tmpData.getPublishedItemTextId()); AnswerIfc tmpAnswer = (AnswerIfc) publishedAnswerHash.get(tmpData.getPublishedAnswerId()); if (pubAnswer != null && tmpAnswer != null && !added && (pubItemText.getSequence().intValue() < tmpPublishedText.getSequence().intValue() || (pubItemText.getSequence().intValue() == tmpPublishedText.getSequence().intValue() && pubAnswer.getSequence().intValue() < tmpAnswer.getSequence().intValue()))) { newList.add(idata); added = true; } newList.add(tmpData); } if (!added) newList.add(idata); scoresByItem.put( idata.getAssessmentGradingId() + ":" + idata.getPublishedItemId(), newList); } log.debug("questionScores(): scoresByItem.size = " + scoresByItem.size()); bean.setScoresByItem(scoresByItem); try { bean.setAnonymous( publishedAssessment .getEvaluationModel() .getAnonymousGrading() .equals(EvaluationModel.ANONYMOUS_GRADING) ? "true" : "false"); } catch (RuntimeException e) { // log.info("No evaluation model."); bean.setAnonymous("false"); } // below properties don't seem to be used in jsf pages, try { bean.setLateHandling( publishedAssessment.getAssessmentAccessControl().getLateHandling().toString()); } catch (Exception e) { // log.info("No access control model."); bean.setLateHandling(AssessmentAccessControl.NOT_ACCEPT_LATE_SUBMISSION.toString()); } try { bean.setDueDate(publishedAssessment.getAssessmentAccessControl().getDueDate().toString()); dueDate = publishedAssessment.getAssessmentAccessControl().getDueDate(); } catch (RuntimeException e) { // log.info("No due date."); bean.setDueDate(new Date().toString()); } try { bean.setMaxScore(publishedAssessment.getEvaluationModel().getFixedTotalScore()); } catch (RuntimeException e) { double score = (double) 0.0; Iterator iter2 = publishedAssessment.getSectionArraySorted().iterator(); while (iter2.hasNext()) { SectionDataIfc sdata = (SectionDataIfc) iter2.next(); Iterator iter3 = sdata.getItemArraySortedForGrading().iterator(); while (iter3.hasNext()) { ItemDataIfc idata = (ItemDataIfc) iter3.next(); if (idata.getItemId().equals(Long.valueOf(itemId))) score = idata.getScore().doubleValue(); } } bean.setMaxScore(score); } // need to get id from somewhere else, not from data. data only // contains answered items , we want to return all items. // ItemDataIfc item = (ItemDataIfc) publishedItemHash.get(data.getPublishedItemId()); ItemDataIfc item = (ItemDataIfc) publishedItemHash.get(Long.valueOf(itemId)); if (item != null) { log.debug("item!=null steting type id = " + item.getTypeId().toString()); bean.setTypeId(item.getTypeId().toString()); bean.setItemId(item.getItemId().toString()); bean.setPartName(item.getSection().getSequence().toString()); bean.setItemName(item.getSequence().toString()); item.setHint("***"); // Keyword to not show student answer // for short answer/ essey question, if there is a model short // answer for this question // set haveModelShortAnswer to true if (item.getTypeId().equals(Long.valueOf(5))) { Iterator iterator = publishedAnswerHash.values().iterator(); while (iterator.hasNext()) { PublishedAnswer publishedAnswer = (PublishedAnswer) iterator.next(); if (publishedAnswer.getItem().getItemId().equals(item.getItemId())) { if (publishedAnswer.getText() == null || publishedAnswer.getText().equals("")) { bean.setHaveModelShortAnswer(false); } else { bean.setHaveModelShortAnswer(true); } break; } } } } else { log.debug("item==null "); } ArrayList deliveryItems = new ArrayList(); // so we can use the var if (item != null) deliveryItems.add(item); bean.setDeliveryItem(deliveryItems); if (ContextUtil.lookupParam("roleSelection") != null) { bean.setRoleSelection(ContextUtil.lookupParam("roleSelection")); } if (bean.getSortType() == null) { if (bean.getAnonymous().equals("true")) { bean.setSortType("totalAutoScore"); } else { bean.setSortType("lastName"); } } // recordingData encapsulates the inbeanation needed for recording. // set recording agent, agent assessmentId, // set course_assignment_context value // set max tries (0=unlimited), and 30 seconds max length // String courseContext = bean.getAssessmentName() + " total "; // Note this is HTTP-centric right now, we can't use in Faces // AuthoringHelper authoringHelper = new AuthoringHelper(); // authoringHelper.getRemoteUserID() needs servlet stuff // authoringHelper.getRemoteUserName() needs servlet stuff /* Dump the grading and agent information into AgentResults */ iter = scoresByItem.values().iterator(); while (iter.hasNext()) { AgentResults results = new AgentResults(); // Get all the answers for this question to put in one grading // row ArrayList answerList = (ArrayList) iter.next(); results.setItemGradingArrayList(answerList); Iterator iter2 = answerList.iterator(); ArrayList itemGradingAttachmentList = new ArrayList(); HashMap<Long, Set<String>> fibmap = new HashMap<Long, Set<String>>(); while (iter2.hasNext()) { ItemGradingData gdata = (ItemGradingData) iter2.next(); results.setItemGrading(gdata); itemGradingAttachmentList.addAll(gdata.getItemGradingAttachmentList()); agentResultsByItemGradingIdMap.put(gdata.getItemGradingId(), results); ItemTextIfc gdataPubItemText = (ItemTextIfc) publishedItemTextHash.get(gdata.getPublishedItemTextId()); AnswerIfc gdataAnswer = (AnswerIfc) publishedAnswerHash.get(gdata.getPublishedAnswerId()); // This all just gets the text of the answer to display String answerText = noAnswer; String rationale = ""; String fullAnswerText = noAnswer; // if question type = MC, MR, Survey, TF, Matching, if user // has not submit an answer // answerText = noAnswer. These question type do not use the // itemGrading.answerText field for // storing answers, thye use temGrading.publishedAnswerId to // make their selection if (bean.getTypeId().equals("1") || bean.getTypeId().equals("2") || bean.getTypeId().equals("12") || bean.getTypeId().equals("3") || bean.getTypeId().equals("4") || bean.getTypeId().equals("9") || bean.getTypeId().equals("13")) { if (gdataAnswer != null) answerText = gdataAnswer.getText(); } else { // this handles the other question types: SAQ, File // upload, Audio, FIB, Fill in Numeric // These question type use itemGrading.answetText to // store information about their answer if ((bean.getTypeId().equals("8") || bean.getTypeId().equals("11") || bean.getTypeId().equals("14")) && gdataAnswer == null) { answerText = ""; } else if (bean.getTypeId().equals("14")) { // gopalrc - EMI answerText = gdataPubItemText.getSequence() + ": " + gdataAnswer.getLabel(); } else { answerText = gdata.getAnswerText(); } } if ("4".equals(bean.getTypeId())) { if (rb == null) { rb = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.EvaluationMessages"); } if ("true".equals(answerText)) { answerText = rb.getString("true_msg"); } else if ("false".equals(answerText)) { answerText = rb.getString("false_msg"); } } if (bean.getTypeId().equals("9")) { if (gdataPubItemText == null) { // the matching pair is deleted answerText = ""; } else { answerText = gdataPubItemText.getSequence() + ":" + answerText; } } if (bean.getTypeId().equals("8")) { if (gdataAnswer != null && gdataAnswer.getSequence() != null) { answerText = gdataAnswer.getSequence() + ":" + answerText; } } if (bean.getTypeId().equals("11")) { if (gdataAnswer != null && gdataAnswer.getSequence() != null) { answerText = gdataAnswer.getSequence() + ":" + answerText; } } if (bean.getTypeId().equals("13")) { if (gdataPubItemText == null) { answerText = ""; } else { int answerNo = gdataPubItemText.getSequence().intValue(); answerText = answerNo + ":" + answerText; } } // file upload if (bean.getTypeId().equals("6")) { gdata.setMediaArray(delegate.getMediaArray2(gdata.getItemGradingId().toString())); } // audio recording if (bean.getTypeId().equals("7")) { ArrayList mediaList = delegate.getMediaArray2(gdata.getItemGradingId().toString()); setDurationIsOver(item, mediaList); gdata.setMediaArray(mediaList); } if (bean.getTypeId().equals("16")) { if (gdataPubItemText == null) { // the matching pair is deleted answerText = ""; } else { answerText = gdataPubItemText.getSequence() + ":" + answerText; } } if (answerText == null) answerText = noAnswer; else { if (gdata.getRationale() != null && !gdata.getRationale().trim().equals("")) rationale = "\nRationale: " + gdata.getRationale(); } // Huong's temp commandout // answerText = answerText.replaceAll("<.*?>", ""); answerText = answerText.replaceAll("(\r\n|\r)", "<br/>"); rationale = rationale.replaceAll("<.*?>", ""); rationale = rationale.replaceAll("(\r\n|\r)", "<br/>"); fullAnswerText = answerText; // this is the // non-abbreviated answers // for essay questions int answerTextLength = ServerConfigurationService.getInt("samigo.questionScore.answerText.length", 1000); if (bean.getTypeId().equals("5")) { answerTextLength = 35; } // Fix for SAK-6932: Strip out all HTML tags except image tags if (answerText.length() > answerTextLength) { String noHTMLAnswerText; noHTMLAnswerText = answerText.replaceAll("<((..?)|([^iI][^mM][^gG].*?))>", ""); int index = noHTMLAnswerText.toLowerCase().indexOf("<img"); if (index != -1) { answerText = noHTMLAnswerText; } else { if (noHTMLAnswerText.length() > answerTextLength) { answerText = noHTMLAnswerText.substring(0, answerTextLength) + "..."; } else { answerText = noHTMLAnswerText; } } } /* * // no need to shorten it if (rationale.length() > 35) * rationale = rationale.substring(0, 35) + "..."; */ // SAM-755-"checkmark" indicates right, add "X" to indicate wrong if (gdataAnswer != null) { String checkmarkGif = "<img src='/samigo-app/images/delivery/checkmark.gif'>"; String crossmarkGif = "<img src='/samigo-app/images/crossmark.gif'>"; if (bean.getTypeId().equals("8") || bean.getTypeId().equals("11")) { answerText = FormattedText.escapeHtml(answerText, true); if (gdata.getIsCorrect() == null) { boolean result = false; if (bean.getTypeId().equals("8")) { result = delegate.getFIBResult(gdata, fibmap, item, publishedAnswerHash); } else { result = delegate.getFINResult(gdata, item, publishedAnswerHash); } if (result) { answerText = checkmarkGif + answerText; } else { answerText = crossmarkGif + answerText; } } else { if (gdata.getIsCorrect().booleanValue()) { answerText = checkmarkGif + answerText; } else { answerText = crossmarkGif + answerText; } } } else if (bean.getTypeId().equals("15")) { // CALCULATED_QUESTION answerText = FormattedText.escapeHtml(answerText, true); // need to do something here for fill in the blanks if (gdataAnswer.getScore() > 0) { // if score is 0, there is no way to tell if user got the correct answer // by using "autoscore"... wish there was a better way to tell if its correct or not Double autoscore = gdata.getAutoScore(); if (!(Double.valueOf(0)).equals(autoscore)) { answerText = checkmarkGif + answerText; } else if (Double.valueOf(0).equals(autoscore)) { answerText = crossmarkGif + answerText; } } } else if (!bean.getTypeId().equals("3")) { if ((gdataAnswer.getIsCorrect() != null && gdataAnswer.getIsCorrect()) || (gdataAnswer.getPartialCredit() != null && gdataAnswer.getPartialCredit() > 0)) { answerText = checkmarkGif + answerText; } else if (gdataAnswer.getIsCorrect() != null && !gdataAnswer.getIsCorrect()) { answerText = crossmarkGif + answerText; } } } // -- Got the answer text -- if (!answerList.get(0).equals(gdata)) { // We already have // an agentResults // for this one results.setAnswer(results.getAnswer() + "<br/>" + answerText); if (gdata.getAutoScore() != null) { results.setTotalAutoScore( Double.toString( (Double.valueOf(results.getExactTotalAutoScore())).doubleValue() + gdata.getAutoScore().doubleValue())); } else { results.setTotalAutoScore( Double.toString( (Double.valueOf(results.getExactTotalAutoScore())).doubleValue())); } results.setItemGradingAttachmentList(itemGradingAttachmentList); } else { results.setItemGradingId(gdata.getItemGradingId()); results.setAssessmentGradingId(gdata.getAssessmentGradingId()); if (gdata.getAutoScore() != null) { // for example, if an assessment has one fileupload // question, the autoscore = null results.setTotalAutoScore(gdata.getAutoScore().toString()); } else { results.setTotalAutoScore(Double.toString(0)); } results.setComments(FormattedText.convertFormattedTextToPlaintext(gdata.getComments())); results.setAnswer(answerText); results.setFullAnswer(fullAnswerText); results.setRationale(rationale); results.setSubmittedDate(gdata.getSubmittedDate()); AgentFacade agent = new AgentFacade(gdata.getAgentId()); // log.info("Rachel: agentid = " + gdata.getAgentId()); results.setLastName(agent.getLastName()); results.setFirstName(agent.getFirstName()); results.setEmail(agent.getEmail()); if (results.getLastName() != null && results.getLastName().length() > 0) results.setLastInitial(results.getLastName().substring(0, 1)); else if (results.getFirstName() != null && results.getFirstName().length() > 0) results.setLastInitial(results.getFirstName().substring(0, 1)); else results.setLastInitial("Anonymous"); results.setIdString(agent.getIdString()); results.setAgentEid(agent.getEidString()); results.setAgentDisplayId(agent.getDisplayIdString()); log.debug("testing agent getEid agent.getFirstname= " + agent.getFirstName()); log.debug("testing agent getEid agent.getid= " + agent.getIdString()); log.debug("testing agent getEid agent.geteid = " + agent.getEidString()); log.debug( "testing agent getDisplayId agent.getdisplayid = " + agent.getDisplayIdString()); results.setRole(agent.getRole()); results.setItemGradingAttachmentList(itemGradingAttachmentList); agents.add(results); } } } // log.info("Sort type is " + bean.getSortType() + "."); bs = new BeanSort(agents, bean.getSortType()); if ((bean.getSortType()).equals("assessmentGradingId") || (bean.getSortType()).equals("totalAutoScore") || (bean.getSortType()).equals("totalOverrideScore") || (bean.getSortType()).equals("finalScore")) { bs.toNumericSort(); } else { bs.toStringSort(); } if (bean.isSortAscending()) { log.debug("sortAscending"); agents = (ArrayList) bs.sort(); } else { log.debug("!sortAscending"); agents = (ArrayList) bs.sortDesc(); } // log.info("Listing agents."); bean.setAgents(agents); bean.setAllAgents(agents); bean.setTotalPeople(Integer.valueOf(bean.getAgents().size()).toString()); bean.setAgentResultsByItemGradingId(agentResultsByItemGradingIdMap); } catch (RuntimeException e) { e.printStackTrace(); return false; } return true; }
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)); }