Remove Guice completely

This commit is contained in:
Andreas Svanberg 2024-06-04 16:40:36 +02:00
parent 426fa73e41
commit ff44a8c4d7
47 changed files with 21 additions and 992 deletions
core
daisy-integration
pom.xml
src/main
java/se/su/dsv/scipro/integration/daisy
resources/META-INF/services
pom.xml
view
pom.xml
src
main
java/se/su/dsv/scipro
resources/META-INF/services
test/java/se/su/dsv/scipro
war/src/test/java/se/su/dsv/scipro/workerthreads

@ -12,14 +12,6 @@
<artifactId>core</artifactId>
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-persist</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>

@ -1,158 +0,0 @@
package modules;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.multibindings.OptionalBinder;
import se.su.dsv.scipro.activityplan.*;
import se.su.dsv.scipro.checklist.*;
import se.su.dsv.scipro.date.DateService;
import se.su.dsv.scipro.date.DateServiceImpl;
import se.su.dsv.scipro.events.EventModule;
import se.su.dsv.scipro.finalseminar.*;
import se.su.dsv.scipro.finalthesis.FinalThesisService;
import se.su.dsv.scipro.finalthesis.FinalThesisServiceImpl;
import se.su.dsv.scipro.finalthesis.PublishingConsentService;
import se.su.dsv.scipro.finalthesis.PublishingConsentUnavailable;
import se.su.dsv.scipro.firstmeeting.FirstMeetingService;
import se.su.dsv.scipro.firstmeeting.FirstMeetingServiceImpl;
import se.su.dsv.scipro.forum.ForumModule;
import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService;
import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsServiceImpl;
import se.su.dsv.scipro.group.GroupFacade;
import se.su.dsv.scipro.group.GroupFacadeImpl;
import se.su.dsv.scipro.group.GroupService;
import se.su.dsv.scipro.group.GroupServiceImpl;
import se.su.dsv.scipro.integration.activityfinalseminar.ActivityFinalSeminarRepository;
import se.su.dsv.scipro.integration.activityfinalseminar.ActivityFinalSeminarRepositoryImpl;
import se.su.dsv.scipro.integration.activityforum.ActivityThreadRepository;
import se.su.dsv.scipro.integration.activityforum.ActivityThreadRepositoryImpl;
import se.su.dsv.scipro.mail.MailModule;
import se.su.dsv.scipro.match.ApplicationPeriodFacade;
import se.su.dsv.scipro.match.ApplicationPeriodFacadeImpl;
import se.su.dsv.scipro.match.MatchModule;
import se.su.dsv.scipro.milestones.service.*;
import se.su.dsv.scipro.milestones.service.impl.MilestoneActivityTemplateServiceImpl;
import se.su.dsv.scipro.milestones.service.impl.MilestonePhaseTemplateServiceImpl;
import se.su.dsv.scipro.milestones.service.impl.MilestoneServiceImpl;
import se.su.dsv.scipro.milestones.service.impl.MilestoneStatisticsServiceImpl;
import se.su.dsv.scipro.misc.DaysService;
import se.su.dsv.scipro.misc.DaysServiceImpl;
import se.su.dsv.scipro.nonworkperiod.NonWorkDayPeriodService;
import se.su.dsv.scipro.nonworkperiod.NonWorkDayPeriodServiceImpl;
import se.su.dsv.scipro.notes.NoteService;
import se.su.dsv.scipro.notes.NoteServiceImpl;
import se.su.dsv.scipro.notifications.NotificationModule;
import se.su.dsv.scipro.notifications.settings.service.DeliveryConfigurationService;
import se.su.dsv.scipro.notifications.settings.service.DeliveryConfigurationServiceImpl;
import se.su.dsv.scipro.notifications.settings.service.ReceiverConfigurationService;
import se.su.dsv.scipro.notifications.settings.service.ReceiverConfigurationServiceImpl;
import se.su.dsv.scipro.peer.*;
import se.su.dsv.scipro.plagiarism.*;
import se.su.dsv.scipro.project.ProjectPeopleStatisticsService;
import se.su.dsv.scipro.project.ProjectPeopleStatisticsServiceImpl;
import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.project.ProjectServiceImpl;
import se.su.dsv.scipro.projectpartner.ProjectPartnerRepository;
import se.su.dsv.scipro.projectpartner.ProjectPartnerRepositoryImpl;
import se.su.dsv.scipro.projectpartner.ProjectPartnerService;
import se.su.dsv.scipro.projectpartner.ProjectPartnerServiceImpl;
import se.su.dsv.scipro.reflection.ReflectionModule;
import se.su.dsv.scipro.report.*;
import se.su.dsv.scipro.reviewing.ProjectFinalSeminarStatisticsService;
import se.su.dsv.scipro.reviewing.ProjectFinalSeminarStatisticsServiceImpl;
import se.su.dsv.scipro.springdata.serviceimpls.SupervisorServiceImpl;
import se.su.dsv.scipro.springdata.serviceimpls.UnitServiceImpl;
import se.su.dsv.scipro.springdata.serviceimpls.UserProfileServiceImpl;
import se.su.dsv.scipro.springdata.services.SupervisorService;
import se.su.dsv.scipro.springdata.services.UnitService;
import se.su.dsv.scipro.springdata.services.UserProfileService;
import se.su.dsv.scipro.system.*;
import se.su.dsv.scipro.thesislink.ExternalLinkService;
import se.su.dsv.scipro.thesislink.ExternalLinkServiceImpl;
public class CoreModule extends AbstractModule {
@Override
protected void configure() {
install(new RepositoryModule());
bind(FooterLinkService.class).to(FooterLinkServiceImpl.class);
bind(ActivityThreadRepository.class).to(ActivityThreadRepositoryImpl.class);
bind(ActivityFinalSeminarRepository.class).to(ActivityFinalSeminarRepositoryImpl.class);
bind(UserService.class).to(UserServiceImpl.class);
bind(MergeService.class).to(MergeServiceImpl.class);
bind(PasswordService.class).to(PasswordServiceImpl.class);
bind(GeneralSystemSettingsService.class).to(GeneralSystemSettingsServiceImpl.class);
bind(ProjectTypeService.class).to(ProjectTypeServiceImpl.class);
bind(UnitService.class).to(UnitServiceImpl.class);
bind(ResearchAreaService.class).to(ResearchAreaServiceImpl.class);
bind(DateService.class).to(DateServiceImpl.class);
bind(ActivityPlanFacade.class).to(ActivityPlanFacadeImpl.class);
bind(ProjectService.class).to(ProjectServiceImpl.class);
bind(ProjectFinalSeminarStatisticsService.class).to(ProjectFinalSeminarStatisticsServiceImpl.class);
bind(ProjectPeopleStatisticsService.class).to(ProjectPeopleStatisticsServiceImpl.class);
bind(DeliveryConfigurationService.class).to(DeliveryConfigurationServiceImpl.class);
bind(ReceiverConfigurationService.class).to(ReceiverConfigurationServiceImpl.class);
bind(ActivityService.class).to(ActivityServiceImpl.class);
bind(ActivityPlanService.class).to(ActivityPlanServiceImpl.class);
bind(ActivityPlanTemplateService.class).to(ActivityPlanTemplateServiceImpl.class);
bind(ChecklistService.class).to(ChecklistServiceImpl.class);
bind(UserProfileService.class).to(UserProfileServiceImpl.class);
bind(FinalSeminarService.class).to(FinalSeminarServiceImpl.class);
bind(FinalSeminarSettingsService.class).to(FinalSeminarSettingsServiceImpl.class);
bind(SupervisorService.class).to(SupervisorServiceImpl.class);
bind(DaysService.class).to(DaysServiceImpl.class);
bind(NonWorkDayPeriodService.class).to(NonWorkDayPeriodServiceImpl.class);
bind(FinalSeminarOppositionService.class).to(FinalSeminarOppositionServiceImpl.class);
bind(AuthorRepository.class).to(AuthorRepositoryImpl.class);
bind(OppositionReportService.class).to(OppositionReportServiceImpl.class);
bind(ApplicationPeriodFacade.class).to(ApplicationPeriodFacadeImpl.class);
bind(GroupFacade.class).to(GroupFacadeImpl.class);
bind(ExternalLinkService.class).to(ExternalLinkServiceImpl.class);
bind(PeerRequestService.class).to(PeerRequestServiceImpl.class);
bind(PeerReviewService.class).to(PeerReviewServiceImpl.class);
bind(MilestoneActivityTemplateService.class).to(MilestoneActivityTemplateServiceImpl.class);
bind(FinalThesisService.class).to(FinalThesisServiceImpl.class);
OptionalBinder.newOptionalBinder(binder(), PublishingConsentService.class)
.setDefault().to(PublishingConsentUnavailable.class);
bind(ChecklistTemplateService.class).to(ChecklistTemplateServiceImpl.class);
bind(PeerPortal.class).to(PeerPortalImpl.class);
bind(FinalSeminarRespondentService.class).to(FinalSeminarRespondentServiceImpl.class);
bind(ProjectPartnerService.class).to(ProjectPartnerServiceImpl.class);
bind(GradingReportService.class).to(GradingReportServiceImpl.class);
bind(GradeCalculatorService.class).to(GradeCalculatorServiceImpl.class);
bind(UserNameService.class).to(UserNameServiceImpl.class);
bind(MileStoneService.class).to(MilestoneServiceImpl.class);
bind(MilestoneStatisticsService.class).to(MilestoneStatisticsServiceImpl.class);
bind(MilestonePhaseTemplateService.class).to(MilestonePhaseTemplateServiceImpl.class);
bind(ReportService.class).to(ReportServiceImpl.class);
bind(CommentThreadService.class).to(CommentThreadServiceImpl.class);
bind(CommentService.class).to(CommentServiceImpl.class);
bind(PerformReviewService.class).to(PeerPortalImpl.class);
bind(EventService.class).to(EventServiceImpl.class);
bind(ChecklistAnswerService.class).to(ChecklistAnswerServiceImpl.class);
bind(FinalSeminarUploadController.class).to(FinalSeminarUploadControllerImpl.class);
bind(FinalSeminarActiveParticipationService.class).to(FinalSeminarActiveParticipationServiceImpl.class);
bind(ExternalResourceService.class).to(ExternalResourceServiceImpl.class);
bind(GroupService.class).to(GroupServiceImpl.class);
bind(NoteService.class).to(NoteServiceImpl.class);
bind(MilestoneActivator.class).asEagerSingleton();
bind(ActivateCompletedMilestonesOnNewProjects.class).asEagerSingleton();
bind(FirstMeetingService.class).to(FirstMeetingServiceImpl.class);
bind(FinalSeminarCreationSubscribers.class).asEagerSingleton();
bind(ProjectPartnerRepository.class).to(ProjectPartnerRepositoryImpl.class);
install(new PlagiarismModule());
install(new NotificationModule());
install(new ProfileModule());
install(new EventModule());
install(new MatchModule());
install(new MailModule());
install(new ForumModule());
install(new ReflectionModule());
Multibinder.newSetBinder(binder(), UserImportService.class);
bind(UserSearchService.class).to(AggregateUserSearch.class);
Multibinder.newSetBinder(binder(), UserSearchProvider.class)
.addBinding().to(LocalUserSearch.class);
}
}

