/**
* <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>
* 12.10.2011 by frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.openmeetings.ui;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.download.DisplayOrDownloadComponent;
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.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.media.RedirectMediaResource;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.StringHelper;
import org.olat.group.BusinessGroup;
import org.olat.modules.openmeetings.OpenMeetingsModule;
import org.olat.modules.openmeetings.manager.OpenMeetingsException;
import org.olat.modules.openmeetings.manager.OpenMeetingsManager;
import org.olat.modules.openmeetings.model.OpenMeetingsRoom;
/**
*
* Initial date: 06.11.2012<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class OpenMeetingsRunController extends BasicController {
private Link openLink, closeLink, startLink, startGuestLink, recordingLink, membersLink, editLink;
private VelocityContainer mainVC;
private CloseableModalController cmc;
private OpenMeetingsGuestController guestController;
private OpenMeetingsRecordingsController recordingsController;
private OpenMeetingsAdminRoomMembersController membersController;
private OpenMeetingsRoomEditController editController;
private final boolean admin;
private final boolean moderator;
private final boolean readOnly;
private OpenMeetingsRoom room;
private final OpenMeetingsModule openMeetingsModule;
private final OpenMeetingsManager openMeetingsManager;
private final BusinessGroup group;
private final OLATResourceable ores;
private final String subIdentifier;
public OpenMeetingsRunController(UserRequest ureq, WindowControl wControl, BusinessGroup group, OLATResourceable ores,
String subIdentifier, boolean admin, boolean moderator, boolean readOnly) {
super(ureq, wControl);
this.admin = admin;
this.readOnly = readOnly;
this.moderator = moderator;
this.group = group;
this.ores = ores;
this.subIdentifier = subIdentifier;
openMeetingsModule = CoreSpringFactory.getImpl(OpenMeetingsModule.class);
openMeetingsManager = CoreSpringFactory.getImpl(OpenMeetingsManager.class);
try {
room = openMeetingsManager.getRoom(group, ores, subIdentifier);
} catch (OpenMeetingsException e) {
logError("", e);
}
mainVC = createVelocityContainer("room");
init(ureq);
putInitialPanel(mainVC);
}
protected void init(UserRequest ureq) {
if(!openMeetingsModule.isEnabled()) {
mainVC.contextPut("disabled", Boolean.TRUE);
} else if(room == null) {
mainVC.contextPut("noroom", Boolean.TRUE);
} else if (ureq.getUserSession().getRoles().isGuestOnly() || ureq.getUserSession().getRoles().isInvitee()){
startGuestLink = LinkFactory.createButton("start.room.guest", mainVC, this);
startGuestLink.setVisible(!readOnly);
mainVC.put("start.room.guest", startGuestLink);
} else {
if (moderator) {
openLink = LinkFactory.createButton("open.room", mainVC, this);
openLink.setVisible(!readOnly);
mainVC.put("open.room", openLink);
closeLink = LinkFactory.createButton("close.room", mainVC, this);
closeLink.setVisible(!readOnly);
mainVC.put("close.room", closeLink);
membersLink = LinkFactory.createButton("room.members", mainVC, this);
mainVC.put("room.members", membersLink);
}
if(admin && !readOnly) {
editLink = LinkFactory.createButton("edit.room", mainVC, this);
mainVC.put("edit", editLink);
}
recordingLink = LinkFactory.createButton("recordings", mainVC, this);
mainVC.put("open.recordings", recordingLink);
startLink = LinkFactory.createButton("start.room", mainVC, this);
startLink.setVisible(!readOnly);
startLink.setTarget("openmeetings");
mainVC.put("start.room", startLink);
}
updateState();
}
private void updateState() {
if(!openMeetingsModule.isEnabled()) {
mainVC.contextPut("disabled", Boolean.TRUE);
} else if(room == null) {
mainVC.contextPut("noroom", Boolean.TRUE);
} else {
boolean closed = room.isClosed();
if(openLink != null) {
openLink.setVisible(closed && !readOnly);
}
if(closeLink != null) {
closeLink.setVisible(!closed && !readOnly);
}
if(startLink != null) {
startLink.setEnabled(!closed && !readOnly);
}
if(startGuestLink != null) {
startGuestLink.setEnabled(!closed && !readOnly);
}
mainVC.contextPut("roomName", room.getName());
if (StringHelper.containsNonWhitespace(room.getComment())) {
mainVC.contextPut("roomComment", room.getComment());
} else {
mainVC.contextRemove("roomComment");
}
mainVC.contextPut("roomClosed", new Boolean(closed));
}
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if(source == startLink) {
doStart(ureq);
} else if (source == startGuestLink) {
doStartAsGuest(ureq);
} else if(source == openLink) {
doOpen();
} else if(source == closeLink) {
doClose();
} else if(source == recordingLink) {
doOpenRecordings(ureq);
} else if(source == membersLink) {
doOpenMembers(ureq);
} else if(source == editLink) {
doEdit(ureq);
}
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(source == guestController) {
if(event == Event.DONE_EVENT) {
String firstName = guestController.getFirstName();
String lastName = guestController.getLastName();
redirectToGuestRoom(firstName, lastName);
}
cmc.deactivate();
cleanupPopups();
} else if (source == recordingsController) {
cmc.deactivate();
cleanupPopups();
} else if(source == membersController) {
cmc.deactivate();
cleanupPopups();
} else if(source == editController) {
if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
room = editController.getRoom();
updateState();
}
cmc.deactivate();
cleanupPopups();
} else if(source == cmc) {
cleanupPopups();
}
super.event(ureq, source, event);
}
private void cleanupPopups() {
removeAsListenerAndDispose(guestController);
removeAsListenerAndDispose(recordingsController);
removeAsListenerAndDispose(membersController);
removeAsListenerAndDispose(editController);
removeAsListenerAndDispose(cmc);
guestController = null;
editController = null;
recordingsController = null;
membersController = null;
cmc = null;
}
private void doOpen() {
try {
room = openMeetingsManager.openRoom(room);
} catch (OpenMeetingsException e) {
showError(e.i18nKey());
}
updateState();
}
private void doClose() {
try {
room = openMeetingsManager.closeRoom(room);
} catch (OpenMeetingsException e) {
showError(e.i18nKey());
}
updateState();
}
private void doOpenRecordings(UserRequest ureq) {
cleanupPopups();
recordingsController = new OpenMeetingsRecordingsController(ureq, getWindowControl(), room.getRoomId(), admin || moderator);
listenTo(recordingsController);
cmc = new CloseableModalController(getWindowControl(), translate("close"), recordingsController.getInitialComponent(), true, translate("recordings"));
listenTo(cmc);
cmc.activate();
}
private void doOpenMembers(UserRequest ureq) {
cleanupPopups();
try {
OpenMeetingsRoom reloadedRoom = openMeetingsManager.getRoom(group, ores, subIdentifier);
membersController = new OpenMeetingsAdminRoomMembersController(ureq, getWindowControl(), reloadedRoom, readOnly);
listenTo(membersController);
cmc = new CloseableModalController(getWindowControl(), translate("close"), membersController.getInitialComponent(), true, translate("room.members"));
listenTo(cmc);
cmc.activate();
} catch (OpenMeetingsException e) {
showError(e.i18nKey());
}
}
private void doEdit(UserRequest ureq) {
cleanupPopups();
editController = new OpenMeetingsRoomEditController(ureq, getWindowControl(), group, ores, subIdentifier, null);
listenTo(editController);
String edit = translate("edit.room");
cmc = new CloseableModalController(getWindowControl(), translate("close"), editController.getInitialComponent(), true, edit);
listenTo(cmc);
cmc.activate();
}
private void doStartAsGuest(UserRequest ureq) {
cleanupPopups();
guestController = new OpenMeetingsGuestController(ureq, getWindowControl());
listenTo(guestController);
cmc = new CloseableModalController(getWindowControl(), translate("close"), guestController.getInitialComponent(), true, translate("guest.room"));
listenTo(cmc);
cmc.activate();
}
private void redirectToGuestRoom(String firstName, String lastName) {
if(room == null && room.getRoomId() <= 0) {
showError("room.notfound.error");
} else {
try {
String securedHash = openMeetingsManager.setGuestUserToRoom(firstName, lastName, room.getRoomId());
String url = openMeetingsManager.getURL(getIdentity(), room.getRoomId(), securedHash, getLocale());
DisplayOrDownloadComponent cmp = new DisplayOrDownloadComponent("openCommand", url);
mainVC.put("openCmd", cmp);
} catch (OpenMeetingsException e) {
showError(e.i18nKey());
}
}
}
private void doStart(UserRequest ureq) {
if(room == null && room.getRoomId() <= 0) {
showError("room.notfound.error");
} else {
try {
String securedHash = openMeetingsManager.setUserToRoom(getIdentity(), room.getRoomId(), moderator);
String url = openMeetingsManager.getURL(getIdentity(), room.getRoomId(), securedHash, getLocale());
RedirectMediaResource redirect = new RedirectMediaResource(url);
ureq.getDispatchResult().setResultingMediaResource(redirect);
} catch (OpenMeetingsException e) {
showError(e.i18nKey());
}
}
}
}