//<OLATCE-103>
/**
* <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>
* BPS Bildungsportal Sachsen GmbH, http://www.bps-system.de
* <p>
*/
package de.bps.course.nodes.vc.provider.adobe;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.media.RedirectMediaResource;
import de.bps.course.nodes.vc.MeetingDate;
import de.bps.course.nodes.vc.provider.VCProvider;
/**
*
* Description:<br>
* Display controller for Adobe Connect implementation, mostly used as
* run controller in the course node.
*
* <P>
* Initial Date: 16.12.2010 <br>
* @author skoeber
*/
public class AdobeDisplayController extends BasicController {
private static String COMMAND_START_MEETING = "cmd.start.meeting";
private static String COMMAND_START_JOIN_MEETING = "cmd.start.join.meeting";
private static String COMMAND_JOIN_MODERATOR = "cmd.join.moderator";
private static String COMMAND_JOIN_LEARNER = "cmd.join.learner";
private static String COMMAND_REMOVE_MEETING = "cmd.remove.meeting";
private static String COMMAND_SYNC_MEETING = "cmd.sync.meeting";
// objects for run view
private VelocityContainer runVC;
private String roomId;
private Link startModerator, startJoinLearner, joinModerator, joinLearner;
private Link removeMeeting, updateMeeting;
// data
private List<MeetingDate> dateList = new ArrayList<MeetingDate>();
private AdobeConnectConfiguration config;
private MeetingDate meeting;
private Date allBegin, allEnd;
private VCProvider adobe;
public AdobeDisplayController(UserRequest ureq, WindowControl wControl, String roomId, String name, String description,
boolean isModerator, boolean readOnly, AdobeConnectConfiguration config, VCProvider provider) {
super(ureq, wControl);
this.roomId = roomId;
this.adobe = provider;
this.config = config;
// The dates Table to the Course odes
if(config.getMeetingDates() != null) dateList.addAll(config.getMeetingDates());
// select actual meeting
if(config.isUseMeetingDates()) {
Date now = new Date((new Date()).getTime() + 15*60*1000); // allow to start meetings about 15 minutes before begin
for(MeetingDate date : dateList) {
Date begin = date.getBegin();
Date end = date.getEnd();
if(now.after(begin) & now.before(end)) {
meeting = date;
}
allBegin = allBegin == null ? begin : begin.before(allBegin) ? begin : allBegin;
allEnd = allEnd == null ? end : end.after(allEnd) ? end : allEnd;
}
} else {
allBegin = new Date();
allEnd = new Date(allBegin.getTime() + 365*24*60*60*1000); // preset one year
meeting = new MeetingDate();
meeting.setBegin(allBegin);
meeting.setEnd(allEnd);
meeting.setTitle(name);
meeting.setDescription(description);
}
runVC = createVelocityContainer("run");
startModerator = LinkFactory.createButton(COMMAND_START_MEETING, runVC, this);
startModerator.setVisible(!readOnly);
startJoinLearner = LinkFactory.createButton(COMMAND_START_JOIN_MEETING, runVC, this);
startJoinLearner.setVisible(!readOnly);
joinLearner = LinkFactory.createButton(COMMAND_JOIN_LEARNER, runVC, this);
joinLearner.setVisible(!readOnly);
joinModerator = LinkFactory.createButton(COMMAND_JOIN_MODERATOR, runVC, this);
joinModerator.setVisible(!readOnly);
removeMeeting = LinkFactory.createButton(COMMAND_REMOVE_MEETING, runVC, this);
removeMeeting.setVisible(!readOnly);
updateMeeting = LinkFactory.createButton(COMMAND_SYNC_MEETING, runVC, this);
updateMeeting.setVisible(!readOnly);
// set target to be able to open new browser window on event
startJoinLearner.setTarget("_blank");
joinLearner.setTarget("_blank");
joinModerator.setTarget("_blank");
// render the right button
boolean isUseDates = config.isUseMeetingDates();
boolean isMeeting = !isUseDates | meeting != null;
boolean exists = adobe.existsClassroom(roomId, config);
boolean guestCanStart = config.isGuestStartMeetingAllowed();
runVC.contextPut("isModerator", isModerator);
runVC.contextPut("exists", exists);
runVC.contextPut("guestCanStart", guestCanStart);
runVC.contextPut("useDates", isUseDates);
joinLearner.setEnabled(isMeeting & exists);
putInitialPanel(runVC);
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if(source == startModerator) {
/*
* create new meeting room and prepare to join it
*/
boolean success = adobe.createClassroom(roomId, null, null, allBegin, allEnd, config);
if(success) {
runVC.contextPut("exists", true);
runVC.setDirty(true);
} else {
getWindowControl().setError(translate("error.create.room"));
}
} else if(source == startJoinLearner) {
/*
* create new meeting room and join immediately as guest
*/
boolean success = adobe.createClassroom(roomId, null, null, allBegin, allEnd, config);
if(success) {
runVC.contextPut("exists", true);
runVC.setDirty(true);
// join meeting as guest
URL url = adobe.createClassroomGuestUrl(roomId, ureq.getIdentity(), config);
RedirectMediaResource rmr = new RedirectMediaResource(url.toString());
ureq.getDispatchResult().setResultingMediaResource(rmr);
return;
} else {
getWindowControl().setError(translate("error.create.room"));
}
} else if(source == joinLearner) {
/*
* easiest case: simply generate link to join meeting as guest
*/
URL url = adobe.createClassroomGuestUrl(roomId, ureq.getIdentity(), config);
RedirectMediaResource rmr = new RedirectMediaResource(url.toString());
ureq.getDispatchResult().setResultingMediaResource(rmr);
return;
} else if(source == joinModerator) {
/*
* join meeting as moderator, first prepare user to have appropriate rights
*/
boolean success = adobe.existsClassroom(roomId, config);
// update rights for user to moderate meeting
if(success) {
success = adobe.createModerator(ureq.getIdentity(), roomId);
} else {
// room not found, should not appear
getWindowControl().setError(translate("error.no.room"));
return;
}
// login the user as moderator
if(success) {
success = adobe.login(ureq.getIdentity(), null);
} else {
// could not create moderator or update the rights
getWindowControl().setError(translate("error.update.rights"));
return;
}
// redirect to the meeting
if(success) {
URL url = adobe.createClassroomUrl(roomId, ureq.getIdentity(), config);
RedirectMediaResource rmr = new RedirectMediaResource(url.toString());
ureq.getDispatchResult().setResultingMediaResource(rmr);
} else {
// login failed
getWindowControl().setError(translate("error.no.login"));
return;
}
return;
} else if(source == removeMeeting) {
boolean success = adobe.removeClassroom(roomId, config);
if(success) {
runVC.contextPut("exists", false);
runVC.setDirty(true);
} else {
// removing failed
getWindowControl().setError(translate("error.remove.room"));
}
} else if(source == updateMeeting) {
boolean success = adobe.updateClassroom(roomId, null, null, allBegin, allEnd, config);
if(success) {
getWindowControl().setInfo(translate("success.update.room"));
} else {
// update failed
getWindowControl().setError(translate("error.update.room"));
}
}
}
@Override
protected void doDispose() {
// nothing to dispose
}
}
//</OLATCE-103>