@ -1,15 +0,0 @@
package modules;
import com.google.inject.Key;
import com.google.inject.PrivateModule;
import com.google.inject.name.Names;
import se.su.dsv.scipro.profiles.CurrentProfile;
public class ProfileModule extends PrivateModule {
@Override
protected void configure() {
requireBinding(Key.get(String.class, Names.named("profile")));
bind(CurrentProfile.class).asEagerSingleton();
expose(CurrentProfile.class);
}
}

@ -1,63 +0,0 @@
package modules;
import com.google.inject.AbstractModule;
import se.su.dsv.scipro.checklist.ChecklistCategoryRepo;
import se.su.dsv.scipro.checklist.ChecklistCategoryRepoImpl;
import se.su.dsv.scipro.checklist.ChecklistQuestionRepo;
import se.su.dsv.scipro.checklist.ChecklistQuestionRepoImpl;
import se.su.dsv.scipro.finalseminar.FinalSeminarActiveParticipationRepository;
import se.su.dsv.scipro.finalseminar.FinalSeminarActiveParticipationRepositoryImpl;
import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepo;
import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepoImpl;
import se.su.dsv.scipro.finalseminar.FinalSeminarRepository;
import se.su.dsv.scipro.finalseminar.FinalSeminarRepositoryImpl;
import se.su.dsv.scipro.milestones.MilestoneActivityTemplateRepository;
import se.su.dsv.scipro.milestones.MilestoneActivityTemplateRepositoryImpl;
import se.su.dsv.scipro.peer.CommentThreadRepo;
import se.su.dsv.scipro.peer.CommentThreadRepoImpl;
import se.su.dsv.scipro.peer.PeerRequestRepository;
import se.su.dsv.scipro.peer.PeerRequestRepositoryImpl;
import se.su.dsv.scipro.peer.PeerReviewRepository;
import se.su.dsv.scipro.peer.PeerReviewRepositoryImpl;
import se.su.dsv.scipro.project.ProjectRepo;
import se.su.dsv.scipro.project.ProjectRepoImpl;
import se.su.dsv.scipro.report.GradingReportTemplateRepo;
import se.su.dsv.scipro.report.GradingReportTemplateRepoImpl;
import se.su.dsv.scipro.report.OppositionReportRepo;
import se.su.dsv.scipro.report.OppositionReportRepoImpl;
import se.su.dsv.scipro.reviewing.DecisionRepository;
import se.su.dsv.scipro.reviewing.DecisionRepositoryImpl;
import se.su.dsv.scipro.reviewing.ReviewerTargetRepository;
import se.su.dsv.scipro.reviewing.ReviewerTargetRepositoryImpl;
import se.su.dsv.scipro.system.FooterAddressRepo;
import se.su.dsv.scipro.system.FooterAddressRepoImpl;
import se.su.dsv.scipro.system.FooterLinkRepo;
import se.su.dsv.scipro.system.FooterLinkRepoImpl;
import se.su.dsv.scipro.system.PasswordRepo;
import se.su.dsv.scipro.system.PasswordRepoImpl;
import se.su.dsv.scipro.system.UserRepo;
import se.su.dsv.scipro.system.UserRepoImpl;
public class RepositoryModule extends AbstractModule {
@Override
protected void configure() {
bind(ChecklistQuestionRepo.class).to(ChecklistQuestionRepoImpl.class);
bind(FinalSeminarOppositionRepo.class).to(FinalSeminarOppositionRepoImpl.class);
bind(FinalSeminarActiveParticipationRepository.class).to(FinalSeminarActiveParticipationRepositoryImpl.class);
bind(GradingReportTemplateRepo.class).to(GradingReportTemplateRepoImpl.class);
bind(MilestoneActivityTemplateRepository.class).to(MilestoneActivityTemplateRepositoryImpl.class);
bind(OppositionReportRepo.class).to(OppositionReportRepoImpl.class);
bind(PasswordRepo.class).to(PasswordRepoImpl.class);
bind(ProjectRepo.class).to(ProjectRepoImpl.class);
bind(UserRepo.class).to(UserRepoImpl.class);
bind(PeerReviewRepository.class).to(PeerReviewRepositoryImpl.class);
bind(PeerRequestRepository.class).to(PeerRequestRepositoryImpl.class);
bind(ChecklistCategoryRepo.class).to(ChecklistCategoryRepoImpl.class);
bind(CommentThreadRepo.class).to(CommentThreadRepoImpl.class);
bind(FooterLinkRepo.class).to(FooterLinkRepoImpl.class);
bind(FooterAddressRepo.class).to(FooterAddressRepoImpl.class);
bind(FinalSeminarRepository.class).to(FinalSeminarRepositoryImpl.class);
bind(ReviewerTargetRepository.class).to(ReviewerTargetRepositoryImpl.class);
bind(DecisionRepository.class).to(DecisionRepositoryImpl.class);
}
}

@ -1,20 +0,0 @@
package se.su.dsv.scipro.daisyExternal;
import com.google.inject.Key;
import com.google.inject.PrivateModule;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
import se.su.dsv.scipro.daisyExternal.http.DaisyAPIImpl;
public class DaisyExternalModule extends PrivateModule {
@Override
protected void configure() {
requireBinding(Key.get(String.class, Names.named("daisy.api.url")));
requireBinding(Key.get(String.class, Names.named("daisy.api.username")));
requireBinding(Key.get(String.class, Names.named("daisy.api.password")));
bind(DaisyAPI.class).to(DaisyAPIImpl.class).in(Scopes.SINGLETON);
expose(DaisyAPI.class);
}
}

@ -1,15 +0,0 @@
package se.su.dsv.scipro.events;
import com.google.common.eventbus.EventBus;
import com.google.inject.AbstractModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EventModule extends AbstractModule {
private static final Logger LOGGER = LoggerFactory.getLogger(EventModule.class);
@Override
protected void configure() {
bind(EventBus.class).toInstance(new EventBus((throwable, context) -> LOGGER.error("Could not dispatch event: " + context.getSubscriber() + " to " + context.getSubscriberMethod(), throwable)));
}
}

@ -1,16 +0,0 @@
package se.su.dsv.scipro.file;
import com.google.inject.AbstractModule;
public class FileModule extends AbstractModule {
@Override
protected void configure() {
bind(FileService.class).to(FileServiceImpl.class);
bind(ProjectFileService.class).to(ProjectFileServiceImpl.class);
bind(ProjectFileRepository.class).to(ProjectFileRepositoryImpl.class);
bind(FileReferenceRepository.class).to(FileReferenceRepositoryImpl.class);
bind(FileDescriptionRepo.class).to(FileDescriptionRepoImpl.class);
requireBinding(FileStore.class);
}
}

@ -1,11 +0,0 @@
package se.su.dsv.scipro.firstmeeting;
import com.google.inject.AbstractModule;
import se.su.dsv.scipro.firstmeeting.FirstMeetingReminderWorker.FirstMeetingReminderWorkerSchedule;
public class FirstMeetingModule extends AbstractModule {
@Override
public void configure() {
bind(FirstMeetingReminderWorkerSchedule.class).asEagerSingleton();
}
}

@ -1,26 +0,0 @@
package se.su.dsv.scipro.forum;
import com.google.inject.PrivateModule;
public class ForumModule extends PrivateModule {
@Override
protected void configure() {
bind(AbstractThreadRepository.class).to(AbstractThreadRepositoryImpl.class);
bind(ForumPostReadStateRepository.class).to(ForumPostReadStateRepositoryImpl.class);
bind(ForumPostRepository.class).to(ForumPostRepositoryImpl.class);
bind(ProjectThreadRepository.class).to(ProjectThreadRepositoryImpl.class);
bind(GroupThreadRepository.class).to(GroupThreadRepositoryImpl.class);
expose(ProjectThreadRepository.class);
expose(GroupThreadRepository.class);
bind(ProjectForumService.class).to(ProjectForumServiceImpl.class);
bind(GroupForumService.class).to(GroupForumServiceImpl.class);
expose(ProjectForumService.class);
expose(GroupForumService.class);
bind(BasicForumService.class).to(BasicForumServiceImpl.class);
expose(BasicForumService.class);
}
}

