/** * Starts new {@link CandidateSession} for the given {@link User} on the given {@link Delivery} * * <p>NB: No checks are made on whether the {@link User} should be allowed to start a session on * this {@link Delivery}. */ public CandidateSession launchCandidateSession( final User candidate, final Delivery delivery, final boolean authorMode, final String lisOutcomeServiceUrl, final String lisResultSourcedid) throws CandidateException { Assert.notNull(candidate, "candidate"); Assert.notNull(delivery, "delivery"); /* Make sure Candidate's account is not disabled */ if (candidate.isLoginDisabled()) { logAndThrowLaunchException( candidate, delivery, CandidateExceptionReason.USER_ACCOUNT_DISABLED); } /* Make sure Delivery is runnable */ if (delivery.getAssessment() == null) { logAndThrowLaunchException( candidate, delivery, CandidateExceptionReason.LAUNCH_INCOMPLETE_DELIVERY); } /* If the candidate already has any non-terminated sessions open for this Delivery, * then we shall reconnect to the (most recent) session instead of creating a new one. */ final List<CandidateSession> existingSessions = candidateSessionDao.getNonTerminatedForDeliveryAndCandidate(delivery, candidate); if (!existingSessions.isEmpty()) { final CandidateSession mostRecent = existingSessions.get(existingSessions.size() - 1); auditLogger.recordEvent( "Reconnected to existing CandidateSession #" + mostRecent.getId() + " on Delivery #" + delivery.getId()); return mostRecent; } /* No existing session to reconnect to, so create a new session. * * (NB: The session will later need to be explicitly entered before anything can be done * with it.) */ final CandidateSession candidateSession = new CandidateSession(); candidateSession.setLisOutcomeServiceUrl(lisOutcomeServiceUrl); candidateSession.setLisResultSourcedid(lisResultSourcedid); candidateSession.setCandidate(candidate); candidateSession.setDelivery(delivery); candidateSession.setAuthorMode(authorMode); candidateSession.setFinishTime(null); candidateSession.setTerminationTime(null); candidateSession.setExploded(false); candidateSessionDao.persist(candidateSession); auditLogger.recordEvent( "Created and initialised new CandidateSession #" + candidateSession.getId() + " on Delivery #" + delivery.getId()); return candidateSession; }
private void ensureTestDelivery(final Delivery delivery) { Assert.notNull(delivery, "delivery"); if (delivery.getAssessment().getAssessmentType() != AssessmentObjectType.ASSESSMENT_TEST) { throw new IllegalArgumentException("Expected " + delivery + " to correspond to a Test"); } }
public void ensureItemDelivery(final Delivery delivery) { Assert.notNull(delivery, "delivery"); if (delivery.getAssessment().getAssessmentType() != AssessmentObjectType.ASSESSMENT_ITEM) { throw new IllegalArgumentException("Expected " + delivery + " to correspond to an Item"); } }