added more actions and connection list to proctor rooms
This commit is contained in:
parent
1d7d15c02c
commit
daebd9b5f7
7 changed files with 221 additions and 86 deletions
|
@ -84,4 +84,29 @@ public class RemoteProctoringRoom {
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(final Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
final RemoteProctoringRoom other = (RemoteProctoringRoom) obj;
|
||||||
|
if (this.id == null) {
|
||||||
|
if (other.id != null)
|
||||||
|
return false;
|
||||||
|
} else if (!this.id.equals(other.id))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Tree;
|
||||||
import org.eclipse.swt.widgets.TreeItem;
|
import org.eclipse.swt.widgets.TreeItem;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -90,6 +91,7 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
"}";
|
"}";
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
|
private static final String SHOW_CONNECTION_ACTION_APPLIED = "SHOW_CONNECTION_ACTION_APPLIED";
|
||||||
private static final LocTextKey EMPTY_SELECTION_TEXT_KEY =
|
private static final LocTextKey EMPTY_SELECTION_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.connection.emptySelection");
|
new LocTextKey("sebserver.monitoring.exam.connection.emptySelection");
|
||||||
private static final LocTextKey EMPTY_ACTIVE_SELECTION_TEXT_KEY =
|
private static final LocTextKey EMPTY_ACTIVE_SELECTION_TEXT_KEY =
|
||||||
|
@ -108,12 +110,14 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
private final GuiServiceInfo guiServiceInfo;
|
private final GuiServiceInfo guiServiceInfo;
|
||||||
private final long pollInterval;
|
private final long pollInterval;
|
||||||
private final String remoteProctoringEndpoint;
|
private final String remoteProctoringEndpoint;
|
||||||
|
private final ProctorRoomConnectionsPopup proctorRoomConnectionsPopup;
|
||||||
|
|
||||||
protected MonitoringRunningExam(
|
protected MonitoringRunningExam(
|
||||||
final ServerPushService serverPushService,
|
final ServerPushService serverPushService,
|
||||||
final PageService pageService,
|
final PageService pageService,
|
||||||
final InstructionProcessor instructionProcessor,
|
final InstructionProcessor instructionProcessor,
|
||||||
final GuiServiceInfo guiServiceInfo,
|
final GuiServiceInfo guiServiceInfo,
|
||||||
|
final ProctorRoomConnectionsPopup proctorRoomConnectionsPopup,
|
||||||
@Value("${sebserver.gui.webservice.poll-interval:1000}") final long pollInterval,
|
@Value("${sebserver.gui.webservice.poll-interval:1000}") final long pollInterval,
|
||||||
@Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") final String remoteProctoringEndpoint) {
|
@Value("${sebserver.gui.remote.proctoring.entrypoint:/remote-proctoring}") final String remoteProctoringEndpoint) {
|
||||||
|
|
||||||
|
@ -124,6 +128,7 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
this.guiServiceInfo = guiServiceInfo;
|
this.guiServiceInfo = guiServiceInfo;
|
||||||
this.pollInterval = pollInterval;
|
this.pollInterval = pollInterval;
|
||||||
this.remoteProctoringEndpoint = remoteProctoringEndpoint;
|
this.remoteProctoringEndpoint = remoteProctoringEndpoint;
|
||||||
|
this.proctorRoomConnectionsPopup = proctorRoomConnectionsPopup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -315,10 +320,11 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
.getOr(null);
|
.getOr(null);
|
||||||
|
|
||||||
if (proctoringSettings != null && proctoringSettings.enableProctoring) {
|
if (proctoringSettings != null && proctoringSettings.enableProctoring) {
|
||||||
final Map<String, TreeItem> availableRoomNames = new HashMap<>();
|
final Map<RemoteProctoringRoom, TreeItem> availableRooms = new HashMap<>();
|
||||||
updateRoomActions(
|
updateRoomActions(
|
||||||
entityKey,
|
entityKey,
|
||||||
availableRoomNames,
|
pageContext,
|
||||||
|
availableRooms,
|
||||||
actionBuilder,
|
actionBuilder,
|
||||||
proctoringSettings);
|
proctoringSettings);
|
||||||
this.serverPushService.runServerPush(
|
this.serverPushService.runServerPush(
|
||||||
|
@ -326,7 +332,8 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
5000,
|
5000,
|
||||||
context -> updateRoomActions(
|
context -> updateRoomActions(
|
||||||
entityKey,
|
entityKey,
|
||||||
availableRoomNames,
|
pageContext,
|
||||||
|
availableRooms,
|
||||||
actionBuilder,
|
actionBuilder,
|
||||||
proctoringSettings));
|
proctoringSettings));
|
||||||
}
|
}
|
||||||
|
@ -334,7 +341,8 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
|
|
||||||
private void updateRoomActions(
|
private void updateRoomActions(
|
||||||
final EntityKey entityKey,
|
final EntityKey entityKey,
|
||||||
final Map<String, TreeItem> rooms,
|
final PageContext pageContext,
|
||||||
|
final Map<RemoteProctoringRoom, TreeItem> rooms,
|
||||||
final PageActionBuilder actionBuilder,
|
final PageActionBuilder actionBuilder,
|
||||||
final ProctoringSettings proctoringSettings) {
|
final ProctoringSettings proctoringSettings) {
|
||||||
|
|
||||||
|
@ -345,9 +353,9 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
.getOrThrow()
|
.getOrThrow()
|
||||||
.stream()
|
.stream()
|
||||||
.forEach(room -> {
|
.forEach(room -> {
|
||||||
if (rooms.containsKey(room.name)) {
|
if (rooms.containsKey(room)) {
|
||||||
// update action
|
// update action
|
||||||
final TreeItem treeItem = rooms.get(room.name);
|
final TreeItem treeItem = rooms.get(room);
|
||||||
treeItem.setText(i18nSupport.getText(new LocTextKey(
|
treeItem.setText(i18nSupport.getText(new LocTextKey(
|
||||||
ActionDefinition.MONITOR_EXAM_VIEW_PROCTOR_ROOM.title.name,
|
ActionDefinition.MONITOR_EXAM_VIEW_PROCTOR_ROOM.title.name,
|
||||||
room.subject,
|
room.subject,
|
||||||
|
@ -367,10 +375,36 @@ public class MonitoringRunningExam implements TemplateComposer {
|
||||||
.noEventPropagation()
|
.noEventPropagation()
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
this.pageService.publishAction(action, treeItem -> rooms.put(room.name, treeItem));
|
this.pageService.publishAction(action, treeItem -> rooms.put(room, treeItem));
|
||||||
|
|
||||||
|
// check and add show connections in room action adaptation
|
||||||
|
if (!rooms.isEmpty()) {
|
||||||
|
final TreeItem treeItem = rooms.values().iterator().next();
|
||||||
|
final Tree tree = treeItem.getParent();
|
||||||
|
if (tree.getData(SHOW_CONNECTION_ACTION_APPLIED) == null) {
|
||||||
|
tree.addListener(SWT.Selection, event -> {
|
||||||
|
final TreeItem item = (TreeItem) event.item;
|
||||||
|
treeItem.getParent().deselectAll();
|
||||||
|
if (event.button == 3) {
|
||||||
|
rooms.entrySet()
|
||||||
|
.stream()
|
||||||
|
.filter(e -> e.getValue().equals(item))
|
||||||
|
.findFirst()
|
||||||
|
.ifPresent(e -> {
|
||||||
|
final PageContext pc = pageContext.copy()
|
||||||
|
.clearAttributes()
|
||||||
|
.withEntityKey(new EntityKey(e.getKey().getName(),
|
||||||
|
EntityType.REMOTE_PROCTORING_ROOM))
|
||||||
|
.withParentEntityKey(entityKey);
|
||||||
|
this.proctorRoomConnectionsPopup.show(pc, e.getKey().getSubject());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tree.setData(SHOW_CONNECTION_ACTION_APPLIED, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private PageAction showExamProctoringRoom(
|
private PageAction showExamProctoringRoom(
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.content;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.page.impl.ModalInputDialog;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.session.GetProctorRoomConnections;
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
@Component
|
||||||
|
@GuiProfile
|
||||||
|
public class ProctorRoomConnectionsPopup {
|
||||||
|
|
||||||
|
private static final LocTextKey TITLE_TEXT_KEY =
|
||||||
|
new LocTextKey("sebserver.monitoring.exam.proctoring.room.connections.title");
|
||||||
|
|
||||||
|
private final PageService pageService;
|
||||||
|
|
||||||
|
protected ProctorRoomConnectionsPopup(final PageService pageService) {
|
||||||
|
this.pageService = pageService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void show(final PageContext pageContext, final String roomSubject) {
|
||||||
|
final ModalInputDialog<Void> dialog = new ModalInputDialog<>(
|
||||||
|
pageContext.getParent().getShell(),
|
||||||
|
this.pageService.getWidgetFactory());
|
||||||
|
dialog.setLargeDialogWidth();
|
||||||
|
dialog.open(
|
||||||
|
new LocTextKey(TITLE_TEXT_KEY.name, roomSubject),
|
||||||
|
pageContext,
|
||||||
|
this::compose);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void compose(final PageContext pageContext) {
|
||||||
|
final Composite parent = pageContext.getParent();
|
||||||
|
final Composite grid = this.pageService.getWidgetFactory().createPopupScrollComposite(parent);
|
||||||
|
final EntityKey entityKey = pageContext.getEntityKey();
|
||||||
|
final EntityKey parentEntityKey = pageContext.getParentEntityKey();
|
||||||
|
|
||||||
|
this.pageService.getRestService().getBuilder(GetProctorRoomConnections.class)
|
||||||
|
.withURIVariable(API.PARAM_MODEL_ID, parentEntityKey.modelId)
|
||||||
|
.withQueryParam(Domain.REMOTE_PROCTORING_ROOM.ATTR_ID, entityKey.modelId)
|
||||||
|
.call()
|
||||||
|
.getOrThrow()
|
||||||
|
.stream()
|
||||||
|
.forEach(connection -> {
|
||||||
|
final Label label = new Label(grid, SWT.NONE);
|
||||||
|
label.setText(connection.userSessionId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -42,19 +42,19 @@ import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||||
public class JitsiMeetProctoringView implements RemoteProctoringView {
|
public class JitsiMeetProctoringView implements RemoteProctoringView {
|
||||||
|
|
||||||
private static final LocTextKey CLOSE_WINDOW_TEXT_KEY =
|
private static final LocTextKey CLOSE_WINDOW_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.close");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.close");
|
||||||
private static final LocTextKey BROADCAST_AUDIO_ON_TEXT_KEY =
|
private static final LocTextKey BROADCAST_AUDIO_ON_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcaston.audio");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcaston.audio");
|
||||||
private static final LocTextKey BROADCAST_AUDIO_OFF_TEXT_KEY =
|
private static final LocTextKey BROADCAST_AUDIO_OFF_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcastoff.audio");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcastoff.audio");
|
||||||
private static final LocTextKey BROADCAST_VIDEO_ON_TEXT_KEY =
|
private static final LocTextKey BROADCAST_VIDEO_ON_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcaston.video");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcaston.video");
|
||||||
private static final LocTextKey BROADCAST_VIDEO_OFF_TEXT_KEY =
|
private static final LocTextKey BROADCAST_VIDEO_OFF_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcastoff.video");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcastoff.video");
|
||||||
private static final LocTextKey CHAT_ON_TEXT_KEY =
|
private static final LocTextKey CHAT_ON_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcaston.chat");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcaston.chat");
|
||||||
private static final LocTextKey CHAT_OFF_TEXT_KEY =
|
private static final LocTextKey CHAT_OFF_TEXT_KEY =
|
||||||
new LocTextKey("sebserver.monitoring.exam.action.broadcastoff.chat");
|
new LocTextKey("sebserver.monitoring.exam.proctoring.action.broadcastoff.chat");
|
||||||
|
|
||||||
private final PageService pageService;
|
private final PageService pageService;
|
||||||
private final GuiServiceInfo guiServiceInfo;
|
private final GuiServiceInfo guiServiceInfo;
|
||||||
|
@ -132,7 +132,8 @@ public class JitsiMeetProctoringView implements RemoteProctoringView {
|
||||||
broadcastVideoAction.addListener(SWT.Selection, event -> toggleBroadcastVideo(
|
broadcastVideoAction.addListener(SWT.Selection, event -> toggleBroadcastVideo(
|
||||||
proctoringWindowData.examId,
|
proctoringWindowData.examId,
|
||||||
proctoringWindowData.connectionData.roomName,
|
proctoringWindowData.connectionData.roomName,
|
||||||
broadcastVideoAction));
|
broadcastVideoAction,
|
||||||
|
broadcastAudioAction));
|
||||||
broadcastVideoAction.setData(BroadcastActionState.KEY_NAME, broadcastActionState);
|
broadcastVideoAction.setData(BroadcastActionState.KEY_NAME, broadcastActionState);
|
||||||
|
|
||||||
final Button chatAction = widgetFactory.buttonLocalized(footer, CHAT_ON_TEXT_KEY);
|
final Button chatAction = widgetFactory.buttonLocalized(footer, CHAT_ON_TEXT_KEY);
|
||||||
|
@ -172,24 +173,37 @@ public class JitsiMeetProctoringView implements RemoteProctoringView {
|
||||||
state.audio = !state.audio;
|
state.audio = !state.audio;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleBroadcastVideo(final String examId, final String roomName, final Button broadcastAction) {
|
private void toggleBroadcastVideo(
|
||||||
|
final String examId,
|
||||||
|
final String roomName,
|
||||||
|
final Button videoAction,
|
||||||
|
final Button audioAction) {
|
||||||
final BroadcastActionState state =
|
final BroadcastActionState state =
|
||||||
(BroadcastActionState) broadcastAction.getData(BroadcastActionState.KEY_NAME);
|
(BroadcastActionState) videoAction.getData(BroadcastActionState.KEY_NAME);
|
||||||
if (state.video) {
|
if (state.video) {
|
||||||
this.pageService.getPolyglotPageService().injectI18n(broadcastAction, BROADCAST_VIDEO_ON_TEXT_KEY);
|
this.pageService.getPolyglotPageService().injectI18n(audioAction, BROADCAST_AUDIO_ON_TEXT_KEY);
|
||||||
|
this.pageService.getPolyglotPageService().injectI18n(videoAction, BROADCAST_VIDEO_ON_TEXT_KEY);
|
||||||
|
|
||||||
this.pageService.getRestService().getBuilder(SendProctoringBroadcastOffInstruction.class)
|
this.pageService.getRestService().getBuilder(SendProctoringBroadcastOffInstruction.class)
|
||||||
.withURIVariable(API.PARAM_MODEL_ID, examId)
|
.withURIVariable(API.PARAM_MODEL_ID, examId)
|
||||||
.withFormParam(Domain.REMOTE_PROCTORING_ROOM.ATTR_ID, roomName)
|
.withFormParam(Domain.REMOTE_PROCTORING_ROOM.ATTR_ID, roomName)
|
||||||
|
.withFormParam(
|
||||||
|
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_AUDIO,
|
||||||
|
Constants.TRUE_STRING)
|
||||||
.withFormParam(
|
.withFormParam(
|
||||||
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_VIDEO,
|
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_VIDEO,
|
||||||
Constants.TRUE_STRING)
|
Constants.TRUE_STRING)
|
||||||
.call()
|
.call()
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
} else {
|
} else {
|
||||||
this.pageService.getPolyglotPageService().injectI18n(broadcastAction, BROADCAST_VIDEO_OFF_TEXT_KEY);
|
this.pageService.getPolyglotPageService().injectI18n(audioAction, BROADCAST_AUDIO_OFF_TEXT_KEY);
|
||||||
|
this.pageService.getPolyglotPageService().injectI18n(videoAction, BROADCAST_VIDEO_OFF_TEXT_KEY);
|
||||||
this.pageService.getRestService().getBuilder(SendProctoringBroadcastOnInstruction.class)
|
this.pageService.getRestService().getBuilder(SendProctoringBroadcastOnInstruction.class)
|
||||||
.withURIVariable(API.PARAM_MODEL_ID, examId)
|
.withURIVariable(API.PARAM_MODEL_ID, examId)
|
||||||
.withFormParam(Domain.REMOTE_PROCTORING_ROOM.ATTR_ID, roomName)
|
.withFormParam(Domain.REMOTE_PROCTORING_ROOM.ATTR_ID, roomName)
|
||||||
|
.withFormParam(
|
||||||
|
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_AUDIO,
|
||||||
|
Constants.TRUE_STRING)
|
||||||
.withFormParam(
|
.withFormParam(
|
||||||
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_VIDEO,
|
ClientInstruction.SEB_INSTRUCTION_ATTRIBUTES.SEB_RECONFIGURE_SETTINGS.JITSI_RECEIVE_VIDEO,
|
||||||
Constants.TRUE_STRING)
|
Constants.TRUE_STRING)
|
||||||
|
@ -197,6 +211,7 @@ public class JitsiMeetProctoringView implements RemoteProctoringView {
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
}
|
}
|
||||||
state.video = !state.video;
|
state.video = !state.video;
|
||||||
|
state.audio = state.video;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleChat(final String examId, final String roomName, final Button broadcastAction) {
|
private void toggleChat(final String examId, final String roomName, final Button broadcastAction) {
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.session;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||||
|
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
@Component
|
||||||
|
@GuiProfile
|
||||||
|
public class GetProctorRoomConnections extends RestCall<Collection<ClientConnection>> {
|
||||||
|
|
||||||
|
public GetProctorRoomConnections() {
|
||||||
|
super(new TypeKey<>(
|
||||||
|
CallType.GET_LIST,
|
||||||
|
EntityType.CLIENT_CONNECTION,
|
||||||
|
new TypeReference<Collection<ClientConnection>>() {
|
||||||
|
}),
|
||||||
|
HttpMethod.GET,
|
||||||
|
MediaType.APPLICATION_FORM_URLENCODED,
|
||||||
|
API.EXAM_MONITORING_ENDPOINT
|
||||||
|
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||||
|
+ API.PROCTORING_PATH_SEGMENT
|
||||||
|
+ API.PROCTORING_ROOM_CONNECTIONS_PATH_SEGMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -360,7 +360,7 @@ public class ExamMonitoringController {
|
||||||
@PathVariable(name = API.PARAM_MODEL_ID) final Long examId,
|
@PathVariable(name = API.PARAM_MODEL_ID) final Long examId,
|
||||||
@RequestParam(
|
@RequestParam(
|
||||||
name = Domain.REMOTE_PROCTORING_ROOM.ATTR_ID,
|
name = Domain.REMOTE_PROCTORING_ROOM.ATTR_ID,
|
||||||
required = true) final Long roomId) {
|
required = true) final String roomName) {
|
||||||
|
|
||||||
this.authorization.check(
|
this.authorization.check(
|
||||||
PrivilegeType.READ,
|
PrivilegeType.READ,
|
||||||
|
@ -370,7 +370,7 @@ public class ExamMonitoringController {
|
||||||
this.authorization.checkRead(
|
this.authorization.checkRead(
|
||||||
this.examSessionService.getExamDAO().byPK(examId).getOrThrow());
|
this.examSessionService.getExamDAO().byPK(examId).getOrThrow());
|
||||||
|
|
||||||
return this.examProcotringRoomService.getRoomConnections(roomId)
|
return this.examProcotringRoomService.getRoomConnections(examId, roomName)
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,62 +639,6 @@ public class ExamMonitoringController {
|
||||||
.getOrThrow();
|
.getOrThrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
// @RequestMapping(
|
|
||||||
// path = API.MODEL_ID_VAR_PATH_SEGMENT
|
|
||||||
// + API.PROCTORING_PATH_SEGMENT
|
|
||||||
// + API.PROCTORING_LEAVE_ROOM_PATH_SEGMENT,
|
|
||||||
// method = RequestMethod.POST,
|
|
||||||
// produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
|
||||||
// public List<SEBProctoringConnectionData> leaveProctoringRoom(
|
|
||||||
// @RequestParam(
|
|
||||||
// name = API.PARAM_INSTITUTION_ID,
|
|
||||||
// required = true,
|
|
||||||
// defaultValue = UserService.USERS_INSTITUTION_AS_DEFAULT) final Long institutionId,
|
|
||||||
// @PathVariable(name = API.PARAM_MODEL_ID) final Long examId,
|
|
||||||
// @RequestParam(
|
|
||||||
// name = SEBProctoringConnectionData.ATTR_ROOM_NAME,
|
|
||||||
// required = true) final String roomName,
|
|
||||||
// @RequestParam(
|
|
||||||
// name = API.EXAM_API_SEB_CONNECTION_TOKEN,
|
|
||||||
// required = true) final String connectionTokens) {
|
|
||||||
//
|
|
||||||
// this.authorization.check(
|
|
||||||
// PrivilegeType.READ,
|
|
||||||
// EntityType.EXAM,
|
|
||||||
// institutionId);
|
|
||||||
//
|
|
||||||
// final ProctoringSettings settings = this.examSessionService
|
|
||||||
// .getRunningExam(examId)
|
|
||||||
// .flatMap(this.authorization::checkRead)
|
|
||||||
// .flatMap(this.examAdminService::getExamProctoring)
|
|
||||||
// .getOrThrow();
|
|
||||||
//
|
|
||||||
// final ExamProctoringService examProctoringService = this.examAdminService
|
|
||||||
// .getExamProctoringService(settings.serverType)
|
|
||||||
// .getOrThrow();
|
|
||||||
//
|
|
||||||
// if (StringUtils.isNotBlank(connectionTokens)) {
|
|
||||||
// return (connectionTokens.contains(Constants.LIST_SEPARATOR)
|
|
||||||
// ? Arrays.asList(StringUtils.split(connectionTokens, Constants.LIST_SEPARATOR))
|
|
||||||
// : Arrays.asList(connectionTokens))
|
|
||||||
// .stream()
|
|
||||||
// .map(connectionToken -> {
|
|
||||||
// final SEBProctoringConnectionData data = examProctoringService
|
|
||||||
// .createClientPublicRoomConnection(settings, connectionToken, roomName, roomName)
|
|
||||||
// .getOrThrow();
|
|
||||||
//
|
|
||||||
// sendLeaveInstruction(examId, connectionTokens, data)
|
|
||||||
// .onError(error -> log.error(
|
|
||||||
// "Failed to send proctoring leave instruction for common room to client: {} ",
|
|
||||||
// connectionToken, error));
|
|
||||||
// return data;
|
|
||||||
//
|
|
||||||
// }).collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return Collections.emptyList();
|
|
||||||
// }
|
|
||||||
|
|
||||||
//**** Proctoring
|
//**** Proctoring
|
||||||
//***********************************************************************************************
|
//***********************************************************************************************
|
||||||
|
|
||||||
|
|
|
@ -1437,17 +1437,19 @@ sebserver.monitoring.exam.list.title=Running Exams
|
||||||
sebserver.monitoring.exam.list.actions=
|
sebserver.monitoring.exam.list.actions=
|
||||||
sebserver.monitoring.exam.action.detail.view=Back To Monitoring
|
sebserver.monitoring.exam.action.detail.view=Back To Monitoring
|
||||||
sebserver.monitoring.exam.action.list.view=Monitoring
|
sebserver.monitoring.exam.action.list.view=Monitoring
|
||||||
sebserver.monitoring.exam.action.close=Close Window
|
sebserver.monitoring.exam.action.viewroom=View {0} ( {1} / {2} )
|
||||||
sebserver.monitoring.exam.action.broadcaston.audio=Start Audio Broadcast
|
|
||||||
sebserver.monitoring.exam.action.broadcastoff.audio=End Audio Broadcast
|
|
||||||
sebserver.monitoring.exam.action.broadcaston.video=Start Video Broadcast
|
|
||||||
sebserver.monitoring.exam.action.broadcastoff.video=End Video Broadcast
|
|
||||||
sebserver.monitoring.exam.action.broadcaston.chat=Enable Chat
|
|
||||||
sebserver.monitoring.exam.action.broadcastoff.chat=Disable Chat
|
|
||||||
sebserver.monitoring.exam.action.viewroom=View {0} | {1} / {2}
|
|
||||||
sebserver.exam.monitoring.action.category.filter=Filter
|
sebserver.exam.monitoring.action.category.filter=Filter
|
||||||
sebserver.exam.overall.action.category.proctoring=Proctoring
|
sebserver.exam.overall.action.category.proctoring=Proctoring
|
||||||
|
|
||||||
|
sebserver.monitoring.exam.proctoring.action.close=Close Window
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcaston.audio=Start Audio Broadcast
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcastoff.audio=End Audio Broadcast
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcaston.video=Start Video Broadcast
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcastoff.video=End Video Broadcast
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcaston.chat=Enable Chat
|
||||||
|
sebserver.monitoring.exam.proctoring.action.broadcastoff.chat=Disable Chat
|
||||||
|
sebserver.monitoring.exam.proctoring.room.connections.title=SEB Connections in {0}
|
||||||
|
|
||||||
|
|
||||||
sebserver.monitoring.exam.info.pleaseSelect=At first please select an Exam from the list
|
sebserver.monitoring.exam.info.pleaseSelect=At first please select an Exam from the list
|
||||||
sebserver.monitoring.exam.list.empty=There are currently no running exams
|
sebserver.monitoring.exam.list.empty=There are currently no running exams
|
||||||
|
|
Loading…
Add table
Reference in a new issue