@ -1,11 +0,0 @@
package se.su.dsv.scipro.forum.notifications;
import com.google.inject.AbstractModule;
public class ForumNotificationsModule extends AbstractModule {
@Override
public void configure() {
bind(ForumNotificationRepository.class).to(ForumNotificationRepositoryImpl.class);
bind(ForumNotifications.class).asEagerSingleton();
}
}

@ -1,12 +0,0 @@
package se.su.dsv.scipro.gdpr;
import com.google.inject.PrivateModule;
public class GDPRModule extends PrivateModule {
@Override
protected void configure() {
bind(Reporter.class).to(ZipReporter.class);
expose(Reporter.class);
}
}

@ -1,33 +0,0 @@
package se.su.dsv.scipro.grading;
import com.google.inject.Key;
import com.google.inject.PrivateModule;
import com.google.inject.name.Names;
public class GradingModule extends PrivateModule {
@Override
protected void configure() {
requireBinding(Key.get(String.class, Names.named("service.grading.url")));
bind(GradingService.class).to(GradingServiceImpl.class);
expose(GradingService.class);
bind(PublicationMetadataRepository.class).to(PublicationMetadataRepositoryImpl.class);
bind(PublicationMetadataService.class).to(PublicationMetadataServiceImpl.class);
expose(PublicationMetadataService.class);
bind(ExaminerTimelineService.class).to(GradingHistory.class);
expose(ExaminerTimelineService.class);
bind(GradingHistoryEventRepository.class).to(GradingHistoryEventRepositoryImpl.class);
bind(ThesisRejectionHistoryService.class).to(GradingHistory.class);
expose(ThesisRejectionHistoryService.class);
bind(ThesisApprovedHistoryService.class).to(GradingHistory.class);
expose(ThesisApprovedHistoryService.class);
bind(ThesisSubmissionHistoryService.class).to(GradingHistory.class);
expose(ThesisSubmissionHistoryService.class);
bind(NationalSubjectCategoryRepository.class).to(NationalSubjectCategoryRepositoryImpl.class);
bind(NationalSubjectCategoryService.class).to(NationalSubjectCategoryServiceImpl.class);
expose(NationalSubjectCategoryService.class);
}
}

@ -1,11 +0,0 @@
package se.su.dsv.scipro.integration.activityfinalseminar;
import com.google.inject.AbstractModule;
public class ActivityFinalSeminarModule extends AbstractModule {
@Override
protected void configure() {
bind(FinalSeminarActivityHandler.class).asEagerSingleton();
bind(ActivityFinalSeminarRepository.class).to(ActivityFinalSeminarRepositoryImpl.class);
}
}

@ -1,11 +0,0 @@
package se.su.dsv.scipro.integration.activityforum;
import com.google.inject.AbstractModule;
public class ActivityForumModule extends AbstractModule {
@Override
protected void configure() {
bind(PostActivityUploadToForum.class).asEagerSingleton();
bind(ActivityThreadRepository.class).to(ActivityThreadRepositoryImpl.class);
}
}

@ -1,43 +0,0 @@
package se.su.dsv.scipro.mail;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import se.su.dsv.scipro.file.FileService;
import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService;
import se.su.dsv.scipro.profiles.CurrentProfile;
import jakarta.mail.Session;
import java.util.Properties;
public class MailModule extends PrivateModule {
private static final String TEST_MAIL_SINK = "scipro-mailtest@dsv.su.se";
@Override
protected void configure() {
requireBinding(CurrentProfile.class);
requireBinding(GeneralSystemSettingsService.class);
bind(MailEventService.class).to(MailEventServiceImpl.class);
expose(MailEventService.class);
}
@Provides
@Exposed
public Mailer mailer(CurrentProfile currentProfile, Session session, FileService fileDescriptionService) {
return switch (currentProfile.getCurrentProfile()) {
case DEV -> new PrintingMailer();
case PROD -> new Mail(session, fileDescriptionService);
case TEST -> new RedirectingMailer(session, TEST_MAIL_SINK, fileDescriptionService);
};
}
@Provides
public Session session(GeneralSystemSettingsService generalSystemSettings) {
String smtpHost = generalSystemSettings.getGeneralSystemSettingsInstance().getSmtpServer();
Properties properties = new Properties();
properties.setProperty("mail.smtp.host", smtpHost);
properties.setProperty("mail.smtp.sendpartial", Boolean.toString(true));
return Session.getDefaultInstance(properties);
}
}

@ -1,26 +0,0 @@
package se.su.dsv.scipro.match;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.OptionalBinder;
public class MatchModule extends AbstractModule {
@Override
protected void configure() {
OptionalBinder.newOptionalBinder(binder(), IdeaCreationJudge.class)
.setDefault().to(AllowAllIdeaCreationJudge.class);
bind(ProjectStartNotifier.class).asEagerSingleton();
bind(AddActivityPlanOnProjectStart.class).asEagerSingleton();
bind(ApplicationPeriodService.class).to(ApplicationPeriodServiceImpl.class);
bind(IdeaService.class).to(IdeaServiceImpl.class);
bind(FirstMeetingRepository.class).to(FirstMeetingRepositoryImpl.class);
bind(KeywordService.class).to(KeywordServiceImpl.class);
bind(MatchService.class).to(MatchServiceImpl.class);
bind(ProgramService.class).to(ProgramServiceImpl.class);
bind(MatchFollowUpService.class).to(MatchFollowUpServiceImpl.class);
bind(TargetService.class).to(TargetServiceImpl.class);
bind(ApplicationPeriodProjectTypeService.class).to(ApplicationPeriodProjectTypeServiceImpl.class);
bind(PreliminaryMatchService.class).to(PreliminaryMatchServiceImpl.class);
bind(IdeaRepository.class).to(IdeaRepositoryImpl.class);
bind(TargetRepository.class).to(TargetRepositoryImpl.class);
}
}

