Skip to content

Commit

Permalink
add issue filters to exam monitoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Nadim Ritter committed Jan 25, 2024
1 parent 7ffef09 commit 8f0f691
Show file tree
Hide file tree
Showing 11 changed files with 317 additions and 17 deletions.
2 changes: 2 additions & 0 deletions src/main/java/ch/ethz/seb/sebserver/gbl/api/API.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@ private BatchActionType(final EntityType entityType) {
public static final String EXAM_MONITORING_SIGNATURE_KEY_ENDPOINT = "/signature";
public static final String EXAM_MONITORING_STATE_FILTER = "hidden-states";
public static final String EXAM_MONITORING_CLIENT_GROUP_FILTER = "hidden-client-group";
public static final String EXAM_MONITORING_ISSUE_FILTER = "hidden-issues";

public static final String EXAM_MONITORING_FINISHED_ENDPOINT = "/finishedexams";
public static final String EXAM_MONITORING_SEB_CONNECTION_TOKEN_PATH_SEGMENT =
"/{" + EXAM_API_SEB_CONNECTION_TOKEN + "}";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@ public enum ConnectionStatus {
}
}

public enum ConnectionIssueStatus {
ASK_GRANTED(0),
SEB_VERSION_GRANTED(1);

public final int code;

ConnectionIssueStatus(final int code){
this.code = code;
}
}

