Skip to content
Snippets Groups Projects
Commit 6d13a302 authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_15.0'

parents 42b3999e a110e1c0
No related branches found
No related tags found
No related merge requests found
Showing
with 102 additions and 94 deletions
...@@ -112,10 +112,9 @@ public interface AssessmentManager { ...@@ -112,10 +112,9 @@ public interface AssessmentManager {
* @param userCourseEnvironment * @param userCourseEnvironment
* @param fullyAssessed * @param fullyAssessed
* @param status * @param status
* @param by
*/ */
public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment,
Boolean fullyAssessed, AssessmentEntryStatus status, Role by); Boolean fullyAssessed, AssessmentEntryStatus status);
/** /**
* Save an assessment comment for this node for a user. If there is already a comment property available, * Save an assessment comment for this node for a user. If there is already a comment property available,
......
...@@ -130,7 +130,7 @@ public interface CourseAssessmentService { ...@@ -130,7 +130,7 @@ public interface CourseAssessmentService {
Double completion, AssessmentEntryStatus status, Role by); Double completion, AssessmentEntryStatus status, Role by);
public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment,
Boolean fullyAssessed, AssessmentEntryStatus status, Role by); Boolean fullyAssessed, AssessmentEntryStatus status);
/** /**
* @param courseNode * @param courseNode
......
...@@ -440,7 +440,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -440,7 +440,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
assessmentService.updateAssessmentEntry(nodeAssessment); assessmentService.updateAssessmentEntry(nodeAssessment);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
nodeAccessService.onStatusUpdated(courseNode, userCourseEnvironment, status, by); nodeAccessService.onStatusUpdated(courseNode, userCourseEnvironment, status);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
...@@ -450,7 +450,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -450,7 +450,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
@Override @Override
public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, Boolean fullyAssessed, public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, Boolean fullyAssessed,
AssessmentEntryStatus status, Role by) { AssessmentEntryStatus status) {
Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry()); ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
Boolean entryRoot = isEntryRoot(course, courseNode); Boolean entryRoot = isEntryRoot(course, courseNode);
...@@ -460,11 +460,6 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -460,11 +460,6 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
return; return;
} }
if (by == Role.coach) {
nodeAssessment.setLastCoachModified(new Date());
} else if (by == Role.user) {
nodeAssessment.setLastUserModified(new Date());
}
nodeAssessment.setAssessmentStatus(status); nodeAssessment.setAssessmentStatus(status);
nodeAssessment.setFullyAssessed(fullyAssessed); nodeAssessment.setFullyAssessed(fullyAssessed);
...@@ -533,9 +528,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -533,9 +528,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry); assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
nodeAccessService.onScoreUpdated(courseNode, userCourseEnv, score, assessmentEntry.getUserVisibility(), by); nodeAccessService.onScoreUpdated(courseNode, userCourseEnv, score, assessmentEntry.getUserVisibility());
nodeAccessService.onPassedUpdated(courseNode, userCourseEnv, passed, assessmentEntry.getUserVisibility(), by); nodeAccessService.onPassedUpdated(courseNode, userCourseEnv, passed, assessmentEntry.getUserVisibility());
nodeAccessService.onStatusUpdated(courseNode, userCourseEnv, assessmentEntry.getAssessmentStatus(), by); nodeAccessService.onStatusUpdated(courseNode, userCourseEnv, assessmentEntry.getAssessmentStatus());
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
//reevalute the tree //reevalute the tree
...@@ -608,7 +603,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -608,7 +603,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry); assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach); nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
...@@ -646,7 +641,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { ...@@ -646,7 +641,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
Boolean passed = assessmentEntry.getPassed(); Boolean passed = assessmentEntry.getPassed();
nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach); nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE);
DBFactory.getInstance().commit(); DBFactory.getInstance().commit();
ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
......
...@@ -196,11 +196,11 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod ...@@ -196,11 +196,11 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
@Override @Override
public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment,
Boolean fullyAssessed, AssessmentEntryStatus status, Role by) { Boolean fullyAssessed, AssessmentEntryStatus status) {
if (!userCourseEnvironment.isParticipant()) return; if (!userCourseEnvironment.isParticipant()) return;
AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager(); AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager();
am.updateFullyAssessed(courseNode, userCourseEnvironment, fullyAssessed, status, by); am.updateFullyAssessed(courseNode, userCourseEnvironment, fullyAssessed, status);
} }
@Override @Override
......
...@@ -35,7 +35,6 @@ import org.olat.course.run.CoursePaginationController; ...@@ -35,7 +35,6 @@ import org.olat.course.run.CoursePaginationController;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -135,17 +134,17 @@ public class ConditionNodeAccessProvider implements NodeAccessProvider { ...@@ -135,17 +134,17 @@ public class ConditionNodeAccessProvider implements NodeAccessProvider {
@Override @Override
public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score, public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score,
Boolean userVisibility, Role by) { Boolean userVisibility) {
// nothing to do // nothing to do
} }
@Override @Override
public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, Boolean userVisibility, Role by) { public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, Boolean userVisibility) {
// nothing to do // nothing to do
} }
@Override @Override
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by) { AssessmentEntryStatus status) {
// nothing to do // nothing to do
} }
......
...@@ -39,7 +39,6 @@ import org.olat.course.run.CoursePaginationController; ...@@ -39,7 +39,6 @@ import org.olat.course.run.CoursePaginationController;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -135,7 +134,7 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider { ...@@ -135,7 +134,7 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider {
AssessmentEntryStatus status = getStatus(courseNode, userCourseEnv, result.isDone(), AssessmentEntryStatus status = getStatus(courseNode, userCourseEnv, result.isDone(),
result.isFullyAssessed()); result.isFullyAssessed());
courseAssessmentService.updateFullyAssessed(courseNode, userCourseEnv, courseAssessmentService.updateFullyAssessed(courseNode, userCourseEnv,
Boolean.valueOf(result.isFullyAssessed()), status, Role.user); Boolean.valueOf(result.isFullyAssessed()), status);
return true; return true;
} }
return false; return false;
...@@ -152,38 +151,37 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider { ...@@ -152,38 +151,37 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider {
@Override @Override
public void onAssessmentConfirmed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, boolean confirmed) { public void onAssessmentConfirmed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, boolean confirmed) {
FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnConfirmation(confirmed); FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnConfirmation(confirmed);
updateFullyAssessed(courseNode, userCourseEnv, Role.user, result); updateFullyAssessed(courseNode, userCourseEnv, result);
} }
@Override @Override
public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score, public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score,
Boolean userVisibility, Role by) { Boolean userVisibility) {
FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnScore(score, userVisibility); FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnScore(score, userVisibility);
updateFullyAssessed(courseNode, userCourseEnv, by, result); updateFullyAssessed(courseNode, userCourseEnv, result);
} }
@Override @Override
public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed,
Boolean userVisibility, Role by) { Boolean userVisibility) {
FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnPassed(passed, userVisibility); FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnPassed(passed, userVisibility);
updateFullyAssessed(courseNode, userCourseEnv, by, result); updateFullyAssessed(courseNode, userCourseEnv, result);
} }
@Override @Override
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by) { AssessmentEntryStatus status) {
FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnStatus(status); FullyAssessedResult result = getConfigs(courseNode).isFullyAssessedOnStatus(status);
updateFullyAssessed(courseNode, userCourseEnv, by, result); updateFullyAssessed(courseNode, userCourseEnv, result);
} }
void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Role by, void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, FullyAssessedResult result) {
FullyAssessedResult result) {
boolean participant = userCourseEnv.isParticipant(); boolean participant = userCourseEnv.isParticipant();
if (participant && result.isEnabled()) { if (participant && result.isEnabled()) {
AssessmentEntryStatus status = getStatus(courseNode, userCourseEnv, result.isDone(), AssessmentEntryStatus status = getStatus(courseNode, userCourseEnv, result.isDone(),
result.isFullyAssessed()); result.isFullyAssessed());
courseAssessmentService.updateFullyAssessed(courseNode, userCourseEnv, courseAssessmentService.updateFullyAssessed(courseNode, userCourseEnv,
Boolean.valueOf(result.isFullyAssessed()), status, by); Boolean.valueOf(result.isFullyAssessed()), status);
} }
} }
......
...@@ -28,7 +28,6 @@ import org.olat.course.run.CoursePaginationController; ...@@ -28,7 +28,6 @@ import org.olat.course.run.CoursePaginationController;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
/** /**
...@@ -63,12 +62,12 @@ public interface NodeAccessProvider extends NodeAccessProviderIdentifier { ...@@ -63,12 +62,12 @@ public interface NodeAccessProvider extends NodeAccessProviderIdentifier {
public void onAssessmentConfirmed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, boolean confirmed); public void onAssessmentConfirmed(CourseNode courseNode, UserCourseEnvironment userCourseEnv, boolean confirmed);
public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score, public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score,
Boolean userVisibility, Role by); Boolean userVisibility);
public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, Boolean userVisibility, Role by); public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, Boolean userVisibility);
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by); AssessmentEntryStatus status);
public void onCoursePublished(ICourse course); public void onCoursePublished(ICourse course);
......
...@@ -31,7 +31,6 @@ import org.olat.course.run.CoursePaginationController; ...@@ -31,7 +31,6 @@ import org.olat.course.run.CoursePaginationController;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
/** /**
...@@ -126,10 +125,9 @@ public interface NodeAccessService { ...@@ -126,10 +125,9 @@ public interface NodeAccessService {
* @param userCourseEnv * @param userCourseEnv
* @param score * @param score
* @param userVisibility * @param userVisibility
* @param by
*/ */
public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score, public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score,
Boolean userVisibility, Role by); Boolean userVisibility);
/** /**
* Hook after the update of the passed value of an assessment changed. * Hook after the update of the passed value of an assessment changed.
...@@ -138,10 +136,9 @@ public interface NodeAccessService { ...@@ -138,10 +136,9 @@ public interface NodeAccessService {
* @param userCourseEnv * @param userCourseEnv
* @param passed * @param passed
* @param userVisibility * @param userVisibility
* @param by
*/ */
public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed,
Boolean userVisibility, Role by); Boolean userVisibility);
/** /**
* Hook after the assessment status is updated. * Hook after the assessment status is updated.
...@@ -149,10 +146,9 @@ public interface NodeAccessService { ...@@ -149,10 +146,9 @@ public interface NodeAccessService {
* @param courseNode * @param courseNode
* @param userCourseEnv * @param userCourseEnv
* @param status * @param status
* @param by
*/ */
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by); AssessmentEntryStatus status);
/** /**
* Hook after a course was published. * Hook after a course was published.
......
...@@ -38,7 +38,6 @@ import org.olat.course.run.navigation.NodeVisitedListener; ...@@ -38,7 +38,6 @@ import org.olat.course.run.navigation.NodeVisitedListener;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -138,23 +137,23 @@ public class NodeAccessServiceImpl implements NodeAccessService, NodeVisitedList ...@@ -138,23 +137,23 @@ public class NodeAccessServiceImpl implements NodeAccessService, NodeVisitedList
@Override @Override
public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score, public void onScoreUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Float score,
Boolean userVisibility, Role by) { Boolean userVisibility) {
NodeAccessType type = NodeAccessType.of(userCourseEnv); NodeAccessType type = NodeAccessType.of(userCourseEnv);
getNodeAccessProvider(type).onScoreUpdated(courseNode, userCourseEnv, score, userVisibility, by); getNodeAccessProvider(type).onScoreUpdated(courseNode, userCourseEnv, score, userVisibility);
} }
@Override @Override
public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed, public void onPassedUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Boolean passed,
Boolean userVisibility, Role by) { Boolean userVisibility) {
NodeAccessType type = NodeAccessType.of(userCourseEnv); NodeAccessType type = NodeAccessType.of(userCourseEnv);
getNodeAccessProvider(type).onPassedUpdated(courseNode, userCourseEnv, passed, userVisibility, by); getNodeAccessProvider(type).onPassedUpdated(courseNode, userCourseEnv, passed, userVisibility);
} }
@Override @Override
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by) { AssessmentEntryStatus status) {
NodeAccessType type = NodeAccessType.of(userCourseEnv); NodeAccessType type = NodeAccessType.of(userCourseEnv);
getNodeAccessProvider(type).onStatusUpdated(courseNode, userCourseEnv, status, by); getNodeAccessProvider(type).onStatusUpdated(courseNode, userCourseEnv, status);
} }
@Override @Override
......
...@@ -161,7 +161,7 @@ final class PreviewAssessmentManager implements AssessmentManager { ...@@ -161,7 +161,7 @@ final class PreviewAssessmentManager implements AssessmentManager {
@Override @Override
public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, Boolean fullyAssessed, public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, Boolean fullyAssessed,
AssessmentEntryStatus status, Role by) { AssessmentEntryStatus status) {
// //
} }
......
...@@ -239,4 +239,21 @@ public class CourseVO { ...@@ -239,4 +239,21 @@ public class CourseVO {
public void setLifecycle(RepositoryEntryLifecycleVO lifecycle) { public void setLifecycle(RepositoryEntryLifecycleVO lifecycle) {
this.lifecycle = lifecycle; this.lifecycle = lifecycle;
} }
@Override
public int hashCode() {
return key == null ? 24348 : key.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == this) {
return true;
}
if(obj instanceof CourseVO) {
CourseVO course = (CourseVO)obj;
return key != null && key.equals(course.getKey());
}
return super.equals(obj);
}
} }
\ No newline at end of file
...@@ -39,7 +39,6 @@ import org.olat.course.learningpath.LearningPathNodeHandler; ...@@ -39,7 +39,6 @@ import org.olat.course.learningpath.LearningPathNodeHandler;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentEntry;
import org.olat.modules.assessment.Role;
import org.olat.modules.assessment.model.AssessmentEntryImpl; import org.olat.modules.assessment.model.AssessmentEntryImpl;
import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentEntryStatus;
...@@ -92,7 +91,7 @@ public class LearningPathNodeAccessProviderTest { ...@@ -92,7 +91,7 @@ public class LearningPathNodeAccessProviderTest {
sut.onNodeVisited(courseNodeMock, participantCourseEnv); sut.onNodeVisited(courseNodeMock, participantCourseEnv);
verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.user); AssessmentEntryStatus.done);
} }
@Test @Test
...@@ -106,7 +105,7 @@ public class LearningPathNodeAccessProviderTest { ...@@ -106,7 +105,7 @@ public class LearningPathNodeAccessProviderTest {
sut.onNodeVisited(courseNodeMock, participantCourseEnv); sut.onNodeVisited(courseNodeMock, participantCourseEnv);
verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.user); AssessmentEntryStatus.done);
} }
@Test @Test
...@@ -120,7 +119,7 @@ public class LearningPathNodeAccessProviderTest { ...@@ -120,7 +119,7 @@ public class LearningPathNodeAccessProviderTest {
sut.onNodeVisited(courseNodeMock, coachCourseEnv); sut.onNodeVisited(courseNodeMock, coachCourseEnv);
verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.user); AssessmentEntryStatus.done);
} }
@Test @Test
...@@ -166,49 +165,49 @@ public class LearningPathNodeAccessProviderTest { ...@@ -166,49 +165,49 @@ public class LearningPathNodeAccessProviderTest {
public void shouldNotSetFullyAssessedIfNotEnabled() { public void shouldNotSetFullyAssessedIfNotEnabled() {
FullyAssessedResult result = fullyAssessed(false, true, true); FullyAssessedResult result = fullyAssessed(false, true, true);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.auto); AssessmentEntryStatus.done);
} }
@Test @Test
public void shouldNotSetFullyAssessedIfNotParticipant() { public void shouldNotSetFullyAssessedIfNotParticipant() {
FullyAssessedResult result = fullyAssessed(false, true, true); FullyAssessedResult result = fullyAssessed(false, true, true);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, coachCourseEnv, Boolean.TRUE, verify(courseAssessmentService, never()).updateFullyAssessed(courseNodeMock, coachCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.auto); AssessmentEntryStatus.done);
} }
@Test @Test
public void shouldSetFullyAssessedToTrue() { public void shouldSetFullyAssessedToTrue() {
FullyAssessedResult result = fullyAssessed(true, true, true); FullyAssessedResult result = fullyAssessed(true, true, true);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.auto); AssessmentEntryStatus.done);
} }
@Test @Test
public void shouldSetFullyAssessedToFalse() { public void shouldSetFullyAssessedToFalse() {
FullyAssessedResult result = fullyAssessed(true, false, true); FullyAssessedResult result = fullyAssessed(true, false, true);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.FALSE, verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.FALSE,
AssessmentEntryStatus.notStarted, Role.auto); AssessmentEntryStatus.notStarted);
} }
@Test @Test
public void shouldSetStatusDone() { public void shouldSetStatusDone() {
FullyAssessedResult result = fullyAssessed(true, true, true); FullyAssessedResult result = fullyAssessed(true, true, true);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.done, Role.auto); AssessmentEntryStatus.done);
} }
@Test @Test
...@@ -219,10 +218,10 @@ public class LearningPathNodeAccessProviderTest { ...@@ -219,10 +218,10 @@ public class LearningPathNodeAccessProviderTest {
.thenReturn(assessmentEntry); .thenReturn(assessmentEntry);
FullyAssessedResult result = fullyAssessed(true, true, false); FullyAssessedResult result = fullyAssessed(true, true, false);
sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, Role.auto, result); sut.updateFullyAssessed(courseNodeMock, participantCourseEnv, result);
verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE, verify(courseAssessmentService).updateFullyAssessed(courseNodeMock, participantCourseEnv, Boolean.TRUE,
AssessmentEntryStatus.inReview, Role.auto); AssessmentEntryStatus.inReview);
} }
@Test @Test
...@@ -234,21 +233,21 @@ public class LearningPathNodeAccessProviderTest { ...@@ -234,21 +233,21 @@ public class LearningPathNodeAccessProviderTest {
@Test @Test
public void shouldInvokeScoreConfig() { public void shouldInvokeScoreConfig() {
sut.onScoreUpdated(courseNodeMock, coachCourseEnv, null, null, null); sut.onScoreUpdated(courseNodeMock, coachCourseEnv, null, null);
verify(configMock).isFullyAssessedOnScore(any(), any()); verify(configMock).isFullyAssessedOnScore(any(), any());
} }
@Test @Test
public void shouldInvokePassedConfig() { public void shouldInvokePassedConfig() {
sut.onPassedUpdated(courseNodeMock, coachCourseEnv, null, null, null); sut.onPassedUpdated(courseNodeMock, coachCourseEnv, null, null);
verify(configMock).isFullyAssessedOnPassed(any(), any()); verify(configMock).isFullyAssessedOnPassed(any(), any());
} }
@Test @Test
public void onStatusUpdated() { public void onStatusUpdated() {
sut.onStatusUpdated(courseNodeMock, coachCourseEnv, null, null); sut.onStatusUpdated(courseNodeMock, coachCourseEnv, null);
verify(configMock).isFullyAssessedOnStatus(any()); verify(configMock).isFullyAssessedOnStatus(any());
} }
......
...@@ -803,6 +803,8 @@ public class AssessmentTest extends Deployments { ...@@ -803,6 +803,8 @@ public class AssessmentTest extends Deployments {
QTI21Page.getQTI21Page(reiBrowser) QTI21Page.getQTI21Page(reiBrowser)
.passE4() .passE4()
.assertOnCourseAssessmentTestScore(4); .assertOnCourseAssessmentTestScore(4);
OOGraphene.waitingALittleLonger();
//open the efficiency statements //open the efficiency statements
UserToolsPage reiUserTools = new UserToolsPage(reiBrowser); UserToolsPage reiUserTools = new UserToolsPage(reiBrowser);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
*/ */
package org.olat.selenium.page.course; package org.olat.selenium.page.course;
import java.time.Duration;
import java.util.List; import java.util.List;
import org.junit.Assert; import org.junit.Assert;
...@@ -189,7 +190,7 @@ public class AssessmentToolPage { ...@@ -189,7 +190,7 @@ public class AssessmentToolPage {
*/ */
public AssessmentToolPage assertProgress(UserVO user, int progress) { public AssessmentToolPage assertProgress(UserVO user, int progress) {
By progressBy = By.xpath("//div[contains(@class,'o_table_wrapper')]/table//tr[td/a[contains(.,'" + user.getFirstName() + "')]]/td/div[@class='progress'][div[@title='" + progress + "%']]"); By progressBy = By.xpath("//div[contains(@class,'o_table_wrapper')]/table//tr[td/a[contains(.,'" + user.getFirstName() + "')]]/td/div[@class='progress'][div[@title='" + progress + "%']]");
OOGraphene.waitElement(progressBy, 15, 1, browser); OOGraphene.waitElement(progressBy, Duration.ofSeconds(15), Duration.ofSeconds(1), browser);
return this; return this;
} }
......
...@@ -58,7 +58,6 @@ public class OOGraphene { ...@@ -58,7 +58,6 @@ public class OOGraphene {
private static final Logger log = Tracing.createLoggerFor(OOGraphene.class); private static final Logger log = Tracing.createLoggerFor(OOGraphene.class);
private static final Duration poolingDuration = Duration.ofMillis(100);//ms
private static final Duration waitTinyDuration = Duration.ofSeconds(50);//seconds private static final Duration waitTinyDuration = Duration.ofSeconds(50);//seconds
private static final long driverTimeout = 60;//seconds private static final long driverTimeout = 60;//seconds
private static final long movePause = 400;//milliseconds private static final long movePause = 400;//milliseconds
...@@ -122,16 +121,17 @@ public class OOGraphene { ...@@ -122,16 +121,17 @@ public class OOGraphene {
public static void waitCallout(WebDriver browser) { public static void waitCallout(WebDriver browser) {
By calloutBy = By.cssSelector("div.popover-content div.o_callout_content"); By calloutBy = By.cssSelector("div.popover-content div.o_callout_content");
waitElement(calloutBy, 5, browser); waitElement(calloutBy, browser);
} }
public static void waitBusy(WebDriver browser) { public static void waitBusy(WebDriver browser) {
waitBusy(browser, timeout.getSeconds()); waitBusy(browser, timeout);
} }
public static void waitBusy(WebDriver browser, long timeoutInSeconds) { public static void waitBusy(WebDriver browser, Duration timeoutDuration) {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(Duration.ofSeconds(timeoutInSeconds)).pollingEvery(poolingDuration) .withTimeout(timeoutDuration)
.pollingEvery(polling)
.until(new BusyPredicate()); .until(new BusyPredicate());
} }
...@@ -141,12 +141,13 @@ public class OOGraphene { ...@@ -141,12 +141,13 @@ public class OOGraphene {
* @param browser * @param browser
*/ */
public static void waitElement(By element, WebDriver browser) { public static void waitElement(By element, WebDriver browser) {
waitElement(element, timeout.getSeconds(), browser); waitElement(element, timeout, polling, browser);
} }
public static void waitElementClickable(By element, WebDriver browser) { public static void waitElementClickable(By element, WebDriver browser) {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(timeout).pollingEvery(polling) .withTimeout(timeout)
.pollingEvery(polling)
.until(ExpectedConditions.elementToBeClickable(element)); .until(ExpectedConditions.elementToBeClickable(element));
} }
...@@ -158,7 +159,7 @@ public class OOGraphene { ...@@ -158,7 +159,7 @@ public class OOGraphene {
* @param browser The web driver * @param browser The web driver
*/ */
public static void waitElement(By element, long timeoutInSeconds, WebDriver browser) { public static void waitElement(By element, long timeoutInSeconds, WebDriver browser) {
waitElement(element, timeoutInSeconds, polling.getSeconds(), browser); waitElement(element, Duration.ofSeconds(timeoutInSeconds), polling, browser);
} }
/** /**
...@@ -170,7 +171,7 @@ public class OOGraphene { ...@@ -170,7 +171,7 @@ public class OOGraphene {
* @param browser The web driver * @param browser The web driver
*/ */
public static void waitElementSlowly(By element, long timeoutInSeconds, WebDriver browser) { public static void waitElementSlowly(By element, long timeoutInSeconds, WebDriver browser) {
waitElement(element, timeoutInSeconds, poolingSlower.getSeconds(), browser); waitElement(element, Duration.ofSeconds(timeoutInSeconds), poolingSlower, browser);
} }
/** /**
...@@ -180,9 +181,9 @@ public class OOGraphene { ...@@ -180,9 +181,9 @@ public class OOGraphene {
* @param timeoutInSeconds The timeout in seconds * @param timeoutInSeconds The timeout in seconds
* @param browser The web driver * @param browser The web driver
*/ */
public static void waitElement(By element, long timeoutInSeconds, long pollingInSeconds, WebDriver browser) { public static void waitElement(By element, Duration timeoutDuration, Duration pollingDuration, WebDriver browser) {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(Duration.ofSeconds(timeoutInSeconds)).pollingEvery(Duration.ofSeconds(pollingInSeconds)) .withTimeout(timeoutDuration).pollingEvery(pollingDuration)
.until(ExpectedConditions.visibilityOfElementLocated(element)); .until(ExpectedConditions.visibilityOfElementLocated(element));
} }
...@@ -208,7 +209,7 @@ public class OOGraphene { ...@@ -208,7 +209,7 @@ public class OOGraphene {
*/ */
public static void waitElementDisappears(By element, int timeoutInSeconds, WebDriver browser) { public static void waitElementDisappears(By element, int timeoutInSeconds, WebDriver browser) {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(Duration.ofSeconds(timeoutInSeconds)).pollingEvery(poolingDuration) .withTimeout(Duration.ofSeconds(timeoutInSeconds)).pollingEvery(polling)
.until(ExpectedConditions.invisibilityOfElementLocated(element)); .until(ExpectedConditions.invisibilityOfElementLocated(element));
} }
...@@ -354,7 +355,7 @@ public class OOGraphene { ...@@ -354,7 +355,7 @@ public class OOGraphene {
public static final void waitTinymce(WebDriver browser) { public static final void waitTinymce(WebDriver browser) {
new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration) new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration)
.pollingEvery(poolingDuration) .pollingEvery(polling)
.until(new TinyMCELoadedPredicate()); .until(new TinyMCELoadedPredicate());
} }
...@@ -377,7 +378,7 @@ public class OOGraphene { ...@@ -377,7 +378,7 @@ public class OOGraphene {
String tinyId = tinyIdEl.getAttribute("id").replace("_diw", ""); String tinyId = tinyIdEl.getAttribute("id").replace("_diw", "");
new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration) new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration)
.pollingEvery(poolingDuration) .pollingEvery(polling)
.until(new TinyMCELoadedByIdPredicate(tinyId)); .until(new TinyMCELoadedByIdPredicate(tinyId));
((JavascriptExecutor)browser).executeScript("top.tinymce.editors['" + tinyId + "'].setContent('" + content + "')"); ((JavascriptExecutor)browser).executeScript("top.tinymce.editors['" + tinyId + "'].setContent('" + content + "')");
} }
...@@ -396,7 +397,7 @@ public class OOGraphene { ...@@ -396,7 +397,7 @@ public class OOGraphene {
String tinyId = tinyIdEl.getAttribute("id").replace("_diw", ""); String tinyId = tinyIdEl.getAttribute("id").replace("_diw", "");
new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration) new WebDriverWait(browser, driverTimeout).withTimeout(waitTinyDuration)
.pollingEvery(poolingDuration) .pollingEvery(polling)
.until(new TinyMCELoadedByIdPredicate(tinyId)); .until(new TinyMCELoadedByIdPredicate(tinyId));
((JavascriptExecutor)browser).executeScript("top.tinymce.editors['" + tinyId + "'].insertContent('" + content + "')"); ((JavascriptExecutor)browser).executeScript("top.tinymce.editors['" + tinyId + "'].insertContent('" + content + "')");
} }
...@@ -529,7 +530,7 @@ public class OOGraphene { ...@@ -529,7 +530,7 @@ public class OOGraphene {
*/ */
public static final void waitingTransition(WebDriver browser) { public static final void waitingTransition(WebDriver browser) {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.pollingEvery(poolingDuration) .pollingEvery(polling)
.until(new TransitionPredicate()); .until(new TransitionPredicate());
waitingALittleBit(); waitingALittleBit();
} }
...@@ -577,7 +578,7 @@ public class OOGraphene { ...@@ -577,7 +578,7 @@ public class OOGraphene {
public static final void waitBusyAndScrollTop(WebDriver browser) { public static final void waitBusyAndScrollTop(WebDriver browser) {
try { try {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.pollingEvery(poolingDuration) .pollingEvery(polling)
.withTimeout(timeout) .withTimeout(timeout)
.until(new BusyScrollToPredicate()); .until(new BusyScrollToPredicate());
} catch (Exception e) { } catch (Exception e) {
...@@ -634,7 +635,7 @@ public class OOGraphene { ...@@ -634,7 +635,7 @@ public class OOGraphene {
public static final void waitAndCloseBlueMessageWindow(WebDriver browser) { public static final void waitAndCloseBlueMessageWindow(WebDriver browser) {
try { try {
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(timeout).pollingEvery(poolingDuration) .withTimeout(timeout).pollingEvery(polling)
.until(ExpectedConditions.visibilityOfElementLocated(closeBlueBoxButtonBy)); .until(ExpectedConditions.visibilityOfElementLocated(closeBlueBoxButtonBy));
} catch (Exception e) { } catch (Exception e) {
//e.printStackTrace(); //e.printStackTrace();
...@@ -669,7 +670,7 @@ public class OOGraphene { ...@@ -669,7 +670,7 @@ public class OOGraphene {
private static final void clickCloseButton(WebDriver browser, WebElement closeButton) { private static final void clickCloseButton(WebDriver browser, WebElement closeButton) {
closeButton.click(); closeButton.click();
new WebDriverWait(browser, driverTimeout) new WebDriverWait(browser, driverTimeout)
.withTimeout(Duration.ofMillis(1000)).pollingEvery(poolingDuration) .withTimeout(Duration.ofMillis(1000)).pollingEvery(polling)
.until(new CloseAlertInfoPredicate()); .until(new CloseAlertInfoPredicate());
} }
...@@ -719,7 +720,7 @@ public class OOGraphene { ...@@ -719,7 +720,7 @@ public class OOGraphene {
public static final void waitNavBarTransition(WebDriver browser) { public static final void waitNavBarTransition(WebDriver browser) {
try { try {
new WebDriverWait(browser, driverTimeout).pollingEvery(poolingDuration) new WebDriverWait(browser, driverTimeout).pollingEvery(polling)
.until(new NavBarTransitionPredicate()); .until(new NavBarTransitionPredicate());
waitingALittleBit(); waitingALittleBit();
} catch (Exception e) { } catch (Exception e) {
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
*/ */
package org.olat.selenium.page.repository; package org.olat.selenium.page.repository;
import java.time.Duration;
import java.util.List; import java.util.List;
import org.junit.Assert; import org.junit.Assert;
...@@ -117,7 +118,7 @@ public class FeedPage { ...@@ -117,7 +118,7 @@ public class FeedPage {
//save the settings //save the settings
By saveButton = By.xpath("//div[contains(@class,'modal-body')]//form//button[contains(@class,'btn-primary')]"); By saveButton = By.xpath("//div[contains(@class,'modal-body')]//form//button[contains(@class,'btn-primary')]");
browser.findElement(saveButton).click(); browser.findElement(saveButton).click();
OOGraphene.waitBusy(browser, 20); OOGraphene.waitBusy(browser, Duration.ofSeconds(20));
return this; return this;
} }
......
...@@ -73,7 +73,7 @@ public class EfficiencyStatementPage { ...@@ -73,7 +73,7 @@ public class EfficiencyStatementPage {
if(courseTitle.length() > 25) { if(courseTitle.length() > 25) {
courseTitle = courseTitle.substring(0, 25); courseTitle = courseTitle.substring(0, 25);
} }
By courseCertificateBy = By.xpath("//div[contains(@class,'o_sel_certificates_table')]//table//tr[td[contains(text(),'" + courseTitle + "')]]/td//a/i[contains(@class,'o_filetype_pdf')]"); By courseCertificateBy = By.xpath("//div[contains(@class,'o_sel_certificates_table')]//table//tr[td[contains(text(),'" + courseTitle + "')]]/td/a/i[contains(@class,'o_filetype_pdf')]");
OOGraphene.waitElementSlowly(courseCertificateBy, 30, browser); OOGraphene.waitElementSlowly(courseCertificateBy, 30, browser);
return this; return this;
} }
......
...@@ -109,6 +109,7 @@ public class RepositoryRestClient { ...@@ -109,6 +109,7 @@ public class RepositoryRestClient {
assertNotNull(vo); assertNotNull(vo);
assertNotNull(vo.getDisplayname()); assertNotNull(vo.getDisplayname());
assertNotNull(vo.getKey()); assertNotNull(vo.getKey());
conn.shutdown();
return vo; return vo;
} }
...@@ -139,6 +140,7 @@ public class RepositoryRestClient { ...@@ -139,6 +140,7 @@ public class RepositoryRestClient {
assertNotNull(vo); assertNotNull(vo);
assertNotNull(vo.getRepoEntryKey()); assertNotNull(vo.getRepoEntryKey());
assertNotNull(vo.getKey()); assertNotNull(vo.getKey());
conn.shutdown();
return vo; return vo;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment