diff --git a/findbugs-excludes.xml b/findbugs-excludes.xml
index 5170e613..95da4dcd 100644
--- a/findbugs-excludes.xml
+++ b/findbugs-excludes.xml
@@ -12,9 +12,11 @@
-
-
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/ExamSessionService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/ExamSessionService.java
index 61103db9..8c59b82f 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/ExamSessionService.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/ExamSessionService.java
@@ -47,14 +47,21 @@ public interface ExamSessionService {
void streamDefaultExamConfig(String connectionToken, OutputStream out);
/** Get current ClientConnectionData for a specified active SEB client connection.
- *
+ *
+ * active SEB client connections are connections that were initialized by a SEB client
+ * on the particular server instance.
+ *
* @param connectionToken the connection token of the active SEB client connection
* @return */
Result getConnectionData(String connectionToken);
/** Get the collection of ClientConnectionData of all active SEB client connections
* of a running exam.
- *
+ *
+ * active SEB client connections are connections that were initialized by a SEB client
+ * on the particular server instance. This may not be the all connections of an exam but
+ * a subset of them.
+ *
* @param examId The exam identifier
* @return collection of ClientConnectionData of all active SEB client connections
* of a running exam */
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/SebClientConnectionService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/SebClientConnectionService.java
index 24b96588..cf3d346c 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/SebClientConnectionService.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/SebClientConnectionService.java
@@ -9,7 +9,6 @@
package ch.ethz.seb.sebserver.webservice.servicelayer.session;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection;
-import ch.ethz.seb.sebserver.gbl.model.session.ClientConnectionData;
import ch.ethz.seb.sebserver.gbl.model.session.ClientEvent;
import ch.ethz.seb.sebserver.gbl.util.Result;
@@ -100,12 +99,6 @@ public interface SebClientConnectionService {
Long institutionId,
String clientAddress);
- /** Get ClientConnectionData for an active connection (connection on running exam)
- *
- * @param connectionToken The connection token of the connection to get the ClientConnectionData from
- * @return ClientConnectionData for an active connection (connection on running exam) */
- Result getActiveConnectionData(String connectionToken);
-
/** Notify a ping for a certain client connection.
*
* @param connectionToken the connection token
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ExamSessionServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ExamSessionServiceImpl.java
index f28e55ff..4bae21ae 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ExamSessionServiceImpl.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ExamSessionServiceImpl.java
@@ -17,6 +17,8 @@ import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;
@@ -40,15 +42,18 @@ public class ExamSessionServiceImpl implements ExamSessionService {
private final ClientConnectionDAO clientConnectionDAO;
private final ExamSessionCacheService examSessionCacheService;
private final ExamDAO examDAO;
+ private final CacheManager cacheManager;
protected ExamSessionServiceImpl(
final ExamSessionCacheService examSessionCacheService,
final ExamDAO examDAO,
- final ClientConnectionDAO clientConnectionDAO) {
+ final ClientConnectionDAO clientConnectionDAO,
+ final CacheManager cacheManager) {
this.examSessionCacheService = examSessionCacheService;
this.examDAO = examDAO;
this.clientConnectionDAO = clientConnectionDAO;
+ this.cacheManager = cacheManager;
}
@Override
@@ -147,25 +152,24 @@ public class ExamSessionServiceImpl implements ExamSessionService {
@Override
public Result getConnectionData(final String connectionToken) {
- final ClientConnectionDataInternal activeClientConnection = this.examSessionCacheService
- .getActiveClientConnection(connectionToken);
-
- if (activeClientConnection == null) {
- log.error("No active ClientConnection found for token: {}", connectionToken);
- return Result.ofError(new IllegalArgumentException("No active ClientConnection found for token"));
- } else {
- return Result.of(activeClientConnection);
- }
+ return Result.tryCatch(() -> {
+ final Cache cache = this.cacheManager.getCache(ExamSessionCacheService.CACHE_NAME_ACTIVE_CLIENT_CONNECTION);
+ return cache.get(connectionToken, ClientConnectionData.class);
+ });
}
@Override
public Result> getConnectionData(final Long examId) {
- return this.clientConnectionDAO
- .getConnectionTokens(examId)
- .map(all -> all
- .stream()
- .map(this.examSessionCacheService::getActiveClientConnection)
- .collect(Collectors.toList()));
+ return Result.tryCatch(() -> {
+ final Cache cache = this.cacheManager.getCache(ExamSessionCacheService.CACHE_NAME_ACTIVE_CLIENT_CONNECTION);
+ return this.clientConnectionDAO
+ .getConnectionTokens(examId)
+ .getOrThrow()
+ .stream()
+ .map(token -> cache.get(token, ClientConnectionData.class))
+ .filter(data -> data != null)
+ .collect(Collectors.toList());
+ });
}
private void flushCache(final Exam exam) {
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/SebClientConnectionServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/SebClientConnectionServiceImpl.java
index 41b2c53e..28ff2bbf 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/SebClientConnectionServiceImpl.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/SebClientConnectionServiceImpl.java
@@ -20,7 +20,6 @@ import org.springframework.stereotype.Service;
import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamType;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection;
import ch.ethz.seb.sebserver.gbl.model.session.ClientConnection.ConnectionStatus;
-import ch.ethz.seb.sebserver.gbl.model.session.ClientConnectionData;
import ch.ethz.seb.sebserver.gbl.model.session.ClientEvent;
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
import ch.ethz.seb.sebserver.gbl.util.Result;
@@ -339,19 +338,6 @@ public class SebClientConnectionServiceImpl implements SebClientConnectionServic
});
}
- @Override
- public Result getActiveConnectionData(final String connectionToken) {
- final ClientConnectionDataInternal activeClientConnection = this.examSessionCacheService
- .getActiveClientConnection(connectionToken);
-
- if (activeClientConnection == null) {
- return Result
- .ofError(new IllegalArgumentException("No active client connection found for connectionToken"));
- } else {
- return Result.of(activeClientConnection);
- }
- }
-
@Override
public void notifyPing(
final String connectionToken,
diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/ExamAPI_V1_Controller.java b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/ExamAPI_V1_Controller.java
index 0ee88e01..b30f2bf4 100644
--- a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/ExamAPI_V1_Controller.java
+++ b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/ExamAPI_V1_Controller.java
@@ -259,8 +259,8 @@ public class ExamAPI_V1_Controller {
handshakeUpdate(connectionToken, Long.valueOf(examId), null, principal, request);
}
- final ClientConnectionData connection = this.sebClientConnectionService
- .getActiveConnectionData(connectionToken)
+ final ClientConnectionData connection = this.examSessionService
+ .getConnectionData(connectionToken)
.getOrThrow();
// exam integrity check