public final static List<String> ACTIVE_STATES = Utils.immutableListOf(
ConnectionStatus.ACTIVE.name(),
ConnectionStatus.READY.name(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;

import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection.ConnectionStatus;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection.ConnectionIssueStatus;
import ch.ethz.seb.sebserver.gbl.model.session.ClientMonitoringData;
import ch.ethz.seb.sebserver.gbl.model.session.ClientMonitoringDataView;

Expand All @@ -27,6 +28,7 @@ public class MonitoringSEBConnectionData {
public static final String ATTR_CONNECTIONS = "cons";
public static final String ATTR_STATUS_MAPPING = "sm";
public static final String ATTR_CLIENT_GROUP_MAPPING = "cgm";
public static final String ATTR_ISSUE_MAPPING = "im";

@JsonProperty(ATTR_CONNECTIONS)
public final Collection<? extends ClientMonitoringDataView> monitoringData;
Expand All @@ -37,25 +39,33 @@ public class MonitoringSEBConnectionData {
@JsonProperty(ATTR_CLIENT_GROUP_MAPPING)
public final Map<Long, Integer> connectionsPerClientGroup;

@JsonProperty(ATTR_ISSUE_MAPPING)
public final int[] connectionPerIssue;


@JsonCreator
public MonitoringSEBConnectionData(
@JsonProperty(ATTR_CONNECTIONS) final Collection<ClientMonitoringData> connections,
@JsonProperty(ATTR_STATUS_MAPPING) final int[] connectionsPerStatus,
@JsonProperty(ATTR_ISSUE_MAPPING) final int[] connectionPerIssue,
@JsonProperty(ATTR_CLIENT_GROUP_MAPPING) final Map<Long, Integer> connectionsPerClientGroup) {

this.monitoringData = connections;
this.connectionsPerStatus = connectionsPerStatus;
this.connectionPerIssue = connectionPerIssue;
this.connectionsPerClientGroup = connectionsPerClientGroup;
}

public MonitoringSEBConnectionData(
final int[] connectionsPerStatus,
final Map<Long, Integer> connectionsPerClientGroup,
final int[] connectionsPerIssue,
final Collection<? extends ClientMonitoringDataView> connections) {

this.monitoringData = connections;
this.connectionsPerStatus = connectionsPerStatus;
this.connectionsPerClientGroup = connectionsPerClientGroup;
this.connectionPerIssue = connectionsPerIssue;
this.monitoringData = connections;
}

public Collection<? extends ClientMonitoringDataView> getMonitoringData() {
Expand All @@ -82,6 +92,14 @@ public int getNumberOfConnection(final Long clientGroupId) {
return this.connectionsPerClientGroup.get(clientGroupId);
}

@JsonIgnore
public int getNumberOfConnection(final ConnectionIssueStatus connectionIssueStatus) {
if (this.connectionPerIssue == null || this.connectionPerIssue.length <= connectionIssueStatus.code) {
return -1;

Check warning on line 98 in src/main/java/ch/ethz/seb/sebserver/gbl/monitoring/MonitoringSEBConnectionData.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/ch/ethz/seb/sebserver/gbl/monitoring/MonitoringSEBConnectionData.java#L98

Added line #L98 was not covered by tests
}
return this.connectionPerIssue[connectionIssueStatus.code];

Check warning on line 100 in src/main/java/ch/ethz/seb/sebserver/gbl/monitoring/MonitoringSEBConnectionData.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/ch/ethz/seb/sebserver/gbl/monitoring/MonitoringSEBConnectionData.java#L100

Added line #L100 was not covered by tests
}

@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ public enum ActionCategory {
VARIA(new LocTextKey("sebserver.overall.action.category.varia"), 0),
STATE_FILTER(new LocTextKey("sebserver.exam.monitoring.action.category.statefilter"), 40),
GROUP_FILTER(new LocTextKey("sebserver.exam.monitoring.action.category.groupfilter"), 50),
PROCTORING(new LocTextKey("sebserver.exam.overall.action.category.proctoring"), 60),
SCREEN_PROCTORING(new LocTextKey("sebserver.exam.overall.action.category.screenproctoring"), 65),
ISSUE_FILTER(new LocTextKey("sebserver.exam.monitoring.action.category.issuefilter"), 60),
PROCTORING(new LocTextKey("sebserver.exam.overall.action.category.proctoring"), 70),
SCREEN_PROCTORING(new LocTextKey("sebserver.exam.overall.action.category.screenproctoring"), 75),

FINISHED_EXAM_LIST(new LocTextKey("sebserver.finished.exam.list.actions"), 1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,30 @@ public enum ActionDefinition {
PageStateDefinitionImpl.MONITORING_RUNNING_EXAM,
ActionCategory.GROUP_FILTER),

MONITOR_EXAM_HIDE_ASK_GRANTED(
new LocTextKey("sebserver.monitoring.exam.connection.action.hide.askgranted"),
ImageIcon.TOGGLE_OFF,
PageStateDefinitionImpl.MONITORING_RUNNING_EXAM,
ActionCategory.ISSUE_FILTER),

MONITOR_EXAM_SHOW_ASK_GRANTED(
new LocTextKey("sebserver.monitoring.exam.connection.action.show.askgranted"),
ImageIcon.TOGGLE_ON,
PageStateDefinitionImpl.MONITORING_RUNNING_EXAM,
ActionCategory.ISSUE_FILTER),

MONITOR_EXAM_HIDE_SEB_VERSION_GRANTED(
new LocTextKey("sebserver.monitoring.exam.connection.action.hide.sebversiongranted"),
ImageIcon.TOGGLE_OFF,
PageStateDefinitionImpl.MONITORING_RUNNING_EXAM,
ActionCategory.ISSUE_FILTER),

MONITOR_EXAM_SHOW_SEB_VERSION_GRANTED(
new LocTextKey("sebserver.monitoring.exam.connection.action.show.sebversiongranted"),
ImageIcon.TOGGLE_ON,
PageStateDefinitionImpl.MONITORING_RUNNING_EXAM,
ActionCategory.ISSUE_FILTER),

MONITORING_EXAM_SEARCH_CONNECTIONS(
new LocTextKey("sebserver.monitoring.search.action"),
ImageIcon.SEARCH,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import ch.ethz.seb.sebserver.gbl.model.exam.ProctoringServiceSettings.ProctoringFeature;
import ch.ethz.seb.sebserver.gbl.model.exam.ScreenProctoringSettings;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection.ConnectionStatus;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection.ConnectionIssueStatus;
import ch.ethz.seb.sebserver.gbl.model.session.RemoteProctoringRoom;
import ch.ethz.seb.sebserver.gbl.model.session.ScreenProctoringGroup;
import ch.ethz.seb.sebserver.gbl.model.user.UserInfo;
Expand Down Expand Up @@ -437,6 +438,23 @@ private FullPageMonitoringGUIUpdate createFilterActions(
ActionDefinition.MONITOR_EXAM_SHOW_DISABLED_CONNECTION,
ActionDefinition.MONITOR_EXAM_HIDE_DISABLED_CONNECTION);

addIssueFilterAction(
monitoringStatus,
statusFilterGUIUpdate,
actionBuilder,
clientTable,
ConnectionIssueStatus.ASK_GRANTED,
ActionDefinition.MONITOR_EXAM_SHOW_ASK_GRANTED,
ActionDefinition.MONITOR_EXAM_HIDE_ASK_GRANTED);
addIssueFilterAction(
monitoringStatus,
statusFilterGUIUpdate,
actionBuilder,
clientTable,
ConnectionIssueStatus.SEB_VERSION_GRANTED,
ActionDefinition.MONITOR_EXAM_SHOW_SEB_VERSION_GRANTED,
ActionDefinition.MONITOR_EXAM_HIDE_SEB_VERSION_GRANTED);

if (clientGroups != null && !clientGroups.isEmpty()) {
clientGroups.forEach(clientGroup -> {

Expand All @@ -455,6 +473,34 @@ private FullPageMonitoringGUIUpdate createFilterActions(
return statusFilterGUIUpdate;
}

private void addIssueFilterAction(
final MonitoringFilter filter,
final FilterGUIUpdate filterGUIUpdate,
final PageActionBuilder actionBuilder,
final ClientConnectionTable clientTable,
final ConnectionIssueStatus connectionIssueStatus,
final ActionDefinition showActionDef,
final ActionDefinition hideActionDef) {


final int numOfConnections = filter.getNumOfConnections(connectionIssueStatus);
final PageAction action = actionBuilder.newAction(hideActionDef)
.withExec(hideIssueViewAction(filter, clientTable, connectionIssueStatus))
.noEventPropagation()
.withSwitchAction(
actionBuilder.newAction(showActionDef)
.withExec(showIssueViewAction(filter, clientTable, connectionIssueStatus))
.noEventPropagation()
.withNameAttributes(numOfConnections)
.create())
.withNameAttributes(numOfConnections)
.create();

this.pageService.publishAction(
action,
treeItem -> filterGUIUpdate.register(treeItem, connectionIssueStatus));
}

private void addFilterAction(
final MonitoringFilter filter,
final FilterGUIUpdate filterGUIUpdate,
Expand Down Expand Up @@ -544,6 +590,7 @@ private static class FilterGUIUpdate implements FullPageMonitoringGUIUpdate {

private final PolyglotPageService polyglotPageService;
private final TreeItem[] actionItemPerStateFilter = new TreeItem[ConnectionStatus.values().length];
private final TreeItem[] actionItemPerIssueFilter = new TreeItem[ConnectionIssueStatus.values().length];
private final Map<Long, TreeItem> actionItemPerClientGroup = new HashMap<>();

public FilterGUIUpdate(final PolyglotPageService polyglotPageService) {
Expand All @@ -558,6 +605,10 @@ void register(final TreeItem item, final Long clientGroupId) {
this.actionItemPerClientGroup.put(clientGroupId, item);
}

void register(final TreeItem item, final ConnectionIssueStatus status) {
this.actionItemPerIssueFilter[status.code] = item;
}

@Override
public void update(final MonitoringFilter monitoringStatus) {
final ConnectionStatus[] states = ConnectionStatus.values();
Expand All @@ -572,6 +623,19 @@ public void update(final MonitoringFilter monitoringStatus) {
}
}

final ConnectionIssueStatus[] connectionIssueStates = ConnectionIssueStatus.values();
for (int i = 0; i < connectionIssueStates.length; i++) {
final ConnectionIssueStatus state = connectionIssueStates[i];
final int numOfConnections = monitoringStatus.getNumOfConnections(state);
if (numOfConnections >= 0 && this.actionItemPerIssueFilter[state.code] != null) {
final TreeItem treeItem = this.actionItemPerIssueFilter[state.code];
final PageAction action = (PageAction) treeItem.getData(ActionPane.ACTION_EVENT_CALL_KEY);
action.setTitleArgument(0, numOfConnections);
this.polyglotPageService.injectI18n(treeItem, action.getTitle());
}
}


if (!this.actionItemPerClientGroup.isEmpty()) {
this.actionItemPerClientGroup.entrySet().stream().forEach(entry -> {
final int numOfConnections = monitoringStatus.getNumOfConnections(entry.getKey());
Expand Down Expand Up @@ -639,6 +703,32 @@ private static Function<PageAction, PageAction> hideClientGroupViewAction(
};
}

private static Function<PageAction, PageAction> showIssueViewAction(
final MonitoringFilter monitoringStatus,
final ClientConnectionTable clientTable,
final ConnectionIssueStatus connectionIssueStatus) {

return action -> {
monitoringStatus.showIssue(connectionIssueStatus);
clientTable.removeSelection();
return action;
};

}

private static Function<PageAction, PageAction> hideIssueViewAction(
final MonitoringFilter monitoringStatus,
final ClientConnectionTable clientTable,
final ConnectionIssueStatus connectionIssueStatus) {

return action -> {
monitoringStatus.hideIssue(connectionIssueStatus);
clientTable.removeSelection();
return action;
};

}

private Set<EntityKey> selectionForInstruction(final ClientConnectionTable clientTable) {
final Set<String> connectionTokens = clientTable.getConnectionTokens(
cc -> cc.getStatus().clientActiveStatus,
Expand Down
Loading

0 comments on commit 8f0f691

Please sign in to comment.