@ -1,6 +1,5 @@
package se.su.dsv.scipro.notifications;
import com.google.inject.ProvisionException;
import se.su.dsv.scipro.data.dataobjects.Member;
import se.su.dsv.scipro.finalseminar.FinalSeminar;
import se.su.dsv.scipro.group.Group;
@ -94,7 +93,7 @@ public class NotificationControllerImpl implements NotificationController {
try {
return currentUserProvider.get().get();
}
catch (ProvisionException ignored) {
catch (RuntimeException ignored) {
return null;
}
}

@ -1,28 +0,0 @@
package se.su.dsv.scipro.notifications;
import com.google.inject.PrivateModule;
import se.su.dsv.scipro.notifications.interfaces.NotificationMailFormatter;
import se.su.dsv.scipro.notifications.interfaces.impl.NotificationMailFormatterImpl;
public class NotificationModule extends PrivateModule {
public static final String NOTIFICATION_RELATIVE_PAGE_URL = "notification";
@Override
protected void configure() {
bind(Notifications.class).asEagerSingleton();
bind(NotificationService.class).to(NotificationServiceImpl.class);
expose(NotificationService.class);
bind(NotificationEventRepository.class).to(NotificationEventRepositoryImpl.class);
bind(NotificationEventService.class).to(NotificationEventServiceImpl.class);
expose(NotificationEventService.class);
bind(NotificationMailFormatter.class).to(NotificationMailFormatterImpl.class);
expose(NotificationMailFormatter.class);
bind(NotificationController.class).to(NotificationControllerImpl.class);
expose(NotificationController.class);
}
}

@ -8,7 +8,6 @@ import se.su.dsv.scipro.finalseminar.FinalSeminar;
import se.su.dsv.scipro.finalseminar.FinalSeminarService;
import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettings;
import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService;
import se.su.dsv.scipro.notifications.NotificationModule;
import se.su.dsv.scipro.notifications.dataobject.*;
import se.su.dsv.scipro.notifications.interfaces.NotificationMailFormatter;
import se.su.dsv.scipro.project.Project;
@ -158,7 +157,7 @@ public class NotificationMailFormatterImpl implements NotificationMailFormatter
private String getAbsoluteURL(final Notification notification) {
final String baseUrl = systemSettingsService.getGeneralSystemSettingsInstance().getSciproURL();
long id = notification.getNotificationEvent().getId();
return baseUrl + "/" + NotificationModule.NOTIFICATION_RELATIVE_PAGE_URL + "?id=" + id;
return baseUrl + "/" + "notification" + "?id=" + id;
}
String makeProperty(Object... parts) {

@ -1,25 +0,0 @@
package se.su.dsv.scipro.oauth;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.inject.Named;
public class OAuthModule extends PrivateModule {
@Override
protected void configure() {
bind(OAuthService.class).to(OAuthServiceImpl.class);
expose(OAuthService.class);
}
@Provides
OAuthSettings settings(
@Named("oauth.uri") String uri,
@Named("oauth.redirectUri") String redirectUri,
@Named("oauth.clientId") String clientId,
@Named("oauth.clientSecret") String clientSecret)
{
return new OAuthSettings(uri, redirectUri, clientId, clientSecret);
}
}

@ -1,13 +0,0 @@
package se.su.dsv.scipro.peer;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import se.su.dsv.scipro.system.Lifecycle;
public class PeerModule extends AbstractModule {
@Override
protected void configure() {
Multibinder.newSetBinder(binder(), Lifecycle.class)
.addBinding().to(PeerWorkerSchedules.class);
}
}

@ -1,11 +0,0 @@
package se.su.dsv.scipro.plagiarism;
import com.google.inject.AbstractModule;
public class PlagiarismModule extends AbstractModule {
@Override
protected void configure() {
bind(PlagiarismControl.class).to(PlagiarismControlImpl.class);
bind(PlagiarismRequestRepository.class).to(PlagiarismRequestRepositoryImpl.class);
}
}

@ -1,26 +0,0 @@
package se.su.dsv.scipro.plagiarism.urkund;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Scopes;
import se.su.dsv.scipro.sukat.Sukat;
import jakarta.persistence.EntityManager;
public class UrkundModule extends AbstractModule {
@Override
protected void configure() {
bind(UrkundService.class).to(UrkundServiceImpl.class);
bind(UrkundSubmissionRepository.class).to(UrkundSubmissionRepositoryImpl.class);
bind(UrkundApi.class).to(UrkundApiImpl.class).in(Scopes.SINGLETON);
bind(UrkundSettingsRepository.class).to(UrkundSettingsRepositoryImpl.class);
requireBinding(EntityManager.class);
requireBinding(Sukat.class);
}
@Provides
public UrkundSettings urkundSettings(UrkundSettingsRepository urkundSettingsRepository) {
return urkundSettingsRepository.getSettings();
}
}

@ -1,13 +0,0 @@
package se.su.dsv.scipro.reflection;
import com.google.inject.AbstractModule;
import se.su.dsv.scipro.finalseminar.AuthorRepository;
public class ReflectionModule extends AbstractModule {
@Override
protected void configure() {
requireBinding(AuthorRepository.class);
bind(ReflectionService.class).to(ReflectionServiceImpl.class);
}
}

@ -1,25 +0,0 @@
package se.su.dsv.scipro.reviewing;
import com.google.inject.AbstractModule;
import se.su.dsv.scipro.file.FileService;
import jakarta.persistence.EntityManager;
public class ReviewingModule extends AbstractModule {
@Override
protected void configure() {
requireBinding(FileService.class);
requireBinding(EntityManager.class);
bind(ReviewerThreadRepository.class).to(ReviewerThreadRepositoryImpl.class);
bind(ReviewerInteractionService.class).to(ReviewerInteractionServiceImpl.class);
bind(FinalSeminarApprovalService.class).to(FinalSeminarApprovalServiceImpl.class);
bind(MyReviewService.class).to(ReviewingServiceImpl.class);
bind(ReviewerDecisionService.class).to(ReviewingServiceImpl.class);
bind(RoughDraftApprovalService.class).to(RoughDraftApprovalServiceImpl.class);
bind(ReviewerDeadlineSettingsService.class).to(ReviewerDeadlineSettingsServiceImpl.class);
bind(ReviewerDeadlineSettingsRepository.class).to(ReviewerDeadlineSettingsRepositoryImpl.class);
bind(ReviewerDeadlineFollowupService.class).to(ReviewerDeadlineFollowupServiceImpl.class);
bind(ReviewerCapacityService.class).to(ReviewerCapacityServiceImpl.class);
bind(ReviewerAssignmentService.class).to(ReviewerCapacityServiceImpl.class);
}
}

@ -1,15 +0,0 @@
package se.su.dsv.scipro.security.auth;
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
public class AuthenticationModule extends AbstractModule {
@Override
protected void configure() {
bind(AuthenticationService.class).to(AuthenticationServiceImpl.class);
Multibinder<AuthenticationProvider> authenticationProviders
= Multibinder.newSetBinder(binder(), AuthenticationProvider.class);
authenticationProviders.addBinding().to(LocalAuthentication.class);
}
}

@ -1,10 +0,0 @@
package se.su.dsv.scipro.sukat;
import com.google.inject.AbstractModule;
public class SukatModule extends AbstractModule {
@Override
protected void configure() {
bind(Sukat.class).to(LDAP.class);
}
}

@ -1,17 +0,0 @@
package se.su.dsv.scipro.survey;
import com.google.inject.AbstractModule;
import se.su.dsv.scipro.finalthesis.FinalThesisService;
import jakarta.persistence.EntityManager;
public class SurveyModule extends AbstractModule {
@Override
protected void configure() {
requireBinding(EntityManager.class);
requireBinding(FinalThesisService.class);
bind(SurveyRepository.class).to(SurveyRepositoryImpl.class);
bind(QuestionRepository.class).to(QuestionRepositoryImpl.class);
bind(SurveyService.class).to(SurveyServiceImpl.class);
}
}

@ -1,31 +0,0 @@
package se.su.dsv.scipro.workerthreads;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.google.inject.multibindings.Multibinder;
import se.su.dsv.scipro.mail.MailEventWorker;
import se.su.dsv.scipro.projectpartner.RemoveFulfilledPartnerAdsWorker;
import se.su.dsv.scipro.system.Lifecycle;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
public class WorkerModule extends AbstractModule {
private static final int NUMBER_OF_WORKER_THREADS = 4;
@Override
protected void configure() {
//Multibinder.newSetBinder(binder(), Lifecycle.class).addBinding().to(SchedulerImpl.class);
bind(ScheduledExecutorService.class).toInstance(Executors.newScheduledThreadPool(NUMBER_OF_WORKER_THREADS));
//bind(Scheduler.class).to(SchedulerImpl.class).in(Scopes.SINGLETON);
bind(TemporaryWorkerScheduler.class).asEagerSingleton();
bind(WorkerDataService.class).to(WorkerDataServiceImpl.class);
bind(ThesisUploadDeadlineWorker.class);
bind(ManualMatchRemindWorker.class);
bind(MailEventWorker.class);
bind(NotificationCompilationWorker.class);
bind(ThesisUploadReminderWorker.class);
bind(IdeaExportWorker.class);
bind(RemoveFulfilledPartnerAdsWorker.class);
}
}

@ -1,20 +1,15 @@
package se.su.dsv.scipro.forum;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import se.su.dsv.scipro.date.DateService;
import se.su.dsv.scipro.file.FileModule;
import se.su.dsv.scipro.file.FileStore;
import se.su.dsv.scipro.notifications.NotificationController;
import se.su.dsv.scipro.notifications.NotificationService;
import se.su.dsv.scipro.test.GuiceTest;
import se.su.dsv.scipro.test.InMemoryFileStore;
import se.su.dsv.scipro.test.SpringTest;
@ExtendWith(MockitoExtension.class)
public abstract class ForumModuleTest extends GuiceTest {
public abstract class ForumModuleTest extends SpringTest {
// TODO: Work towards removing these dependencies.
@Mock
private DateService dateService;
@ -23,18 +18,4 @@ public abstract class ForumModuleTest extends GuiceTest {
@Mock
private NotificationService notificationService;
@Override
protected Module moduleUnderTest() {
return new AbstractModule() {
@Override
protected void configure() {
install(new ForumModule());
install(new FileModule());
bind(FileStore.class).to(InMemoryFileStore.class);
bind(DateService.class).toInstance(dateService);
bind(NotificationController.class).toInstance(notificationController);
bind(NotificationService.class).toInstance(notificationService);
}
};
}
}

@ -1,9 +1,6 @@
package se.su.dsv.scipro.match;
import com.google.common.eventbus.EventBus;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.name.Names;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ -13,10 +10,10 @@ import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService;
import se.su.dsv.scipro.mail.MailEventService;
import se.su.dsv.scipro.notifications.NotificationController;
import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.test.GuiceTest;
import se.su.dsv.scipro.test.SpringTest;
@ExtendWith(MockitoExtension.class)
public abstract class MatchModuleTest extends GuiceTest {
public abstract class MatchModuleTest extends SpringTest {
// ToDo:The system services should be move to a system module that other modules can depend on
@Mock
protected DateService dateService;
@ -34,28 +31,4 @@ public abstract class MatchModuleTest extends GuiceTest {
@Mock
protected ProjectService projectService;
@Override
protected Module moduleUnderTest() {
return new AbstractModule() {
@Override
protected void configure() {
install(new MatchModule());
bind(GeneralSystemSettingsService.class).toInstance(generalSystemSettingsService);
bind(NotificationController.class).toInstance(notificationController);
bind(DateService.class).toInstance(dateService);
bind(MailEventService.class).toInstance(mailEventService);
bind(ActivityPlanFacade.class).toInstance(activityPlanFacade);
bind(EventBus.class).toInstance(eventBus);
bind(ProjectService.class).toInstance(projectService);
// Work towards removing the dependency on NotificationSourceURL
bindConstant().annotatedWith(Names.named("source.export.fail.supervisor")).to("");
bindConstant().annotatedWith(Names.named("source.export.fail.user")).to("");
bindConstant().annotatedWith(Names.named("source.export.success.supervisor")).to("");
bindConstant().annotatedWith(Names.named("source.export.success.user")).to("");
bindConstant().annotatedWith(Names.named("source.project.supervisor")).to("");
bindConstant().annotatedWith(Names.named("source.project.student")).to("");
}
};
}
}

@ -1,6 +1,5 @@
package se.su.dsv.scipro.notifications;
import com.google.inject.util.Providers;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
@ -55,7 +54,7 @@ public class NotificationControllerImplTest {
notificationService,
mailFormatter,
mailEventService,
receiverConfiguration, deliveryConfiguration, Providers.of(currentUser));
receiverConfiguration, deliveryConfiguration, () -> currentUser);
when(mailFormatter.format(isA(Notification.class))).thenReturn(new NotificationMail("Subject", "Body"));
when(deliveryConfiguration.isDelivery(isA(Notification.Type.class), isA(Enum.class), isA(DeliveryMethod.class), isA(Optional.class))).thenReturn(true);

@ -1,35 +1,16 @@
package se.su.dsv.scipro.plagiarism.urkund;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import org.junit.jupiter.api.Test;
import se.su.dsv.scipro.file.FileModule;
import se.su.dsv.scipro.file.FileStore;
import se.su.dsv.scipro.sukat.SukatModule;
import se.su.dsv.scipro.test.GuiceTest;
import se.su.dsv.scipro.test.InMemoryFileStore;
import se.su.dsv.scipro.test.SpringTest;
import jakarta.inject.Inject;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UrkundSettingsRepositoryTest extends GuiceTest {
public class UrkundSettingsRepositoryTest extends SpringTest {
@Inject
private UrkundSettingsRepository urkundSettingsRepository;
@Override
protected Module moduleUnderTest() {
return new AbstractModule() {
@Override
protected void configure() {
install(new SukatModule());
install(new UrkundModule());
install(new FileModule());
bind(FileStore.class).to(InMemoryFileStore.class);
}
};
}
@Test
public void change_settings() {
final UrkundSettings settings = urkundSettingsRepository.getSettings();

@ -1,18 +1,12 @@
package se.su.dsv.scipro.plagiarism.urkund;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.jupiter.api.Test;
import se.su.dsv.scipro.file.FileDescription;
import se.su.dsv.scipro.file.FileModule;
import se.su.dsv.scipro.file.FileReference;
import se.su.dsv.scipro.file.FileStore;
import se.su.dsv.scipro.sukat.Sukat;
import se.su.dsv.scipro.test.GuiceTest;
import se.su.dsv.scipro.test.InMemoryFileStore;
import se.su.dsv.scipro.test.SpringTest;
import jakarta.inject.Inject;
import java.time.Instant;
@ -22,23 +16,10 @@ import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
public class UrkundSubmissionRepositoryTest extends GuiceTest {
public class UrkundSubmissionRepositoryTest extends SpringTest {
@Inject
private UrkundSubmissionRepository submissionRepository;
@Override
protected Module moduleUnderTest() {
return new AbstractModule() {
@Override
protected void configure() {
install(new UrkundModule());
bind(Sukat.class).toInstance((username) -> Optional.empty());
install(new FileModule());
bind(FileStore.class).to(InMemoryFileStore.class);
}
};
}
@Test
public void save() {

@ -1,57 +1,5 @@
package se.su.dsv.scipro.test;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.name.Names;
import modules.CoreModule;
import se.su.dsv.scipro.file.FileModule;
import se.su.dsv.scipro.file.FileStore;
import se.su.dsv.scipro.grading.GradingHistory;
import se.su.dsv.scipro.grading.GradingHistoryEventRepository;
import se.su.dsv.scipro.grading.GradingHistoryEventRepositoryImpl;
import se.su.dsv.scipro.grading.GradingModule;
import se.su.dsv.scipro.grading.ThesisSubmissionHistoryService;
import se.su.dsv.scipro.plagiarism.urkund.UrkundModule;
import se.su.dsv.scipro.reviewing.ReviewingModule;
import se.su.dsv.scipro.sukat.SukatModule;
import se.su.dsv.scipro.system.CurrentUser;
import se.su.dsv.scipro.system.User;
public abstract class IntegrationTest extends SpringTest {
import jakarta.inject.Singleton;
public abstract class IntegrationTest extends GuiceTest {
@Override
protected Module moduleUnderTest() {
return new AbstractModule() {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("profile")).to("TEST");
install(new CoreModule());
install(new FileModule());
install(new ReviewingModule());
install(new SukatModule());
install(new UrkundModule());
bind(ThesisSubmissionHistoryService.class).to(GradingHistory.class);
bind(GradingHistoryEventRepository.class).to(GradingHistoryEventRepositoryImpl.class);
bind(CurrentUser.class).to(TestUser.class);
bind(FileStore.class).to(InMemoryFileStore.class);
}
};
}
@Singleton
private static class TestUser implements CurrentUser {
private User user;
public void set(User user) {
this.user = user;
}
@Override
public User get() {
return user;
}
}
}

@ -1,7 +1,6 @@
package se.su.dsv.scipro.test;
import com.google.common.eventbus.EventBus;
import com.google.inject.Module;
import jakarta.inject.Provider;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
@ -30,12 +29,12 @@ import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
public abstract class GuiceTest {
public abstract class SpringTest {
private EntityManager entityManager;
private EntityManagerFactory entityManagerFactory;
@BeforeEach
public final void prepareGuice() {
public final void prepareSpring() {
entityManagerFactory = Persistence.createEntityManagerFactory("testPersistenceUnit");
this.entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
@ -51,8 +50,6 @@ public abstract class GuiceTest {
.autowireBean(this);
}
protected abstract Module moduleUnderTest();
@AfterEach
public final void shutDownPersistence() {
entityManager.getTransaction().rollback();

@ -20,10 +20,6 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>

@ -1,44 +0,0 @@
package se.su.dsv.scipro.integration.daisy;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.multibindings.OptionalBinder;
import com.google.inject.servlet.ServletModule;
import se.su.dsv.scipro.daisyExternal.ExternalImporter;
import se.su.dsv.scipro.daisyExternal.ImporterTransactions;
import se.su.dsv.scipro.daisyExternal.impl.ExternalImporterDaisyImpl;
import se.su.dsv.scipro.daisyExternal.impl.ImporterTransactionsImpl;
import se.su.dsv.scipro.finalthesis.PublishingConsentService;
import se.su.dsv.scipro.integration.daisy.workers.ProjectExporter;
import se.su.dsv.scipro.integration.daisy.workers.UserImportWorker;
import se.su.dsv.scipro.io.ExternalExporter;
import se.su.dsv.scipro.io.impl.ExternalExporterDaisyImpl;
import se.su.dsv.scipro.match.IdeaCreationJudge;
import se.su.dsv.scipro.system.UserImportService;
import se.su.dsv.scipro.system.UserSearchProvider;
public class DaisyModule extends ServletModule {
@Override
protected void configureServlets() {
bind(ExternalImporter.class).to(ExternalImporterDaisyImpl.class);
bind(ImporterTransactions.class).to(ImporterTransactionsImpl.class);
OptionalBinder.newOptionalBinder(binder(), IdeaCreationJudge.class)
.setBinding().to(Daisy.class);
bind(ExternalExporter.class).to(ExternalExporterDaisyImpl.class);
bind(UserImportWorker.class);
bind(ProjectExporter.class);
bind(DaisyWorkerInitialization.class).asEagerSingleton();
bind(SyncReviewerWithDaisy.class).asEagerSingleton();
Multibinder.newSetBinder(binder(), UserImportService.class)
.addBinding().to(ExternalImporterDaisyImpl.class);
Multibinder.newSetBinder(binder(), UserSearchProvider.class)
.addBinding().to(DaisyUserSearchService.class);
OptionalBinder.newOptionalBinder(binder(), PublishingConsentService.class)
.setBinding().to(DaisyConsentService.class);
}
}

@ -1 +0,0 @@
se.su.dsv.scipro.integration.daisy.DaisyModule

10
pom.xml

@ -38,7 +38,6 @@
<mockito.version>5.3.1</mockito.version>
<flyway.version>9.19.1</flyway.version>
<jersey.version>3.1.6</jersey.version>
<guice.version>7.0.0</guice.version>
<poi.version>5.2.5</poi.version>
<jackson.version>2.17.0</jackson.version>
@ -90,7 +89,7 @@
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-guice</artifactId>
<artifactId>wicket-ioc</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependency>
@ -204,13 +203,6 @@
<artifactId>guava</artifactId>
<version>32.0.1-jre</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice-bom</artifactId>
<version>${guice.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>jakarta.mail</groupId>

@ -13,15 +13,6 @@
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-persist</artifactId>
</dependency>
<dependency>
<groupId>se.su.dsv.scipro</groupId>
<artifactId>core</artifactId>
@ -44,7 +35,7 @@
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-guice</artifactId>
<artifactId>wicket-ioc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>

@ -33,7 +33,6 @@ import se.su.dsv.scipro.forum.pages.ProjectForumBasePage;
import se.su.dsv.scipro.forum.pages.SupervisorForumBasePage;
import se.su.dsv.scipro.forum.pages.threaded.*;
import se.su.dsv.scipro.gdpr.AdminGDPRPage;
import se.su.dsv.scipro.gdpr.GDPRReportResourceReference;
import se.su.dsv.scipro.generalsystemsettings.AdminGeneralSettingsPage;
import se.su.dsv.scipro.grading.SupervisorGradingPage;
import se.su.dsv.scipro.grading.SupervisorGradingReportPage;
@ -49,7 +48,6 @@ import se.su.dsv.scipro.milestones.pages.SupervisorMileStonePage;
import se.su.dsv.scipro.nonworkdays.NonWorkDaysPage;
import se.su.dsv.scipro.notes.NotesPage;
import se.su.dsv.scipro.notifications.NotificationLoader;
import se.su.dsv.scipro.notifications.NotificationModule;
import se.su.dsv.scipro.notifications.pages.NotificationLandingPage;
import se.su.dsv.scipro.notifications.pages.NotificationsPage;
import se.su.dsv.scipro.notifications.pages.SupervisorNotificationSettingsPage;
@ -339,7 +337,7 @@ public class SciProApplication extends LifecycleManagedWebApplication {
private void mountNotificationAndSettingsPages() {
mountPage("notes", NotesPage.class);
mountPage(NotificationModule.NOTIFICATION_RELATIVE_PAGE_URL, NotificationLandingPage.class);
mountPage("notification", NotificationLandingPage.class);
mountPage("notifications", NotificationsPage.class);
mountPage("settings", BasicProfilePage.class);
mountPage("settings/supervisorprofile", SupervisorProfilePage.class);

@ -1,33 +0,0 @@
package se.su.dsv.scipro;
import com.google.inject.Singleton;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.persist.jpa.JpaPersistModule;
import com.google.inject.servlet.ServletModule;
import com.google.inject.servlet.SessionScoped;
import modules.CoreModule;
import org.apache.wicket.protocol.http.WebApplication;
import se.su.dsv.scipro.file.FileModule;
import se.su.dsv.scipro.file.FileStore;
import se.su.dsv.scipro.security.auth.AuthenticationModule;
import se.su.dsv.scipro.system.CurrentUser;
import se.su.dsv.scipro.system.Lifecycle;
import se.su.dsv.scipro.workerthreads.WorkerModule;
public class SciProModule extends ServletModule {
@Override
protected void configureServlets() {
install(new JpaPersistModule("defaultPersistenceUnit"));
install(new CoreModule());
install(new FileModule());
bind(FileStore.class).to(FileSystemStore.class);
install(new WorkerModule());
install(new AuthenticationModule());
bind(WebApplication.class).to(SciProApplication.class).in(Singleton.class);
bind(CurrentUser.class).to(CurrentUserFromWicketSession.class).in(SessionScoped.class);
Multibinder<Lifecycle> lifecycles = Multibinder.newSetBinder(binder(), Lifecycle.class);
lifecycles.addBinding().to(DataInitializer.class);
}
}

@ -1,16 +0,0 @@
package se.su.dsv.scipro.crosscutting;
import com.google.common.eventbus.EventBus;
import com.google.inject.AbstractModule;
public class CrosscuttingModule extends AbstractModule {
@Override
protected void configure() {
requireBinding(EventBus.class);
bind(ReviewingNotifications.class).asEagerSingleton();
bind(ReviewerSupportMailer.class).asEagerSingleton();
bind(ReviewerAssignedNotifications.class).asEagerSingleton();
bind(ReviewerAssignedDeadline.class).asEagerSingleton();
bind(ForwardPhase2Feedback.class).asEagerSingleton();
}
}

@ -1,15 +0,0 @@
se.su.dsv.scipro.SciProModule
se.su.dsv.scipro.reviewing.ReviewingModule
se.su.dsv.scipro.crosscutting.CrosscuttingModule
se.su.dsv.scipro.integration.activityfinalseminar.ActivityFinalSeminarModule
se.su.dsv.scipro.integration.activityforum.ActivityForumModule
se.su.dsv.scipro.peer.PeerModule
se.su.dsv.scipro.firstmeeting.FirstMeetingModule
se.su.dsv.scipro.forum.notifications.ForumNotificationsModule
se.su.dsv.scipro.daisyExternal.DaisyExternalModule
se.su.dsv.scipro.plagiarism.urkund.UrkundModule
se.su.dsv.scipro.sukat.SukatModule
se.su.dsv.scipro.oauth.OAuthModule
se.su.dsv.scipro.grading.GradingModule
se.su.dsv.scipro.gdpr.GDPRModule
se.su.dsv.scipro.survey.SurveyModule

@ -1,15 +1,9 @@
package se.su.dsv.scipro;
import com.google.common.eventbus.EventBus;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.guice.GuiceComponentInjector;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;

@ -1,8 +1,10 @@
package se.su.dsv.scipro.workerthreads;
import com.google.inject.util.Providers;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@ -33,7 +35,7 @@ public class SchedulerImplTest {
public void schedules_correctly() {
long period = 1;
TimeUnit timeUnit = TimeUnit.SECONDS;
scheduler.schedule("My worker").runBy(Providers.of(abstractWorker)).every(period, timeUnit);
scheduler.schedule("My worker").runBy(() -> abstractWorker).every(period, timeUnit);
verify(scheduledExecutorService).scheduleAtFixedRate(any(Runnable.class), eq(period), eq(period), eq(timeUnit));
}