/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.course.assessment.bulk; import java.util.Collections; import java.util.Date; import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.taskexecutor.TaskExecutorManager; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.wizard.Step; import org.olat.core.gui.control.generic.wizard.StepRunnerCallback; import org.olat.core.gui.control.generic.wizard.StepsMainRunController; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.course.assessment.manager.BulkAssessmentTask; import org.olat.course.assessment.model.BulkAssessmentDatas; import org.olat.course.assessment.model.BulkAssessmentFeedback; import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.resource.OLATResource; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class BulkAssessmentToolController extends BasicController { private final Link startButton; private final AssessableCourseNode courseNode; private DialogBoxController errorCtrl; private StepsMainRunController bulkAssessmentCtrl; private final TaskExecutorManager taskManager; private final OLATResource courseOres; public BulkAssessmentToolController(UserRequest ureq, WindowControl wControl, CourseEnvironment courseEnv, AssessableCourseNode courseNode) { super(ureq, wControl); this.courseNode = courseNode; taskManager = CoreSpringFactory.getImpl(TaskExecutorManager.class); courseOres = courseEnv.getCourseGroupManager().getCourseResource(); startButton = LinkFactory.createButton("new.bulk", null, this); startButton.setTranslator(getTranslator()); putInitialPanel(startButton); getInitialComponent().setSpanAsDomReplaceable(true); // override to wrap panel as span to not break link layout } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Component source, Event event) { if(startButton == source) { doOpen(ureq); } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(bulkAssessmentCtrl == source) { if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) { getWindowControl().pop(); Feedback feedback = (Feedback)bulkAssessmentCtrl.getRunContext().get("feedback"); removeAsListenerAndDispose(bulkAssessmentCtrl); bulkAssessmentCtrl = null; if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) { doBulkAssessmentSynchronous(ureq, feedback); } } } super.event(ureq, source, event); } private void doOpen(UserRequest ureq) { StepRunnerCallback finish = new StepRunnerCallback() { @Override public Step execute(UserRequest uureq, WindowControl bwControl, StepsRunContext runContext) { Date scheduledDate = (Date)runContext.get("scheduledDate"); BulkAssessmentDatas datas = (BulkAssessmentDatas)runContext.get("datas"); Feedback feedback = doBulkAssessment(scheduledDate, datas); runContext.put("feedback", feedback); return StepsMainRunController.DONE_MODIFIED; } }; Step start = new BulkAssessment_2_DatasStep(ureq, courseNode); bulkAssessmentCtrl = new StepsMainRunController(ureq, getWindowControl(), start, finish, null, translate("bulk.wizard.title"), "o_sel_bulk_assessment_wizard"); listenTo(bulkAssessmentCtrl); getWindowControl().pushAsModalDialog(bulkAssessmentCtrl.getInitialComponent()); } private Feedback doBulkAssessment(Date scheduledDate, BulkAssessmentDatas datas) { BulkAssessmentTask task = new BulkAssessmentTask(courseOres, courseNode, datas, getIdentity().getKey()); Feedback feedback; if(scheduledDate == null) { List<BulkAssessmentFeedback> feedbacks = task.process(); feedback = new Feedback(true, feedbacks); } else { taskManager.execute(task, getIdentity(), courseOres, courseNode.getIdent(), scheduledDate); feedback = new Feedback(false, null); } return feedback; } private void doBulkAssessmentSynchronous(UserRequest ureq, Feedback feedback) { if(feedback.isSynchronous()) { List<BulkAssessmentFeedback> feedbacks = feedback.getFeedbacks(); if(feedbacks.isEmpty()) { showInfo("bulk.assessment.done"); } else { String text = BulkAssessmentTask.renderFeedback(feedbacks, getTranslator()); List<String> buttonLabels = Collections.singletonList(translate("ok")); String title = translate("bulk.assessment.error.title"); String translatedText = translate("bulk.assessment.error.feedback", new String[]{ text }); errorCtrl = activateGenericDialog(ureq, title, translatedText, buttonLabels, errorCtrl); } } else { showInfo("bulk.assessment.enlisted"); } } private static class Feedback { private final boolean synchronous; private final List<BulkAssessmentFeedback> feedbacks; public Feedback(boolean synchronous, List<BulkAssessmentFeedback> feedbacks) { this.synchronous = synchronous; this.feedbacks = feedbacks; } public boolean isSynchronous() { return synchronous; } public List<BulkAssessmentFeedback> getFeedbacks() { return feedbacks; } } }