@Override protected void doDispose() { // child controllers disposed by basic controller if (!type.equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS)) { return; } singleUserEventCenter.deregisterFor(this, assessmentInstanceOres); singleUserEventCenter.deregisterFor(this, chatEventOres); if (!assessmentStopped) { final AssessmentEvent assessmentStoppedEvent = new AssessmentEvent(AssessmentEvent.TYPE.STOPPED, userSession); singleUserEventCenter.fireEventToListenersOf(assessmentStoppedEvent, assessmentEventOres); } }
/** [used by spring] */ @Override public void init() { // called by spring. // register for sign-off event in order to release all locks for that // user eventBus.registerFor(this, null, SignOnOffEventResourceable.getResourceable()); }
private void init(final UserRequest ureq) { startButton = LinkFactory.createButton("start", myContent, this); // fetch disclaimer file String sDisclaimer = (String) modConfig.get(IQEditController.CONFIG_KEY_DISCLAIMER); if (sDisclaimer != null) { VFSContainer baseContainer = userCourseEnv.getCourseEnvironment().getCourseFolderContainer(); final int lastSlash = sDisclaimer.lastIndexOf('/'); if (lastSlash != -1) { baseContainer = (VFSContainer) baseContainer.resolve(sDisclaimer.substring(0, lastSlash)); sDisclaimer = sDisclaimer.substring(lastSlash); // first check if disclaimer exists on filesystem if (baseContainer == null || baseContainer.resolve(sDisclaimer) == null) { showWarning("disclaimer.file.invalid", sDisclaimer); } else { // screenreader do not like iframes, display inline if (getWindowControl().getWindowBackOffice().getWindowManager().isForScreenReader()) { final HtmlStaticPageComponent disclaimerComp = new HtmlStaticPageComponent("disc", baseContainer); myContent.put("disc", disclaimerComp); disclaimerComp.setCurrentURI(sDisclaimer); myContent.contextPut("hasDisc", Boolean.TRUE); } else { iFrameCtr = new IFrameDisplayController(ureq, getWindowControl(), baseContainer); listenTo(iFrameCtr); // dispose automatically myContent.put("disc", iFrameCtr.getInitialComponent()); iFrameCtr.setCurrentURI(sDisclaimer); myContent.contextPut("hasDisc", Boolean.TRUE); } } } } // push title and learning objectives, only visible on intro page myContent.contextPut("menuTitle", courseNode.getShortTitle()); myContent.contextPut("displayTitle", courseNode.getLongTitle()); // Adding learning objectives final String learningObj = courseNode.getLearningObjectives(); if (learningObj != null) { final Component learningObjectives = ObjectivesHelper.createLearningObjectivesComponent(learningObj, ureq); myContent.put("learningObjectives", learningObjectives); myContent.contextPut("hasObjectives", learningObj); // dummy value, just an exists operator } if (type.equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS)) { checkChats(ureq); singleUserEventCenter.registerFor(this, getIdentity(), chatEventOres); } }
@Override protected void event(final UserRequest urequest, final Controller source, final Event event) { if (source == displayController) { if (event instanceof IQSubmittedEvent) { final IQSubmittedEvent se = (IQSubmittedEvent) event; final AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager(); // Save results in case of test if (type.equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS)) { // update scoring overview for the user in the current course final Float score = new Float(se.getScore()); final Boolean passed = new Boolean(se.isPassed()); final ScoreEvaluation sceval = new ScoreEvaluation(score, passed, new Long(se.getAssessmentID())); final AssessableCourseNode acn = (AssessableCourseNode) courseNode; // assessment nodes are assesable final boolean incrementUserAttempts = true; acn.updateUserScoreEvaluation( sceval, userCourseEnv, urequest.getIdentity(), incrementUserAttempts); // userCourseEnv.getScoreAccounting().scoreInfoChanged(acn, sceval); exposeUserTestDataToVC(urequest); // Mark publisher for notifications final Long courseId = userCourseEnv.getCourseEnvironment().getCourseResourceableId(); notificationHandler.markPublisherNews(urequest.getIdentity(), courseId); if (!assessmentStopped) { assessmentStopped = true; final AssessmentEvent assessmentStoppedEvent = new AssessmentEvent(AssessmentEvent.TYPE.STOPPED, userSession); singleUserEventCenter.deregisterFor(this, assessmentInstanceOres); singleUserEventCenter.fireEventToListenersOf( assessmentStoppedEvent, assessmentEventOres); } } // Save results in case of questionnaire else if (type.equals(AssessmentInstance.QMD_ENTRY_TYPE_SURVEY)) { // save number of attempts // although this is not an assessable node we still use the assessment // manager since this one uses caching am.incrementNodeAttempts(courseNode, urequest.getIdentity(), userCourseEnv); exposeUserQuestionnaireDataToVC(); getWindowControl().pop(); } // Don't save results in case of self-test // but do safe attempts ! else if (type.equals(AssessmentInstance.QMD_ENTRY_TYPE_SELF)) { am.incrementNodeAttempts(courseNode, urequest.getIdentity(), userCourseEnv); } } else if (event.equals(Event.DONE_EVENT)) { getWindowControl().pop(); if (type.equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS) && !assessmentStopped) { assessmentStopped = true; final AssessmentEvent assessmentStoppedEvent = new AssessmentEvent(AssessmentEvent.TYPE.STOPPED, userSession); singleUserEventCenter.deregisterFor(this, assessmentInstanceOres); singleUserEventCenter.fireEventToListenersOf(assessmentStoppedEvent, assessmentEventOres); } fireEvent(urequest, Event.DONE_EVENT); } } }
@Override protected void event(final UserRequest ureq, final Component source, final Event event) { if (source == startButton && startButton.isEnabled()) { final long callingResId = userCourseEnv.getCourseEnvironment().getCourseResourceableId().longValue(); final String callingResDetail = courseNode.getIdent(); removeAsListenerAndDispose(displayController); final Controller returnController = IQManager.getInstance() .createIQDisplayController( modConfig, secCallback, ureq, getWindowControl(), callingResId, callingResDetail); /* * either returnController is a MessageController or it is a IQDisplayController this should not serve as pattern to be copy&pasted. FIXME:2008-11-21:pb * INTRODUCED because of read/write QTI Lock solution for scalability II, 6.1.x Release */ if (returnController instanceof IQDisplayController) { displayController = (IQDisplayController) returnController; listenTo(displayController); if (displayController.isReady()) { // in case displayController was unable to initialize, a message was set by // displayController // this is the case if no more attempts or security check was unsuccessfull final LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController( ureq, getWindowControl(), null, null, displayController.getInitialComponent(), null); listenTo(layoutCtr); // autodispose // need to wrap a course restart controller again, because IQDisplay // runs on top of GUIStack final ICourse course = CourseFactory.loadCourse(callingResId); final RepositoryEntry courseRepositoryEntry = RepositoryServiceImpl.getInstance().lookupRepositoryEntry(course, true); final Panel empty = new Panel("empty"); // empty panel set as "menu" and "tool" final Controller courseCloser = CourseFactory.createDisposedCourseRestartController( ureq, getWindowControl(), courseRepositoryEntry.getResourceableId()); final Controller disposedRestartController = new LayoutMain3ColsController( ureq, getWindowControl(), empty, empty, courseCloser.getInitialComponent(), "disposed course whily in iqRun" + callingResId); layoutCtr.setDisposedMessageController(disposedRestartController); getWindowControl().pushToMainArea(layoutCtr.getInitialComponent()); if (modConfig .get(IQEditController.CONFIG_KEY_TYPE) .equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS)) { assessmentStopped = false; singleUserEventCenter.registerFor(this, getIdentity(), assessmentInstanceOres); singleUserEventCenter.fireEventToListenersOf( new AssessmentEvent(AssessmentEvent.TYPE.STARTED, ureq.getUserSession()), assessmentEventOres); } } // endif isReady } else { // -> qti file was locked -> show info message // user must click again on course node to activate mainPanel.pushContent(returnController.getInitialComponent()); } } else if (source == showResultsButton) { final AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager(); Long assessmentID = am.getAssessmentID(courseNode, ureq.getIdentity()); if (assessmentID == null) { // fallback solution: if the assessmentID is not available via AssessmentManager than try to // get it via IQManager final long callingResId = userCourseEnv.getCourseEnvironment().getCourseResourceableId().longValue(); final String callingResDetail = courseNode.getIdent(); assessmentID = IQManager.getInstance() .getLastAssessmentID(ureq.getIdentity(), callingResId, callingResDetail); } if (assessmentID != null && !assessmentID.equals("")) { final Document doc = IQManager.getInstance() .getResultsReportingFromFile(ureq.getIdentity(), type, assessmentID); // StringBuilder resultsHTML = // LocalizedXSLTransformer.getInstance(ureq.getLocale()).renderResults(doc); final String summaryConfig = (String) modConfig.get(IQEditController.CONFIG_KEY_SUMMARY); final int summaryType = AssessmentInstance.getSummaryType(summaryConfig); final String resultsHTML = IQManager.getInstance().transformResultsReporting(doc, ureq.getLocale(), summaryType); myContent.contextPut("displayreporting", resultsHTML); myContent.contextPut("resreporting", resultsHTML); myContent.contextPut("showResults", Boolean.TRUE); } } else if (source == hideResultsButton) { myContent.contextPut("showResults", Boolean.FALSE); } }