From 2907c17120cfdc069ba9393d8894db963e6771cb Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 13:55:16 +0100 Subject: [PATCH 01/19] Add abstract simple repository service --- .../base/AbstractSimpleRepositoryService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java new file mode 100644 index 000000000000..58740da2325b --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java @@ -0,0 +1,12 @@ +package de.tum.cit.aet.artemis.core.repository.base; + +import java.util.Optional; + +import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; + +public abstract class AbstractSimpleRepositoryService { + + protected U getValueElseThrow(Optional optional, String entityName) { + return optional.orElseThrow(() -> new EntityNotFoundException(entityName)); + } +} From 3195bd6243a4c9fff6359b904559de733e0a1829 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 13:55:55 +0100 Subject: [PATCH 02/19] Move default methods from CompetencyRepository to CompetencySimpleRepository --- .../repository/CompetencyRepository.java | 8 ------ .../CompetencySimpleRepository.java | 26 +++++++++++++++++++ .../service/competency/CompetencyService.java | 8 ++++-- .../artemis/atlas/web/CompetencyResource.java | 10 ++++--- 4 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencyRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencyRepository.java index 38651ce86558..a6f371de0da7 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencyRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencyRepository.java @@ -56,14 +56,6 @@ public interface CompetencyRepository extends ArtemisJpaRepository findByIdWithLectureUnitsAndExercises(@Param("competencyId") long competencyId); - default Competency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithLectureUnitsAndExercises(competencyId), competencyId); - } - - default Competency findByIdWithLectureUnitsElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithLectureUnits(competencyId), competencyId); - } - long countByCourse(Course course); List findByCourseIdOrderById(long courseId); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java new file mode 100644 index 000000000000..2dea62ea7838 --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java @@ -0,0 +1,26 @@ +package de.tum.cit.aet.artemis.atlas.repository; + +import org.springframework.stereotype.Service; + +import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; +import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepositoryService; + +@Service +public class CompetencySimpleRepository extends AbstractSimpleRepositoryService { + + private final static String ENTITY_NAME = "Competency"; + + private final CompetencyRepository competencyRepository; + + public CompetencySimpleRepository(CompetencyRepository competencyRepository) { + this.competencyRepository = competencyRepository; + } + + public Competency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { + return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + } + + public Competency findByIdWithLectureUnitsElseThrow(long competencyId) { + return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + } +} diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index 3b0a4bc083c9..cfd6d7556c37 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -20,6 +20,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; @@ -42,6 +43,8 @@ public class CompetencyService extends CourseCompetencyService { private final CompetencyRepository competencyRepository; + private final CompetencySimpleRepository competencySimpleRepository; + private final CompetencyExerciseLinkRepository competencyExerciseLinkRepository; public CompetencyService(CompetencyRepository competencyRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, @@ -49,10 +52,11 @@ public CompetencyService(CompetencyRepository competencyRepository, Authorizatio CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, - CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { + CompetencySimpleRepository competencySimpleRepository, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { super(competencyProgressRepository, courseCompetencyRepository, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); this.competencyRepository = competencyRepository; + this.competencySimpleRepository = competencySimpleRepository; this.competencyExerciseLinkRepository = competencyExerciseLinkRepository; } @@ -100,7 +104,7 @@ public List createCompetencies(List competencies, Course * @return The found competency */ public Competency findCompetencyWithExercisesAndLectureUnitsAndProgressForUser(Long competencyId, Long userId) { - Competency competency = competencyRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); + Competency competency = competencySimpleRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); return findProgressAndLectureUnitCompletionsForUser(competency, userId); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index 1bc5b2202aeb..e363871d725e 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -29,6 +29,7 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; @@ -64,6 +65,8 @@ public class CompetencyResource { private final CompetencyRepository competencyRepository; + private final CompetencySimpleRepository competencySimpleRepository; + private final CompetencyService competencyService; private final CourseCompetencyRepository courseCompetencyRepository; @@ -71,12 +74,13 @@ public class CompetencyResource { private final CourseCompetencyService courseCompetencyService; public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - CompetencyRepository competencyRepository, CompetencyService competencyService, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencyService courseCompetencyService) { + CompetencyRepository competencyRepository, CompetencySimpleRepository competencySimpleRepository, CompetencyService competencyService, + CourseCompetencyRepository courseCompetencyRepository, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; this.competencyRepository = competencyRepository; + this.competencySimpleRepository = competencySimpleRepository; this.competencyService = competencyService; this.courseCompetencyRepository = courseCompetencyRepository; this.courseCompetencyService = courseCompetencyService; @@ -293,7 +297,7 @@ public ResponseEntity updateCompetency(@PathVariable long courseId, checkCompetencyAttributesForUpdate(competency); var course = courseRepository.findByIdElseThrow(courseId); - var existingCompetency = competencyRepository.findByIdWithLectureUnitsElseThrow(competency.getId()); + var existingCompetency = competencySimpleRepository.findByIdWithLectureUnitsElseThrow(competency.getId()); checkCourseForCompetency(course, existingCompetency); var persistedCompetency = competencyService.updateCourseCompetency(existingCompetency, competency); From 7d4693edfdbc4216352b112647ef2d9bd03ad228 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 13:58:54 +0100 Subject: [PATCH 03/19] Add JavaDoc for AbstractSimpleRepositoryService --- .../core/repository/base/AbstractSimpleRepositoryService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java index 58740da2325b..bbbdb0874fc4 100644 --- a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java @@ -4,6 +4,10 @@ import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; +/** + * Abstract base for simple repository services. These are services on repository + * layer which contain the default methods of the repository layer/data access. + */ public abstract class AbstractSimpleRepositoryService { protected U getValueElseThrow(Optional optional, String entityName) { From 755c449ead3261057fd9e0bcb278c88ca98ad2c2 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 14:24:10 +0100 Subject: [PATCH 04/19] Rename AbstractSimpleRepositoryService to AbstractSimpleRepository --- .../artemis/atlas/repository/CompetencySimpleRepository.java | 4 ++-- ...leRepositoryService.java => AbstractSimpleRepository.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/de/tum/cit/aet/artemis/core/repository/base/{AbstractSimpleRepositoryService.java => AbstractSimpleRepository.java} (89%) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java index 2dea62ea7838..ed63be0e7311 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java @@ -3,10 +3,10 @@ import org.springframework.stereotype.Service; import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; -import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepositoryService; +import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepository; @Service -public class CompetencySimpleRepository extends AbstractSimpleRepositoryService { +public class CompetencySimpleRepository extends AbstractSimpleRepository { private final static String ENTITY_NAME = "Competency"; diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java similarity index 89% rename from src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java rename to src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java index bbbdb0874fc4..fbace83654a9 100644 --- a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepositoryService.java +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java @@ -8,7 +8,7 @@ * Abstract base for simple repository services. These are services on repository * layer which contain the default methods of the repository layer/data access. */ -public abstract class AbstractSimpleRepositoryService { +public abstract class AbstractSimpleRepository { protected U getValueElseThrow(Optional optional, String entityName) { return optional.orElseThrow(() -> new EntityNotFoundException(entityName)); From b2e81345ad66c4a45fe58250046cd0e8760951c9 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 14:31:48 +0100 Subject: [PATCH 05/19] Move default methods from CourseCompetencyRepository to CourseCompetencySimpleRepository --- .../CourseCompetencyRepository.java | 39 ------------- .../CourseCompetencySimpleRepository.java | 57 +++++++++++++++++++ .../competency/CompetencyProgressService.java | 12 ++-- .../competency/CourseCompetencyService.java | 14 +++-- .../LearningPathRecommendationService.java | 11 ++-- .../artemis/atlas/web/CompetencyResource.java | 11 +++- .../atlas/web/CourseCompetencyResource.java | 8 ++- .../atlas/web/PrerequisiteResource.java | 10 +++- 8 files changed, 101 insertions(+), 61 deletions(-) create mode 100644 src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencyRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencyRepository.java index bba103f436d9..051666bfbb34 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencyRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencyRepository.java @@ -14,7 +14,6 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import de.tum.cit.aet.artemis.atlas.domain.LearningObject; import de.tum.cit.aet.artemis.atlas.domain.competency.CourseCompetency; import de.tum.cit.aet.artemis.atlas.dto.metrics.CompetencyExerciseMasteryCalculationDTO; import de.tum.cit.aet.artemis.atlas.dto.metrics.CompetencyLectureUnitMasteryCalculationDTO; @@ -80,10 +79,6 @@ public interface CourseCompetencyRepository extends ArtemisJpaRepository findByIdWithExercisesAndLectureUnitsAndLectures(@Param("id") long id); - default CourseCompetency findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(long id) { - return getValueElseThrow(findByIdWithExercisesAndLectureUnitsAndLectures(id), id); - } - @Query(""" SELECT c FROM CourseCompetency c @@ -259,40 +254,6 @@ Page findForImportAndUserHasAccessToCourse(@Param("partialTitl """) Optional findByIdWithLectureUnitsAndExercises(@Param("competencyId") long competencyId); - default CourseCompetency findByIdWithLectureUnitsElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithLectureUnits(competencyId), competencyId); - } - - default CourseCompetency findByIdWithExercisesAndLectureUnitsElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithExercisesAndLectureUnits(competencyId), competencyId); - } - - default CourseCompetency findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithExercisesAndLectureUnitsBidirectional(competencyId), competencyId); - } - - /** - * Finds the set of ids of course competencies that are linked to a given learning object - * - * @param learningObject the learning object to find the course competencies for - * @return the set of ids of course competencies linked to the learning object - */ - default Set findAllIdsByLearningObject(LearningObject learningObject) { - return switch (learningObject) { - case LectureUnit lectureUnit -> findAllIdsByLectureUnit(lectureUnit); - case Exercise exercise -> findAllIdsByExercise(exercise); - default -> throw new IllegalArgumentException("Unknown LearningObject type: " + learningObject.getClass()); - }; - } - - default CourseCompetency findByIdWithExercisesElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithExercises(competencyId), competencyId); - } - - default CourseCompetency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { - return getValueElseThrow(findByIdWithLectureUnitsAndExercises(competencyId), competencyId); - } - List findByCourseIdOrderById(long courseId); boolean existsByIdAndCourseId(long competencyId, long courseId); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java new file mode 100644 index 000000000000..03c3e861d934 --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java @@ -0,0 +1,57 @@ +package de.tum.cit.aet.artemis.atlas.repository; + +import java.util.Set; + +import org.springframework.stereotype.Service; + +import de.tum.cit.aet.artemis.atlas.domain.LearningObject; +import de.tum.cit.aet.artemis.atlas.domain.competency.CourseCompetency; +import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepository; +import de.tum.cit.aet.artemis.exercise.domain.Exercise; +import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; + +@Service +public class CourseCompetencySimpleRepository extends AbstractSimpleRepository { + + private static final String ENTITY_NAME = "CourseCompetency"; + + private final CourseCompetencyRepository courseCompetencyRepository; + + public CourseCompetencySimpleRepository(CourseCompetencyRepository courseCompetencyRepository) { + this.courseCompetencyRepository = courseCompetencyRepository; + } + + public CourseCompetency findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(long id) { + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsAndLectures(id), ENTITY_NAME); + } + + public CourseCompetency findByIdWithExercisesAndLectureUnitsElseThrow(long competencyId) { + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnits(competencyId), ENTITY_NAME); + } + + public CourseCompetency findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(long competencyId) { + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsBidirectional(competencyId), ENTITY_NAME); + } + + /** + * Finds the set of ids of course competencies that are linked to a given learning object + * + * @param learningObject the learning object to find the course competencies for + * @return the set of ids of course competencies linked to the learning object + */ + public Set findAllIdsByLearningObject(LearningObject learningObject) { + return switch (learningObject) { + case LectureUnit lectureUnit -> courseCompetencyRepository.findAllIdsByLectureUnit(lectureUnit); + case Exercise exercise -> courseCompetencyRepository.findAllIdsByExercise(exercise); + default -> throw new IllegalArgumentException("Unknown LearningObject type: " + learningObject.getClass()); + }; + } + + public CourseCompetency findByIdWithExercisesElseThrow(long competencyId) { + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercises(competencyId), ENTITY_NAME); + } + + public CourseCompetency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { + return getValueElseThrow(courseCompetencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + } +} diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java index 813408442238..2527f85d251e 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java @@ -31,6 +31,7 @@ import de.tum.cit.aet.artemis.atlas.dto.metrics.CompetencyLectureUnitMasteryCalculationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; import de.tum.cit.aet.artemis.core.domain.User; @@ -62,6 +63,8 @@ public class CompetencyProgressService { private final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private static final int MIN_EXERCISES_RECENCY_CONFIDENCE = 3; private static final int MAX_SUBMISSIONS_FOR_QUICK_SOLVE_HEURISTIC = 3; @@ -75,13 +78,14 @@ public class CompetencyProgressService { private static final double CONFIDENCE_REASON_DEADZONE = 0.05; public CompetencyProgressService(CompetencyProgressRepository competencyProgressRepository, LearningPathService learningPathService, - ParticipantScoreService participantScoreService, LectureUnitCompletionRepository lectureUnitCompletionRepository, - CourseCompetencyRepository courseCompetencyRepository) { + ParticipantScoreService participantScoreService, LectureUnitCompletionRepository lectureUnitCompletionRepository, CourseCompetencyRepository courseCompetencyRepository, + CourseCompetencySimpleRepository courseCompetencySimpleRepository) { this.competencyProgressRepository = competencyProgressRepository; this.learningPathService = learningPathService; this.participantScoreService = participantScoreService; this.lectureUnitCompletionRepository = lectureUnitCompletionRepository; this.courseCompetencyRepository = courseCompetencyRepository; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; } /** @@ -104,7 +108,7 @@ public void updateProgressByLearningObjectForParticipantAsync(LearningObject lea @Async public void updateProgressByLearningObjectAsync(LearningObject learningObject) { SecurityUtils.setAuthorizationObject(); // Required for async - Set competencyIds = courseCompetencyRepository.findAllIdsByLearningObject(learningObject); + Set competencyIds = courseCompetencySimpleRepository.findAllIdsByLearningObject(learningObject); for (long competencyId : competencyIds) { Set users = competencyProgressRepository.findAllByCompetencyId(competencyId).stream().map(CompetencyProgress::getUser).collect(Collectors.toSet()); @@ -183,7 +187,7 @@ private void updateProgressByCompetencyIdsAndLearningObject(Set competency * @param users The users for which to update the progress */ public void updateProgressByLearningObjectSync(LearningObject learningObject, Set users) { - Set competencyIds = courseCompetencyRepository.findAllIdsByLearningObject(learningObject); + Set competencyIds = courseCompetencySimpleRepository.findAllIdsByLearningObject(learningObject); for (long competencyId : competencyIds) { log.debug("Updating competency progress synchronously for {} users.", users.size()); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java index 88cad15f1000..cb86314a7508 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java @@ -33,6 +33,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; @@ -64,6 +65,8 @@ public class CourseCompetencyService { protected final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + protected final CompetencyRelationRepository competencyRelationRepository; protected final CompetencyProgressService competencyProgressService; @@ -85,12 +88,13 @@ public class CourseCompetencyService { private final CourseRepository courseRepository; public CourseCompetencyService(CompetencyProgressRepository competencyProgressRepository, CourseCompetencyRepository courseCompetencyRepository, - CompetencyRelationRepository competencyRelationRepository, CompetencyProgressService competencyProgressService, ExerciseService exerciseService, - LectureUnitService lectureUnitService, LearningPathService learningPathService, AuthorizationCheckService authCheckService, - StandardizedCompetencyRepository standardizedCompetencyRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, - LearningObjectImportService learningObjectImportService, CourseRepository courseRepository) { + CourseCompetencySimpleRepository courseCompetencySimpleRepository, CompetencyRelationRepository competencyRelationRepository, + CompetencyProgressService competencyProgressService, ExerciseService exerciseService, LectureUnitService lectureUnitService, LearningPathService learningPathService, + AuthorizationCheckService authCheckService, StandardizedCompetencyRepository standardizedCompetencyRepository, + LectureUnitCompletionRepository lectureUnitCompletionRepository, LearningObjectImportService learningObjectImportService, CourseRepository courseRepository) { this.competencyProgressRepository = competencyProgressRepository; this.courseCompetencyRepository = courseCompetencyRepository; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; this.competencyRelationRepository = competencyRelationRepository; this.competencyProgressService = competencyProgressService; this.exerciseService = exerciseService; @@ -113,7 +117,7 @@ public CourseCompetencyService(CompetencyProgressRepository competencyProgressRe * @return The found competency */ public CourseCompetency findCompetencyWithExercisesAndLectureUnitsAndProgressForUser(Long competencyId, Long userId) { - CourseCompetency competency = courseCompetencyRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); + CourseCompetency competency = courseCompetencySimpleRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); return findProgressAndLectureUnitCompletionsForUser(competency, userId); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java index 1f3981baa4ce..9d3ebcfcac5f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java @@ -33,7 +33,7 @@ import de.tum.cit.aet.artemis.atlas.domain.competency.RelationType; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.core.domain.User; import de.tum.cit.aet.artemis.exercise.domain.BaseExercise; @@ -57,7 +57,7 @@ public class LearningPathRecommendationService { private final CompetencyProgressRepository competencyProgressRepository; - private final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; /** * Base utility that is used to calculate a competencies' utility with respect to the earliest due date of the competency. @@ -99,12 +99,13 @@ public class LearningPathRecommendationService { { 0.50, 0.40, 0.10 }, { 0.39, 0.45, 0.16 }, { 0.28, 0.48, 0.24 }, { 0.20, 0.47, 0.33 }, { 0.13, 0.43, 0.44 }, { 0.08, 0.37, 0.55 }, { 0.04, 0.29, 0.67 }, }; protected LearningPathRecommendationService(CompetencyRelationRepository competencyRelationRepository, LearningObjectService learningObjectService, - ParticipantScoreService participantScoreService, CompetencyProgressRepository competencyProgressRepository, CourseCompetencyRepository courseCompetencyRepository) { + ParticipantScoreService participantScoreService, CompetencyProgressRepository competencyProgressRepository, + CourseCompetencySimpleRepository courseCompetencySimpleRepository) { this.competencyRelationRepository = competencyRelationRepository; this.learningObjectService = learningObjectService; this.participantScoreService = participantScoreService; this.competencyProgressRepository = competencyProgressRepository; - this.courseCompetencyRepository = courseCompetencyRepository; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; } /** @@ -695,7 +696,7 @@ public record RecommendationState(Map competencyIdMap, L * @return the recommended order of learning objects */ public List getOrderOfLearningObjectsForCompetency(long competencyId, User user) { - CourseCompetency competency = courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsElseThrow(competencyId); + CourseCompetency competency = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsElseThrow(competencyId); return getOrderOfLearningObjectsForCompetency(competency, user); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index e363871d725e..e80eba02aac4 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -31,6 +31,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.core.domain.Course; @@ -71,11 +72,14 @@ public class CompetencyResource { private final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencyService courseCompetencyService; public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, CompetencyRepository competencyRepository, CompetencySimpleRepository competencySimpleRepository, CompetencyService competencyService, - CourseCompetencyRepository courseCompetencyRepository, CourseCompetencyService courseCompetencyService) { + CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleRepository courseCompetencySimpleRepository, + CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; @@ -83,6 +87,7 @@ public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckS this.competencySimpleRepository = competencySimpleRepository; this.competencyService = competencyService; this.courseCompetencyRepository = courseCompetencyRepository; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; this.courseCompetencyService = courseCompetencyService; } @@ -185,7 +190,7 @@ public ResponseEntity importCompetency(@PathVariable long courseId, long competencyId = importOptions.competencyIds().iterator().next(); var course = courseRepository.findWithEagerCompetenciesAndPrerequisitesByIdElseThrow(courseId); - var competencyToImport = courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(competencyId); + var competencyToImport = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(competencyId); authorizationCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.EDITOR, competencyToImport.getCourse(), null); if (competencyToImport.getCourse().getId().equals(courseId)) { @@ -318,7 +323,7 @@ public ResponseEntity deleteCompetency(@PathVariable long competencyId, @P log.info("REST request to delete a Competency : {}", competencyId); var course = courseRepository.findByIdElseThrow(courseId); - var competency = courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(competencyId); + var competency = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(competencyId); checkCourseForCompetency(course, competency); courseCompetencyService.deleteCourseCompetency(competency, course); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java index 8e93c6c73090..65b326f9ce86 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java @@ -38,6 +38,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyJolService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyRelationService; @@ -91,13 +92,15 @@ public class CourseCompetencyResource { private final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final AuthorizationCheckService authorizationCheckService; public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyService courseCompetencyService, CourseCompetencyRepository courseCompetencyRepository, CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, - AuthorizationCheckService authorizationCheckService) { + CourseCompetencySimpleRepository courseCompetencySimpleRepository, AuthorizationCheckService authorizationCheckService) { this.userRepository = userRepository; this.courseCompetencyService = courseCompetencyService; this.courseCompetencyRepository = courseCompetencyRepository; @@ -108,6 +111,7 @@ public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyS this.competencyRelationService = competencyRelationService; this.irisCompetencyGenerationService = irisCompetencyGenerationService; this.competencyJolService = competencyJolService; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; this.authorizationCheckService = authorizationCheckService; } @@ -215,7 +219,7 @@ public ResponseEntity getCompetencyStudentProgress(@PathVari public ResponseEntity getCompetencyCourseProgress(@PathVariable long courseId, @PathVariable long competencyId) { log.debug("REST request to get course progress for competency: {}", competencyId); var course = courseRepository.findByIdElseThrow(courseId); - var competency = courseCompetencyRepository.findByIdWithExercisesElseThrow(competencyId); + var competency = courseCompetencySimpleRepository.findByIdWithExercisesElseThrow(competencyId); var progress = competencyProgressService.getCompetencyCourseProgress(competency, course); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java index 4f75c618282d..d9b78e36f7a2 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java @@ -29,6 +29,7 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.PrerequisiteService; @@ -72,17 +73,20 @@ public class PrerequisiteResource { private final CourseCompetencyRepository courseCompetencyRepository; + private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencyService courseCompetencyService; public PrerequisiteResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencyService courseCompetencyService) { + CourseCompetencySimpleRepository courseCompetencySimpleRepository, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; this.prerequisiteRepository = prerequisiteRepository; this.prerequisiteService = prerequisiteService; this.courseCompetencyRepository = courseCompetencyRepository; + this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; this.courseCompetencyService = courseCompetencyService; } @@ -185,7 +189,7 @@ public ResponseEntity importPrerequisite(@PathVariable long course long prerequisiteId = importOptions.competencyIds().iterator().next(); var course = courseRepository.findWithEagerCompetenciesAndPrerequisitesByIdElseThrow(courseId); - var prerequisiteToImport = courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(prerequisiteId); + var prerequisiteToImport = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(prerequisiteId); authorizationCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.EDITOR, prerequisiteToImport.getCourse(), null); if (prerequisiteToImport.getCourse().getId().equals(courseId)) { @@ -318,7 +322,7 @@ public ResponseEntity deletePrerequisite(@PathVariable long prerequisiteId log.info("REST request to delete a Prerequisite : {}", prerequisiteId); var course = courseRepository.findByIdElseThrow(courseId); - var prerequisite = courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(prerequisiteId); + var prerequisite = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(prerequisiteId); checkCourseForPrerequisite(course, prerequisite); courseCompetencyService.deleteCourseCompetency(prerequisite, course); From 479c4057a6ac1ee292a2e00360312103ab70e27e Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 14:32:50 +0100 Subject: [PATCH 06/19] Annotate SimpleRepository with profile --- .../artemis/atlas/repository/CompetencySimpleRepository.java | 4 ++++ .../atlas/repository/CourseCompetencySimpleRepository.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java index ed63be0e7311..66902a2d5be8 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java @@ -1,10 +1,14 @@ package de.tum.cit.aet.artemis.atlas.repository; +import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; + +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepository; +@Profile(PROFILE_CORE) @Service public class CompetencySimpleRepository extends AbstractSimpleRepository { diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java index 03c3e861d934..3267eb3e3873 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java @@ -1,7 +1,10 @@ package de.tum.cit.aet.artemis.atlas.repository; +import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; + import java.util.Set; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import de.tum.cit.aet.artemis.atlas.domain.LearningObject; @@ -10,6 +13,7 @@ import de.tum.cit.aet.artemis.exercise.domain.Exercise; import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; +@Profile(PROFILE_CORE) @Service public class CourseCompetencySimpleRepository extends AbstractSimpleRepository { From 1c62cdb140136857ea4251b8f3af7de53c4f768a Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 14:38:31 +0100 Subject: [PATCH 07/19] Fix missing autowiring --- .../atlas/service/competency/CompetencyService.java | 10 ++++++---- .../atlas/service/competency/PrerequisiteService.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index cfd6d7556c37..85e896c5afee 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -22,6 +22,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; @@ -48,13 +49,14 @@ public class CompetencyService extends CourseCompetencyService { private final CompetencyExerciseLinkRepository competencyExerciseLinkRepository; public CompetencyService(CompetencyRepository competencyRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - LearningPathService learningPathService, CompetencyProgressService competencyProgressService, LectureUnitService lectureUnitService, - CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, + CourseCompetencySimpleRepository courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, CompetencySimpleRepository competencySimpleRepository, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { - super(competencyProgressRepository, courseCompetencyRepository, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, - learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); + super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleRepository, competencyRelationRepository, competencyProgressService, exerciseService, + lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, + courseRepository); this.competencyRepository = competencyRepository; this.competencySimpleRepository = competencySimpleRepository; this.competencyExerciseLinkRepository = competencyExerciseLinkRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java index 96a68280f334..00b66dfb8316 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java @@ -17,6 +17,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; @@ -38,12 +39,13 @@ public class PrerequisiteService extends CourseCompetencyService { private final PrerequisiteRepository prerequisiteRepository; public PrerequisiteService(PrerequisiteRepository prerequisiteRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - LearningPathService learningPathService, CompetencyProgressService competencyProgressService, LectureUnitService lectureUnitService, - CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, + CourseCompetencySimpleRepository courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository) { - super(competencyProgressRepository, courseCompetencyRepository, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, - learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); + super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleRepository, competencyRelationRepository, competencyProgressService, exerciseService, + lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, + courseRepository); this.prerequisiteRepository = prerequisiteRepository; } From 98a226e6ceee5bdbee723833cef453fcd8c6ecc3 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 26 Nov 2024 14:38:55 +0100 Subject: [PATCH 08/19] Adjust AbstractModuleServiceArchitectureTest to allow simple repository (services) --- .../module/AbstractModuleServiceArchitectureTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java index cd43dd981e51..b4e9d893c79a 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java @@ -30,14 +30,15 @@ public abstract class AbstractModuleServiceArchitectureTest extends AbstractArch @Test void shouldBeNamedService() { - ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service") - .because("services should have a name ending with 'Service'."); + ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").orShould() + .haveSimpleNameEndingWith("SimpleRepository").because("services should have a name ending with 'Service'."); rule.check(productionClasses); } @Test void shouldBeInServicePackage() { - ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().resideInAPackage("..service..").because("services should be in the package 'service'."); + ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().resideInAPackage("..service..").orShould().resideInAPackage("..repository..") + .because("services should be in the package 'service'."); final var exceptions = new Class[] { MigrationService.class, SecurityMetersService.class, DomainUserDetailsService.class, OAuth2JWKSService.class, JWTCookieService.class, GitDiffReportParserService.class, ResultWebsocketService.class, LocalCIWebsocketMessagingService.class }; final var classes = classesExcept(productionClasses, exceptions); @@ -61,7 +62,8 @@ void testCorrectServiceAnnotation() { classesOfThisModuleThat().haveSimpleNameEndingWith("Service").should().notBeAnnotatedWith(RestController.class).check(allClasses); classesOfThisModuleThat().haveSimpleNameEndingWith("Service").should().notHaveModifier(FINAL).check(allClasses); - classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").check(allClasses); + classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").orShould().haveSimpleNameEndingWith("SimpleRepository") + .check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notBeAnnotatedWith(Component.class).check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notBeAnnotatedWith(RestController.class).check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notHaveModifier(FINAL).check(allClasses); From 1e1b3c92837681e3f14276d1bc376d9a318c8a66 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 11:48:47 +0100 Subject: [PATCH 09/19] Rename SimpleRepository to SimpleService and use generics --- ...eRepository.java => CompetencySimpleService.java} | 6 +++--- ...itory.java => CourseCompetencySimpleService.java} | 6 +++--- .../competency/CompetencyProgressService.java | 6 +++--- .../atlas/service/competency/CompetencyService.java | 10 +++++----- .../service/competency/CourseCompetencyService.java | 6 +++--- .../service/competency/PrerequisiteService.java | 4 ++-- .../LearningPathRecommendationService.java | 6 +++--- .../aet/artemis/atlas/web/CompetencyResource.java | 12 ++++++------ .../artemis/atlas/web/CourseCompetencyResource.java | 6 +++--- .../aet/artemis/atlas/web/PrerequisiteResource.java | 6 +++--- ...pleRepository.java => AbstractSimpleService.java} | 7 ++++--- 11 files changed, 38 insertions(+), 37 deletions(-) rename src/main/java/de/tum/cit/aet/artemis/atlas/repository/{CompetencySimpleRepository.java => CompetencySimpleService.java} (85%) rename src/main/java/de/tum/cit/aet/artemis/atlas/repository/{CourseCompetencySimpleRepository.java => CourseCompetencySimpleService.java} (93%) rename src/main/java/de/tum/cit/aet/artemis/core/repository/base/{AbstractSimpleRepository.java => AbstractSimpleService.java} (52%) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java similarity index 85% rename from src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java rename to src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java index 66902a2d5be8..0a3ae359988c 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java @@ -6,17 +6,17 @@ import org.springframework.stereotype.Service; import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; -import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepository; +import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; @Profile(PROFILE_CORE) @Service -public class CompetencySimpleRepository extends AbstractSimpleRepository { +public class CompetencySimpleService extends AbstractSimpleService { private final static String ENTITY_NAME = "Competency"; private final CompetencyRepository competencyRepository; - public CompetencySimpleRepository(CompetencyRepository competencyRepository) { + public CompetencySimpleService(CompetencyRepository competencyRepository) { this.competencyRepository = competencyRepository; } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java similarity index 93% rename from src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java rename to src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java index 3267eb3e3873..a49c00daaa03 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java @@ -9,19 +9,19 @@ import de.tum.cit.aet.artemis.atlas.domain.LearningObject; import de.tum.cit.aet.artemis.atlas.domain.competency.CourseCompetency; -import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleRepository; +import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; import de.tum.cit.aet.artemis.exercise.domain.Exercise; import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; @Profile(PROFILE_CORE) @Service -public class CourseCompetencySimpleRepository extends AbstractSimpleRepository { +public class CourseCompetencySimpleService extends AbstractSimpleService { private static final String ENTITY_NAME = "CourseCompetency"; private final CourseCompetencyRepository courseCompetencyRepository; - public CourseCompetencySimpleRepository(CourseCompetencyRepository courseCompetencyRepository) { + public CourseCompetencySimpleService(CourseCompetencyRepository courseCompetencyRepository) { this.courseCompetencyRepository = courseCompetencyRepository; } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java index 2527f85d251e..263cc04d22d8 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java @@ -31,7 +31,7 @@ import de.tum.cit.aet.artemis.atlas.dto.metrics.CompetencyLectureUnitMasteryCalculationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; import de.tum.cit.aet.artemis.core.domain.User; @@ -63,7 +63,7 @@ public class CompetencyProgressService { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; private static final int MIN_EXERCISES_RECENCY_CONFIDENCE = 3; @@ -79,7 +79,7 @@ public class CompetencyProgressService { public CompetencyProgressService(CompetencyProgressRepository competencyProgressRepository, LearningPathService learningPathService, ParticipantScoreService participantScoreService, LectureUnitCompletionRepository lectureUnitCompletionRepository, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository) { + CourseCompetencySimpleService courseCompetencySimpleRepository) { this.competencyProgressRepository = competencyProgressRepository; this.learningPathService = learningPathService; this.participantScoreService = participantScoreService; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index 85e896c5afee..2f096efc95cc 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -20,9 +20,9 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; @@ -44,16 +44,16 @@ public class CompetencyService extends CourseCompetencyService { private final CompetencyRepository competencyRepository; - private final CompetencySimpleRepository competencySimpleRepository; + private final CompetencySimpleService competencySimpleRepository; private final CompetencyExerciseLinkRepository competencyExerciseLinkRepository; public CompetencyService(CompetencyRepository competencyRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + CourseCompetencySimpleService courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, - CompetencySimpleRepository competencySimpleRepository, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { + CompetencySimpleService competencySimpleRepository, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleRepository, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java index cb86314a7508..a0bf53141cf7 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java @@ -33,7 +33,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; @@ -65,7 +65,7 @@ public class CourseCompetencyService { protected final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; protected final CompetencyRelationRepository competencyRelationRepository; @@ -88,7 +88,7 @@ public class CourseCompetencyService { private final CourseRepository courseRepository; public CourseCompetencyService(CompetencyProgressRepository competencyProgressRepository, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository, CompetencyRelationRepository competencyRelationRepository, + CourseCompetencySimpleService courseCompetencySimpleRepository, CompetencyRelationRepository competencyRelationRepository, CompetencyProgressService competencyProgressService, ExerciseService exerciseService, LectureUnitService lectureUnitService, LearningPathService learningPathService, AuthorizationCheckService authCheckService, StandardizedCompetencyRepository standardizedCompetencyRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, LearningObjectImportService learningObjectImportService, CourseRepository courseRepository) { diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java index 00b66dfb8316..ffcb23b664c6 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java @@ -17,7 +17,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; @@ -39,7 +39,7 @@ public class PrerequisiteService extends CourseCompetencyService { private final PrerequisiteRepository prerequisiteRepository; public PrerequisiteService(PrerequisiteRepository prerequisiteRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + CourseCompetencySimpleService courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository) { diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java index 9d3ebcfcac5f..64713bd169be 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java @@ -33,7 +33,7 @@ import de.tum.cit.aet.artemis.atlas.domain.competency.RelationType; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.core.domain.User; import de.tum.cit.aet.artemis.exercise.domain.BaseExercise; @@ -57,7 +57,7 @@ public class LearningPathRecommendationService { private final CompetencyProgressRepository competencyProgressRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; /** * Base utility that is used to calculate a competencies' utility with respect to the earliest due date of the competency. @@ -100,7 +100,7 @@ public class LearningPathRecommendationService { protected LearningPathRecommendationService(CompetencyRelationRepository competencyRelationRepository, LearningObjectService learningObjectService, ParticipantScoreService participantScoreService, CompetencyProgressRepository competencyProgressRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository) { + CourseCompetencySimpleService courseCompetencySimpleRepository) { this.competencyRelationRepository = competencyRelationRepository; this.learningObjectService = learningObjectService; this.participantScoreService = participantScoreService; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index e80eba02aac4..d36d68c997b4 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -29,9 +29,9 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.core.domain.Course; @@ -66,19 +66,19 @@ public class CompetencyResource { private final CompetencyRepository competencyRepository; - private final CompetencySimpleRepository competencySimpleRepository; + private final CompetencySimpleService competencySimpleRepository; private final CompetencyService competencyService; private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; private final CourseCompetencyService courseCompetencyService; public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - CompetencyRepository competencyRepository, CompetencySimpleRepository competencySimpleRepository, CompetencyService competencyService, - CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleRepository courseCompetencySimpleRepository, + CompetencyRepository competencyRepository, CompetencySimpleService competencySimpleRepository, CompetencyService competencyService, + CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleService courseCompetencySimpleRepository, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java index 65b326f9ce86..8db9a36101f7 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java @@ -38,7 +38,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyJolService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyRelationService; @@ -92,7 +92,7 @@ public class CourseCompetencyResource { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; private final AuthorizationCheckService authorizationCheckService; @@ -100,7 +100,7 @@ public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyS CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, - CourseCompetencySimpleRepository courseCompetencySimpleRepository, AuthorizationCheckService authorizationCheckService) { + CourseCompetencySimpleService courseCompetencySimpleRepository, AuthorizationCheckService authorizationCheckService) { this.userRepository = userRepository; this.courseCompetencyService = courseCompetencyService; this.courseCompetencyRepository = courseCompetencyRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java index d9b78e36f7a2..41325f66383b 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java @@ -29,7 +29,7 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleRepository; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.PrerequisiteService; @@ -73,13 +73,13 @@ public class PrerequisiteResource { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleRepository courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleRepository; private final CourseCompetencyService courseCompetencyService; public PrerequisiteResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleRepository courseCompetencySimpleRepository, CourseCompetencyService courseCompetencyService) { + CourseCompetencySimpleService courseCompetencySimpleRepository, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java similarity index 52% rename from src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java rename to src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java index fbace83654a9..ce08bbdec690 100644 --- a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleRepository.java +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java @@ -2,15 +2,16 @@ import java.util.Optional; +import de.tum.cit.aet.artemis.core.domain.DomainObject; import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; /** - * Abstract base for simple repository services. These are services on repository + * Abstract base for simple (repository) services. These are services on repository * layer which contain the default methods of the repository layer/data access. */ -public abstract class AbstractSimpleRepository { +public abstract class AbstractSimpleService { - protected U getValueElseThrow(Optional optional, String entityName) { + protected U getValueElseThrow(Optional optional, String entityName) { return optional.orElseThrow(() -> new EntityNotFoundException(entityName)); } } From 4f6db42cb432bf3d56ba6f541c844efa42ba3fc0 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 11:52:02 +0100 Subject: [PATCH 10/19] Move atlas SimpleServices to subpackage --- .../repository/{ => simple}/CompetencySimpleService.java | 3 ++- .../{ => simple}/CourseCompetencySimpleService.java | 3 ++- .../atlas/service/competency/CompetencyProgressService.java | 2 +- .../artemis/atlas/service/competency/CompetencyService.java | 4 ++-- .../atlas/service/competency/CourseCompetencyService.java | 2 +- .../artemis/atlas/service/competency/PrerequisiteService.java | 2 +- .../learningpath/LearningPathRecommendationService.java | 2 +- .../de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java | 4 ++-- .../cit/aet/artemis/atlas/web/CourseCompetencyResource.java | 2 +- .../tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java | 2 +- 10 files changed, 14 insertions(+), 12 deletions(-) rename src/main/java/de/tum/cit/aet/artemis/atlas/repository/{ => simple}/CompetencySimpleService.java (89%) rename src/main/java/de/tum/cit/aet/artemis/atlas/repository/{ => simple}/CourseCompetencySimpleService.java (95%) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java similarity index 89% rename from src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java rename to src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java index 0a3ae359988c..ebb95c02faf6 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java @@ -1,4 +1,4 @@ -package de.tum.cit.aet.artemis.atlas.repository; +package de.tum.cit.aet.artemis.atlas.repository.simple; import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; +import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; @Profile(PROFILE_CORE) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java similarity index 95% rename from src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java rename to src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java index a49c00daaa03..f720a618f22f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/CourseCompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java @@ -1,4 +1,4 @@ -package de.tum.cit.aet.artemis.atlas.repository; +package de.tum.cit.aet.artemis.atlas.repository.simple; import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; @@ -9,6 +9,7 @@ import de.tum.cit.aet.artemis.atlas.domain.LearningObject; import de.tum.cit.aet.artemis.atlas.domain.competency.CourseCompetency; +import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; import de.tum.cit.aet.artemis.exercise.domain.Exercise; import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java index 263cc04d22d8..190932d7580a 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java @@ -31,7 +31,7 @@ import de.tum.cit.aet.artemis.atlas.dto.metrics.CompetencyLectureUnitMasteryCalculationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; import de.tum.cit.aet.artemis.core.domain.User; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index 2f096efc95cc..aaa072d2d44c 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -20,10 +20,10 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.simple.CompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java index a0bf53141cf7..c349aea0081f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java @@ -33,8 +33,8 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java index ffcb23b664c6..61b80902f757 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java @@ -17,9 +17,9 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; import de.tum.cit.aet.artemis.atlas.repository.StandardizedCompetencyRepository; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.LearningObjectImportService; import de.tum.cit.aet.artemis.atlas.service.learningpath.LearningPathService; import de.tum.cit.aet.artemis.core.domain.Course; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java index 64713bd169be..c4d785267b2d 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java @@ -33,7 +33,7 @@ import de.tum.cit.aet.artemis.atlas.domain.competency.RelationType; import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.core.domain.User; import de.tum.cit.aet.artemis.exercise.domain.BaseExercise; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index d36d68c997b4..2c4cda352bbd 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -29,9 +29,9 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.core.domain.Course; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java index 8db9a36101f7..1f2fea0e2e2f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java @@ -38,7 +38,7 @@ import de.tum.cit.aet.artemis.atlas.repository.CompetencyProgressRepository; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyJolService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyProgressService; import de.tum.cit.aet.artemis.atlas.service.competency.CompetencyRelationService; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java index 41325f66383b..f99ca76ad4f2 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java @@ -29,8 +29,8 @@ import de.tum.cit.aet.artemis.atlas.dto.CompetencyImportResponseDTO; import de.tum.cit.aet.artemis.atlas.dto.CompetencyWithTailRelationDTO; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.repository.PrerequisiteRepository; +import de.tum.cit.aet.artemis.atlas.repository.simple.CourseCompetencySimpleService; import de.tum.cit.aet.artemis.atlas.service.competency.CourseCompetencyService; import de.tum.cit.aet.artemis.atlas.service.competency.PrerequisiteService; import de.tum.cit.aet.artemis.core.domain.Course; From 3a1cd246a34a4994e53bbb0af8ebfb9045dfb2f0 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 11:55:21 +0100 Subject: [PATCH 11/19] Adapt service arch tests to consider SimpleServices --- .../module/AbstractModuleServiceArchitectureTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java index b4e9d893c79a..1d5658b55463 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleServiceArchitectureTest.java @@ -30,14 +30,14 @@ public abstract class AbstractModuleServiceArchitectureTest extends AbstractArch @Test void shouldBeNamedService() { - ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").orShould() - .haveSimpleNameEndingWith("SimpleRepository").because("services should have a name ending with 'Service'."); + ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service") + .because("services should have a name ending with 'Service'."); rule.check(productionClasses); } @Test void shouldBeInServicePackage() { - ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().resideInAPackage("..service..").orShould().resideInAPackage("..repository..") + ArchRule rule = classesOfThisModuleThat().areAnnotatedWith(Service.class).should().resideInAPackage("..service..").orShould().resideInAPackage("..repository.simple..") .because("services should be in the package 'service'."); final var exceptions = new Class[] { MigrationService.class, SecurityMetersService.class, DomainUserDetailsService.class, OAuth2JWKSService.class, JWTCookieService.class, GitDiffReportParserService.class, ResultWebsocketService.class, LocalCIWebsocketMessagingService.class }; @@ -62,8 +62,7 @@ void testCorrectServiceAnnotation() { classesOfThisModuleThat().haveSimpleNameEndingWith("Service").should().notBeAnnotatedWith(RestController.class).check(allClasses); classesOfThisModuleThat().haveSimpleNameEndingWith("Service").should().notHaveModifier(FINAL).check(allClasses); - classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").orShould().haveSimpleNameEndingWith("SimpleRepository") - .check(allClasses); + classesOfThisModuleThat().areAnnotatedWith(Service.class).should().haveSimpleNameEndingWith("Service").check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notBeAnnotatedWith(Component.class).check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notBeAnnotatedWith(RestController.class).check(allClasses); classesOfThisModuleThat().areAnnotatedWith(Service.class).should().notHaveModifier(FINAL).check(allClasses); From b80b453993a0b2f4e90885f9de4e5be698bf89d5 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 12:26:34 +0100 Subject: [PATCH 12/19] Add arch test to enforce that repositories have no default methods --- ...tractModuleRepositoryArchitectureTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java index fdc272e7877d..af1197cdcbfe 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java @@ -29,6 +29,7 @@ import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaField; import com.tngtech.archunit.core.domain.JavaMethod; +import com.tngtech.archunit.core.domain.JavaModifier; import com.tngtech.archunit.core.domain.JavaType; import com.tngtech.archunit.lang.ArchCondition; import com.tngtech.archunit.lang.ArchRule; @@ -302,4 +303,22 @@ private String replaceLast(String string, String substring, String replacement) sb.replace(lastIndex, lastIndex + substring.length(), replacement); return sb.toString(); } + + /** + * Enforce that no default methods are declared in the JPARepository interfaces. + * Instead, one should use/create a SimpleService in the 'simple'-subpackage. + */ + @Test + void enforceNoDefaultMethodsInRepository() { + methodsOfThisModuleThat().areDeclaredInClassesThat().areAnnotatedWith(Repository.class).should(new ArchCondition<>("not have default methods") { + + @Override + public void check(JavaMethod javaMethod, ConditionEvents events) { + if (!javaMethod.getModifiers().contains(JavaModifier.ABSTRACT)) { + String message = String.format("Method %s has a default modifier", javaMethod.getFullName()); + events.add(SimpleConditionEvent.violated(javaMethod, message)); + } + } + }).because("Default methods should be declared in SimpleServices, not in JPA Repository").allowEmptyShould(true).check(productionClasses); + } } From b22daac2736e725f6ef56aa4b1cbdc986691c8b9 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 12:27:30 +0100 Subject: [PATCH 13/19] Disable enforceNoDefaultMethodsInRepository for now --- .../module/AbstractModuleRepositoryArchitectureTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java index af1197cdcbfe..bdc5ced1239c 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java @@ -14,6 +14,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Primary; import org.springframework.data.domain.Pageable; @@ -305,9 +306,11 @@ private String replaceLast(String string, String substring, String replacement) } /** + * Disabled for now. * Enforce that no default methods are declared in the JPARepository interfaces. * Instead, one should use/create a SimpleService in the 'simple'-subpackage. */ + @Disabled @Test void enforceNoDefaultMethodsInRepository() { methodsOfThisModuleThat().areDeclaredInClassesThat().areAnnotatedWith(Repository.class).should(new ArchCondition<>("not have default methods") { From 61f0e059f39d0b09506f684c180d333a1eb8d532 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Thu, 28 Nov 2024 12:35:44 +0100 Subject: [PATCH 14/19] Add arch test to enforce single autowired candidate --- ...tractModuleRepositoryArchitectureTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java index bdc5ced1239c..2ee9151813c1 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java @@ -8,6 +8,7 @@ import static com.tngtech.archunit.lang.SimpleConditionEvent.violated; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; +import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Supplier; @@ -28,9 +29,11 @@ import com.tngtech.archunit.base.DescribedPredicate; import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.domain.JavaConstructor; import com.tngtech.archunit.core.domain.JavaField; import com.tngtech.archunit.core.domain.JavaMethod; import com.tngtech.archunit.core.domain.JavaModifier; +import com.tngtech.archunit.core.domain.JavaParameter; import com.tngtech.archunit.core.domain.JavaType; import com.tngtech.archunit.lang.ArchCondition; import com.tngtech.archunit.lang.ArchRule; @@ -324,4 +327,33 @@ public void check(JavaMethod javaMethod, ConditionEvents events) { } }).because("Default methods should be declared in SimpleServices, not in JPA Repository").allowEmptyShould(true).check(productionClasses); } + + @Test + void enforceSimpleServiceSingleAutowire() { + classesOfThisModuleThat().resideInAPackage("..repository.simple..").and().areAnnotatedWith(Service.class) + .should(new ArchCondition<>("have a constructor with exactly one parameter of a @Repository type") { + + @Override + public void check(JavaClass javaClass, ConditionEvents events) { + List constructors = javaClass.getConstructors().stream().filter(constructor -> constructor.getParameters().size() == 1).toList(); + + boolean hasValidConstructor = false; + + for (JavaConstructor constructor : constructors) { + JavaParameter parameter = constructor.getParameters().getFirst(); + JavaClass parameterType = parameter.getType().toErasure(); + + if (parameterType.isAnnotatedWith(Repository.class)) { + hasValidConstructor = true; + break; + } + } + + if (!hasValidConstructor) { + String message = String.format("Class %s does not have a constructor with exactly one parameter of a @Repository type.", javaClass.getName()); + events.add(SimpleConditionEvent.violated(javaClass, message)); + } + } + }).because("Simple Services should have exactly one autowired candidate to remain simple").check(productionClasses); + } } From 4da414eb6944887b1d297e4f7786b20e85fc71d1 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 17 Dec 2024 12:01:43 +0100 Subject: [PATCH 15/19] fix field naming of SimpleService --- .../competency/CompetencyProgressService.java | 10 +++++----- .../service/competency/CompetencyService.java | 18 ++++++++--------- .../competency/CourseCompetencyService.java | 8 ++++---- .../competency/PrerequisiteService.java | 4 ++-- .../LearningPathRecommendationService.java | 8 ++++---- .../artemis/atlas/web/CompetencyResource.java | 20 +++++++++---------- .../atlas/web/CourseCompetencyResource.java | 14 ++++++------- .../atlas/web/PrerequisiteResource.java | 12 +++++------ 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java index 190932d7580a..756f94280905 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyProgressService.java @@ -63,7 +63,7 @@ public class CompetencyProgressService { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; private static final int MIN_EXERCISES_RECENCY_CONFIDENCE = 3; @@ -79,13 +79,13 @@ public class CompetencyProgressService { public CompetencyProgressService(CompetencyProgressRepository competencyProgressRepository, LearningPathService learningPathService, ParticipantScoreService participantScoreService, LectureUnitCompletionRepository lectureUnitCompletionRepository, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository) { + CourseCompetencySimpleService courseCompetencySimpleService) { this.competencyProgressRepository = competencyProgressRepository; this.learningPathService = learningPathService; this.participantScoreService = participantScoreService; this.lectureUnitCompletionRepository = lectureUnitCompletionRepository; this.courseCompetencyRepository = courseCompetencyRepository; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; } /** @@ -108,7 +108,7 @@ public void updateProgressByLearningObjectForParticipantAsync(LearningObject lea @Async public void updateProgressByLearningObjectAsync(LearningObject learningObject) { SecurityUtils.setAuthorizationObject(); // Required for async - Set competencyIds = courseCompetencySimpleRepository.findAllIdsByLearningObject(learningObject); + Set competencyIds = courseCompetencySimpleService.findAllIdsByLearningObject(learningObject); for (long competencyId : competencyIds) { Set users = competencyProgressRepository.findAllByCompetencyId(competencyId).stream().map(CompetencyProgress::getUser).collect(Collectors.toSet()); @@ -187,7 +187,7 @@ private void updateProgressByCompetencyIdsAndLearningObject(Set competency * @param users The users for which to update the progress */ public void updateProgressByLearningObjectSync(LearningObject learningObject, Set users) { - Set competencyIds = courseCompetencySimpleRepository.findAllIdsByLearningObject(learningObject); + Set competencyIds = courseCompetencySimpleService.findAllIdsByLearningObject(learningObject); for (long competencyId : competencyIds) { log.debug("Updating competency progress synchronously for {} users.", users.size()); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index aaa072d2d44c..659512ccd858 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -44,21 +44,21 @@ public class CompetencyService extends CourseCompetencyService { private final CompetencyRepository competencyRepository; - private final CompetencySimpleService competencySimpleRepository; + private final CompetencySimpleService competencySimpleService; private final CompetencyExerciseLinkRepository competencyExerciseLinkRepository; public CompetencyService(CompetencyRepository competencyRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, - LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, - StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, - LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, - CompetencySimpleService competencySimpleRepository, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { - super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleRepository, competencyRelationRepository, competencyProgressService, exerciseService, + CourseCompetencySimpleService courseCompetencySimpleService, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, + StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, + LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, + CompetencySimpleService competencySimpleService, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { + super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleService, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); this.competencyRepository = competencyRepository; - this.competencySimpleRepository = competencySimpleRepository; + this.competencySimpleService = competencySimpleService; this.competencyExerciseLinkRepository = competencyExerciseLinkRepository; } @@ -106,7 +106,7 @@ public List createCompetencies(List competencies, Course * @return The found competency */ public Competency findCompetencyWithExercisesAndLectureUnitsAndProgressForUser(Long competencyId, Long userId) { - Competency competency = competencySimpleRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); + Competency competency = competencySimpleService.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); return findProgressAndLectureUnitCompletionsForUser(competency, userId); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java index c349aea0081f..a4123f63ec52 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CourseCompetencyService.java @@ -65,7 +65,7 @@ public class CourseCompetencyService { protected final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; protected final CompetencyRelationRepository competencyRelationRepository; @@ -88,13 +88,13 @@ public class CourseCompetencyService { private final CourseRepository courseRepository; public CourseCompetencyService(CompetencyProgressRepository competencyProgressRepository, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository, CompetencyRelationRepository competencyRelationRepository, + CourseCompetencySimpleService courseCompetencySimpleService, CompetencyRelationRepository competencyRelationRepository, CompetencyProgressService competencyProgressService, ExerciseService exerciseService, LectureUnitService lectureUnitService, LearningPathService learningPathService, AuthorizationCheckService authCheckService, StandardizedCompetencyRepository standardizedCompetencyRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, LearningObjectImportService learningObjectImportService, CourseRepository courseRepository) { this.competencyProgressRepository = competencyProgressRepository; this.courseCompetencyRepository = courseCompetencyRepository; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; this.competencyRelationRepository = competencyRelationRepository; this.competencyProgressService = competencyProgressService; this.exerciseService = exerciseService; @@ -117,7 +117,7 @@ public CourseCompetencyService(CompetencyProgressRepository competencyProgressRe * @return The found competency */ public CourseCompetency findCompetencyWithExercisesAndLectureUnitsAndProgressForUser(Long competencyId, Long userId) { - CourseCompetency competency = courseCompetencySimpleRepository.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); + CourseCompetency competency = courseCompetencySimpleService.findByIdWithLectureUnitsAndExercisesElseThrow(competencyId); return findProgressAndLectureUnitCompletionsForUser(competency, userId); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java index 61b80902f757..0d18f373f619 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/PrerequisiteService.java @@ -39,11 +39,11 @@ public class PrerequisiteService extends CourseCompetencyService { private final PrerequisiteRepository prerequisiteRepository; public PrerequisiteService(PrerequisiteRepository prerequisiteRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + CourseCompetencySimpleService courseCompetencySimpleService, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository) { - super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleRepository, competencyRelationRepository, competencyProgressService, exerciseService, + super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleService, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); this.prerequisiteRepository = prerequisiteRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java index c4d785267b2d..a5c2161be9b1 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathRecommendationService.java @@ -57,7 +57,7 @@ public class LearningPathRecommendationService { private final CompetencyProgressRepository competencyProgressRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; /** * Base utility that is used to calculate a competencies' utility with respect to the earliest due date of the competency. @@ -100,12 +100,12 @@ public class LearningPathRecommendationService { protected LearningPathRecommendationService(CompetencyRelationRepository competencyRelationRepository, LearningObjectService learningObjectService, ParticipantScoreService participantScoreService, CompetencyProgressRepository competencyProgressRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository) { + CourseCompetencySimpleService courseCompetencySimpleService) { this.competencyRelationRepository = competencyRelationRepository; this.learningObjectService = learningObjectService; this.participantScoreService = participantScoreService; this.competencyProgressRepository = competencyProgressRepository; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; } /** @@ -696,7 +696,7 @@ public record RecommendationState(Map competencyIdMap, L * @return the recommended order of learning objects */ public List getOrderOfLearningObjectsForCompetency(long competencyId, User user) { - CourseCompetency competency = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsElseThrow(competencyId); + CourseCompetency competency = courseCompetencySimpleService.findByIdWithExercisesAndLectureUnitsElseThrow(competencyId); return getOrderOfLearningObjectsForCompetency(competency, user); } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index 2c4cda352bbd..c944f03d9301 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -66,28 +66,28 @@ public class CompetencyResource { private final CompetencyRepository competencyRepository; - private final CompetencySimpleService competencySimpleRepository; + private final CompetencySimpleService competencySimpleService; private final CompetencyService competencyService; private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; private final CourseCompetencyService courseCompetencyService; public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - CompetencyRepository competencyRepository, CompetencySimpleService competencySimpleRepository, CompetencyService competencyService, - CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleService courseCompetencySimpleRepository, - CourseCompetencyService courseCompetencyService) { + CompetencyRepository competencyRepository, CompetencySimpleService competencySimpleService, CompetencyService competencyService, + CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleService courseCompetencySimpleService, + CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; this.competencyRepository = competencyRepository; - this.competencySimpleRepository = competencySimpleRepository; + this.competencySimpleService = competencySimpleService; this.competencyService = competencyService; this.courseCompetencyRepository = courseCompetencyRepository; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; this.courseCompetencyService = courseCompetencyService; } @@ -190,7 +190,7 @@ public ResponseEntity importCompetency(@PathVariable long courseId, long competencyId = importOptions.competencyIds().iterator().next(); var course = courseRepository.findWithEagerCompetenciesAndPrerequisitesByIdElseThrow(courseId); - var competencyToImport = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(competencyId); + var competencyToImport = courseCompetencySimpleService.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(competencyId); authorizationCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.EDITOR, competencyToImport.getCourse(), null); if (competencyToImport.getCourse().getId().equals(courseId)) { @@ -302,7 +302,7 @@ public ResponseEntity updateCompetency(@PathVariable long courseId, checkCompetencyAttributesForUpdate(competency); var course = courseRepository.findByIdElseThrow(courseId); - var existingCompetency = competencySimpleRepository.findByIdWithLectureUnitsElseThrow(competency.getId()); + var existingCompetency = competencySimpleService.findByIdWithLectureUnitsElseThrow(competency.getId()); checkCourseForCompetency(course, existingCompetency); var persistedCompetency = competencyService.updateCourseCompetency(existingCompetency, competency); @@ -323,7 +323,7 @@ public ResponseEntity deleteCompetency(@PathVariable long competencyId, @P log.info("REST request to delete a Competency : {}", competencyId); var course = courseRepository.findByIdElseThrow(courseId); - var competency = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(competencyId); + var competency = courseCompetencySimpleService.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(competencyId); checkCourseForCompetency(course, competency); courseCompetencyService.deleteCourseCompetency(competency, course); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java index 1f2fea0e2e2f..ffbf0ea89607 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java @@ -92,15 +92,15 @@ public class CourseCompetencyResource { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; private final AuthorizationCheckService authorizationCheckService; public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyService courseCompetencyService, CourseCompetencyRepository courseCompetencyRepository, - CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, - CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, - Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, - CourseCompetencySimpleService courseCompetencySimpleRepository, AuthorizationCheckService authorizationCheckService) { + CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, + CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, + Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, + CourseCompetencySimpleService courseCompetencySimpleService, AuthorizationCheckService authorizationCheckService) { this.userRepository = userRepository; this.courseCompetencyService = courseCompetencyService; this.courseCompetencyRepository = courseCompetencyRepository; @@ -111,7 +111,7 @@ public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyS this.competencyRelationService = competencyRelationService; this.irisCompetencyGenerationService = irisCompetencyGenerationService; this.competencyJolService = competencyJolService; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; this.authorizationCheckService = authorizationCheckService; } @@ -219,7 +219,7 @@ public ResponseEntity getCompetencyStudentProgress(@PathVari public ResponseEntity getCompetencyCourseProgress(@PathVariable long courseId, @PathVariable long competencyId) { log.debug("REST request to get course progress for competency: {}", competencyId); var course = courseRepository.findByIdElseThrow(courseId); - var competency = courseCompetencySimpleRepository.findByIdWithExercisesElseThrow(competencyId); + var competency = courseCompetencySimpleService.findByIdWithExercisesElseThrow(competencyId); var progress = competencyProgressService.getCompetencyCourseProgress(competency, course); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java index f99ca76ad4f2..eca979572a83 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java @@ -73,20 +73,20 @@ public class PrerequisiteResource { private final CourseCompetencyRepository courseCompetencyRepository; - private final CourseCompetencySimpleService courseCompetencySimpleRepository; + private final CourseCompetencySimpleService courseCompetencySimpleService; private final CourseCompetencyService courseCompetencyService; public PrerequisiteResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleService courseCompetencySimpleRepository, CourseCompetencyService courseCompetencyService) { + PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, + CourseCompetencySimpleService courseCompetencySimpleService, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; this.prerequisiteRepository = prerequisiteRepository; this.prerequisiteService = prerequisiteService; this.courseCompetencyRepository = courseCompetencyRepository; - this.courseCompetencySimpleRepository = courseCompetencySimpleRepository; + this.courseCompetencySimpleService = courseCompetencySimpleService; this.courseCompetencyService = courseCompetencyService; } @@ -189,7 +189,7 @@ public ResponseEntity importPrerequisite(@PathVariable long course long prerequisiteId = importOptions.competencyIds().iterator().next(); var course = courseRepository.findWithEagerCompetenciesAndPrerequisitesByIdElseThrow(courseId); - var prerequisiteToImport = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(prerequisiteId); + var prerequisiteToImport = courseCompetencySimpleService.findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(prerequisiteId); authorizationCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.EDITOR, prerequisiteToImport.getCourse(), null); if (prerequisiteToImport.getCourse().getId().equals(courseId)) { @@ -322,7 +322,7 @@ public ResponseEntity deletePrerequisite(@PathVariable long prerequisiteId log.info("REST request to delete a Prerequisite : {}", prerequisiteId); var course = courseRepository.findByIdElseThrow(courseId); - var prerequisite = courseCompetencySimpleRepository.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(prerequisiteId); + var prerequisite = courseCompetencySimpleService.findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(prerequisiteId); checkCourseForPrerequisite(course, prerequisite); courseCompetencyService.deleteCourseCompetency(prerequisite, course); From bbadbe6405342370185a990c7ba8cda09992297b Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 17 Dec 2024 12:28:40 +0100 Subject: [PATCH 16/19] use abstract getEntityName in AbstractSimpleService --- .../simple/CompetencySimpleService.java | 11 +++++++---- .../simple/CourseCompetencySimpleService.java | 17 ++++++++++------- .../repository/base/AbstractSimpleService.java | 6 ++++++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java index ebb95c02faf6..372ddf85212f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java @@ -13,19 +13,22 @@ @Service public class CompetencySimpleService extends AbstractSimpleService { - private final static String ENTITY_NAME = "Competency"; - private final CompetencyRepository competencyRepository; + @Override + protected String getEntityName() { + return "Competency"; + } + public CompetencySimpleService(CompetencyRepository competencyRepository) { this.competencyRepository = competencyRepository; } public Competency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { - return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId)); } public Competency findByIdWithLectureUnitsElseThrow(long competencyId) { - return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + return getValueElseThrow(competencyRepository.findByIdWithLectureUnitsAndExercises(competencyId)); } } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java index f720a618f22f..bd371746d026 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java @@ -18,24 +18,27 @@ @Service public class CourseCompetencySimpleService extends AbstractSimpleService { - private static final String ENTITY_NAME = "CourseCompetency"; - private final CourseCompetencyRepository courseCompetencyRepository; + @Override + protected String getEntityName() { + return "CourseCompetency"; + } + public CourseCompetencySimpleService(CourseCompetencyRepository courseCompetencyRepository) { this.courseCompetencyRepository = courseCompetencyRepository; } public CourseCompetency findByIdWithExercisesAndLectureUnitsAndLecturesElseThrow(long id) { - return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsAndLectures(id), ENTITY_NAME); + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsAndLectures(id)); } public CourseCompetency findByIdWithExercisesAndLectureUnitsElseThrow(long competencyId) { - return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnits(competencyId), ENTITY_NAME); + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnits(competencyId)); } public CourseCompetency findByIdWithExercisesAndLectureUnitsBidirectionalElseThrow(long competencyId) { - return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsBidirectional(competencyId), ENTITY_NAME); + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercisesAndLectureUnitsBidirectional(competencyId)); } /** @@ -53,10 +56,10 @@ public Set findAllIdsByLearningObject(LearningObject learningObject) { } public CourseCompetency findByIdWithExercisesElseThrow(long competencyId) { - return getValueElseThrow(courseCompetencyRepository.findByIdWithExercises(competencyId), ENTITY_NAME); + return getValueElseThrow(courseCompetencyRepository.findByIdWithExercises(competencyId)); } public CourseCompetency findByIdWithLectureUnitsAndExercisesElseThrow(long competencyId) { - return getValueElseThrow(courseCompetencyRepository.findByIdWithLectureUnitsAndExercises(competencyId), ENTITY_NAME); + return getValueElseThrow(courseCompetencyRepository.findByIdWithLectureUnitsAndExercises(competencyId)); } } diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java index ce08bbdec690..2bfb99323a1f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java @@ -11,6 +11,12 @@ */ public abstract class AbstractSimpleService { + protected abstract String getEntityName(); + + protected U getValueElseThrow(Optional optional) { + return getValueElseThrow(optional, getEntityName()); + } + protected U getValueElseThrow(Optional optional, String entityName) { return optional.orElseThrow(() -> new EntityNotFoundException(entityName)); } From d31c49a23c309905c0364eae6b4da220aadd4a39 Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 17 Dec 2024 12:29:10 +0100 Subject: [PATCH 17/19] fmt --- .../atlas/service/competency/CompetencyService.java | 10 +++++----- .../cit/aet/artemis/atlas/web/CompetencyResource.java | 5 ++--- .../artemis/atlas/web/CourseCompetencyResource.java | 8 ++++---- .../aet/artemis/atlas/web/PrerequisiteResource.java | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java index 659512ccd858..954cb530daff 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/competency/CompetencyService.java @@ -49,11 +49,11 @@ public class CompetencyService extends CourseCompetencyService { private final CompetencyExerciseLinkRepository competencyExerciseLinkRepository; public CompetencyService(CompetencyRepository competencyRepository, AuthorizationCheckService authCheckService, CompetencyRelationRepository competencyRelationRepository, - CourseCompetencySimpleService courseCompetencySimpleService, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, - LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, - StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, - LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, - CompetencySimpleService competencySimpleService, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { + CourseCompetencySimpleService courseCompetencySimpleService, LearningPathService learningPathService, CompetencyProgressService competencyProgressService, + LectureUnitService lectureUnitService, CompetencyProgressRepository competencyProgressRepository, LectureUnitCompletionRepository lectureUnitCompletionRepository, + StandardizedCompetencyRepository standardizedCompetencyRepository, CourseCompetencyRepository courseCompetencyRepository, ExerciseService exerciseService, + LearningObjectImportService learningObjectImportService, CompetencyLectureUnitLinkRepository competencyLectureUnitLinkRepository, CourseRepository courseRepository, + CompetencySimpleService competencySimpleService, CompetencyExerciseLinkRepository competencyExerciseLinkRepository) { super(competencyProgressRepository, courseCompetencyRepository, courseCompetencySimpleService, competencyRelationRepository, competencyProgressService, exerciseService, lectureUnitService, learningPathService, authCheckService, standardizedCompetencyRepository, lectureUnitCompletionRepository, learningObjectImportService, courseRepository); diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java index c944f03d9301..89405a7e739c 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CompetencyResource.java @@ -77,9 +77,8 @@ public class CompetencyResource { private final CourseCompetencyService courseCompetencyService; public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - CompetencyRepository competencyRepository, CompetencySimpleService competencySimpleService, CompetencyService competencyService, - CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleService courseCompetencySimpleService, - CourseCompetencyService courseCompetencyService) { + CompetencyRepository competencyRepository, CompetencySimpleService competencySimpleService, CompetencyService competencyService, + CourseCompetencyRepository courseCompetencyRepository, CourseCompetencySimpleService courseCompetencySimpleService, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java index ffbf0ea89607..39225fa1011f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/CourseCompetencyResource.java @@ -97,10 +97,10 @@ public class CourseCompetencyResource { private final AuthorizationCheckService authorizationCheckService; public CourseCompetencyResource(UserRepository userRepository, CourseCompetencyService courseCompetencyService, CourseCompetencyRepository courseCompetencyRepository, - CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, - CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, - Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, - CourseCompetencySimpleService courseCompetencySimpleService, AuthorizationCheckService authorizationCheckService) { + CourseRepository courseRepository, CompetencyProgressService competencyProgressService, CompetencyProgressRepository competencyProgressRepository, + CompetencyRelationRepository competencyRelationRepository, CompetencyRelationService competencyRelationService, + Optional irisCompetencyGenerationService, CompetencyJolService competencyJolService, + CourseCompetencySimpleService courseCompetencySimpleService, AuthorizationCheckService authorizationCheckService) { this.userRepository = userRepository; this.courseCompetencyService = courseCompetencyService; this.courseCompetencyRepository = courseCompetencyRepository; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java index eca979572a83..14571bd7562f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/web/PrerequisiteResource.java @@ -78,8 +78,8 @@ public class PrerequisiteResource { private final CourseCompetencyService courseCompetencyService; public PrerequisiteResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository, - PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, - CourseCompetencySimpleService courseCompetencySimpleService, CourseCompetencyService courseCompetencyService) { + PrerequisiteRepository prerequisiteRepository, PrerequisiteService prerequisiteService, CourseCompetencyRepository courseCompetencyRepository, + CourseCompetencySimpleService courseCompetencySimpleService, CourseCompetencyService courseCompetencyService) { this.courseRepository = courseRepository; this.authorizationCheckService = authorizationCheckService; this.userRepository = userRepository; From 4f050e0a23a2c0668bcb7f8e57d624bc2c42abdd Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 17 Dec 2024 12:31:35 +0100 Subject: [PATCH 18/19] change AbstractSimpleService from abstract class to interface --- .../repository/simple/CompetencySimpleService.java | 6 +++--- .../simple/CourseCompetencySimpleService.java | 6 +++--- ...{AbstractSimpleService.java => ISimpleService.java} | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/de/tum/cit/aet/artemis/core/repository/base/{AbstractSimpleService.java => ISimpleService.java} (55%) diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java index 372ddf85212f..da854465b54b 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CompetencySimpleService.java @@ -7,16 +7,16 @@ import de.tum.cit.aet.artemis.atlas.domain.competency.Competency; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRepository; -import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; +import de.tum.cit.aet.artemis.core.repository.base.ISimpleService; @Profile(PROFILE_CORE) @Service -public class CompetencySimpleService extends AbstractSimpleService { +public class CompetencySimpleService implements ISimpleService { private final CompetencyRepository competencyRepository; @Override - protected String getEntityName() { + public String getEntityName() { return "Competency"; } diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java index bd371746d026..0fa4684bd3e2 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/repository/simple/CourseCompetencySimpleService.java @@ -10,18 +10,18 @@ import de.tum.cit.aet.artemis.atlas.domain.LearningObject; import de.tum.cit.aet.artemis.atlas.domain.competency.CourseCompetency; import de.tum.cit.aet.artemis.atlas.repository.CourseCompetencyRepository; -import de.tum.cit.aet.artemis.core.repository.base.AbstractSimpleService; +import de.tum.cit.aet.artemis.core.repository.base.ISimpleService; import de.tum.cit.aet.artemis.exercise.domain.Exercise; import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; @Profile(PROFILE_CORE) @Service -public class CourseCompetencySimpleService extends AbstractSimpleService { +public class CourseCompetencySimpleService implements ISimpleService { private final CourseCompetencyRepository courseCompetencyRepository; @Override - protected String getEntityName() { + public String getEntityName() { return "CourseCompetency"; } diff --git a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/ISimpleService.java similarity index 55% rename from src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java rename to src/main/java/de/tum/cit/aet/artemis/core/repository/base/ISimpleService.java index 2bfb99323a1f..b004fe55370d 100644 --- a/src/main/java/de/tum/cit/aet/artemis/core/repository/base/AbstractSimpleService.java +++ b/src/main/java/de/tum/cit/aet/artemis/core/repository/base/ISimpleService.java @@ -6,18 +6,18 @@ import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; /** - * Abstract base for simple (repository) services. These are services on repository + * Interface for simple (repository) services. These are services on repository * layer which contain the default methods of the repository layer/data access. */ -public abstract class AbstractSimpleService { +public interface ISimpleService { - protected abstract String getEntityName(); + String getEntityName(); - protected U getValueElseThrow(Optional optional) { + default U getValueElseThrow(Optional optional) { return getValueElseThrow(optional, getEntityName()); } - protected U getValueElseThrow(Optional optional, String entityName) { + default U getValueElseThrow(Optional optional, String entityName) { return optional.orElseThrow(() -> new EntityNotFoundException(entityName)); } } From 902a7ed95f9f5789b15d5330b464c091ca53b71a Mon Sep 17 00:00:00 2001 From: Ole Vester Date: Tue, 17 Dec 2024 12:35:40 +0100 Subject: [PATCH 19/19] change test for ensuring single autowire in SimpleServices to allow for no results --- .../module/AbstractModuleRepositoryArchitectureTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java index 2ee9151813c1..17c09ad2b456 100644 --- a/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/shared/architecture/module/AbstractModuleRepositoryArchitectureTest.java @@ -354,6 +354,6 @@ public void check(JavaClass javaClass, ConditionEvents events) { events.add(SimpleConditionEvent.violated(javaClass, message)); } } - }).because("Simple Services should have exactly one autowired candidate to remain simple").check(productionClasses); + }).because("Simple Services should have exactly one autowired candidate to remain simple").allowEmptyShould(true).check(productionClasses); } }