/**
* <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.modules.gotomeeting.ui;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
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.components.velocity.VelocityContainer;
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.creator.ControllerCreator;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.core.gui.media.RedirectMediaResource;
import org.olat.core.util.Formatter;
import org.olat.modules.gotomeeting.GoToMeeting;
import org.olat.modules.gotomeeting.GoToMeetingManager;
import org.olat.modules.gotomeeting.GoToRegistrant;
import org.olat.modules.gotomeeting.model.GoToError;
import org.olat.modules.gotomeeting.model.GoToErrors;
import org.olat.modules.gotomeeting.model.GoToRecordingsG2T;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 22.03.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class GoToMeetingController extends BasicController {
private Link registerLink, confirmLink, joinLink, startLink, openRecordingsLink;
private final VelocityContainer mainVC;
private GoToMeeting meeting;
private GoToRegistrant registrant;
private final boolean administrator, moderator, readOnly;
private CloseableModalController cmc;
private GoToRecordingsController recordingsCtrl;
@Autowired
private GoToMeetingManager meetingMgr;
public GoToMeetingController(UserRequest ureq, WindowControl wControl,
GoToMeeting meeting, boolean administrator, boolean moderator, boolean readOnly) {
super(ureq, wControl);
this.readOnly = readOnly;
this.moderator = moderator;
this.administrator = administrator;
mainVC = createVelocityContainer("meeting");
mainVC.contextPut("title", meeting.getName());
mainVC.contextPut("description", meeting.getDescription());
if(administrator || moderator) {
startLink = LinkFactory.createButtonLarge("training.start", mainVC, this);
startLink.setTarget("_blank");
}
registerLink = LinkFactory.createButtonLarge("training.register", mainVC, this);
confirmLink = LinkFactory.createButtonLarge("training.confirm", mainVC, this);
confirmLink.setTarget("_blank");
joinLink = LinkFactory.createButtonLarge("training.join", mainVC, this);
joinLink.setTarget("_blank");
openRecordingsLink = LinkFactory.createButton("recordings", mainVC, this);
GoToError error = new GoToError();
this.meeting = meetingMgr.getMeeting(meeting, error);
this.registrant = meetingMgr.getRegistrant(meeting, getIdentity());
if(error.hasError() && error.getError() != null) {
mainVC.contextPut("errorMessage", translate(error.getError().i18nKey()));
}
List<GoToRecordingsG2T> recordings = meetingMgr.getRecordings(meeting, error);
openRecordingsLink.setVisible(recordings != null && recordings.size() > 0);
Date start = meeting.getStartDate();
Date end = meeting.getEndDate();
Formatter formatter = Formatter.getInstance(getLocale());
mainVC.contextPut("start", formatter.formatDateAndTime(start));
mainVC.contextPut("end", formatter.formatDateAndTime(end));
putInitialPanel(mainVC);
updateButtons();
}
@Override
protected void doDispose() {
//
}
private void updateButtons() {
if(readOnly) {
startLink.setVisible(false);
registerLink.setVisible(false);
confirmLink.setVisible(false);
joinLink.setVisible(false);
} else {
Date start = meeting.getStartDate();
Date end = meeting.getEndDate();
Date now = new Date();
boolean canStart = (start.compareTo(now) <= 0 && end.compareTo(now) > 0);
Calendar cal = Calendar.getInstance();
cal.setTime(start);
cal.add(Calendar.MINUTE, -60);
Date startMinusOne = cal.getTime();
boolean canCoachStart = (startMinusOne.compareTo(now) <= 0 && end.compareTo(now) > 0);
boolean ended = (end.compareTo(now) <= 0);
if(administrator || moderator) {
if(canCoachStart) {
startLink.setVisible(true);
registerLink.setVisible(false);
} else if(ended) {
startLink.setVisible(false);
registerLink.setVisible(false);
} else if(registrant == null) {
startLink.setVisible(false);
registerLink.setVisible(true);
} else {
startLink.setVisible(false);
registerLink.setVisible(false);
}
confirmLink.setVisible(false);
joinLink.setVisible(false);
} else if(ended) {
registerLink.setVisible(false);
confirmLink.setVisible(false);
joinLink.setVisible(false);
} else if(canStart) {
if(registrant == null) {
registerLink.setVisible(false);
confirmLink.setVisible(false);
joinLink.setVisible(true);
} else {
registerLink.setVisible(false);
confirmLink.setVisible(false);
joinLink.setVisible(true);
}
} else {
if(registrant == null) {
registerLink.setVisible(true);
confirmLink.setVisible(false);
joinLink.setVisible(false);
} else {
registerLink.setVisible(false);
confirmLink.setVisible(true);
joinLink.setVisible(false);
}
}
}
mainVC.setDirty(true);
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if(joinLink == source) {
doJoin(ureq);
} else if(registerLink == source) {
doRegister();
} else if(confirmLink == source) {
doConfirm(ureq);
} else if(startLink == source) {
doStart(ureq);
} else if(openRecordingsLink == source) {
doOpenRecordings(ureq);
}
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(recordingsCtrl == source) {
cmc.deactivate();
cleanUp();
} else if(cmc == source) {
cleanUp();
}
super.event(ureq, source, event);
}
private void cleanUp() {
removeAsListenerAndDispose(recordingsCtrl);
removeAsListenerAndDispose(cmc);
recordingsCtrl = null;
cmc = null;
}
private void doStart(UserRequest ureq) {
if(registrant == null) {
GoToError error = new GoToError();
registrant = meetingMgr.registerTraining(meeting, getIdentity(), error);
}
GoToError error = new GoToError();
String startUrl = meetingMgr.startTraining(meeting, error);
if(startUrl != null) {
RedirectMediaResource redirect = new RedirectMediaResource(startUrl);
ureq.getDispatchResult().setResultingMediaResource(redirect);
} else if(error.getError() == GoToErrors.TrainingInSession) {
String joinUrl = registrant.getJoinUrl();
RedirectMediaResource redirect = new RedirectMediaResource(joinUrl);
ureq.getDispatchResult().setResultingMediaResource(redirect);
}
}
private void doRegister() {
if(registrant == null) {
GoToError error = new GoToError();
registrant = meetingMgr.registerTraining(meeting, getIdentity(), error);
if(registrant != null) {
showInfo("training.register.success");
} else {
showWarning("training.register.failed");
}
}
updateButtons();
}
private void doConfirm(UserRequest ureq) {
if(registrant != null) {
String confirmUrl = registrant.getConfirmUrl();
if(confirmUrl != null) {
RedirectMediaResource redirect = new RedirectMediaResource(confirmUrl);
ureq.getDispatchResult().setResultingMediaResource(redirect);
}
}
updateButtons();
}
private void doJoin(UserRequest ureq) {
boolean join = false;
GoToError error = new GoToError();
if(registrant == null) {
registrant = meetingMgr.registerTraining(meeting, getIdentity(), error);
}
if(registrant != null) {
String joinUrl = registrant.getJoinUrl();
if(joinUrl != null) {
RedirectMediaResource redirect = new RedirectMediaResource(joinUrl);
ureq.getDispatchResult().setResultingMediaResource(redirect);
join = true;
}
}
if(!join) {
final String errorMessage;
if(error.hasError()) {
if(error.getError() != null) {
errorMessage = translate(error.getError().i18nKey());
} else {
errorMessage = translate("error.code.unkown");
}
} else {
errorMessage = translate("error.code.unkown");
}
ControllerCreator creator = BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, new ControllerCreator() {
@Override
public Controller createController(UserRequest lureq, WindowControl lwControl) {
// Wrap in column layout, popup window needs a layout controller
String title = "";
String text = errorMessage;
Controller ctr = MessageUIFactory.createErrorMessage(lureq, lwControl, title, text);
LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr);
layoutCtr.addDisposableChildController(ctr);
return layoutCtr;
}
});
openInNewBrowserWindow(ureq, creator);
}
updateButtons();
}
private void doOpenRecordings(UserRequest ureq) {
if(recordingsCtrl != null) return;
recordingsCtrl = new GoToRecordingsController(ureq, getWindowControl(), meeting);
listenTo(recordingsCtrl);
cmc = new CloseableModalController(getWindowControl(), translate("close"), recordingsCtrl.getInitialComponent(),
true, translate("recordings"));
cmc.activate();
listenTo(cmc);
}
}