From ccac2c1cf89cb91a20a2b209b4df9fc1e655b4a9 Mon Sep 17 00:00:00 2001 From: Andreas Svanberg <andreass@dsv.su.se> Date: Wed, 6 Nov 2024 11:23:28 +0100 Subject: [PATCH] Enable creating an API using Spring Web (#5) SciPro will have to provide information to the upcoming student portal. Wicket does not have the ability to serve JSON in the usual REST way and is only able to serve HTML. The most common way to write JSON over HTTP API:s in Java is using Spring Web, but currently SciPro uses Guice for dependency injection rather than Spring which makes adding Spring Web a bit more tricky. This pull request attempts to solve this by doing the following; * Replacing Guice with Spring * Adding a new API module that uses Spring Web * Turning the entire system into a standard Spring Boot web application The hope is that these changes will bring the following benefits; * Harmonize our web stack (Daisy uses Spring and the new lecture hall system is full Spring Boot) * Enable easy development of a traditional JSON over HTTP API * Ease future recruitment by using the most common Java web frameworks Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/5 Reviewed-by: niat8586 <nico@dsv.su.se> Co-authored-by: Andreas Svanberg <andreass@dsv.su.se> Co-committed-by: Andreas Svanberg <andreass@dsv.su.se> --- .gitignore | 2 + GetToken.java | 101 ++ README.md | 13 + api/pom.xml | 25 + .../se/su/dsv/scipro/api/ApiController.java | 29 + core/pom.xml | 28 +- core/src/main/java/modules/CoreModule.java | 160 --- core/src/main/java/modules/ProfileModule.java | 15 - .../main/java/modules/RepositoryModule.java | 66 -- .../java/se/su/dsv/scipro/CoreConfig.java | 1012 +++++++++++++++++ .../se/su/dsv/scipro/DataInitializer.java | 2 +- .../dsv/scipro/RepositoryConfiguration.java | 285 +++++ .../activityplan/ActivityPlanFacadeImpl.java | 2 +- .../checklist/ChecklistAnswerServiceImpl.java | 2 +- .../checklist/ChecklistCategoryRepo.java | 2 +- .../checklist/ChecklistQuestionRepo.java | 2 +- .../checklist/ChecklistServiceImpl.java | 2 +- .../ChecklistTemplateServiceImpl.java | 2 +- .../daisyExternal/DaisyExternalModule.java | 20 - .../se/su/dsv/scipro/events/EventModule.java | 15 - .../dsv/scipro/file/FileDescriptionRepo.java | 2 +- .../se/su/dsv/scipro/file/FileModule.java | 16 - .../scipro/file/FileReferenceRepository.java | 2 +- .../file/FileReferenceRepositoryImpl.java | 6 +- .../su/dsv/scipro/file/FileServiceImpl.java | 2 +- .../scipro/file/ProjectFileServiceImpl.java | 2 +- .../FinalSeminarOppositionRepo.java | 2 +- .../FinalSeminarRepositoryImpl.java | 4 +- .../finalseminar/FinalSeminarServiceImpl.java | 2 +- .../FinalSeminarSettingsServiceImpl.java | 2 +- .../FinalSeminarUploadControllerImpl.java | 2 +- .../finalthesis/FinalThesisServiceImpl.java | 2 +- .../firstmeeting/FirstMeetingModule.java | 11 - .../scipro/forum/BasicForumServiceImpl.java | 2 +- .../se/su/dsv/scipro/forum/ForumModule.java | 26 - .../forum/ForumPostReadStateRepository.java | 2 +- .../ForumPostReadStateRepositoryImpl.java | 2 +- .../dsv/scipro/forum/ForumPostRepository.java | 2 +- .../scipro/forum/GroupForumServiceImpl.java | 2 +- .../scipro/forum/GroupThreadRepository.java | 2 +- .../scipro/forum/ProjectForumServiceImpl.java | 2 +- .../scipro/forum/ProjectThreadRepository.java | 2 +- .../notifications/ForumNotifications.java | 2 +- .../ForumNotificationsModule.java | 11 - .../se/su/dsv/scipro/gdpr/GDPRModule.java | 12 - .../GeneralSystemSettingsServiceImpl.java | 2 +- .../GradingHistoryEventRepositoryImpl.java | 2 +- .../su/dsv/scipro/grading/GradingModule.java | 37 - ...NationalSubjectCategoryRepositoryImpl.java | 2 +- .../PublicationMetadataRepository.java | 2 +- .../PublicationMetadataRepositoryImpl.java | 6 +- .../PublicationMetadataServiceImpl.java | 4 +- .../ActivityFinalSeminarModule.java | 11 - .../ActivityFinalSeminarRepository.java | 2 +- .../activityforum/ActivityForumModule.java | 11 - .../se/su/dsv/scipro/mail/PrintingMailer.java | 2 +- .../match/AllowAllIdeaCreationJudge.java | 2 +- .../match/ApplicationPeriodServiceImpl.java | 2 +- .../scipro/match/FirstMeetingRepository.java | 2 +- .../su/dsv/scipro/match/IdeaServiceImpl.java | 2 +- .../dsv/scipro/match/KeywordServiceImpl.java | 2 +- .../se/su/dsv/scipro/match/MatchModule.java | 26 - .../dsv/scipro/match/ProgramServiceImpl.java | 2 +- .../MilestoneActivityTemplateRepository.java | 2 +- .../MilestonePhaseTemplateServiceImpl.java | 2 +- .../NotificationControllerImpl.java | 3 +- .../notifications/NotificationModule.java | 28 - .../NotificationServiceImpl.java | 2 +- .../impl/NotificationMailFormatterImpl.java | 3 +- .../DeliveryConfigurationServiceImpl.java | 2 +- .../ReceiverConfigurationServiceImpl.java | 2 +- .../se/su/dsv/scipro/oauth/OAuthModule.java | 25 - .../se/su/dsv/scipro/oauth/OAuthSettings.java | 2 +- .../dsv/scipro/peer/CommentServiceImpl.java | 2 +- .../su/dsv/scipro/peer/CommentThreadRepo.java | 2 +- .../scipro/peer/CommentThreadServiceImpl.java | 2 +- .../se/su/dsv/scipro/peer/PeerModule.java | 13 - .../se/su/dsv/scipro/peer/PeerPortalImpl.java | 4 +- .../scipro/peer/PeerRequestRepository.java | 2 +- .../scipro/peer/PeerRequestServiceImpl.java | 2 +- .../plagiarism/PlagiarismControlImpl.java | 2 +- .../scipro/plagiarism/PlagiarismModule.java | 11 - .../plagiarism/urkund/UrkundApiImpl.java | 2 +- .../plagiarism/urkund/UrkundModule.java | 26 - .../plagiarism/urkund/UrkundServiceImpl.java | 2 +- .../dsv/scipro/profiles/CurrentProfile.java | 6 +- .../ProjectPeopleStatisticsServiceImpl.java | 2 +- .../se/su/dsv/scipro/project/ProjectRepo.java | 2 +- .../dsv/scipro/project/ProjectRepoImpl.java | 2 +- .../scipro/project/ProjectServiceImpl.java | 2 +- .../ProjectPartnerRepositoryImpl.java | 2 +- .../ProjectPartnerServiceImpl.java | 2 +- .../scipro/reflection/ReflectionModule.java | 13 - .../reflection/ReflectionServiceImpl.java | 6 +- .../report/GradingReportServiceImpl.java | 3 +- .../report/GradingReportTemplateRepoImpl.java | 2 +- .../report/OppositionReportServiceImpl.java | 2 +- .../dsv/scipro/report/ReportServiceImpl.java | 2 +- .../FinalSeminarApprovalServiceImpl.java | 2 +- ...jectFinalSeminarStatisticsServiceImpl.java | 2 +- .../ReviewerCapacityServiceImpl.java | 6 +- .../ReviewerDeadlineSettingsRepository.java | 2 +- ...eviewerDeadlineSettingsRepositoryImpl.java | 4 +- .../ReviewerDeadlineSettingsServiceImpl.java | 2 +- .../ReviewerInteractionServiceImpl.java | 2 +- .../ReviewerTargetRepositoryImpl.java | 2 +- .../dsv/scipro/reviewing/ReviewingModule.java | 25 - .../RoughDraftApprovalServiceImpl.java | 2 +- .../security/auth/AuthenticationModule.java | 15 - .../serviceimpls/UserProfileServiceImpl.java | 3 +- .../se/su/dsv/scipro/sukat/SukatModule.java | 10 - .../se/su/dsv/scipro/survey/SurveyModule.java | 17 - .../dsv/scipro/survey/SurveyServiceImpl.java | 2 +- .../scipro/system/AbstractServiceImpl.java | 2 +- .../dsv/scipro/system/FooterAddressRepo.java | 2 +- .../su/dsv/scipro/system/FooterLinkRepo.java | 2 +- .../scipro/system/FooterLinkServiceImpl.java | 2 +- .../se/su/dsv/scipro/system/GenericRepo.java | 2 +- .../dsv/scipro/system/MergeServiceImpl.java | 2 +- .../se/su/dsv/scipro/system/PasswordRepo.java | 2 +- .../se/su/dsv/scipro/system/UserRepo.java | 2 +- .../dsv/scipro/war/PluginConfiguration.java | 4 + .../scipro/workerthreads/AbstractWorker.java | 33 +- .../scipro/workerthreads/WorkerModule.java | 31 - .../WorkerTransactionManager.java | 20 + .../su/dsv/scipro/forum/ForumModuleTest.java | 23 +- .../scipro/group/GroupServiceImplTest.java | 270 ++--- .../su/dsv/scipro/match/MatchModuleTest.java | 31 +- .../NotificationControllerImplTest.java | 3 +- .../urkund/UrkundSettingsRepositoryTest.java | 23 +- .../UrkundSubmissionRepositoryTest.java | 23 +- .../scipro/reviewing/ReviewingModuleTest.java | 12 - .../reviewing/ReviewingServiceImplTest.java | 322 +++--- .../java/se/su/dsv/scipro/test/GuiceTest.java | 73 -- .../su/dsv/scipro/test/IntegrationTest.java | 54 +- .../se/su/dsv/scipro/test/SpringTest.java | 92 ++ daisy-integration/pom.xml | 4 +- .../impl/ExternalImporterDaisyImpl.java | 2 +- .../impl/ImporterTransactionsImpl.java | 2 +- .../daisy/DaisyIntegrationConfiguration.java | 182 +++ .../scipro/integration/daisy/DaisyModule.java | 44 - .../dsv/scipro/io/facade/ExporterFacade.java | 2 +- .../services/com.google.inject.Module | 1 - .../se.su.dsv.scipro.war.PluginConfiguration | 1 + ...radingCompletedMilestoneActivatorTest.java | 15 +- .../daisy/workers/ProjectExporterTest.java | 13 +- .../daisy/workers/ProjectFinalizerTest.java | 14 +- docker-compose.yml | 15 + pom.xml | 30 +- view/pom.xml | 25 +- view/src/main/java/ApplicationBootstrap.java | 68 -- view/src/main/java/DatabaseMigration.java | 35 - .../se/su/dsv/scipro/FileSystemStore.java | 2 +- .../se/su/dsv/scipro/SciProApplication.java | 3 +- .../java/se/su/dsv/scipro/SciProModule.java | 33 - .../AdminCreateProjectConfirmationPage.java | 2 +- .../panels/AdminEditFooterAddressPanel.java | 2 +- .../crosscutting/CrosscuttingModule.java | 17 - .../match/SupervisorIdeaDetailsPage.java | 2 +- .../peer/PeerReviewFilterDetailsPanel.java | 2 +- .../peer/PeerReviewStatusStatisticsPanel.java | 2 +- .../panels/SupervisorApprovalPanel.java | 2 +- .../services/com.google.inject.Module | 15 - view/src/main/webapp/WEB-INF/web.xml | 28 - .../java/se/su/dsv/scipro/SciProTest.java | 31 +- war/pom.xml | 109 ++ .../java/se/su/dsv/scipro/war/ApiConfig.java | 72 ++ .../java/se/su/dsv/scipro/war/MailConfig.java | 48 +- .../main/java/se/su/dsv/scipro/war/Main.java | 168 +++ .../war/SpringManagedWorkerTransactions.java | 50 + .../dsv/scipro/war/WicketConfiguration.java | 90 ++ .../se/su/dsv/scipro/war/WorkerConfig.java | 245 ++++ .../scipro/workerthreads/SchedulerImpl.java | 23 +- .../scipro/workerthreads/TaskScheduling.java | 0 ...akarta.servlet.ServletContainerInitializer | 1 + war/src/main/resources/application.properties | 20 + war/src/main/webapp/WEB-INF/web.xml | 14 + .../workerthreads/SchedulerImplTest.java | 8 +- 178 files changed, 3104 insertions(+), 1677 deletions(-) create mode 100644 GetToken.java create mode 100644 README.md create mode 100644 api/pom.xml create mode 100644 api/src/main/java/se/su/dsv/scipro/api/ApiController.java delete mode 100644 core/src/main/java/modules/CoreModule.java delete mode 100644 core/src/main/java/modules/ProfileModule.java delete mode 100644 core/src/main/java/modules/RepositoryModule.java create mode 100644 core/src/main/java/se/su/dsv/scipro/CoreConfig.java create mode 100644 core/src/main/java/se/su/dsv/scipro/RepositoryConfiguration.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/daisyExternal/DaisyExternalModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/events/EventModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/file/FileModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/firstmeeting/FirstMeetingModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/forum/ForumModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotificationsModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/gdpr/GDPRModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/grading/GradingModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/integration/activityforum/ActivityForumModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/match/MatchModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/notifications/NotificationModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/oauth/OAuthModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/peer/PeerModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/reflection/ReflectionModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/reviewing/ReviewingModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/security/auth/AuthenticationModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/sukat/SukatModule.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/survey/SurveyModule.java create mode 100644 core/src/main/java/se/su/dsv/scipro/war/PluginConfiguration.java delete mode 100644 core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerModule.java create mode 100644 core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerTransactionManager.java delete mode 100644 core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java create mode 100644 core/src/test/java/se/su/dsv/scipro/test/SpringTest.java create mode 100644 daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyIntegrationConfiguration.java delete mode 100644 daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyModule.java delete mode 100644 daisy-integration/src/main/resources/META-INF/services/com.google.inject.Module create mode 100644 daisy-integration/src/main/resources/META-INF/services/se.su.dsv.scipro.war.PluginConfiguration create mode 100644 docker-compose.yml delete mode 100644 view/src/main/java/ApplicationBootstrap.java delete mode 100644 view/src/main/java/DatabaseMigration.java delete mode 100644 view/src/main/java/se/su/dsv/scipro/SciProModule.java delete mode 100644 view/src/main/java/se/su/dsv/scipro/crosscutting/CrosscuttingModule.java delete mode 100644 view/src/main/resources/META-INF/services/com.google.inject.Module delete mode 100755 view/src/main/webapp/WEB-INF/web.xml create mode 100644 war/pom.xml create mode 100644 war/src/main/java/se/su/dsv/scipro/war/ApiConfig.java rename core/src/main/java/se/su/dsv/scipro/mail/MailModule.java => war/src/main/java/se/su/dsv/scipro/war/MailConfig.java (52%) create mode 100644 war/src/main/java/se/su/dsv/scipro/war/Main.java create mode 100644 war/src/main/java/se/su/dsv/scipro/war/SpringManagedWorkerTransactions.java create mode 100644 war/src/main/java/se/su/dsv/scipro/war/WicketConfiguration.java create mode 100644 war/src/main/java/se/su/dsv/scipro/war/WorkerConfig.java rename {core => war}/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java (63%) rename {core => war}/src/main/java/se/su/dsv/scipro/workerthreads/TaskScheduling.java (100%) create mode 100644 war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer create mode 100644 war/src/main/resources/application.properties create mode 100755 war/src/main/webapp/WEB-INF/web.xml rename {core => war}/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java (83%) diff --git a/.gitignore b/.gitignore index 40f55760b0..204ca95f52 100755 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ view/target *.log fitnesse/target/ daisy-integration/target/ +war/target/ +api/target/ diff --git a/GetToken.java b/GetToken.java new file mode 100644 index 0000000000..68c0dee549 --- /dev/null +++ b/GetToken.java @@ -0,0 +1,101 @@ +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; + +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.io.IOException; +import java.io.OutputStream; +import java.net.Authenticator; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class GetToken { + public static void main(String[] args) throws IOException { + URI baseUri = URI.create("http://localhost:59733"); + String clientId = "get-token"; + String clientSecret = "get-token-secret"; + + System.out.println("Browse to " + baseUri.resolve("authorize?response_type=code&client_id=" + clientId)); + + HttpClient httpClient = HttpClient.newBuilder() + .authenticator(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(clientId, clientSecret.toCharArray()); + } + }) + .build(); + + HttpServer httpServer = HttpServer.create(); + httpServer.bind(new InetSocketAddress(59732), 0); + + Thread thread = Thread.currentThread(); + + httpServer.createContext("/", exchange -> { + exchange.sendResponseHeaders(200, 0); + try (OutputStream responseBody = exchange.getResponseBody()) { + responseBody.write("All done, close tab".getBytes(StandardCharsets.UTF_8)); + } + + Map<String, List<String>> queryParams = getQueryParams(exchange); + String code = queryParams.get("code").get(0); + HttpRequest httpRequest = HttpRequest.newBuilder() + .uri(baseUri.resolve("exchange")) + .header("Content-Type", "application/x-www-form-urlencoded") + .POST(HttpRequest.BodyPublishers.ofString("grant_type=authorization_code&code=" + code)) + .build(); + try { + HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.body()); + + // Try to copy the access token to the clipboard + Matcher matcher = Pattern.compile("access_token\":\"([^\"]+)\"") + .matcher(response.body()); + if (matcher.find()) { + StringSelection clipboardData = new StringSelection(matcher.group(1)); + Toolkit.getDefaultToolkit() + .getSystemClipboard() + .setContents(clipboardData, clipboardData); + try { Thread.sleep(1_000L); } catch (InterruptedException e) { } + System.out.println("Access token copied to clipboard (probably)"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + thread.interrupt(); + } + }); + + httpServer.start(); + try { + Thread.sleep(Duration.ofMinutes(1L).toMillis()); + System.out.println("No authorization within one minute, exiting."); + System.exit(1); + } catch (InterruptedException ignored) { + // expected + } + httpServer.stop(0); + } + + private static Map<String, List<String>> getQueryParams(final HttpExchange exchange) { + String query = exchange.getRequestURI() + .getQuery(); + return Arrays.stream(query.split("&")) + .map(s -> s.split("=")) + .collect(Collectors.groupingBy( + split -> split[0], + Collectors.mapping(split -> split[1], Collectors.toList()))); + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000000..749d07cb72 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +## Working with the API +The API is protected by OAuth 2 acting as a [resource server](https://www.oauth.com/oauth2-servers/the-resource-server/) +verifying tokens using [token introspection](https://datatracker.ietf.org/doc/html/rfc7662). + +When developing it uses a locally running instance of an +[authorization server](https://datatracker.ietf.org/doc/html/rfc6749#section-1.1) +that is run inside [Docker](https://www.docker.com). It can be started with `docker compose -f docker-compose.yml up`. +Since there is no frontend to interact with the authorization server there's a helper script in +[GetToken.java](GetToken.java) that can be run directly with `java GetToken.java` to run through the authorization flow +and get an access token. + +Once the token has been obtained go to the [Swagger UI](http://localhost:8080/api/swagger) to interact with the API. +Click the "Authorize" button in the top right and paste the access token to log in. diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 0000000000..35c607e1b1 --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>SciPro</artifactId> + <version>0.1-SNAPSHOT</version> + </parent> + + <artifactId>api</artifactId> + + <dependencies> + <dependency> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>core</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-webmvc</artifactId> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/api/src/main/java/se/su/dsv/scipro/api/ApiController.java b/api/src/main/java/se/su/dsv/scipro/api/ApiController.java new file mode 100644 index 0000000000..8059cdde66 --- /dev/null +++ b/api/src/main/java/se/su/dsv/scipro/api/ApiController.java @@ -0,0 +1,29 @@ +package se.su.dsv.scipro.api; + +import jakarta.inject.Inject; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import se.su.dsv.scipro.system.User; +import se.su.dsv.scipro.system.UserService; + +import java.util.Optional; + +@RestController +public class ApiController { + private final UserService userService; + + @Inject + public ApiController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/hello-world") + public String helloWorld(@RequestParam(value = "username", required = false) String username) { + String name = Optional.ofNullable(username) + .map(userService::findByUsername) + .map(User::getFullName) + .orElse("World"); + return "Hello, " + name + "!"; + } +} diff --git a/core/pom.xml b/core/pom.xml index df548c1fad..a3c2a1a1e9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -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> @@ -62,12 +54,9 @@ <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> </dependency> - - <!--Database stuff--> <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <scope>test</scope> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> </dependency> <!--QueryDSL--> @@ -87,10 +76,19 @@ <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> </dependency> + <dependency> + <groupId>jakarta.transaction</groupId> + <artifactId>jakarta.transaction-api</artifactId> + </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> - <scope>runtime</scope> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hsqldb</groupId> + <artifactId>hsqldb</artifactId> + <scope>test</scope> </dependency> <!--Additional stuff--> @@ -130,8 +128,6 @@ <version>4.0.5</version> <scope>runtime</scope> </dependency> - - </dependencies> <build> diff --git a/core/src/main/java/modules/CoreModule.java b/core/src/main/java/modules/CoreModule.java deleted file mode 100644 index 075c6e9ed8..0000000000 --- a/core/src/main/java/modules/CoreModule.java +++ /dev/null @@ -1,160 +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.ProjectNoteService; -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); - bind(ProjectNoteService.class).to(ProjectServiceImpl.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); - - } -} diff --git a/core/src/main/java/modules/ProfileModule.java b/core/src/main/java/modules/ProfileModule.java deleted file mode 100644 index 16d276dba8..0000000000 --- a/core/src/main/java/modules/ProfileModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/modules/RepositoryModule.java b/core/src/main/java/modules/RepositoryModule.java deleted file mode 100644 index 2ae13bc0cb..0000000000 --- a/core/src/main/java/modules/RepositoryModule.java +++ /dev/null @@ -1,66 +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.report.SupervisorGradingReportRepository; -import se.su.dsv.scipro.report.SupervisorGradingReportRepositoryImpl; -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); - bind(SupervisorGradingReportRepository.class).to(SupervisorGradingReportRepositoryImpl.class); - } -} \ No newline at end of file diff --git a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java new file mode 100644 index 0000000000..d9245d2155 --- /dev/null +++ b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java @@ -0,0 +1,1012 @@ +package se.su.dsv.scipro; + +import com.google.common.eventbus.EventBus; +import jakarta.inject.Provider; +import jakarta.persistence.EntityManager; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import se.su.dsv.scipro.activityplan.ActivityPlanFacade; +import se.su.dsv.scipro.activityplan.ActivityPlanFacadeImpl; +import se.su.dsv.scipro.activityplan.ActivityPlanServiceImpl; +import se.su.dsv.scipro.activityplan.ActivityPlanTemplateServiceImpl; +import se.su.dsv.scipro.activityplan.ActivityServiceImpl; +import se.su.dsv.scipro.checklist.ChecklistAnswerServiceImpl; +import se.su.dsv.scipro.checklist.ChecklistServiceImpl; +import se.su.dsv.scipro.checklist.ChecklistTemplateService; +import se.su.dsv.scipro.checklist.ChecklistTemplateServiceImpl; +import se.su.dsv.scipro.daisyExternal.http.DaisyAPIImpl; +import se.su.dsv.scipro.date.DateServiceImpl; +import se.su.dsv.scipro.file.FileDescriptionRepo; +import se.su.dsv.scipro.file.FileReferenceRepository; +import se.su.dsv.scipro.file.FileService; +import se.su.dsv.scipro.file.FileServiceImpl; +import se.su.dsv.scipro.file.FileStore; +import se.su.dsv.scipro.file.ProjectFileRepository; +import se.su.dsv.scipro.file.ProjectFileService; +import se.su.dsv.scipro.file.ProjectFileServiceImpl; +import se.su.dsv.scipro.finalseminar.AuthorRepository; +import se.su.dsv.scipro.finalseminar.FinalSeminarActiveParticipationRepository; +import se.su.dsv.scipro.finalseminar.FinalSeminarActiveParticipationServiceImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarCreationSubscribers; +import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepo; +import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionServiceImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarRepository; +import se.su.dsv.scipro.finalseminar.FinalSeminarRespondentServiceImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarService; +import se.su.dsv.scipro.finalseminar.FinalSeminarServiceImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarSettingsService; +import se.su.dsv.scipro.finalseminar.FinalSeminarSettingsServiceImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarUploadControllerImpl; +import se.su.dsv.scipro.finalthesis.FinalThesisService; +import se.su.dsv.scipro.finalthesis.FinalThesisServiceImpl; +import se.su.dsv.scipro.firstmeeting.FirstMeetingServiceImpl; +import se.su.dsv.scipro.forum.AbstractThreadRepository; +import se.su.dsv.scipro.forum.BasicForumService; +import se.su.dsv.scipro.forum.BasicForumServiceImpl; +import se.su.dsv.scipro.forum.ForumPostReadStateRepository; +import se.su.dsv.scipro.forum.ForumPostRepository; +import se.su.dsv.scipro.forum.GroupForumService; +import se.su.dsv.scipro.forum.GroupForumServiceImpl; +import se.su.dsv.scipro.forum.GroupThreadRepository; +import se.su.dsv.scipro.forum.ProjectForumService; +import se.su.dsv.scipro.forum.ProjectForumServiceImpl; +import se.su.dsv.scipro.forum.ProjectThreadRepository; +import se.su.dsv.scipro.forum.notifications.ForumNotificationRepository; +import se.su.dsv.scipro.forum.notifications.ForumNotifications; +import se.su.dsv.scipro.gdpr.ZipReporter; +import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService; +import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsServiceImpl; +import se.su.dsv.scipro.grading.GradingHistory; +import se.su.dsv.scipro.grading.GradingHistoryEventRepository; +import se.su.dsv.scipro.grading.GradingServiceImpl; +import se.su.dsv.scipro.grading.NationalSubjectCategoryRepository; +import se.su.dsv.scipro.grading.NationalSubjectCategoryServiceImpl; +import se.su.dsv.scipro.grading.PublicationMetadataRepository; +import se.su.dsv.scipro.grading.PublicationMetadataServiceImpl; +import se.su.dsv.scipro.grading.ThesisSubmissionHistoryService; +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.FinalSeminarActivityHandler; +import se.su.dsv.scipro.integration.activityforum.ActivityThreadRepository; +import se.su.dsv.scipro.integration.activityforum.PostActivityUploadToForum; +import se.su.dsv.scipro.mail.MailEventService; +import se.su.dsv.scipro.mail.MailEventServiceImpl; +import se.su.dsv.scipro.match.AddActivityPlanOnProjectStart; +import se.su.dsv.scipro.match.ApplicationPeriodFacadeImpl; +import se.su.dsv.scipro.match.ApplicationPeriodProjectTypeServiceImpl; +import se.su.dsv.scipro.match.ApplicationPeriodService; +import se.su.dsv.scipro.match.ApplicationPeriodServiceImpl; +import se.su.dsv.scipro.match.FirstMeetingRepository; +import se.su.dsv.scipro.match.IdeaRepository; +import se.su.dsv.scipro.match.IdeaService; +import se.su.dsv.scipro.match.IdeaServiceImpl; +import se.su.dsv.scipro.match.KeywordServiceImpl; +import se.su.dsv.scipro.match.MatchFollowUpServiceImpl; +import se.su.dsv.scipro.match.MatchServiceImpl; +import se.su.dsv.scipro.match.PreliminaryMatchServiceImpl; +import se.su.dsv.scipro.match.ProgramServiceImpl; +import se.su.dsv.scipro.match.ProjectStartNotifier; +import se.su.dsv.scipro.match.TargetRepository; +import se.su.dsv.scipro.match.TargetServiceImpl; +import se.su.dsv.scipro.milestones.MilestoneActivityTemplateRepository; +import se.su.dsv.scipro.milestones.service.ActivateCompletedMilestonesOnNewProjects; +import se.su.dsv.scipro.milestones.service.MilestoneActivityTemplateService; +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.NoteServiceImpl; +import se.su.dsv.scipro.notifications.NotificationController; +import se.su.dsv.scipro.notifications.NotificationControllerImpl; +import se.su.dsv.scipro.notifications.NotificationEventRepository; +import se.su.dsv.scipro.notifications.NotificationEventServiceImpl; +import se.su.dsv.scipro.notifications.NotificationService; +import se.su.dsv.scipro.notifications.NotificationServiceImpl; +import se.su.dsv.scipro.notifications.Notifications; +import se.su.dsv.scipro.notifications.interfaces.NotificationMailFormatter; +import se.su.dsv.scipro.notifications.interfaces.impl.NotificationMailFormatterImpl; +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.oauth.OAuthServiceImpl; +import se.su.dsv.scipro.oauth.OAuthSettings; +import se.su.dsv.scipro.peer.CommentServiceImpl; +import se.su.dsv.scipro.peer.CommentThreadRepo; +import se.su.dsv.scipro.peer.CommentThreadServiceImpl; +import se.su.dsv.scipro.peer.PeerPortalImpl; +import se.su.dsv.scipro.peer.PeerRequestRepository; +import se.su.dsv.scipro.peer.PeerRequestService; +import se.su.dsv.scipro.peer.PeerRequestServiceImpl; +import se.su.dsv.scipro.peer.PeerReviewRepository; +import se.su.dsv.scipro.peer.PeerReviewService; +import se.su.dsv.scipro.peer.PeerReviewServiceImpl; +import se.su.dsv.scipro.plagiarism.PlagiarismControl; +import se.su.dsv.scipro.plagiarism.PlagiarismControlImpl; +import se.su.dsv.scipro.plagiarism.PlagiarismRequestRepository; +import se.su.dsv.scipro.plagiarism.urkund.UrkundApi; +import se.su.dsv.scipro.plagiarism.urkund.UrkundApiImpl; +import se.su.dsv.scipro.plagiarism.urkund.UrkundServiceImpl; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSettingsRepository; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSubmissionRepository; +import se.su.dsv.scipro.project.ProjectPeopleStatisticsServiceImpl; +import se.su.dsv.scipro.project.ProjectRepo; +import se.su.dsv.scipro.project.ProjectService; +import se.su.dsv.scipro.project.ProjectServiceImpl; +import se.su.dsv.scipro.projectpartner.ProjectPartnerServiceImpl; +import se.su.dsv.scipro.reflection.ReflectionService; +import se.su.dsv.scipro.reflection.ReflectionServiceImpl; +import se.su.dsv.scipro.report.GradeCalculatorServiceImpl; +import se.su.dsv.scipro.report.GradingReportService; +import se.su.dsv.scipro.report.GradingReportServiceImpl; +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.OppositionReportServiceImpl; +import se.su.dsv.scipro.report.ReportServiceImpl; +import se.su.dsv.scipro.report.SupervisorGradingReportRepository; +import se.su.dsv.scipro.reviewing.DecisionRepository; +import se.su.dsv.scipro.reviewing.FinalSeminarApprovalService; +import se.su.dsv.scipro.reviewing.FinalSeminarApprovalServiceImpl; +import se.su.dsv.scipro.reviewing.ProjectFinalSeminarStatisticsServiceImpl; +import se.su.dsv.scipro.reviewing.ReviewerAssignedDeadline; +import se.su.dsv.scipro.reviewing.ReviewerCapacityServiceImpl; +import se.su.dsv.scipro.reviewing.ReviewerDeadlineFollowupServiceImpl; +import se.su.dsv.scipro.reviewing.ReviewerDeadlineSettingsRepository; +import se.su.dsv.scipro.reviewing.ReviewerDeadlineSettingsService; +import se.su.dsv.scipro.reviewing.ReviewerDeadlineSettingsServiceImpl; +import se.su.dsv.scipro.reviewing.ReviewerInteractionService; +import se.su.dsv.scipro.reviewing.ReviewerInteractionServiceImpl; +import se.su.dsv.scipro.reviewing.ReviewerTargetRepository; +import se.su.dsv.scipro.reviewing.ReviewerThreadRepository; +import se.su.dsv.scipro.reviewing.ReviewingServiceImpl; +import se.su.dsv.scipro.reviewing.RoughDraftApprovalService; +import se.su.dsv.scipro.reviewing.RoughDraftApprovalServiceImpl; +import se.su.dsv.scipro.security.auth.AuthenticationProvider; +import se.su.dsv.scipro.security.auth.AuthenticationServiceImpl; +import se.su.dsv.scipro.security.auth.LocalAuthentication; +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.UserProfileService; +import se.su.dsv.scipro.sukat.LDAP; +import se.su.dsv.scipro.sukat.Sukat; +import se.su.dsv.scipro.survey.QuestionRepository; +import se.su.dsv.scipro.survey.SurveyRepository; +import se.su.dsv.scipro.survey.SurveyServiceImpl; +import se.su.dsv.scipro.system.CurrentUser; +import se.su.dsv.scipro.system.EventServiceImpl; +import se.su.dsv.scipro.system.ExternalResourceServiceImpl; +import se.su.dsv.scipro.system.FooterLinkRepo; +import se.su.dsv.scipro.system.FooterLinkServiceImpl; +import se.su.dsv.scipro.system.LocalUserSearch; +import se.su.dsv.scipro.system.PasswordRepo; +import se.su.dsv.scipro.system.PasswordService; +import se.su.dsv.scipro.system.PasswordServiceImpl; +import se.su.dsv.scipro.system.ProjectTypeService; +import se.su.dsv.scipro.system.ProjectTypeServiceImpl; +import se.su.dsv.scipro.system.ResearchAreaServiceImpl; +import se.su.dsv.scipro.system.UserNameServiceImpl; +import se.su.dsv.scipro.system.UserRepo; +import se.su.dsv.scipro.system.UserService; +import se.su.dsv.scipro.system.UserServiceImpl; +import se.su.dsv.scipro.thesislink.ExternalLinkServiceImpl; +import se.su.dsv.scipro.workerthreads.WorkerDataServiceImpl; + +import java.time.Clock; +import java.util.Set; + +@Configuration(proxyBeanMethods = false) +public class CoreConfig { + @Bean + public EventBus eventBus() { + return new EventBus(); + } + + @Bean + public GradingHistory gradingHistory(GradingHistoryEventRepository gradingHistoryEventRepository) { + return new GradingHistory(gradingHistoryEventRepository); + } + + @Bean + public OAuthSettings oAuthSettings( + @Value("${oauth.uri}") String uri, + @Value("${oauth.redirectUri}") String redirectUri, + @Value("${oauth.clientId}") String clientId, + @Value("${oauth.clientSecret}") String clientSecret) + { + return new OAuthSettings(uri, redirectUri, clientId, clientSecret); + } + + @Bean + public Sukat sukat() { + return new LDAP(); + } + + @Bean + public DaisyAPIImpl daisyAPI( + @Value("${daisy.api.url}") final String baseUrl, + @Value("${daisy.api.username}") final String user, + @Value("${daisy.api.password}") final String password) + { + return new DaisyAPIImpl(baseUrl, user, password); + } + + @Bean + public GradingServiceImpl gradingService(@Value("${service.grading.url}") final String url) { + return new GradingServiceImpl(url); + } + + @Bean + public OAuthServiceImpl oAuthService(OAuthSettings settings) { + return new OAuthServiceImpl(settings); + } + + @Bean + public FinalSeminarApprovalServiceImpl finalSeminarApprovalService( + Provider<EntityManager> em, + FileService fileDescriptionService, + EventBus eventBus, + DaysService daysService, + ReviewerDeadlineSettingsService reviewerDeadlineSettingsService) + { + return new FinalSeminarApprovalServiceImpl(em, fileDescriptionService, eventBus, daysService, reviewerDeadlineSettingsService); + } + + @Bean + public RoughDraftApprovalServiceImpl roughDraftApprovalService( + Provider<EntityManager> em, + FileService fileDescriptionService, + EventBus eventBus, + DaysService daysService, + ReviewerDeadlineSettingsService reviewerDeadlineSettingsService) + { + return new RoughDraftApprovalServiceImpl(em, eventBus, fileDescriptionService, daysService, reviewerDeadlineSettingsService); + } + + @Bean + public ActivityPlanServiceImpl activityPlanService(Provider<EntityManager> em) { + return new ActivityPlanServiceImpl(em); + } + + @Bean + public ActivityPlanTemplateServiceImpl activityPlanTemplateService(Provider<EntityManager> em) { + return new ActivityPlanTemplateServiceImpl(em); + } + + @Bean + public ActivityServiceImpl activityService(Provider<EntityManager> em) { + return new ActivityServiceImpl(em); + } + + @Bean + public ActivityPlanFacadeImpl activityPlanFacade( + EventBus eventBus, + ProjectFileService projectFileService, + ChecklistTemplateService checklistTemplateService, + DaysService daysService, + FileService fileService + ) + { + return new ActivityPlanFacadeImpl(eventBus, projectFileService, checklistTemplateService, daysService, + fileService); + } + + @Bean + public ApplicationPeriodFacadeImpl applicationPeriodFacade() { + return new ApplicationPeriodFacadeImpl(); + } + + @Bean + public ApplicationPeriodProjectTypeServiceImpl applicationPeriodProjectTypeService(Provider<EntityManager> em) { + return new ApplicationPeriodProjectTypeServiceImpl(em); + } + + @Bean + public ApplicationPeriodServiceImpl applicationPeriodService(Provider<EntityManager> em, Clock clock) { + return new ApplicationPeriodServiceImpl(em, clock); + } + + @Bean + public AuthenticationServiceImpl authenticationService(Set<AuthenticationProvider> authenticationProviders) { + return new AuthenticationServiceImpl(authenticationProviders); + } + + @Bean + public LocalAuthentication localAuthentication( + UserService userService, + PasswordService passwordService) + { + return new LocalAuthentication(userService, passwordService); + } + + @Bean + public BasicForumServiceImpl basicForumService( + ForumPostRepository forumPostRepository, + ForumPostReadStateRepository readStateRepository, + AbstractThreadRepository threadRepository, + FileService fileService, + EventBus eventBus) + { + return new BasicForumServiceImpl(forumPostRepository, readStateRepository, threadRepository, fileService, + eventBus); + } + + @Bean + public ChecklistAnswerServiceImpl checklistAnswerService(Provider<EntityManager> em) { + return new ChecklistAnswerServiceImpl(em); + } + + @Bean + public ChecklistServiceImpl checklistService(Provider<EntityManager> em) { + return new ChecklistServiceImpl(em); + } + + @Bean + public ChecklistTemplateServiceImpl checklistTemplateService(Provider<EntityManager> em) { + return new ChecklistTemplateServiceImpl(em); + } + + @Bean + public CommentServiceImpl commentService(Provider<EntityManager> em) { + return new CommentServiceImpl(em); + } + + @Bean + public DateServiceImpl dateService() { + return new DateServiceImpl(); + } + + @Bean + public DaysServiceImpl daysService(NonWorkDayPeriodService nonWorkDayPeriodService) { + return new DaysServiceImpl(nonWorkDayPeriodService); + } + + @Bean + public DeliveryConfigurationServiceImpl deliveryConfigurationService( + Provider<EntityManager> em, + UserProfileService userProfileService) + { + return new DeliveryConfigurationServiceImpl(em, userProfileService); + } + + @Bean + public EventServiceImpl eventService(Provider<EntityManager> em) { + return new EventServiceImpl(em); + } + + @Bean + public ExternalLinkServiceImpl externalLinkService(Provider<EntityManager> em) { + return new ExternalLinkServiceImpl(em); + } + + @Bean + public ExternalResourceServiceImpl externalResourceService(Provider<EntityManager> em) { + return new ExternalResourceServiceImpl(em); + } + + @Bean + public FileServiceImpl fileService( + Provider<EntityManager> em, + FileStore fileStore, + FileReferenceRepository fileReferenceRepository, + FileDescriptionRepo fileDescriptionRepository) + { + return new FileServiceImpl(em, fileReferenceRepository, fileDescriptionRepository, fileStore); + } + + @Bean + public FinalSeminarActiveParticipationServiceImpl finalSeminarActiveParticipationService(Provider<EntityManager> em) { + return new FinalSeminarActiveParticipationServiceImpl(em); + } + + @Bean + public FinalSeminarOppositionServiceImpl finalSeminarOppositionService(Provider<EntityManager> em) { + return new FinalSeminarOppositionServiceImpl(em); + } + + @Bean + public FinalSeminarRespondentServiceImpl finalSeminarRespondentService(Provider<EntityManager> em) { + return new FinalSeminarRespondentServiceImpl(em); + } + + @Bean + public FinalSeminarServiceImpl finalSeminarService( + Provider<EntityManager> em, + EventBus eventBus, + FileService fileService, + AuthorRepository authorRepository, + FinalSeminarOppositionRepo finalSeminarOppositionRepository, + FinalSeminarActiveParticipationRepository finalSeminarActiveParticipationRepository, + FinalSeminarRepository finalSeminarRepository, + Clock clock, + RoughDraftApprovalService roughDraftApprovalService) + { + return new FinalSeminarServiceImpl( + em, + eventBus, + authorRepository, + fileService, + finalSeminarOppositionRepository, + finalSeminarActiveParticipationRepository, + finalSeminarRepository, + clock, + roughDraftApprovalService); + } + + @Bean + public FinalSeminarSettingsServiceImpl finalSeminarSettingsService(Provider<EntityManager> em) { + return new FinalSeminarSettingsServiceImpl(em); + } + + @Bean + public FinalSeminarUploadControllerImpl finalSeminarUploadController( + EventBus eventBus, + FileService fileService, + FinalSeminarService finalSeminarService, + ProjectFileService projectFileService, + ProjectService projectService, + FinalSeminarSettingsService finalSeminarSettingsService, + PlagiarismControl plagiarismControl) + { + return new FinalSeminarUploadControllerImpl(projectService, fileService, finalSeminarSettingsService, + finalSeminarService, eventBus, projectFileService, plagiarismControl); + } + + @Bean + public FinalThesisServiceImpl finalThesisService( + Provider<EntityManager> em, + NotificationController notification, + ProjectFileService projectFile, + FileService fileService, + EventBus eventBus, + PlagiarismControl plagiarismControl, + GradingReportService gradingReportService) + { + return new FinalThesisServiceImpl(em, notification, projectFile, + fileService, eventBus, plagiarismControl, gradingReportService); + } + + @Bean + public FirstMeetingServiceImpl firstMeetingService( + Provider<EntityManager> em, + ActivityPlanFacade activityPlanFacade) + { + return new FirstMeetingServiceImpl(em, activityPlanFacade); + } + + @Bean + public FooterLinkServiceImpl footerLinkService(FooterLinkRepo footerLinkRepository) { + return new FooterLinkServiceImpl(footerLinkRepository); + } + + @Bean + public GeneralSystemSettingsServiceImpl generalSystemSettingsService(Provider<EntityManager> em) { + return new GeneralSystemSettingsServiceImpl(em); + } + + @Bean + public GradeCalculatorServiceImpl gradeCalculatorService(GradingReportService gradingReportService) { + return new GradeCalculatorServiceImpl(gradingReportService); + } + + @Bean + public GradingReportServiceImpl gradingReportService( + EventBus eventBus, + ThesisSubmissionHistoryService thesisSubmissionHistoryService, + Clock clock, + SupervisorGradingReportRepository supervisorGradingReportRepository, + GradingReportTemplateRepoImpl gradingReportTemplateRepo, + ProjectTypeService projectTypeService) + { + return new GradingReportServiceImpl( + eventBus, + thesisSubmissionHistoryService, + clock, + supervisorGradingReportRepository, + gradingReportTemplateRepo, + projectTypeService); + } + + @Bean + public GroupForumServiceImpl groupForumService( + EventBus eventBus, + GroupThreadRepository groupThreadRepository, + BasicForumService basicForumService) + { + return new GroupForumServiceImpl(groupThreadRepository, basicForumService, eventBus); + } + + @Bean + public GroupServiceImpl groupService(Provider<EntityManager> em) { + return new GroupServiceImpl(em); + } + + @Bean + public IdeaServiceImpl ideaService( + Provider<EntityManager> em, + ApplicationPeriodService applicationPeriodService, + FirstMeetingRepository firstMeetingRepository, + NotificationController notificationController, + ProjectService projectService, + GeneralSystemSettingsService generalSystemSettingsService, + TargetRepository targetRepository, + IdeaRepository ideaRepository, + Clock clock) + { + return new IdeaServiceImpl(em, applicationPeriodService, firstMeetingRepository, notificationController, + projectService, generalSystemSettingsService, targetRepository, ideaRepository, clock); + } + + @Bean + public KeywordServiceImpl keywordService(Provider<EntityManager> em) { + return new KeywordServiceImpl(em); + } + + @Bean + public LocalUserSearch localUserSearch(UserRepo userRepository) { + return new LocalUserSearch(userRepository); + } + + @Bean + public MailEventServiceImpl mailEventService(Provider<EntityManager> em) { + return new MailEventServiceImpl(em); + } + + @Bean + public MatchFollowUpServiceImpl matchFollowUpService(Provider<EntityManager> em) { + return new MatchFollowUpServiceImpl(em); + } + + @Bean + public MatchServiceImpl matchService(Provider<EntityManager> em) { + return new MatchServiceImpl(em); + } + + @Bean + public MilestoneActivityTemplateServiceImpl milestoneActivityTemplateService( + MilestoneActivityTemplateRepository milestoneActivityTemplateRepository) + { + return new MilestoneActivityTemplateServiceImpl(milestoneActivityTemplateRepository); + } + + @Bean + public MilestonePhaseTemplateServiceImpl milestonePhaseTemplateService(Provider<EntityManager> em) { + return new MilestonePhaseTemplateServiceImpl(em); + } + + @Bean + public MilestoneServiceImpl milestoneService( + Provider<EntityManager> em, + NotificationController notificationController) + { + return new MilestoneServiceImpl(notificationController, em); + } + + @Bean + public MilestoneStatisticsServiceImpl milestoneStatisticsService(Provider<EntityManager> em) { + return new MilestoneStatisticsServiceImpl(em); + } + + @Bean + public NationalSubjectCategoryServiceImpl nationalSubjectCategoryService( + NationalSubjectCategoryRepository nationalSubjectCategoryRepository) + { + return new NationalSubjectCategoryServiceImpl(nationalSubjectCategoryRepository); + } + + @Bean + public NonWorkDayPeriodServiceImpl nonWorkDayPeriodService(Provider<EntityManager> em) { + return new NonWorkDayPeriodServiceImpl(em); + } + + @Bean + public NoteServiceImpl noteService(Provider<EntityManager> em) { + return new NoteServiceImpl(em); + } + + @Bean + public NotificationServiceImpl notificationService(Provider<EntityManager> em) { + return new NotificationServiceImpl(em); + } + + @Bean + public OppositionReportServiceImpl oppositionReportService( + OppositionReportRepo oppositionReportRepository, + GradingReportTemplateRepo gradingReportTemplateRepository, + FileService fileService, + FinalSeminarOppositionRepo finalSeminarOppositionRepository) + { + return new OppositionReportServiceImpl(oppositionReportRepository, gradingReportTemplateRepository, + fileService, finalSeminarOppositionRepository); + } + + @Bean + public PasswordServiceImpl passwordService(PasswordRepo passwordRepo) { + return new PasswordServiceImpl(passwordRepo); + } + + @Bean + public PeerPortalImpl peerPortal( + FileService fileService, + PeerReviewRepository peerReviewRepository, + PeerRequestRepository peerRequestRepository, + EventBus eventBus, + ProjectFileService projectFileService, + DaysService daisyService, + Clock clock) + { + return new PeerPortalImpl(fileService, peerReviewRepository, peerRequestRepository, + eventBus, projectFileService, daisyService, clock); + } + + @Bean + public PeerRequestServiceImpl peerRequestService( + Provider<EntityManager> em, + EventBus eventBus, + FileService fileService) + { + return new PeerRequestServiceImpl(em, eventBus, fileService); + } + + @Bean + public PeerReviewServiceImpl peerReviewService( + Provider<EntityManager> em, + PeerReviewRepository peerReviewRepository) + { + return new PeerReviewServiceImpl(em, peerReviewRepository); + } + + @Bean + public PlagiarismControlImpl plagiarismControl( + FileService fileService, + PlagiarismRequestRepository plagiarismRequestRepository, + UrkundSubmissionRepository urkundSubmissionRepository) + { + return new PlagiarismControlImpl(plagiarismRequestRepository, urkundSubmissionRepository, fileService); + } + + @Bean + public PreliminaryMatchServiceImpl preliminaryMatchService(Provider<EntityManager> em, IdeaService ideaService) { + return new PreliminaryMatchServiceImpl(em, ideaService); + } + + @Bean + public ProgramServiceImpl programService(Provider<EntityManager> em) { + return new ProgramServiceImpl(em); + } + + @Bean + public ProjectFileServiceImpl projectFileService( + FileService fileService, + ProjectFileRepository projectFileRepository) + { + return new ProjectFileServiceImpl(fileService, projectFileRepository); + } + + @Bean + public ProjectFinalSeminarStatisticsServiceImpl projectFinalSeminarStatisticsService(Provider<EntityManager> em) { + return new ProjectFinalSeminarStatisticsServiceImpl(em); + } + + @Bean + public ProjectForumServiceImpl projectForumService( + EventBus eventBus, + BasicForumService basicForumService, + ProjectThreadRepository projectThreadRepository, + ForumPostRepository postRepository, + ProjectFileService projectFileService) + { + return new ProjectForumServiceImpl(projectThreadRepository, + postRepository, projectFileService, basicForumService, eventBus); + } + + @Bean + public ProjectPartnerServiceImpl projectPartnerService(Provider<EntityManager> em) { + return new ProjectPartnerServiceImpl(em); + } + + @Bean + public ProjectPeopleStatisticsServiceImpl projectPeopleStatisticsService(Provider<EntityManager> em) { + return new ProjectPeopleStatisticsServiceImpl(em); + } + + @Bean + public ProjectServiceImpl projectService( + Provider<EntityManager> em, + EventBus eventBus, + ProjectRepo projectRepo, + Clock clock) + { + return new ProjectServiceImpl(projectRepo, clock, eventBus, em); + } + + @Bean + public ProjectTypeServiceImpl projectTypeService(Provider<EntityManager> em) { + return new ProjectTypeServiceImpl(em); + } + + @Bean + public PublicationMetadataServiceImpl publicationMetadataService( + PublicationMetadataRepository publicationMetadataRepository) + { + return new PublicationMetadataServiceImpl(publicationMetadataRepository); + } + + @Bean + public ReflectionServiceImpl reflectionService( + AuthorRepository authorRepository, + FinalSeminarServiceImpl finalSeminarService) + { + return new ReflectionServiceImpl(authorRepository, finalSeminarService); + } + + @Bean + public ReceiverConfigurationServiceImpl receiverConfigurationService(Provider<EntityManager> em) { + return new ReceiverConfigurationServiceImpl(em); + } + + @Bean + public ReviewerDeadlineFollowupServiceImpl reviewerDeadlineFollowupService(Provider<EntityManager> em) { + return new ReviewerDeadlineFollowupServiceImpl(em); + } + + @Bean + public ZipReporter reporter( + FileService fileService, + ProjectService projectService, + FinalSeminarService finalSeminarService, + ProjectForumService projectForumService, + PeerReviewService peerReviewService, + PeerRequestService peerRequestService, + GroupService groupService, + GroupForumService groupForumService, + IdeaService ideaService, + GradingReportService gradingReportService, + ReviewerInteractionService reviewerInteractionService, + RoughDraftApprovalService roughDraftApprovalService, + FinalSeminarApprovalService finalSeminarApprovalService) + { + return new ZipReporter(fileService, projectService, finalSeminarService, projectForumService, peerReviewService, + peerRequestService, groupService, groupForumService, ideaService, gradingReportService, + reviewerInteractionService, roughDraftApprovalService, finalSeminarApprovalService); + } + + @Bean + public ReportServiceImpl reportService(Provider<EntityManager> em, FileService fileService) { + return new ReportServiceImpl(em, fileService); + } + + @Bean + public ResearchAreaServiceImpl researchAreaService(Provider<EntityManager> em) { + return new ResearchAreaServiceImpl(em); + } + + @Bean + public ReviewerInteractionServiceImpl reviewerInteractionService( + ReviewerThreadRepository reviewerThreadRepository, + BasicForumService forumService, + EventBus eventBus) + { + return new ReviewerInteractionServiceImpl(reviewerThreadRepository, forumService, eventBus); + } + + @Bean + public ReviewingServiceImpl reviewingService( + Provider<EntityManager> em, + EventBus eventBus, + FileService fileService) + { + return new ReviewingServiceImpl(em, fileService, eventBus); + } + + @Bean + public ReviewerCapacityServiceImpl reviewerCapacityService( + ReviewerTargetRepository reviewerTargetRepository, + DecisionRepository decisionRepository, + UserService userService, + ProjectService projectService, + EventBus eventBus) + { + return new ReviewerCapacityServiceImpl(reviewerTargetRepository, decisionRepository, userService, + projectService, eventBus); + } + + @Bean + public ReviewerDeadlineSettingsServiceImpl reviewerDeadlineSettingsService( + ReviewerDeadlineSettingsRepository reviewerDeadlineSettingsRepository) + { + return new ReviewerDeadlineSettingsServiceImpl(reviewerDeadlineSettingsRepository); + } + + @Bean + public SupervisorServiceImpl supervisorService(Provider<EntityManager> em) { + return new SupervisorServiceImpl(em); + } + + @Bean + public SurveyServiceImpl surveyService( + SurveyRepository surveyRepository, + QuestionRepository questionRepository, + FinalThesisService finalThesisService, + GeneralSystemSettingsService generalSystemSettingsService, + ReflectionService reflectionService) + { + return new SurveyServiceImpl(surveyRepository, questionRepository, finalThesisService, + generalSystemSettingsService, reflectionService); + } + + @Bean + public TargetServiceImpl targetService(Provider<EntityManager> em, IdeaService ideaService) { + return new TargetServiceImpl(em, ideaService); + } + + @Bean + public UnitServiceImpl unitService(Provider<EntityManager> em) { + return new UnitServiceImpl(em); + } + + @Bean + public UrkundApiImpl urkundApi( + UrkundSettingsRepository urkundSettingsRepository, + FileService fileService) + { + return new UrkundApiImpl(urkundSettingsRepository, fileService); + } + + @Bean + public UrkundServiceImpl urkundService( + UrkundApi urkundApi, + UrkundSubmissionRepository urkundSubmissionRepository, + Sukat sukat, + FileService fileService) + { + return new UrkundServiceImpl(urkundApi, urkundSubmissionRepository, sukat, fileService); + } + + @Bean + public UserNameServiceImpl userNameService(Provider<EntityManager> em) { + return new UserNameServiceImpl(em); + } + + @Bean + public UserProfileServiceImpl userProfileService(Provider<EntityManager> em) { + return new UserProfileServiceImpl(em); + } + + @Bean + public UserServiceImpl userService(Provider<EntityManager> em) { + return new UserServiceImpl(em); + } + + @Bean + public WorkerDataServiceImpl workerDataService(Provider<EntityManager> em) { + return new WorkerDataServiceImpl(em); + } + + @Bean + public NotificationControllerImpl notificationController( + NotificationServiceImpl notificationService, + NotificationMailFormatter notificationMailFormatter, + MailEventService mailEventService, + ReceiverConfigurationService receiverConfigurationService, + DeliveryConfigurationService deliveryConfigurationService, + Provider<CurrentUser> currentUserProvider) + { + return new NotificationControllerImpl(notificationService, + notificationMailFormatter, + mailEventService, receiverConfigurationService, deliveryConfigurationService, currentUserProvider); + } + + @Bean + public NotificationMailFormatterImpl notificationMailFormatter() { + return new NotificationMailFormatterImpl(); + } + + @Bean + public ReviewerAssignedDeadline reviewerAssignedDeadline( + EventBus eventBus, + ReviewerDeadlineSettingsService reviewerDeadlineSettingsService, + RoughDraftApprovalService roughDraftApprovalService, + FinalSeminarApprovalService finalSeminarApprovalService, + DaysService daysService, + Clock clock) + { + return new ReviewerAssignedDeadline(roughDraftApprovalService, finalSeminarApprovalService, + reviewerDeadlineSettingsService, daysService, eventBus, clock); + } + + @Bean + public DataInitializer dataInitializer() { + return new DataInitializer(); + } + + @Bean + public FinalSeminarActivityHandler finalSeminarActivityHandler( + ActivityPlanFacade activityPlanFacade, + ActivityFinalSeminarRepository activityFinalSeminarRepository, + EventBus eventBus) + { + return new FinalSeminarActivityHandler(activityPlanFacade, activityFinalSeminarRepository, eventBus); + } + + @Bean + public PostActivityUploadToForum postActivityUploadToForum( + EventBus eventBus, + ProjectForumService projectForumService, + ActivityThreadRepository activityThreadRepository) + { + return new PostActivityUploadToForum(projectForumService, activityThreadRepository, eventBus); + } + + @Bean + public ForumNotifications forumNotifications( + EventBus eventBus, + NotificationController notificationController, + ForumNotificationRepository forumNotificationRepository, + NotificationService notificationService) + { + return new ForumNotifications(eventBus, notificationController, forumNotificationRepository, + notificationService); + } + + @Bean + public ActivateCompletedMilestonesOnNewProjects activateCompletedMilestonesOnNewProjects( + EventBus eventBus, + MilestoneServiceImpl milestoneService, + PeerReviewService peerReviewService, + MilestoneActivityTemplateService milestoneActivityTemplateService, + FinalSeminarService finalSeminarService) + { + return new ActivateCompletedMilestonesOnNewProjects(peerReviewService, milestoneActivityTemplateService, + milestoneService, eventBus, finalSeminarService); + } + + @Bean + public FinalSeminarCreationSubscribers finalSeminarCreationSubscribers( + EventBus eventBus, + FinalSeminarServiceImpl finalSeminarService, + NotificationController notificationController, + AuthorRepository authorRepository) + { + return new FinalSeminarCreationSubscribers(authorRepository, finalSeminarService, notificationController, eventBus); + } + + @Bean + public ProjectStartNotifier projectStartNotifier(EventBus eventBus, NotificationController notificationController) { + return new ProjectStartNotifier(eventBus, notificationController); + } + + @Bean + public AddActivityPlanOnProjectStart addActivityPlanOnProjectStart( + ActivityPlanFacade activityPlanFacade, + EventBus eventBus) + { + return new AddActivityPlanOnProjectStart(activityPlanFacade, eventBus); + } + + @Bean + public Notifications notifications( + EventBus eventBus, + NotificationController notificationController, + NotificationService notificationService) + { + return new Notifications(notificationController, notificationService, eventBus); + } + + @Bean + public CommentThreadServiceImpl commentThreadService(CommentThreadRepo commentThreadRepository) { + return new CommentThreadServiceImpl(commentThreadRepository); + } + + @Bean + public NotificationEventServiceImpl notificationEventService(NotificationEventRepository notificationEventRepository) { + return new NotificationEventServiceImpl(notificationEventRepository); + } +} diff --git a/core/src/main/java/se/su/dsv/scipro/DataInitializer.java b/core/src/main/java/se/su/dsv/scipro/DataInitializer.java index 6720ffac7e..762ea0c32a 100644 --- a/core/src/main/java/se/su/dsv/scipro/DataInitializer.java +++ b/core/src/main/java/se/su/dsv/scipro/DataInitializer.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.checklist.ChecklistCategory; import se.su.dsv.scipro.match.ApplicationPeriod; import se.su.dsv.scipro.match.Keyword; diff --git a/core/src/main/java/se/su/dsv/scipro/RepositoryConfiguration.java b/core/src/main/java/se/su/dsv/scipro/RepositoryConfiguration.java new file mode 100644 index 0000000000..6a2167bc1f --- /dev/null +++ b/core/src/main/java/se/su/dsv/scipro/RepositoryConfiguration.java @@ -0,0 +1,285 @@ +package se.su.dsv.scipro; + +import jakarta.inject.Provider; +import jakarta.persistence.EntityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import se.su.dsv.scipro.checklist.ChecklistCategoryRepoImpl; +import se.su.dsv.scipro.checklist.ChecklistQuestionRepoImpl; +import se.su.dsv.scipro.file.FileDescriptionRepoImpl; +import se.su.dsv.scipro.file.FileReferenceRepositoryImpl; +import se.su.dsv.scipro.file.ProjectFileRepositoryImpl; +import se.su.dsv.scipro.finalseminar.AuthorRepositoryImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarActiveParticipationRepositoryImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarOppositionRepoImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarRepositoryImpl; +import se.su.dsv.scipro.forum.AbstractThreadRepositoryImpl; +import se.su.dsv.scipro.forum.ForumPostReadStateRepositoryImpl; +import se.su.dsv.scipro.forum.ForumPostRepositoryImpl; +import se.su.dsv.scipro.forum.GroupThreadRepositoryImpl; +import se.su.dsv.scipro.forum.ProjectThreadRepositoryImpl; +import se.su.dsv.scipro.forum.notifications.ForumNotificationRepositoryImpl; +import se.su.dsv.scipro.grading.GradingHistoryEventRepositoryImpl; +import se.su.dsv.scipro.grading.NationalSubjectCategoryRepositoryImpl; +import se.su.dsv.scipro.grading.PublicationMetadataRepositoryImpl; +import se.su.dsv.scipro.integration.activityfinalseminar.ActivityFinalSeminarRepositoryImpl; +import se.su.dsv.scipro.integration.activityforum.ActivityThreadRepositoryImpl; +import se.su.dsv.scipro.match.FirstMeetingRepositoryImpl; +import se.su.dsv.scipro.match.IdeaRepositoryImpl; +import se.su.dsv.scipro.match.TargetRepositoryImpl; +import se.su.dsv.scipro.milestones.MilestoneActivityTemplateRepositoryImpl; +import se.su.dsv.scipro.notifications.NotificationEventRepositoryImpl; +import se.su.dsv.scipro.peer.CommentThreadRepoImpl; +import se.su.dsv.scipro.peer.PeerRequestRepositoryImpl; +import se.su.dsv.scipro.peer.PeerReviewRepositoryImpl; +import se.su.dsv.scipro.plagiarism.PlagiarismRequestRepositoryImpl; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSettingsRepositoryImpl; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSubmissionRepositoryImpl; +import se.su.dsv.scipro.project.ProjectRepoImpl; +import se.su.dsv.scipro.projectpartner.ProjectPartnerRepositoryImpl; +import se.su.dsv.scipro.report.GradingReportTemplateRepoImpl; +import se.su.dsv.scipro.report.OppositionReportRepoImpl; +import se.su.dsv.scipro.report.SupervisorGradingReportRepositoryImpl; +import se.su.dsv.scipro.reviewing.DecisionRepositoryImpl; +import se.su.dsv.scipro.reviewing.ReviewerDeadlineSettingsRepositoryImpl; +import se.su.dsv.scipro.reviewing.ReviewerTargetRepositoryImpl; +import se.su.dsv.scipro.reviewing.ReviewerThreadRepositoryImpl; +import se.su.dsv.scipro.survey.QuestionRepositoryImpl; +import se.su.dsv.scipro.survey.SurveyRepositoryImpl; +import se.su.dsv.scipro.system.FooterAddressRepoImpl; +import se.su.dsv.scipro.system.FooterLinkRepoImpl; +import se.su.dsv.scipro.system.PasswordRepoImpl; +import se.su.dsv.scipro.system.UserRepoImpl; + +@Configuration(proxyBeanMethods = false) +public class RepositoryConfiguration { + @Bean + public GradingHistoryEventRepositoryImpl gradingHistoryEventRepository(Provider<EntityManager> em) { + return new GradingHistoryEventRepositoryImpl(em); + } + + @Bean + public AbstractThreadRepositoryImpl abstractThreadRepository(Provider<EntityManager> em) { + return new AbstractThreadRepositoryImpl(em); + } + + @Bean + public ActivityFinalSeminarRepositoryImpl activityFinalSeminarRepository(Provider<EntityManager> em) { + return new ActivityFinalSeminarRepositoryImpl(em); + } + + @Bean + public ActivityThreadRepositoryImpl activityThreadRepository(Provider<EntityManager> em) { + return new ActivityThreadRepositoryImpl(em); + } + + @Bean + public AuthorRepositoryImpl authorRepository(Provider<EntityManager> em) { + return new AuthorRepositoryImpl(em); + } + + @Bean + public ChecklistCategoryRepoImpl checklistCategoryRepo(Provider<EntityManager> em) { + return new ChecklistCategoryRepoImpl(em); + } + + @Bean + public ChecklistQuestionRepoImpl checklistQuestionRepo(Provider<EntityManager> em) { + return new ChecklistQuestionRepoImpl(em); + } + + @Bean + public CommentThreadRepoImpl commentThreadRepo(Provider<EntityManager> em) { + return new CommentThreadRepoImpl(em); + } + + @Bean + public DecisionRepositoryImpl decisionRepository(Provider<EntityManager> em) { + return new DecisionRepositoryImpl(em); + } + + @Bean + public FileDescriptionRepoImpl fileDescriptionRepo(Provider<EntityManager> em) { + return new FileDescriptionRepoImpl(em); + } + + @Bean + public FinalSeminarActiveParticipationRepositoryImpl finalSeminarActiveParticipationRepository(Provider<EntityManager> em) { + return new FinalSeminarActiveParticipationRepositoryImpl(em); + } + + @Bean + public FinalSeminarRepositoryImpl finalSeminarRepository(Provider<EntityManager> em) { + return new FinalSeminarRepositoryImpl(em); + } + + @Bean + public FileReferenceRepositoryImpl fileReferenceRepository(Provider<EntityManager> em) { + return new FileReferenceRepositoryImpl(em); + } + + @Bean + public FinalSeminarOppositionRepoImpl finalSeminarOppositionRepo(Provider<EntityManager> em) { + return new FinalSeminarOppositionRepoImpl(em); + } + + @Bean + public FirstMeetingRepositoryImpl firstMeetingRepository(Provider<EntityManager> em) { + return new FirstMeetingRepositoryImpl(em); + } + + @Bean + public FooterAddressRepoImpl footerAddressRepo(Provider<EntityManager> em) { + return new FooterAddressRepoImpl(em); + } + + @Bean + public FooterLinkRepoImpl footerLinkRepo(Provider<EntityManager> em) { + return new FooterLinkRepoImpl(em); + } + + @Bean + public ForumNotificationRepositoryImpl forumNotificationRepository(Provider<EntityManager> em) { + return new ForumNotificationRepositoryImpl(em); + } + + @Bean + public ForumPostReadStateRepositoryImpl forumPostReadStateRepository(Provider<EntityManager> em) { + return new ForumPostReadStateRepositoryImpl(em); + } + + @Bean + public ForumPostRepositoryImpl forumPostRepository(Provider<EntityManager> em) { + return new ForumPostRepositoryImpl(em); + } + + @Bean + public GradingReportTemplateRepoImpl gradingReportTemplateRepo(Provider<EntityManager> em) { + return new GradingReportTemplateRepoImpl(em); + } + + @Bean + public GroupThreadRepositoryImpl groupThreadRepository(Provider<EntityManager> em) { + return new GroupThreadRepositoryImpl(em); + } + + @Bean + public IdeaRepositoryImpl ideaRepository(Provider<EntityManager> em) { + return new IdeaRepositoryImpl(em); + } + + @Bean + public MilestoneActivityTemplateRepositoryImpl milestoneActivityTemplateRepository(Provider<EntityManager> em) { + return new MilestoneActivityTemplateRepositoryImpl(em); + } + + @Bean + public NationalSubjectCategoryRepositoryImpl nationalSubjectCategoryRepository(Provider<EntityManager> em) { + return new NationalSubjectCategoryRepositoryImpl(em); + } + + @Bean + public OppositionReportRepoImpl oppositionReportRepo(Provider<EntityManager> em) { + return new OppositionReportRepoImpl(em); + } + + @Bean + public PasswordRepoImpl passwordRepo(Provider<EntityManager> em) { + return new PasswordRepoImpl(em); + } + + @Bean + public PeerRequestRepositoryImpl peerRequestRepository(Provider<EntityManager> em) { + return new PeerRequestRepositoryImpl(em); + } + + @Bean + public PeerReviewRepositoryImpl peerReviewRepository(Provider<EntityManager> em) { + return new PeerReviewRepositoryImpl(em); + } + + @Bean + public ProjectPartnerRepositoryImpl projectPartnerRepository(Provider<EntityManager> em) { + return new ProjectPartnerRepositoryImpl(em); + } + + @Bean + public ProjectRepoImpl projectRepo(Provider<EntityManager> em) { + return new ProjectRepoImpl(em); + } + + @Bean + public ProjectThreadRepositoryImpl projectThreadRepository(Provider<EntityManager> em) { + return new ProjectThreadRepositoryImpl(em); + } + + @Bean + public PublicationMetadataRepositoryImpl publicationMetadataRepository(Provider<EntityManager> em) { + return new PublicationMetadataRepositoryImpl(em); + } + + @Bean + public QuestionRepositoryImpl questionRepository(Provider<EntityManager> em) { + return new QuestionRepositoryImpl(em); + } + + @Bean + public ReviewerDeadlineSettingsRepositoryImpl reviewerDeadlineSettingsRepository(Provider<EntityManager> em) { + return new ReviewerDeadlineSettingsRepositoryImpl(em); + } + + @Bean + public ReviewerTargetRepositoryImpl reviewerTargetRepository(Provider<EntityManager> em) { + return new ReviewerTargetRepositoryImpl(em); + } + + @Bean + public ReviewerThreadRepositoryImpl reviewerThreadRepository(Provider<EntityManager> em) { + return new ReviewerThreadRepositoryImpl(em); + } + + @Bean + public SurveyRepositoryImpl surveyRepository(Provider<EntityManager> em) { + return new SurveyRepositoryImpl(em); + } + + @Bean + public TargetRepositoryImpl targetRepository(Provider<EntityManager> em) { + return new TargetRepositoryImpl(em); + } + + @Bean + public UrkundSettingsRepositoryImpl urkundSettingsRepository(Provider<EntityManager> em) { + return new UrkundSettingsRepositoryImpl(em); + } + + @Bean + public UrkundSubmissionRepositoryImpl urkundSubmissionRepository(Provider<EntityManager> em) { + return new UrkundSubmissionRepositoryImpl(em); + } + + @Bean + public UserRepoImpl userRepo(Provider<EntityManager> em) { + return new UserRepoImpl(em); + } + + @Bean + public PlagiarismRequestRepositoryImpl plagiarismRequestRepository(Provider<EntityManager> em) { + return new PlagiarismRequestRepositoryImpl(em); + } + + @Bean + public ProjectFileRepositoryImpl projectFileRepository(Provider<EntityManager> em) { + return new ProjectFileRepositoryImpl(em); + } + + @Bean + public NotificationEventRepositoryImpl notificationEventRepository(Provider<EntityManager> em) { + return new NotificationEventRepositoryImpl(em); + } + + @Bean + public SupervisorGradingReportRepositoryImpl supervisorGradingReportRepository(Provider<EntityManager> em) { + return new SupervisorGradingReportRepositoryImpl(em); + } +} diff --git a/core/src/main/java/se/su/dsv/scipro/activityplan/ActivityPlanFacadeImpl.java b/core/src/main/java/se/su/dsv/scipro/activityplan/ActivityPlanFacadeImpl.java index d211c1cbac..4f7955f835 100755 --- a/core/src/main/java/se/su/dsv/scipro/activityplan/ActivityPlanFacadeImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/activityplan/ActivityPlanFacadeImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.activityplan; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.su.dsv.scipro.system.Pageable; diff --git a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistAnswerServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistAnswerServiceImpl.java index 1e1893ccda..20a612c25f 100644 --- a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistAnswerServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistAnswerServiceImpl.java @@ -9,7 +9,7 @@ import jakarta.persistence.EntityManager; public class ChecklistAnswerServiceImpl extends AbstractServiceImpl<ChecklistAnswer, Long> implements ChecklistAnswerService { @Inject - protected ChecklistAnswerServiceImpl(Provider<EntityManager> em) { + public ChecklistAnswerServiceImpl(Provider<EntityManager> em) { super(em, ChecklistAnswer.class, QChecklistAnswer.checklistAnswer); } } diff --git a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistCategoryRepo.java b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistCategoryRepo.java index 9b5883089e..64b595d29e 100755 --- a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistCategoryRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistCategoryRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.checklist; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistQuestionRepo.java b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistQuestionRepo.java index 410c90439a..3fb6407ebc 100755 --- a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistQuestionRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistQuestionRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.checklist; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistServiceImpl.java index cba683c25a..9a9a9c234e 100755 --- a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.checklist; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.activityplan.QActivity; import se.su.dsv.scipro.activityplan.QActivityPlan; import se.su.dsv.scipro.project.Project; diff --git a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistTemplateServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistTemplateServiceImpl.java index 0e43b8c13d..336d0e8b58 100755 --- a/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistTemplateServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/checklist/ChecklistTemplateServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.checklist; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.dsl.BooleanExpression; import se.su.dsv.scipro.system.Pageable; import se.su.dsv.scipro.project.Project; diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/DaisyExternalModule.java b/core/src/main/java/se/su/dsv/scipro/daisyExternal/DaisyExternalModule.java deleted file mode 100644 index 63de05fdfb..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/DaisyExternalModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/events/EventModule.java b/core/src/main/java/se/su/dsv/scipro/events/EventModule.java deleted file mode 100644 index 61fb042f87..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/events/EventModule.java +++ /dev/null @@ -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))); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/file/FileDescriptionRepo.java b/core/src/main/java/se/su/dsv/scipro/file/FileDescriptionRepo.java index eccb9da1eb..c649d10bfe 100755 --- a/core/src/main/java/se/su/dsv/scipro/file/FileDescriptionRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/file/FileDescriptionRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.file; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/file/FileModule.java b/core/src/main/java/se/su/dsv/scipro/file/FileModule.java deleted file mode 100644 index 82cc9172ea..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/file/FileModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepository.java b/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepository.java index a942b50e60..3264448133 100644 --- a/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.file; -interface FileReferenceRepository { +public interface FileReferenceRepository { FileReference create(FileReference fileReference); void delete(FileReference fileReference); diff --git a/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepositoryImpl.java index cacc3f7a16..25e00cf450 100644 --- a/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/file/FileReferenceRepositoryImpl.java @@ -1,16 +1,16 @@ package se.su.dsv.scipro.file; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.AbstractRepository; import jakarta.inject.Inject; import jakarta.inject.Provider; import jakarta.persistence.EntityManager; -class FileReferenceRepositoryImpl extends AbstractRepository implements FileReferenceRepository { +public class FileReferenceRepositoryImpl extends AbstractRepository implements FileReferenceRepository { @Inject - FileReferenceRepositoryImpl(final Provider<EntityManager> em) { + public FileReferenceRepositoryImpl(final Provider<EntityManager> em) { super(em); } diff --git a/core/src/main/java/se/su/dsv/scipro/file/FileServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/file/FileServiceImpl.java index 2fe1f634d6..c6643f50ad 100755 --- a/core/src/main/java/se/su/dsv/scipro/file/FileServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/file/FileServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.file; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.AbstractServiceImpl; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/file/ProjectFileServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/file/ProjectFileServiceImpl.java index e995fd1831..db099d6323 100644 --- a/core/src/main/java/se/su/dsv/scipro/file/ProjectFileServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/file/ProjectFileServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.file; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.Pageable; import se.su.dsv.scipro.project.Project; diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionRepo.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionRepo.java index 7def75b680..46957a9678 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.finalseminar; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.system.ProjectType; diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarRepositoryImpl.java index f17e41be75..40e72964a7 100644 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.finalseminar; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.EntityManager; import se.su.dsv.scipro.system.AbstractRepository; @@ -9,7 +9,7 @@ import jakarta.inject.Provider; public class FinalSeminarRepositoryImpl extends AbstractRepository implements FinalSeminarRepository { @Inject - protected FinalSeminarRepositoryImpl(Provider<EntityManager> em) { + public FinalSeminarRepositoryImpl(Provider<EntityManager> em) { super(em); } diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java index e3510ddfae..b5514bcd3e 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.finalseminar; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import jakarta.persistence.EntityManager; diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarSettingsServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarSettingsServiceImpl.java index 24aa74c59e..c912f35abb 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarSettingsServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarSettingsServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.finalseminar; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.AbstractServiceImpl; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarUploadControllerImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarUploadControllerImpl.java index 5feff42af2..2613d77c32 100755 --- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarUploadControllerImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarUploadControllerImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.finalseminar; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.su.dsv.scipro.file.*; diff --git a/core/src/main/java/se/su/dsv/scipro/finalthesis/FinalThesisServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalthesis/FinalThesisServiceImpl.java index 98b775c07b..41251d1700 100644 --- a/core/src/main/java/se/su/dsv/scipro/finalthesis/FinalThesisServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/finalthesis/FinalThesisServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.finalthesis; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import jakarta.persistence.EntityManager; diff --git a/core/src/main/java/se/su/dsv/scipro/firstmeeting/FirstMeetingModule.java b/core/src/main/java/se/su/dsv/scipro/firstmeeting/FirstMeetingModule.java deleted file mode 100644 index e567605a8d..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/firstmeeting/FirstMeetingModule.java +++ /dev/null @@ -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(); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java index 05642970d2..0dae3383bb 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.forum; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; import se.su.dsv.scipro.forum.dataobjects.ForumPost; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ForumModule.java b/core/src/main/java/se/su/dsv/scipro/forum/ForumModule.java deleted file mode 100644 index 7346fd1166..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/forum/ForumModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepository.java b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepository.java index 4d385c0255..00dd52bb7c 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.forum; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.forum.dataobjects.ForumPost; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepositoryImpl.java index 909c57693f..862884445c 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostReadStateRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.forum; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.LockModeType; import se.su.dsv.scipro.forum.dataobjects.ForumPost; import se.su.dsv.scipro.forum.dataobjects.ForumPostReadState; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostRepository.java b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostRepository.java index 0b39495268..92e3afb1c8 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ForumPostRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ForumPostRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.forum; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.forum.dataobjects.ForumPost; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java index bed0169c09..0ba81e0b92 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.forum; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.forum.dataobjects.ForumPost; import se.su.dsv.scipro.forum.dataobjects.ForumThread; import se.su.dsv.scipro.forum.dataobjects.GroupThread; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/GroupThreadRepository.java b/core/src/main/java/se/su/dsv/scipro/forum/GroupThreadRepository.java index 37e0a30d31..2c254d5bd2 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/GroupThreadRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/GroupThreadRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.forum; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.forum.dataobjects.GroupThread; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java index 7ed3e1715c..1825a16197 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.forum; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileSource; import se.su.dsv.scipro.file.ProjectFileService; import se.su.dsv.scipro.forum.dataobjects.ForumPost; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java index b50913b764..cbe28506a1 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.forum; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.forum.dataobjects.ProjectThread; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotifications.java b/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotifications.java index b294608351..5b1ff17920 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotifications.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotifications.java @@ -2,7 +2,7 @@ package se.su.dsv.scipro.forum.notifications; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.forum.dataobjects.ForumPost; import se.su.dsv.scipro.forum.ForumPostReadEvent; import se.su.dsv.scipro.forum.NewGroupForumReplyEvent; diff --git a/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotificationsModule.java b/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotificationsModule.java deleted file mode 100644 index 2a77013615..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/forum/notifications/ForumNotificationsModule.java +++ /dev/null @@ -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(); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/gdpr/GDPRModule.java b/core/src/main/java/se/su/dsv/scipro/gdpr/GDPRModule.java deleted file mode 100644 index 65a3f3ae8f..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/gdpr/GDPRModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/generalsystemsettings/GeneralSystemSettingsServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/generalsystemsettings/GeneralSystemSettingsServiceImpl.java index 1550844b4e..5450f5b837 100755 --- a/core/src/main/java/se/su/dsv/scipro/generalsystemsettings/GeneralSystemSettingsServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/generalsystemsettings/GeneralSystemSettingsServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.generalsystemsettings; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.AbstractServiceImpl; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/grading/GradingHistoryEventRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/grading/GradingHistoryEventRepositoryImpl.java index 68b25d1cd0..de3f36ac13 100644 --- a/core/src/main/java/se/su/dsv/scipro/grading/GradingHistoryEventRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/grading/GradingHistoryEventRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.grading; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.EntityManager; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.system.AbstractRepository; diff --git a/core/src/main/java/se/su/dsv/scipro/grading/GradingModule.java b/core/src/main/java/se/su/dsv/scipro/grading/GradingModule.java deleted file mode 100644 index e67d559b77..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/grading/GradingModule.java +++ /dev/null @@ -1,37 +0,0 @@ -package se.su.dsv.scipro.grading; - -import com.google.inject.Key; -import com.google.inject.PrivateModule; -import com.google.inject.name.Names; -import se.su.dsv.scipro.report.GradingReportServiceImpl; - -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); - - bind(GradingReportTemplateService.class).to(GradingReportServiceImpl.class); - expose(GradingReportTemplateService.class); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/grading/NationalSubjectCategoryRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/grading/NationalSubjectCategoryRepositoryImpl.java index 2a6d009a47..90c2723739 100644 --- a/core/src/main/java/se/su/dsv/scipro/grading/NationalSubjectCategoryRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/grading/NationalSubjectCategoryRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.grading; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.EntityManager; import se.su.dsv.scipro.system.AbstractRepository; diff --git a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepository.java b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepository.java index 05702c1d93..10c37dab9e 100644 --- a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepository.java @@ -2,7 +2,7 @@ package se.su.dsv.scipro.grading; import se.su.dsv.scipro.project.Project; -interface PublicationMetadataRepository { +public interface PublicationMetadataRepository { void save(PublicationMetadata publicationMetadata); PublicationMetadata findByProject(Project project); diff --git a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepositoryImpl.java index f1b2ac5a38..503b62f6ec 100644 --- a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.grading; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.EntityManager; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.system.AbstractRepository; @@ -8,9 +8,9 @@ import se.su.dsv.scipro.system.AbstractRepository; import jakarta.inject.Inject; import jakarta.inject.Provider; -class PublicationMetadataRepositoryImpl extends AbstractRepository implements PublicationMetadataRepository { +public class PublicationMetadataRepositoryImpl extends AbstractRepository implements PublicationMetadataRepository { @Inject - PublicationMetadataRepositoryImpl(Provider<EntityManager> em) { + public PublicationMetadataRepositoryImpl(Provider<EntityManager> em) { super(em); } diff --git a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataServiceImpl.java index 26f0e1801b..684e24ae7b 100644 --- a/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/grading/PublicationMetadataServiceImpl.java @@ -6,11 +6,11 @@ import se.su.dsv.scipro.system.Language; import jakarta.inject.Inject; import java.util.Objects; -class PublicationMetadataServiceImpl implements PublicationMetadataService { +public class PublicationMetadataServiceImpl implements PublicationMetadataService { private final PublicationMetadataRepository publicationMetadataRepository; @Inject - PublicationMetadataServiceImpl(PublicationMetadataRepository publicationMetadataRepository) { + public PublicationMetadataServiceImpl(PublicationMetadataRepository publicationMetadataRepository) { this.publicationMetadataRepository = publicationMetadataRepository; } diff --git a/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarModule.java b/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarModule.java deleted file mode 100644 index 0d5d8bf9a4..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarRepository.java b/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarRepository.java index 87191121e6..6f1af4098c 100644 --- a/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/integration/activityfinalseminar/ActivityFinalSeminarRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.integration.activityfinalseminar; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.finalseminar.FinalSeminar; diff --git a/core/src/main/java/se/su/dsv/scipro/integration/activityforum/ActivityForumModule.java b/core/src/main/java/se/su/dsv/scipro/integration/activityforum/ActivityForumModule.java deleted file mode 100644 index c14a655f13..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/integration/activityforum/ActivityForumModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/mail/PrintingMailer.java b/core/src/main/java/se/su/dsv/scipro/mail/PrintingMailer.java index a5c7f597be..179bffc02c 100644 --- a/core/src/main/java/se/su/dsv/scipro/mail/PrintingMailer.java +++ b/core/src/main/java/se/su/dsv/scipro/mail/PrintingMailer.java @@ -6,7 +6,7 @@ import se.su.dsv.scipro.file.FileDescription; import java.util.Arrays; import java.util.UUID; -class PrintingMailer implements Mailer { +public class PrintingMailer implements Mailer { @Override public MailResult mail(final String fromName, final String fromEmail, final String[] recipients, final String subject, final String message, final FileDescription attachment) { return new MailResult() { diff --git a/core/src/main/java/se/su/dsv/scipro/match/AllowAllIdeaCreationJudge.java b/core/src/main/java/se/su/dsv/scipro/match/AllowAllIdeaCreationJudge.java index f5e0035fa5..6a91588ff1 100644 --- a/core/src/main/java/se/su/dsv/scipro/match/AllowAllIdeaCreationJudge.java +++ b/core/src/main/java/se/su/dsv/scipro/match/AllowAllIdeaCreationJudge.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -class AllowAllIdeaCreationJudge implements IdeaCreationJudge { +public class AllowAllIdeaCreationJudge implements IdeaCreationJudge { @Override public Decision ruling(Idea idea) { return Decision.allowed(); diff --git a/core/src/main/java/se/su/dsv/scipro/match/ApplicationPeriodServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/match/ApplicationPeriodServiceImpl.java index 0156c88bd8..29499c6f0c 100755 --- a/core/src/main/java/se/su/dsv/scipro/match/ApplicationPeriodServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/match/ApplicationPeriodServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import se.su.dsv.scipro.system.PageRequest; diff --git a/core/src/main/java/se/su/dsv/scipro/match/FirstMeetingRepository.java b/core/src/main/java/se/su/dsv/scipro/match/FirstMeetingRepository.java index 7714a267a9..caa4bab050 100755 --- a/core/src/main/java/se/su/dsv/scipro/match/FirstMeetingRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/match/FirstMeetingRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/match/IdeaServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/match/IdeaServiceImpl.java index 07a468f894..d3c410eb05 100755 --- a/core/src/main/java/se/su/dsv/scipro/match/IdeaServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/match/IdeaServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.BooleanExpression; diff --git a/core/src/main/java/se/su/dsv/scipro/match/KeywordServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/match/KeywordServiceImpl.java index 44c702b1aa..9eb0a58232 100755 --- a/core/src/main/java/se/su/dsv/scipro/match/KeywordServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/match/KeywordServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.dsl.BooleanExpression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/se/su/dsv/scipro/match/MatchModule.java b/core/src/main/java/se/su/dsv/scipro/match/MatchModule.java deleted file mode 100644 index 28e19d2295..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/match/MatchModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/match/ProgramServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/match/ProgramServiceImpl.java index e759f53f93..925831af46 100644 --- a/core/src/main/java/se/su/dsv/scipro/match/ProgramServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/match/ProgramServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.dsl.BooleanExpression; import se.su.dsv.scipro.system.PageRequest; import se.su.dsv.scipro.system.Sort; diff --git a/core/src/main/java/se/su/dsv/scipro/milestones/MilestoneActivityTemplateRepository.java b/core/src/main/java/se/su/dsv/scipro/milestones/MilestoneActivityTemplateRepository.java index e43bb892e8..8d8aaaeb33 100644 --- a/core/src/main/java/se/su/dsv/scipro/milestones/MilestoneActivityTemplateRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/milestones/MilestoneActivityTemplateRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.milestones; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.milestones.dataobjects.MilestoneActivityTemplate; diff --git a/core/src/main/java/se/su/dsv/scipro/milestones/service/impl/MilestonePhaseTemplateServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/milestones/service/impl/MilestonePhaseTemplateServiceImpl.java index f5bd91a316..197e947bda 100644 --- a/core/src/main/java/se/su/dsv/scipro/milestones/service/impl/MilestonePhaseTemplateServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/milestones/service/impl/MilestonePhaseTemplateServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.milestones.service.impl; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.Sort; import se.su.dsv.scipro.milestones.dataobjects.MilestonePhaseTemplate; import se.su.dsv.scipro.milestones.dataobjects.QMilestonePhaseTemplate; diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationControllerImpl.java b/core/src/main/java/se/su/dsv/scipro/notifications/NotificationControllerImpl.java index 8bd1a88a13..0a4a6e08f4 100755 --- a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationControllerImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/notifications/NotificationControllerImpl.java @@ -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; } } diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationModule.java b/core/src/main/java/se/su/dsv/scipro/notifications/NotificationModule.java deleted file mode 100644 index 507ca4bcab..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationModule.java +++ /dev/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); - } - -} diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/notifications/NotificationServiceImpl.java index 826991801f..6c460a0741 100755 --- a/core/src/main/java/se/su/dsv/scipro/notifications/NotificationServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/notifications/NotificationServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.notifications; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import se.su.dsv.scipro.system.Pageable; diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImpl.java b/core/src/main/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImpl.java index cdf67a52d4..b8aeadcb99 100755 --- a/core/src/main/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/notifications/interfaces/impl/NotificationMailFormatterImpl.java @@ -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) { diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/DeliveryConfigurationServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/DeliveryConfigurationServiceImpl.java index 285b9f6c0a..75f7624ac6 100644 --- a/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/DeliveryConfigurationServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/DeliveryConfigurationServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.notifications.settings.service; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.notifications.dataobject.Notification; import se.su.dsv.scipro.notifications.dataobject.Notification.Type; import se.su.dsv.scipro.notifications.settings.entities.DeliveryConfiguration; diff --git a/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/ReceiverConfigurationServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/ReceiverConfigurationServiceImpl.java index 37befe6c34..596c2e3821 100644 --- a/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/ReceiverConfigurationServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/notifications/settings/service/ReceiverConfigurationServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.notifications.settings.service; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.data.dataobjects.Member; import se.su.dsv.scipro.notifications.dataobject.Notification; import se.su.dsv.scipro.notifications.settings.entities.QReceiverConfiguration; diff --git a/core/src/main/java/se/su/dsv/scipro/oauth/OAuthModule.java b/core/src/main/java/se/su/dsv/scipro/oauth/OAuthModule.java deleted file mode 100644 index bce825afe1..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/oauth/OAuthModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/oauth/OAuthSettings.java b/core/src/main/java/se/su/dsv/scipro/oauth/OAuthSettings.java index a8b41b8648..2a20bcf204 100644 --- a/core/src/main/java/se/su/dsv/scipro/oauth/OAuthSettings.java +++ b/core/src/main/java/se/su/dsv/scipro/oauth/OAuthSettings.java @@ -1,4 +1,4 @@ package se.su.dsv.scipro.oauth; -record OAuthSettings(String uri, String redirectUri, String clientId, String clientSecret) { +public record OAuthSettings(String uri, String redirectUri, String clientId, String clientSecret) { } diff --git a/core/src/main/java/se/su/dsv/scipro/peer/CommentServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/peer/CommentServiceImpl.java index db26096621..63723ecf16 100644 --- a/core/src/main/java/se/su/dsv/scipro/peer/CommentServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/CommentServiceImpl.java @@ -10,7 +10,7 @@ import java.util.List; public class CommentServiceImpl extends AbstractServiceImpl<Comment, Long> implements CommentService { @Inject - protected CommentServiceImpl(Provider<EntityManager> em) { + public CommentServiceImpl(Provider<EntityManager> em) { super(em, Comment.class, QComment.comment1); } diff --git a/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadRepo.java b/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadRepo.java index 025bb02da1..8210abd3c5 100644 --- a/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.peer; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadServiceImpl.java index 82d1e68e53..604e36b9a5 100644 --- a/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/CommentThreadServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.peer; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/peer/PeerModule.java b/core/src/main/java/se/su/dsv/scipro/peer/PeerModule.java deleted file mode 100644 index 0fdd05980c..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/peer/PeerModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/peer/PeerPortalImpl.java b/core/src/main/java/se/su/dsv/scipro/peer/PeerPortalImpl.java index 5582001f6a..aa6b178072 100755 --- a/core/src/main/java/se/su/dsv/scipro/peer/PeerPortalImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/PeerPortalImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.peer; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.su.dsv.scipro.file.FileReference; @@ -152,7 +152,7 @@ public class PeerPortalImpl implements PeerPortal, PerformReviewService { } @Override - @Transactional(ignore = {TooShortCommentException.class, MissingAnswerException.class}) + @Transactional(dontRollbackOn = {TooShortCommentException.class, MissingAnswerException.class}) public void submit(PeerReview review, Optional<FileUpload> upload) { review.submit(); final Optional<FileReference> fileDescription = storePeerReviewFileUpload(upload); diff --git a/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestRepository.java b/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestRepository.java index d6ca147c68..1a5c7439ff 100755 --- a/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.peer; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; diff --git a/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestServiceImpl.java index b79394efd6..ad77dcfe22 100755 --- a/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/peer/PeerRequestServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.peer; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import se.su.dsv.scipro.system.Pageable; diff --git a/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismControlImpl.java b/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismControlImpl.java index b21bd32fe9..d72913163d 100755 --- a/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismControlImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismControlImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.plagiarism; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileDescription; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; diff --git a/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismModule.java b/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismModule.java deleted file mode 100644 index 3f862ea21c..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/plagiarism/PlagiarismModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundApiImpl.java b/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundApiImpl.java index 774dfdda3a..5a5f58f929 100644 --- a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundApiImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundApiImpl.java @@ -36,7 +36,7 @@ public class UrkundApiImpl implements UrkundApi { private final FileService fileService; @Inject - UrkundApiImpl(final UrkundSettingsRepository urkundSettingsRepository, FileService fileService) { + public UrkundApiImpl(final UrkundSettingsRepository urkundSettingsRepository, FileService fileService) { this.urkundSettingsRepository = urkundSettingsRepository; this.fileService = fileService; objectMapper = new ObjectMapper(); diff --git a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundModule.java b/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundModule.java deleted file mode 100644 index 573a3a5559..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundModule.java +++ /dev/null @@ -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(); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundServiceImpl.java index 8eac423c9b..e83125690b 100644 --- a/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/plagiarism/urkund/UrkundServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.plagiarism.urkund; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileDescription; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; diff --git a/core/src/main/java/se/su/dsv/scipro/profiles/CurrentProfile.java b/core/src/main/java/se/su/dsv/scipro/profiles/CurrentProfile.java index 679ba53157..6bf6f2bd19 100755 --- a/core/src/main/java/se/su/dsv/scipro/profiles/CurrentProfile.java +++ b/core/src/main/java/se/su/dsv/scipro/profiles/CurrentProfile.java @@ -1,14 +1,10 @@ package se.su.dsv.scipro.profiles; -import jakarta.inject.Inject; -import jakarta.inject.Named; - public class CurrentProfile { private String currentProfileString; - @Inject - public void setCurrentProfileString(@Named("profile") String currentProfileString) { + public void setCurrentProfileString(String currentProfileString) { this.currentProfileString = currentProfileString; } diff --git a/core/src/main/java/se/su/dsv/scipro/project/ProjectPeopleStatisticsServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/project/ProjectPeopleStatisticsServiceImpl.java index 9a2862ae63..ada1db066b 100644 --- a/core/src/main/java/se/su/dsv/scipro/project/ProjectPeopleStatisticsServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/project/ProjectPeopleStatisticsServiceImpl.java @@ -10,7 +10,7 @@ import jakarta.persistence.EntityManager; public class ProjectPeopleStatisticsServiceImpl extends AbstractServiceImpl<Project, Long> implements ProjectPeopleStatisticsService { @Inject - protected ProjectPeopleStatisticsServiceImpl(Provider<EntityManager> em) { + public ProjectPeopleStatisticsServiceImpl(Provider<EntityManager> em) { super(em, Project.class, QProject.project); } diff --git a/core/src/main/java/se/su/dsv/scipro/project/ProjectRepo.java b/core/src/main/java/se/su/dsv/scipro/project/ProjectRepo.java index 43892156ca..a1c985044f 100755 --- a/core/src/main/java/se/su/dsv/scipro/project/ProjectRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/project/ProjectRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.project; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.system.User; diff --git a/core/src/main/java/se/su/dsv/scipro/project/ProjectRepoImpl.java b/core/src/main/java/se/su/dsv/scipro/project/ProjectRepoImpl.java index f8dfb462bd..8211412568 100644 --- a/core/src/main/java/se/su/dsv/scipro/project/ProjectRepoImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/project/ProjectRepoImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.project; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.GenericRepo; import se.su.dsv.scipro.system.User; diff --git a/core/src/main/java/se/su/dsv/scipro/project/ProjectServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/project/ProjectServiceImpl.java index 617f39e795..e52cae2397 100755 --- a/core/src/main/java/se/su/dsv/scipro/project/ProjectServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/project/ProjectServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.project; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.BooleanExpression; diff --git a/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerRepositoryImpl.java index 63dada7bf6..a437f162d5 100644 --- a/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.projectpartner; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.system.AbstractRepository; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerServiceImpl.java index 3b39364a33..5af5e3a0a7 100644 --- a/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/projectpartner/ProjectPartnerServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.projectpartner; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPAExpressions; import se.su.dsv.scipro.system.Pageable; diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionModule.java b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionModule.java deleted file mode 100644 index 872fd7d8dd..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java index ccd23a6244..bdc36bc904 100644 --- a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.reflection; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.finalseminar.AuthorRepository; import se.su.dsv.scipro.finalseminar.FinalSeminarService; import se.su.dsv.scipro.project.Author; @@ -9,12 +9,12 @@ import se.su.dsv.scipro.system.User; import jakarta.inject.Inject; -class ReflectionServiceImpl implements ReflectionService { +public class ReflectionServiceImpl implements ReflectionService { private final AuthorRepository authorRepository; private final FinalSeminarService finalSeminarService; @Inject - ReflectionServiceImpl(AuthorRepository authorRepository, FinalSeminarService finalSeminarService) { + public ReflectionServiceImpl(AuthorRepository authorRepository, FinalSeminarService finalSeminarService) { this.authorRepository = authorRepository; this.finalSeminarService = finalSeminarService; } diff --git a/core/src/main/java/se/su/dsv/scipro/report/GradingReportServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/report/GradingReportServiceImpl.java index 6f9b1a9824..1dd53e1665 100644 --- a/core/src/main/java/se/su/dsv/scipro/report/GradingReportServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/report/GradingReportServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.report; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition; import se.su.dsv.scipro.grading.GradingBasis; import se.su.dsv.scipro.grading.GradingReportTemplateService; @@ -133,6 +133,7 @@ public class GradingReportServiceImpl implements GradingReportTemplateService, G } @Override + @Transactional public List<SupervisorGradingReport> getSupervisorGradingReports(Project project) { List<SupervisorGradingReport> gradingReports = new ArrayList<>(); for (User user : project.getProjectParticipants()) { diff --git a/core/src/main/java/se/su/dsv/scipro/report/GradingReportTemplateRepoImpl.java b/core/src/main/java/se/su/dsv/scipro/report/GradingReportTemplateRepoImpl.java index 8cf96941a1..7eec180ce5 100644 --- a/core/src/main/java/se/su/dsv/scipro/report/GradingReportTemplateRepoImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/report/GradingReportTemplateRepoImpl.java @@ -1,8 +1,8 @@ package se.su.dsv.scipro.report; -import com.google.inject.persist.Transactional; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.JPQLQuery; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.grading.GradingReportTemplateUpdate; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.system.GenericRepo; diff --git a/core/src/main/java/se/su/dsv/scipro/report/OppositionReportServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/report/OppositionReportServiceImpl.java index 417e7a15bf..231fe6f692 100644 --- a/core/src/main/java/se/su/dsv/scipro/report/OppositionReportServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/report/OppositionReportServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.report; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition; diff --git a/core/src/main/java/se/su/dsv/scipro/report/ReportServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/report/ReportServiceImpl.java index f8ba6bd969..44d938d819 100644 --- a/core/src/main/java/se/su/dsv/scipro/report/ReportServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/report/ReportServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.report; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; import se.su.dsv.scipro.file.FileUpload; diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/FinalSeminarApprovalServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/FinalSeminarApprovalServiceImpl.java index 5d8e123342..fec755260c 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/FinalSeminarApprovalServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/FinalSeminarApprovalServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.reviewing; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; import se.su.dsv.scipro.file.FileUpload; diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ProjectFinalSeminarStatisticsServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ProjectFinalSeminarStatisticsServiceImpl.java index 736c9d4120..9a5239e570 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ProjectFinalSeminarStatisticsServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ProjectFinalSeminarStatisticsServiceImpl.java @@ -27,7 +27,7 @@ import static com.querydsl.core.types.dsl.Expressions.anyOf; public class ProjectFinalSeminarStatisticsServiceImpl extends AbstractServiceImpl<Project, Long> implements ProjectFinalSeminarStatisticsService { @Inject - protected ProjectFinalSeminarStatisticsServiceImpl(Provider<EntityManager> em) { + public ProjectFinalSeminarStatisticsServiceImpl(Provider<EntityManager> em) { super(em, Project.class, QProject.project); } diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerCapacityServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerCapacityServiceImpl.java index c758523db5..08e67aa38b 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerCapacityServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerCapacityServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.reviewing; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.project.ProjectService; import se.su.dsv.scipro.project.ReviewerAssignedEvent; @@ -25,7 +25,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Stream; -class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAssignmentService { +public class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAssignmentService { private final ReviewerTargetRepository reviewerTargetRepository; private final DecisionRepository decisionRepository; private final UserService userService; @@ -33,7 +33,7 @@ class ReviewerCapacityServiceImpl implements ReviewerCapacityService, ReviewerAs private final EventBus eventBus; @Inject - ReviewerCapacityServiceImpl( + public ReviewerCapacityServiceImpl( ReviewerTargetRepository reviewerTargetRepository, DecisionRepository decisionRepository, UserService userService, diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepository.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepository.java index 0094b9e7dc..e95b191bb8 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepository.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.reviewing; -interface ReviewerDeadlineSettingsRepository { +public interface ReviewerDeadlineSettingsRepository { ReviewerDeadlineSettings findOne(long instanceId); ReviewerDeadlineSettings save(ReviewerDeadlineSettings entity); diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepositoryImpl.java index bcaf1e434e..6839c0cac5 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsRepositoryImpl.java @@ -6,12 +6,12 @@ import se.su.dsv.scipro.system.AbstractRepository; import jakarta.inject.Inject; import jakarta.inject.Provider; -class ReviewerDeadlineSettingsRepositoryImpl +public class ReviewerDeadlineSettingsRepositoryImpl extends AbstractRepository implements ReviewerDeadlineSettingsRepository { @Inject - ReviewerDeadlineSettingsRepositoryImpl(Provider<EntityManager> em) { + public ReviewerDeadlineSettingsRepositoryImpl(Provider<EntityManager> em) { super(em); } diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsServiceImpl.java index e52d28d078..3f0db387dd 100755 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerDeadlineSettingsServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.reviewing; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerInteractionServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerInteractionServiceImpl.java index 0079e40a2b..a08f5ffcbc 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerInteractionServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerInteractionServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.reviewing; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.forum.Attachment; import se.su.dsv.scipro.forum.BasicForumService; import se.su.dsv.scipro.forum.dataobjects.ForumPost; diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerTargetRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerTargetRepositoryImpl.java index 985ae1934b..ba1b9b961c 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerTargetRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerTargetRepositoryImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.reviewing; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.persistence.EntityManager; import se.su.dsv.scipro.system.AbstractRepository; import se.su.dsv.scipro.system.User; diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewingModule.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewingModule.java deleted file mode 100644 index 9a0d1d53f7..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewingModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java index fea26c83d6..f7a4365b24 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java @@ -1,7 +1,7 @@ package se.su.dsv.scipro.reviewing; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.file.FileService; import se.su.dsv.scipro.file.FileUpload; diff --git a/core/src/main/java/se/su/dsv/scipro/security/auth/AuthenticationModule.java b/core/src/main/java/se/su/dsv/scipro/security/auth/AuthenticationModule.java deleted file mode 100644 index 3598358043..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/security/auth/AuthenticationModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/UserProfileServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/UserProfileServiceImpl.java index a89512dab1..788ae44b07 100644 --- a/core/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/UserProfileServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/UserProfileServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.springdata.serviceimpls; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.security.auth.roles.Roles; import se.su.dsv.scipro.settings.dataobjects.QUserProfile; import se.su.dsv.scipro.settings.dataobjects.UserProfile; @@ -43,6 +43,7 @@ public class UserProfileServiceImpl extends AbstractServiceImpl<UserProfile, Lon } @Override + @Transactional public void setSelectedRole(User user, Roles role) { UserProfile profile = findByUser(user); profile.setSelectedRole(role); diff --git a/core/src/main/java/se/su/dsv/scipro/sukat/SukatModule.java b/core/src/main/java/se/su/dsv/scipro/sukat/SukatModule.java deleted file mode 100644 index 544a17ec39..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/sukat/SukatModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/survey/SurveyModule.java b/core/src/main/java/se/su/dsv/scipro/survey/SurveyModule.java deleted file mode 100644 index 54a6c83c92..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/survey/SurveyModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/survey/SurveyServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/survey/SurveyServiceImpl.java index ecb7c22070..386c771880 100644 --- a/core/src/main/java/se/su/dsv/scipro/survey/SurveyServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/survey/SurveyServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.survey; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.finalthesis.FinalThesisService; import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettings; import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService; diff --git a/core/src/main/java/se/su/dsv/scipro/system/AbstractServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/system/AbstractServiceImpl.java index 748940900e..f6d52a414b 100755 --- a/core/src/main/java/se/su/dsv/scipro/system/AbstractServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/system/AbstractServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.EntityPathBase; import com.querydsl.core.types.dsl.Expressions; diff --git a/core/src/main/java/se/su/dsv/scipro/system/FooterAddressRepo.java b/core/src/main/java/se/su/dsv/scipro/system/FooterAddressRepo.java index ad0f13494d..b326a9c967 100644 --- a/core/src/main/java/se/su/dsv/scipro/system/FooterAddressRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/system/FooterAddressRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; @Transactional public interface FooterAddressRepo extends JpaRepository<FooterAddress, Long>, QueryDslPredicateExecutor<FooterAddress> { diff --git a/core/src/main/java/se/su/dsv/scipro/system/FooterLinkRepo.java b/core/src/main/java/se/su/dsv/scipro/system/FooterLinkRepo.java index bd0c349289..8994ba19ae 100755 --- a/core/src/main/java/se/su/dsv/scipro/system/FooterLinkRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/system/FooterLinkRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import java.util.List; import java.util.Optional; diff --git a/core/src/main/java/se/su/dsv/scipro/system/FooterLinkServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/system/FooterLinkServiceImpl.java index 327b83accc..901a487f84 100644 --- a/core/src/main/java/se/su/dsv/scipro/system/FooterLinkServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/system/FooterLinkServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.inject.Inject; import java.util.List; diff --git a/core/src/main/java/se/su/dsv/scipro/system/GenericRepo.java b/core/src/main/java/se/su/dsv/scipro/system/GenericRepo.java index 2a42a60a0e..07ae33135f 100644 --- a/core/src/main/java/se/su/dsv/scipro/system/GenericRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/system/GenericRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.EntityPathBase; import com.querydsl.core.types.dsl.Expressions; diff --git a/core/src/main/java/se/su/dsv/scipro/system/MergeServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/system/MergeServiceImpl.java index 0c58d7f4d5..e14516ffb9 100644 --- a/core/src/main/java/se/su/dsv/scipro/system/MergeServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/system/MergeServiceImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.inject.Inject; diff --git a/core/src/main/java/se/su/dsv/scipro/system/PasswordRepo.java b/core/src/main/java/se/su/dsv/scipro/system/PasswordRepo.java index 32d5c4c4f9..53dfe5d7a8 100755 --- a/core/src/main/java/se/su/dsv/scipro/system/PasswordRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/system/PasswordRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; @Transactional diff --git a/core/src/main/java/se/su/dsv/scipro/system/UserRepo.java b/core/src/main/java/se/su/dsv/scipro/system/UserRepo.java index 1a227078e1..9831c44da1 100755 --- a/core/src/main/java/se/su/dsv/scipro/system/UserRepo.java +++ b/core/src/main/java/se/su/dsv/scipro/system/UserRepo.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.system; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.security.auth.roles.Roles; import java.util.Collection; diff --git a/core/src/main/java/se/su/dsv/scipro/war/PluginConfiguration.java b/core/src/main/java/se/su/dsv/scipro/war/PluginConfiguration.java new file mode 100644 index 0000000000..a111714130 --- /dev/null +++ b/core/src/main/java/se/su/dsv/scipro/war/PluginConfiguration.java @@ -0,0 +1,4 @@ +package se.su.dsv.scipro.war; + +public interface PluginConfiguration { +} diff --git a/core/src/main/java/se/su/dsv/scipro/workerthreads/AbstractWorker.java b/core/src/main/java/se/su/dsv/scipro/workerthreads/AbstractWorker.java index 751b6c8831..5c721b2ffe 100755 --- a/core/src/main/java/se/su/dsv/scipro/workerthreads/AbstractWorker.java +++ b/core/src/main/java/se/su/dsv/scipro/workerthreads/AbstractWorker.java @@ -1,6 +1,5 @@ package se.su.dsv.scipro.workerthreads; -import com.google.inject.persist.UnitOfWork; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,9 +22,7 @@ public abstract class AbstractWorker implements Worker { private WorkerData wd = null; private Date lastSuccessfulRun = new Date(0); private boolean successfulWorker = true; - private Provider<EntityManager> emProvider; - private EntityTransaction transaction; - private UnitOfWork unitOfWork; + private WorkerTransactionManager txManager; /** * Subclasses must be annotated with @Component or similar annotation in order for autowiring of dependencies to work @@ -39,22 +36,13 @@ public abstract class AbstractWorker implements Worker { } @Inject - public void setTxManager(Provider<EntityManager> em) { - this.emProvider = em; - } - - @Inject - public void setUnitOfWork(UnitOfWork unitOfWork) { - this.unitOfWork = unitOfWork; + public void setTxManager(WorkerTransactionManager txManager) { + this.txManager = txManager; } @Override public void run() { - unitOfWork.begin(); - EntityManager em = emProvider.get(); try { - transaction = em.getTransaction(); - wd = workerDataService.getWorkerDataByName(getName()); if (wd != null) { lastSuccessfulRun = wd.getLastSuccessfulRun(); @@ -80,9 +68,7 @@ public abstract class AbstractWorker implements Worker { setSuccessfulWorker(false); } finally { - if (transaction.isActive() && em.isOpen()) { - transaction.rollback(); - } + txManager.rollbackIfActive(); } // in case a job crashes or clears the cache (so the entity is detached) @@ -95,10 +81,7 @@ public abstract class AbstractWorker implements Worker { saveWorkerData(); } finally { - if (transaction.isActive() && em.isOpen()) { - transaction.rollback(); - } - unitOfWork.end(); + txManager.rollbackIfActive(); } } @@ -148,15 +131,15 @@ public abstract class AbstractWorker implements Worker { protected abstract void doWork(); protected void beginTransaction() { - transaction.begin(); + txManager.begin(); } protected void commitTransaction() { - transaction.commit(); + txManager.commit(); } protected void rollbackTransaction() { - transaction.rollback(); + txManager.rollback(); } } diff --git a/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerModule.java b/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerModule.java deleted file mode 100644 index 370d486d83..0000000000 --- a/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerModule.java +++ /dev/null @@ -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); - } -} diff --git a/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerTransactionManager.java b/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerTransactionManager.java new file mode 100644 index 0000000000..1ff2b458d4 --- /dev/null +++ b/core/src/main/java/se/su/dsv/scipro/workerthreads/WorkerTransactionManager.java @@ -0,0 +1,20 @@ +package se.su.dsv.scipro.workerthreads; + +public interface WorkerTransactionManager { + void rollbackIfActive(); + + /** + * @throws IllegalStateException if a transaction is already active + */ + void begin(); + + /** + * @throws IllegalStateException if a transaction is not active + */ + void commit(); + + /** + * @throws IllegalStateException if a transaction is not active + */ + void rollback(); +} diff --git a/core/src/test/java/se/su/dsv/scipro/forum/ForumModuleTest.java b/core/src/test/java/se/su/dsv/scipro/forum/ForumModuleTest.java index 4c0f37379d..90cc242e77 100644 --- a/core/src/test/java/se/su/dsv/scipro/forum/ForumModuleTest.java +++ b/core/src/test/java/se/su/dsv/scipro/forum/ForumModuleTest.java @@ -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); - } - }; - } } diff --git a/core/src/test/java/se/su/dsv/scipro/group/GroupServiceImplTest.java b/core/src/test/java/se/su/dsv/scipro/group/GroupServiceImplTest.java index da314ab9c1..4a3e6dc33c 100644 --- a/core/src/test/java/se/su/dsv/scipro/group/GroupServiceImplTest.java +++ b/core/src/test/java/se/su/dsv/scipro/group/GroupServiceImplTest.java @@ -1,135 +1,135 @@ -package se.su.dsv.scipro.group; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import se.su.dsv.scipro.project.Project; -import se.su.dsv.scipro.system.DegreeType; -import se.su.dsv.scipro.system.ProjectType; -import se.su.dsv.scipro.system.User; -import se.su.dsv.scipro.test.IntegrationTest; - -import jakarta.inject.Inject; -import java.time.LocalDate; -import java.util.Collections; -import java.util.HashSet; - -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItem; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class GroupServiceImplTest extends IntegrationTest { - - @Inject - private GroupServiceImpl groupService; - private User author; - private User creator; - private User reviewer; - private User cosupervisor; - private Group group; - private ProjectType projectType; - - @BeforeEach - public void setUp() throws Exception { - author = saveUser("author", "name", "author@example.com"); - creator = saveUser("supervisor", "sup", "supervisor@example.com"); - reviewer = saveUser("reviewer", "test", "reviewer@example.com"); - cosupervisor = saveUser("cosupervisor", "test", "reviewer@example.com"); - projectType = save(new ProjectType(DegreeType.BACHELOR, "b", "b")); - User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); - Project project = save(Project.builder().title("title").projectType(projectType).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); - project.addProjectParticipant(author); - project.addReviewer(reviewer); - project.addCoSupervisor(cosupervisor); - createGroup(project); - } - - @Test - public void find_by_author() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setAuthor(author); - assertGroup(filter); - } - - @Test - public void find_all() { - GroupService.Filter filter = new GroupService.Filter(); - assertGroup(filter); - } - - @Test - public void find_by_creator_fails() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setCreator(author); - assertTrue(groupService.findAll(filter).isEmpty()); - } - - @Test - public void find_by_creator() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setCreator(creator); - assertGroup(filter); - } - - @Test - public void find_by_reviewer_involvee() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setNonAuthorInvolvee(reviewer); - assertThat(groupService.findAll(filter), not(hasItem(group))); - } - - @Test - public void find_by_cosupervisor_involvee() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setNonAuthorInvolvee(cosupervisor); - assertGroup(filter); - } - - @Test - public void find_active_groups() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setActive(true); - assertGroup(filter); - - filter.setActive(false); - assertTrue(groupService.findAll(filter).isEmpty()); - } - - @Test - public void count() { - GroupService.Filter filter = new GroupService.Filter(); - filter.setAuthor(author); - assertEquals(1, groupService.count(filter)); - } - - @Test - public void find_groups_by_project() { - Group another = new Group(); - another.setTitle("hi"); - another.setUser(creator); - User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); - Project anotherProject = save(Project.builder().title("another").projectType(projectType).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); - another.setProjects(new HashSet<>(Collections.singletonList(anotherProject))); - save(another); - GroupService.Filter filter = new GroupService.Filter(); - filter.setProject(anotherProject); - assertEquals(another, groupService.findAll(filter).get(0)); - } - - private void assertGroup(GroupService.Filter filter) { - assertThat(groupService.findAll(filter), hasItem(group)); - } - - private void createGroup(Project project) { - group = new Group(); - group.setTitle("group title"); - group.setProjects(new HashSet<>(Collections.singletonList(project))); - group.setUser(creator); - save(group); - } - - private User saveUser(String firstName, String lastName, String emailAddress) { - return save(User.builder().firstName(firstName).lastName(lastName).emailAddress(emailAddress).build()); - } -} +package se.su.dsv.scipro.group; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import se.su.dsv.scipro.project.Project; +import se.su.dsv.scipro.system.DegreeType; +import se.su.dsv.scipro.system.ProjectType; +import se.su.dsv.scipro.system.User; +import se.su.dsv.scipro.test.IntegrationTest; + +import jakarta.inject.Inject; +import java.time.LocalDate; +import java.util.Collections; +import java.util.HashSet; + +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GroupServiceImplTest extends IntegrationTest { + + @Inject + private GroupServiceImpl groupService; + private User author; + private User creator; + private User reviewer; + private User cosupervisor; + private Group group; + private ProjectType projectType; + + @BeforeEach + public void setUp() throws Exception { + author = saveUser("author", "name", "author@example.com"); + creator = saveUser("supervisor", "sup", "supervisor@example.com"); + reviewer = saveUser("reviewer", "test", "reviewer@example.com"); + cosupervisor = saveUser("cosupervisor", "test", "reviewer@example.com"); + projectType = save(new ProjectType(DegreeType.BACHELOR, "b", "b")); + User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); + Project project = save(Project.builder().title("title").projectType(projectType).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); + project.addProjectParticipant(author); + project.addReviewer(reviewer); + project.addCoSupervisor(cosupervisor); + createGroup(project); + } + + @Test + public void find_by_author() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setAuthor(author); + assertGroup(filter); + } + + @Test + public void find_all() { + GroupService.Filter filter = new GroupService.Filter(); + assertGroup(filter); + } + + @Test + public void find_by_creator_fails() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setCreator(author); + assertTrue(groupService.findAll(filter).isEmpty()); + } + + @Test + public void find_by_creator() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setCreator(creator); + assertGroup(filter); + } + + @Test + public void find_by_reviewer_involvee() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setNonAuthorInvolvee(reviewer); + assertThat(groupService.findAll(filter), not(hasItem(group))); + } + + @Test + public void find_by_cosupervisor_involvee() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setNonAuthorInvolvee(cosupervisor); + assertGroup(filter); + } + + @Test + public void find_active_groups() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setActive(true); + assertGroup(filter); + + filter.setActive(false); + assertTrue(groupService.findAll(filter).isEmpty()); + } + + @Test + public void count() { + GroupService.Filter filter = new GroupService.Filter(); + filter.setAuthor(author); + assertEquals(1, groupService.count(filter)); + } + + @Test + public void find_groups_by_project() { + Group another = new Group(); + another.setTitle("hi"); + another.setUser(creator); + User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); + Project anotherProject = save(Project.builder().title("another").projectType(projectType).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); + another.setProjects(new HashSet<>(Collections.singletonList(anotherProject))); + save(another); + GroupService.Filter filter = new GroupService.Filter(); + filter.setProject(anotherProject); + assertEquals(another, groupService.findAll(filter).get(0)); + } + + private void assertGroup(GroupService.Filter filter) { + assertThat(groupService.findAll(filter), hasItem(group)); + } + + private void createGroup(Project project) { + group = new Group(); + group.setTitle("group title"); + group.setProjects(new HashSet<>(Collections.singletonList(project))); + group.setUser(creator); + save(group); + } + + private User saveUser(String firstName, String lastName, String emailAddress) { + return save(User.builder().firstName(firstName).lastName(lastName).emailAddress(emailAddress).build()); + } +} diff --git a/core/src/test/java/se/su/dsv/scipro/match/MatchModuleTest.java b/core/src/test/java/se/su/dsv/scipro/match/MatchModuleTest.java index 63417a754b..7a189d32f4 100644 --- a/core/src/test/java/se/su/dsv/scipro/match/MatchModuleTest.java +++ b/core/src/test/java/se/su/dsv/scipro/match/MatchModuleTest.java @@ -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(""); - } - }; - } } diff --git a/core/src/test/java/se/su/dsv/scipro/notifications/NotificationControllerImplTest.java b/core/src/test/java/se/su/dsv/scipro/notifications/NotificationControllerImplTest.java index 6453a0f537..6c770e1a9d 100755 --- a/core/src/test/java/se/su/dsv/scipro/notifications/NotificationControllerImplTest.java +++ b/core/src/test/java/se/su/dsv/scipro/notifications/NotificationControllerImplTest.java @@ -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); diff --git a/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSettingsRepositoryTest.java b/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSettingsRepositoryTest.java index a2eb62c871..8b113e1524 100644 --- a/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSettingsRepositoryTest.java +++ b/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSettingsRepositoryTest.java @@ -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(); diff --git a/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSubmissionRepositoryTest.java b/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSubmissionRepositoryTest.java index 0d2599f5fd..6120fe3468 100644 --- a/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSubmissionRepositoryTest.java +++ b/core/src/test/java/se/su/dsv/scipro/plagiarism/urkund/UrkundSubmissionRepositoryTest.java @@ -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() { diff --git a/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingModuleTest.java b/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingModuleTest.java index 8d59c17234..ba058fcce1 100644 --- a/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingModuleTest.java +++ b/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingModuleTest.java @@ -1,18 +1,6 @@ package se.su.dsv.scipro.reviewing; -import com.google.inject.AbstractModule; -import com.google.inject.Module; import se.su.dsv.scipro.test.IntegrationTest; public abstract class ReviewingModuleTest extends IntegrationTest { - @Override - protected Module moduleUnderTest() { - return new AbstractModule() { - @Override - protected void configure() { - install(ReviewingModuleTest.super.moduleUnderTest()); - bind(ReviewerAssignedDeadline.class).asEagerSingleton(); - } - }; - } } diff --git a/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingServiceImplTest.java b/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingServiceImplTest.java index 56398d9f29..dd4ad1a076 100644 --- a/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingServiceImplTest.java +++ b/core/src/test/java/se/su/dsv/scipro/reviewing/ReviewingServiceImplTest.java @@ -1,161 +1,161 @@ -package se.su.dsv.scipro.reviewing; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatchers; -import se.su.dsv.scipro.file.FileUpload; -import se.su.dsv.scipro.project.Project; -import se.su.dsv.scipro.system.DegreeType; -import se.su.dsv.scipro.system.Page; -import se.su.dsv.scipro.system.ProjectType; -import se.su.dsv.scipro.system.User; -import se.su.dsv.scipro.util.Either; - -import jakarta.inject.Inject; -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class ReviewingServiceImplTest extends ReviewingModuleTest { - private static final TestPage ALL = new TestPage(0, Long.MAX_VALUE); - - @Inject - private ReviewingServiceImpl reviewingService; - @Inject - private FinalSeminarApprovalServiceImpl finalSeminarApprovalService; - @Inject - private RoughDraftApprovalServiceImpl roughDraftApprovalService; - - private Project project; - private User reviewer; - private Project project3; - - @BeforeEach - public void setUp() throws Exception { - reviewer = save(User.builder().firstName("Ronny").lastName("Reviewer").emailAddress("reviewer@dsv.su.se").build()); - User reviewer2 = save(User.builder().firstName("Ronny").lastName("Reviewer").emailAddress("reviewer@dsv.su.se").build()); - User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); - ProjectType bachelor = save(new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor")); - project = save(Project.builder().title("My project").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); - project.addReviewer(reviewer); - Project project2 = save(Project.builder().title("My project 2").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); - project2.addReviewer(reviewer2); - project3 = save(Project.builder().title("My project 3").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); - project3.addReviewer(reviewer); - } - - @Test - public void count() { - finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); - assertEquals(1, reviewingService.countDecisions(getFilter(ReviewerApproval.Step.FINAL_SEMINAR_APPROVAL))); - } - - private MyReviewService.Filter getFilter(ReviewerApproval.Step step) { - MyReviewService.Filter filter = new MyReviewService.Filter(); - filter.setUser(reviewer); - filter.setStep(step); - return filter; - } - - @Test - public void find_undecided() { - finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); - assertThat(reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.FINAL_SEMINAR_APPROVAL), ALL), hasItem(where(Decision::getReviewerApproval, instanceOf(FinalSeminarApproval.class)))); - } - - @Test - public void find_undecided_rough_draft_approvals() { - roughDraftApprovalService.requestApproval(project, createFileUpload(), "test"); - assertThat(reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), ALL), hasItem(where(Decision::getReviewerApproval, instanceOf(RoughDraftApproval.class)))); - } - - @Test - public void count_undecided_rough_drafts() { - roughDraftApprovalService.requestApproval(project, createFileUpload(), "test"); - assertEquals(reviewingService.countUndecidedRoughDraft(reviewer), 1); - } - - @Test - public void back_and_forth() { - assertTrue(finalSeminarApprovalService.requiresUpload(project)); - Either<AlreadyRequested, FinalSeminarApproval> first = finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); - assertFalse(finalSeminarApprovalService.requiresUpload(project)); - - first.foreach(firstFinalSeminarApproval -> reviewingService.reject(firstFinalSeminarApproval, "Very bad", Optional.of(createFileUpload()))); - - assertTrue(finalSeminarApprovalService.requiresUpload(project)); - Either<AlreadyRequested, FinalSeminarApproval> second = finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); - assertFalse(finalSeminarApprovalService.requiresUpload(project)); - - second.foreach(secondFinalSeminarApproval -> reviewingService.approve(secondFinalSeminarApproval, "Very good", Optional.empty())); - assertFalse(finalSeminarApprovalService.requiresUpload(project)); - } - - @Test - public void only_fetches_my_reviews() { - Either<AlreadyRequested, RoughDraftApproval> myRequest = - roughDraftApprovalService.requestApproval(project, createFileUpload(), "my request"); - assertTrue(myRequest.isRight()); - - List<Decision> requests = reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), ALL); - assertEquals(1, requests.size()); - } - - @Test - public void sort_by_requested() { - Either<AlreadyRequested, RoughDraftApproval> request1 = - roughDraftApprovalService.requestApproval(project, createFileUpload(), "request 1"); - assertTrue(request1.isRight()); - - Either<AlreadyRequested, RoughDraftApproval> request2 = - roughDraftApprovalService.requestApproval(project3, createFileUpload(), "request 2"); - assertTrue(request2.isRight()); - - var sortByRequested = new Page.Sort<>(MyReviewService.Sort.TITLE, Page.Direction.DESCENDING); - TestPage page = new TestPage(0, Long.MAX_VALUE, sortByRequested); - List<Decision> requests = - reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), page); - - assertEquals(2, requests.size()); - assertEquals(request2.right(), requests.get(0).getReviewerApproval()); - assertEquals(request1.right(), requests.get(1).getReviewerApproval()); - } - - private FileUpload createFileUpload() { - FileUpload fileUpload = mock(FileUpload.class); - when(fileUpload.handleData(ArgumentMatchers.any())).thenReturn(null); - return fileUpload; - } - - record TestPage(long offset, long limit, Sort<MyReviewService.Sort> sort) implements Page<MyReviewService.Sort> { - TestPage(long offset, long limit) { - this(offset, limit, new Sort<>(MyReviewService.Sort.TITLE, Direction.ASCENDING)); - } - } - - private static <A, B> Matcher<A> where(Function<A, B> f, Matcher<? extends B> matcher) { - return new TypeSafeMatcher<>() { - @Override - protected boolean matchesSafely(A a) { - return matcher.matches(f.apply(a)); - } - - @Override - public void describeTo(Description description) { - description.appendText("an object where ") - .appendDescriptionOf(matcher); - } - }; - } -} +package se.su.dsv.scipro.reviewing; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import se.su.dsv.scipro.file.FileUpload; +import se.su.dsv.scipro.project.Project; +import se.su.dsv.scipro.system.DegreeType; +import se.su.dsv.scipro.system.Page; +import se.su.dsv.scipro.system.ProjectType; +import se.su.dsv.scipro.system.User; +import se.su.dsv.scipro.util.Either; + +import jakarta.inject.Inject; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ReviewingServiceImplTest extends ReviewingModuleTest { + private static final TestPage ALL = new TestPage(0, Long.MAX_VALUE); + + @Inject + private ReviewingServiceImpl reviewingService; + @Inject + private FinalSeminarApprovalServiceImpl finalSeminarApprovalService; + @Inject + private RoughDraftApprovalServiceImpl roughDraftApprovalService; + + private Project project; + private User reviewer; + private Project project3; + + @BeforeEach + public void setUp() throws Exception { + reviewer = save(User.builder().firstName("Ronny").lastName("Reviewer").emailAddress("reviewer@dsv.su.se").build()); + User reviewer2 = save(User.builder().firstName("Ronny").lastName("Reviewer").emailAddress("reviewer@dsv.su.se").build()); + User headSupervisor = save(User.builder().firstName("John").lastName("Doe").emailAddress("john@example.com").build()); + ProjectType bachelor = save(new ProjectType(DegreeType.BACHELOR, "Bachelor", "Bachelor")); + project = save(Project.builder().title("My project").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); + project.addReviewer(reviewer); + Project project2 = save(Project.builder().title("My project 2").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); + project2.addReviewer(reviewer2); + project3 = save(Project.builder().title("My project 3").projectType(bachelor).startDate(LocalDate.now()).headSupervisor(headSupervisor).build()); + project3.addReviewer(reviewer); + } + + @Test + public void count() { + finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); + assertEquals(1, reviewingService.countDecisions(getFilter(ReviewerApproval.Step.FINAL_SEMINAR_APPROVAL))); + } + + private MyReviewService.Filter getFilter(ReviewerApproval.Step step) { + MyReviewService.Filter filter = new MyReviewService.Filter(); + filter.setUser(reviewer); + filter.setStep(step); + return filter; + } + + @Test + public void find_undecided() { + finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); + assertThat(reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.FINAL_SEMINAR_APPROVAL), ALL), hasItem(where(Decision::getReviewerApproval, instanceOf(FinalSeminarApproval.class)))); + } + + @Test + public void find_undecided_rough_draft_approvals() { + roughDraftApprovalService.requestApproval(project, createFileUpload(), "test"); + assertThat(reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), ALL), hasItem(where(Decision::getReviewerApproval, instanceOf(RoughDraftApproval.class)))); + } + + @Test + public void count_undecided_rough_drafts() { + roughDraftApprovalService.requestApproval(project, createFileUpload(), "test"); + assertEquals(reviewingService.countUndecidedRoughDraft(reviewer), 1); + } + + @Test + public void back_and_forth() { + assertTrue(finalSeminarApprovalService.requiresUpload(project)); + Either<AlreadyRequested, FinalSeminarApproval> first = finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); + assertFalse(finalSeminarApprovalService.requiresUpload(project)); + + first.foreach(firstFinalSeminarApproval -> reviewingService.reject(firstFinalSeminarApproval, "Very bad", Optional.of(createFileUpload()))); + + assertTrue(finalSeminarApprovalService.requiresUpload(project)); + Either<AlreadyRequested, FinalSeminarApproval> second = finalSeminarApprovalService.requestApproval(project, createFileUpload(), "test"); + assertFalse(finalSeminarApprovalService.requiresUpload(project)); + + second.foreach(secondFinalSeminarApproval -> reviewingService.approve(secondFinalSeminarApproval, "Very good", Optional.empty())); + assertFalse(finalSeminarApprovalService.requiresUpload(project)); + } + + @Test + public void only_fetches_my_reviews() { + Either<AlreadyRequested, RoughDraftApproval> myRequest = + roughDraftApprovalService.requestApproval(project, createFileUpload(), "my request"); + assertTrue(myRequest.isRight()); + + List<Decision> requests = reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), ALL); + assertEquals(1, requests.size()); + } + + @Test + public void sort_by_requested() { + Either<AlreadyRequested, RoughDraftApproval> request1 = + roughDraftApprovalService.requestApproval(project, createFileUpload(), "request 1"); + assertTrue(request1.isRight()); + + Either<AlreadyRequested, RoughDraftApproval> request2 = + roughDraftApprovalService.requestApproval(project3, createFileUpload(), "request 2"); + assertTrue(request2.isRight()); + + var sortByRequested = new Page.Sort<>(MyReviewService.Sort.TITLE, Page.Direction.DESCENDING); + TestPage page = new TestPage(0, Long.MAX_VALUE, sortByRequested); + List<Decision> requests = + reviewingService.findAllDecisions(getFilter(ReviewerApproval.Step.ROUGH_DRAFT_APPROVAL), page); + + assertEquals(2, requests.size()); + assertEquals(request2.right(), requests.get(0).getReviewerApproval()); + assertEquals(request1.right(), requests.get(1).getReviewerApproval()); + } + + private FileUpload createFileUpload() { + FileUpload fileUpload = mock(FileUpload.class); + when(fileUpload.handleData(ArgumentMatchers.any())).thenReturn(null); + return fileUpload; + } + + record TestPage(long offset, long limit, Sort<MyReviewService.Sort> sort) implements Page<MyReviewService.Sort> { + TestPage(long offset, long limit) { + this(offset, limit, new Sort<>(MyReviewService.Sort.TITLE, Direction.ASCENDING)); + } + } + + private static <A, B> Matcher<A> where(Function<A, B> f, Matcher<? extends B> matcher) { + return new TypeSafeMatcher<>() { + @Override + protected boolean matchesSafely(A a) { + return matcher.matches(f.apply(a)); + } + + @Override + public void describeTo(Description description) { + description.appendText("an object where ") + .appendDescriptionOf(matcher); + } + }; + } +} diff --git a/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java b/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java deleted file mode 100644 index 6d2667ef5c..0000000000 --- a/core/src/test/java/se/su/dsv/scipro/test/GuiceTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package se.su.dsv.scipro.test; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Module; -import com.google.inject.persist.PersistService; -import com.google.inject.persist.UnitOfWork; -import com.google.inject.persist.jpa.JpaPersistModule; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; - -import jakarta.inject.Inject; -import jakarta.inject.Provider; -import java.time.Clock; - -public abstract class GuiceTest { - @Inject - private UnitOfWork unitOfWork; - @Inject - private PersistService persistService; - @Inject - private Provider<EntityManager> entityManager; - - @BeforeEach - public final void prepareGuice() { - Injector injector = Guice.createInjector( - new JpaPersistModule("testPersistenceUnit"), - new AbstractModule() { - @Override - protected void configure() { - final MutableFixedClock clock = new MutableFixedClock(Clock.systemDefaultZone()); - bind(Clock.class).toInstance(clock); - bind(MutableFixedClock.class).toInstance(clock); - } - }, - moduleUnderTest()); - - // Have to start the PersistService and UnitOfWork manually since they are no longer - // automatically started as an EntityManager is injected - injector.getInstance(PersistService.class).start(); - injector.getInstance(UnitOfWork.class).begin(); - - injector.injectMembers(this); - - persistService.start(); - EntityTransaction transaction = entityManager.get().getTransaction(); - transaction.begin(); - transaction.setRollbackOnly(); - } - - protected abstract Module moduleUnderTest(); - - @AfterEach - public final void shutDownPersistence() { - entityManager.get().getTransaction().rollback(); - unitOfWork.end(); - persistService.stop(); - } - - protected <T> T save(T entity) { - EntityManager em = entityManager.get(); - if (em.contains(entity)) { - return em.merge(entity); - } - else { - em.persist(entity); - return entity; - } - } -} diff --git a/core/src/test/java/se/su/dsv/scipro/test/IntegrationTest.java b/core/src/test/java/se/su/dsv/scipro/test/IntegrationTest.java index 4833f0e4bd..837f58dc90 100644 --- a/core/src/test/java/se/su/dsv/scipro/test/IntegrationTest.java +++ b/core/src/test/java/se/su/dsv/scipro/test/IntegrationTest.java @@ -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; - } - } } diff --git a/core/src/test/java/se/su/dsv/scipro/test/SpringTest.java b/core/src/test/java/se/su/dsv/scipro/test/SpringTest.java new file mode 100644 index 0000000000..eae4492265 --- /dev/null +++ b/core/src/test/java/se/su/dsv/scipro/test/SpringTest.java @@ -0,0 +1,92 @@ +package se.su.dsv.scipro.test; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.Persistence; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import se.su.dsv.scipro.profiles.CurrentProfile; +import se.su.dsv.scipro.sukat.Sukat; +import se.su.dsv.scipro.system.CurrentUser; +import se.su.dsv.scipro.CoreConfig; +import se.su.dsv.scipro.RepositoryConfiguration; + +import java.time.Clock; +import java.util.Optional; + +public abstract class SpringTest { + private EntityManager entityManager; + private EntityManagerFactory entityManagerFactory; + + @BeforeEach + public final void prepareSpring() { + entityManagerFactory = Persistence.createEntityManagerFactory("testPersistenceUnit"); + this.entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction transaction = entityManager.getTransaction(); + transaction.begin(); + transaction.setRollbackOnly(); + + AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(); + annotationConfigApplicationContext.register(TestContext.class); + annotationConfigApplicationContext.getBeanFactory() + .registerSingleton("entityManager", this.entityManager); + annotationConfigApplicationContext.refresh(); + annotationConfigApplicationContext.getAutowireCapableBeanFactory() + .autowireBean(this); + } + + @AfterEach + public final void shutDownPersistence() { + entityManager.getTransaction().rollback(); + entityManager.close(); + entityManagerFactory.close(); + } + + protected <T> T save(T entity) { + EntityManager em = entityManager; + if (em.contains(entity)) { + return em.merge(entity); + } + else { + em.persist(entity); + return entity; + } + } + + @Configuration(proxyBeanMethods = false) + @Import({CoreConfig.class, RepositoryConfiguration.class}) + public static class TestContext { + @Bean + public InMemoryFileStore inMemoryFileStore() { + return new InMemoryFileStore(); + } + + @Bean + public MutableFixedClock clock() { + return new MutableFixedClock(Clock.systemDefaultZone()); + } + + @Bean + public Sukat sukat() { + return (username) -> Optional.empty(); + } + + @Bean + public CurrentUser currentUser() { + return () -> null; + } + + @Bean + public CurrentProfile currentProfile() { + CurrentProfile currentProfile = new CurrentProfile(); + currentProfile.setCurrentProfileString("DEV"); + return currentProfile; + } + } +} diff --git a/daisy-integration/pom.xml b/daisy-integration/pom.xml index 891a45a81e..3d94bb165c 100644 --- a/daisy-integration/pom.xml +++ b/daisy-integration/pom.xml @@ -17,8 +17,8 @@ <artifactId>core</artifactId> </dependency> <dependency> - <groupId>com.google.inject.extensions</groupId> - <artifactId>guice-servlet</artifactId> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>jakarta.servlet</groupId> diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImpl.java b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImpl.java index 3d4acbe581..3f78ffd415 100755 --- a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImpl.java +++ b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.daisyExternal.impl; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.su.dsv.scipro.system.PageRequest; diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImpl.java b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImpl.java index 0fe1dd6e51..9e6ea05554 100644 --- a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImpl.java +++ b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImpl.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.daisyExternal.impl; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import jakarta.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyIntegrationConfiguration.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyIntegrationConfiguration.java new file mode 100644 index 0000000000..1a50b0c056 --- /dev/null +++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyIntegrationConfiguration.java @@ -0,0 +1,182 @@ +package se.su.dsv.scipro.integration.daisy; + +import com.google.common.eventbus.EventBus; +import jakarta.inject.Provider; +import jakarta.persistence.EntityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import se.su.dsv.scipro.daisyExternal.ExternalImporter; +import se.su.dsv.scipro.daisyExternal.ImporterTransactions; +import se.su.dsv.scipro.daisyExternal.http.DaisyAPI; +import se.su.dsv.scipro.daisyExternal.impl.ExternalImporterDaisyImpl; +import se.su.dsv.scipro.daisyExternal.impl.ImporterTransactionsImpl; +import se.su.dsv.scipro.finalseminar.FinalSeminarService; +import se.su.dsv.scipro.finalthesis.FinalThesisService; +import se.su.dsv.scipro.forum.ProjectForumService; +import se.su.dsv.scipro.grading.NationalSubjectCategoryService; +import se.su.dsv.scipro.grading.ThesisApprovedHistoryService; +import se.su.dsv.scipro.grading.ThesisRejectionHistoryService; +import se.su.dsv.scipro.integration.daisy.workers.GradingCompletedMilestoneActivator; +import se.su.dsv.scipro.integration.daisy.workers.ImportNationalCategories; +import se.su.dsv.scipro.integration.daisy.workers.ProjectExporter; +import se.su.dsv.scipro.integration.daisy.workers.ProjectFinalizer; +import se.su.dsv.scipro.integration.daisy.workers.RejectedThesisWorker; +import se.su.dsv.scipro.integration.daisy.workers.UserImportWorker; +import se.su.dsv.scipro.io.ExternalExporter; +import se.su.dsv.scipro.io.facade.ExporterFacade; +import se.su.dsv.scipro.io.impl.ExternalExporterDaisyImpl; +import se.su.dsv.scipro.match.ProgramService; +import se.su.dsv.scipro.project.ProjectRepo; +import se.su.dsv.scipro.project.ProjectService; +import se.su.dsv.scipro.report.GradingReportService; +import se.su.dsv.scipro.springdata.services.UnitService; +import se.su.dsv.scipro.system.MergeService; +import se.su.dsv.scipro.system.MergeServiceImpl; +import se.su.dsv.scipro.system.ResearchAreaService; +import se.su.dsv.scipro.system.UserNameService; +import se.su.dsv.scipro.system.UserService; +import se.su.dsv.scipro.war.PluginConfiguration; +import se.su.dsv.scipro.workerthreads.Scheduler; + +@Configuration +public class DaisyIntegrationConfiguration implements PluginConfiguration { + @Bean + public Daisy daisy(ExporterFacade exporterFacade, ExternalExporter externalExporter) { + return new Daisy(exporterFacade, externalExporter); + } + + @Bean + public ExporterFacade exporterFacade(ExternalExporter externalExporter) { + return new ExporterFacade(externalExporter); + } + + @Bean + public ExternalExporterDaisyImpl externalExporter(DaisyAPI daisyApi) { + return new ExternalExporterDaisyImpl(daisyApi); + } + + @Bean + public DaisyWorkerInitialization daisyWorkerInitialization( + Scheduler scheduler, + Provider<ProjectExporter> projectExporter, + Provider<UserImportWorker> userImportWorker, + Provider<ProjectFinalizer> projectFinalizer, + Provider<RejectedThesisWorker> rejectedThesisWorkerProvider, + Provider<GradingCompletedMilestoneActivator> gradingFinalizer, + Provider<ImportNationalCategories> importNationalCategories) + { + return new DaisyWorkerInitialization(scheduler, projectExporter, userImportWorker, projectFinalizer, + rejectedThesisWorkerProvider, gradingFinalizer, importNationalCategories); + } + + @Bean + public ProjectExporter projectExporter( + ExporterFacade exporterFacade, + ProjectRepo projectRepo, + DaisyAPI daisyApi, + ExternalExporter externalExporter, + FinalSeminarService finalSeminarService, + FinalThesisService finalThesisService) + { + return new ProjectExporter(projectRepo, exporterFacade, daisyApi, externalExporter, finalSeminarService, + finalThesisService); + } + + @Bean + public UserImportWorker userImportWorker( + DaisyAPI daisyApi, + ImporterTransactions importerTransactions, + ExternalImporter externalImporter, + MergeService mergeService, + UserService userService, + ProgramService programService, + Provider<EntityManager> entityManager, + ResearchAreaService researchAreaService) + { + return new UserImportWorker(daisyApi, importerTransactions, externalImporter, mergeService, userService, + programService, entityManager, researchAreaService); + } + + @Bean + public ProjectFinalizer projectFinalizer( + ProjectService projectService, + DaisyAPI daisyApi, + ThesisApprovedHistoryService thesisApprovedHistoryService) + { + return new ProjectFinalizer(projectService, daisyApi, thesisApprovedHistoryService); + } + + @Bean + public RejectedThesisWorker rejectedThesisWorker( + GradingReportService gradingReportService, + ProjectService projectService, + FinalThesisService finalThesisService, + ProjectForumService projectForumService, + ThesisRejectionHistoryService thesisRejectionHistoryService, + DaisyAPI daisyApi) + { + return new RejectedThesisWorker(gradingReportService, projectService, finalThesisService, projectForumService, + thesisRejectionHistoryService, daisyApi); + } + + @Bean + public GradingCompletedMilestoneActivator gradingFinalizer( + ProjectService projectService, + DaisyAPI daisyApi, + EventBus eventBus, + UserService userService) + { + return new GradingCompletedMilestoneActivator(projectService, daisyApi, eventBus, userService); + } + + @Bean + public ImportNationalCategories importNationalCategories( + DaisyAPI daisyApi, + NationalSubjectCategoryService nationalSubjectCategoryService) + { + return new ImportNationalCategories(daisyApi, nationalSubjectCategoryService); + } + + @Bean + public ImporterTransactionsImpl importerTransactions( + UserService userService, + ResearchAreaService researchAreaService, + ProjectService projectService, + UserNameService userNameService, + DaisyAPI daisyApi, + ProgramService programService) + { + return new ImporterTransactionsImpl(userService, researchAreaService, projectService, userNameService, + daisyApi, programService); + } + + @Bean + public ExternalImporterDaisyImpl externalImporter( + DaisyAPI daisyApi, + ImporterTransactions importerTransactions, + UserService userService, + UnitService unitService) + { + return new ExternalImporterDaisyImpl(userService, unitService, daisyApi, importerTransactions); + } + + @Bean + public MergeServiceImpl mergeService(UserService userService, UserNameService userNameService) { + return new MergeServiceImpl(userNameService, userService); + } + + @Bean + SyncReviewerWithDaisy syncReviewerWithDaisy(DaisyAPI daisyApi, EventBus eventBus) { + return new SyncReviewerWithDaisy(daisyApi, eventBus); + } + + @Bean + public DaisyUserSearchService daisyUserSearchService(DaisyAPI daisyApi, UserService userService) { + return new DaisyUserSearchService(daisyApi, userService); + } + + @Bean + DaisyConsentService daisyConsentService(DaisyAPI daisyApi) { + return new DaisyConsentService(daisyApi); + } +} diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyModule.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyModule.java deleted file mode 100644 index ffedb6c3c1..0000000000 --- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyModule.java +++ /dev/null @@ -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); - } - -} diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/io/facade/ExporterFacade.java b/daisy-integration/src/main/java/se/su/dsv/scipro/io/facade/ExporterFacade.java index 4d7c11803d..75400ab642 100755 --- a/daisy-integration/src/main/java/se/su/dsv/scipro/io/facade/ExporterFacade.java +++ b/daisy-integration/src/main/java/se/su/dsv/scipro/io/facade/ExporterFacade.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.io.facade; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import se.su.dsv.scipro.io.ExternalExporter; import se.su.dsv.scipro.io.dto.Role; import se.su.dsv.scipro.io.exceptions.ExternalExportException; diff --git a/daisy-integration/src/main/resources/META-INF/services/com.google.inject.Module b/daisy-integration/src/main/resources/META-INF/services/com.google.inject.Module deleted file mode 100644 index f216e38b02..0000000000 --- a/daisy-integration/src/main/resources/META-INF/services/com.google.inject.Module +++ /dev/null @@ -1 +0,0 @@ -se.su.dsv.scipro.integration.daisy.DaisyModule diff --git a/daisy-integration/src/main/resources/META-INF/services/se.su.dsv.scipro.war.PluginConfiguration b/daisy-integration/src/main/resources/META-INF/services/se.su.dsv.scipro.war.PluginConfiguration new file mode 100644 index 0000000000..39148f50a9 --- /dev/null +++ b/daisy-integration/src/main/resources/META-INF/services/se.su.dsv.scipro.war.PluginConfiguration @@ -0,0 +1 @@ +se.su.dsv.scipro.integration.daisy.DaisyIntegrationConfiguration diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivatorTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivatorTest.java index b583b29e21..f51c23592a 100644 --- a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivatorTest.java +++ b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivatorTest.java @@ -1,10 +1,6 @@ package se.su.dsv.scipro.integration.daisy.workers; import com.google.common.eventbus.EventBus; -import com.google.inject.persist.UnitOfWork; -import com.google.inject.util.Providers; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -23,6 +19,7 @@ import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.system.UserService; import se.su.dsv.scipro.workerthreads.WorkerData; import se.su.dsv.scipro.workerthreads.WorkerDataService; +import se.su.dsv.scipro.workerthreads.WorkerTransactionManager; import java.util.*; @@ -47,22 +44,16 @@ public class GradingCompletedMilestoneActivatorTest { @Mock private EventBus eventBus; @Mock - private UnitOfWork unitOfWork; - @Mock - private EntityManager entityManager; - @Mock - private EntityTransaction entityTransaction; + private WorkerTransactionManager workerTransactionManager; @Mock private WorkerDataService workerDataService; @BeforeEach public void setup() { gradingCompletedMilestoneActivator = new GradingCompletedMilestoneActivator(projectService, daisyAPI, eventBus, userService); - gradingCompletedMilestoneActivator.setUnitOfWork(unitOfWork); - gradingCompletedMilestoneActivator.setTxManager(Providers.of(entityManager)); + gradingCompletedMilestoneActivator.setTxManager(workerTransactionManager); gradingCompletedMilestoneActivator.setWorkerDataService(workerDataService); when(workerDataService.save(any(WorkerData.class))).thenReturn(new WorkerData()); - when(entityManager.getTransaction()).thenReturn(entityTransaction); project.setId(3493L); project.setIdentifier(234); diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporterTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporterTest.java index f4165842bb..dfd523ad4f 100644 --- a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporterTest.java +++ b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporterTest.java @@ -1,10 +1,6 @@ package se.su.dsv.scipro.integration.daisy.workers; -import com.google.inject.persist.UnitOfWork; -import com.google.inject.util.Providers; import com.querydsl.core.types.Predicate; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,6 +22,7 @@ import se.su.dsv.scipro.system.Unit; import se.su.dsv.scipro.system.User; import se.su.dsv.scipro.workerthreads.WorkerData; import se.su.dsv.scipro.workerthreads.WorkerDataService; +import se.su.dsv.scipro.workerthreads.WorkerTransactionManager; import java.time.LocalDate; import java.util.*; @@ -45,10 +42,8 @@ public class ProjectExporterTest { private @Mock ExporterFacade exporterFacade; private @Mock DaisyAPI daisyAPI; private @Mock ExternalExporter externalExporter; - private @Mock EntityManager entityManager; - private @Mock EntityTransaction entityTransaction; + private @Mock WorkerTransactionManager workerTransactionManager; private @Mock WorkerDataService workerDataService; - private @Mock UnitOfWork unitOfWork; private @Mock FinalSeminarService finalSeminarService; private @Mock FinalThesisService finalThesisService; @@ -61,11 +56,9 @@ public class ProjectExporterTest { @BeforeEach public void setUp() { projectExporter = new ProjectExporter(projectRepo, exporterFacade, daisyAPI, externalExporter, finalSeminarService, finalThesisService); - projectExporter.setTxManager(Providers.of(entityManager)); + projectExporter.setTxManager(workerTransactionManager); projectExporter.setWorkerDataService(workerDataService); - projectExporter.setUnitOfWork(unitOfWork); when(workerDataService.save(any(WorkerData.class))).thenReturn(new WorkerData()); - when(entityManager.getTransaction()).thenReturn(entityTransaction); Unit unit = new Unit(); unit.setIdentifier(239478); diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizerTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizerTest.java index 576409136a..048d2165e7 100644 --- a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizerTest.java +++ b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizerTest.java @@ -1,7 +1,5 @@ package se.su.dsv.scipro.integration.daisy.workers; -import com.google.inject.persist.UnitOfWork; -import com.google.inject.util.Providers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,8 +16,8 @@ import se.su.dsv.scipro.project.QProject; import se.su.dsv.scipro.workerthreads.WorkerData; import se.su.dsv.scipro.workerthreads.WorkerDataService; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; +import se.su.dsv.scipro.workerthreads.WorkerTransactionManager; + import java.util.Collections; import java.util.List; import java.util.Optional; @@ -38,9 +36,7 @@ public class ProjectFinalizerTest { private @Mock DaisyAPI daisyAPI; private @Mock ProjectService projectService; - private @Mock UnitOfWork unitOfWork; - private @Mock EntityManager entityManager; - private @Mock EntityTransaction entityTransaction; + private @Mock WorkerTransactionManager workerTransactionManager; private @Mock WorkerDataService workerDataService; private @Mock ThesisApprovedHistoryService thesisApprovedHistoryService; @@ -48,11 +44,9 @@ public class ProjectFinalizerTest { @BeforeEach public void setup() { projectFinalizer = new ProjectFinalizer(projectService, daisyAPI, thesisApprovedHistoryService); - projectFinalizer.setUnitOfWork(unitOfWork); - projectFinalizer.setTxManager(Providers.of(entityManager)); + projectFinalizer.setTxManager(workerTransactionManager); projectFinalizer.setWorkerDataService(workerDataService); when(workerDataService.save(any(WorkerData.class))).thenReturn(new WorkerData()); - when(entityManager.getTransaction()).thenReturn(entityTransaction); project.setId(3493L); project.setIdentifier(234); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..637455a39e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + oauth2: + container_name: scipro-dev-oauth2 + build: + context: https://github.com/dsv-su/toker.git + dockerfile: embedded.Dockerfile + restart: on-failure + ports: + - '59733:8080' + environment: + - CLIENT_ID=get-token + - CLIENT_SECRET=get-token-secret + - CLIENT_REDIRECT_URI=http://localhost:59732/ + - RESOURCE_SERVER_ID=scipro-api-client + - RESOURCE_SERVER_SECRET=scipro-api-secret diff --git a/pom.xml b/pom.xml index d222069a72..c96cb4a122 100755 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,8 @@ <module>core</module> <module>view</module> <module>daisy-integration</module> + <module>war</module> + <module>api</module> </modules> <properties> @@ -36,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> @@ -88,9 +89,22 @@ </dependency> <dependency> <groupId>org.apache.wicket</groupId> - <artifactId>wicket-guice</artifactId> + <artifactId>wicket-ioc</artifactId> <version>${wicket.version}</version> </dependency> + <dependency> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-spring</artifactId> + <version>${wicket.version}</version> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>3.2.5</version> + <scope>import</scope> + <type>pom</type> + </dependency> <!-- Servlet API, needed for compilation. --> <dependency> @@ -189,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> @@ -260,6 +267,11 @@ <artifactId>flyway-mysql</artifactId> <version>${flyway.version}</version> </dependency> + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> + <version>2.5.0</version> + </dependency> </dependencies> </dependencyManagement> diff --git a/view/pom.xml b/view/pom.xml index c359d76206..9cdd26f28b 100644 --- a/view/pom.xml +++ b/view/pom.xml @@ -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> @@ -55,6 +46,11 @@ <artifactId>wicket-tester</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-spring</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.wicketstuff</groupId> <artifactId>wicketstuff-jasperreports</artifactId> @@ -144,6 +140,15 @@ </dependencies> <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <configuration> + <attachClasses>true</attachClasses> + </configuration> + </plugin> + </plugins> <resources> <resource> <filtering>true</filtering> diff --git a/view/src/main/java/ApplicationBootstrap.java b/view/src/main/java/ApplicationBootstrap.java deleted file mode 100644 index d5631e6f1c..0000000000 --- a/view/src/main/java/ApplicationBootstrap.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Module; -import com.google.inject.name.Names; -import com.google.inject.persist.PersistFilter; -import com.google.inject.servlet.GuiceServletContextListener; -import com.google.inject.servlet.ServletModule; -import org.apache.wicket.guice.GuiceWebApplicationFactory; -import org.apache.wicket.protocol.http.WicketFilter; - -import jakarta.servlet.ServletContext; -import java.net.CookieHandler; -import java.net.CookieManager; -import java.time.Clock; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.ServiceLoader; - -public class ApplicationBootstrap extends GuiceServletContextListener { - @Override - protected Injector getInjector() { - // preserve cookies when using Jersey which will use the logged in session cookie from - // Daisy API thus drastically speeding up the batch jobs - CookieHandler.setDefault(new CookieManager()); - return Guice.createInjector( - new ServletModule() { - @Override - protected void configureServlets() { - final ServletContext servletContext = getServletContext(); - final Enumeration<String> initParameterNames = servletContext.getInitParameterNames(); - while (initParameterNames.hasMoreElements()) { - final String parameterName = initParameterNames.nextElement(); - final String value = servletContext.getInitParameter(parameterName); - bindConstant().annotatedWith(Names.named(parameterName)).to(value); - } - } - }, - new ServletModule() { - @Override - protected void configureServlets() { - filter("/*").through(PersistFilter.class); - } - }, - new AbstractModule() { - @Override - protected void configure() { - bind(Clock.class).toInstance(Clock.systemDefaultZone()); - ServiceLoader<Module> modules = ServiceLoader.load(Module.class); - for (Module module : modules) { - install(module); - } - } - }, - new ServletModule() { - @Override - protected void configureServlets() { - Map<String,String> params = new HashMap<>(); - params.put(WicketFilter.FILTER_MAPPING_PARAM, "/*"); - params.put(WicketFilter.APP_FACT_PARAM, GuiceWebApplicationFactory.class.getName()); - params.put("injectorContextAttribute", Injector.class.getName()); - filter("/*").through(new WicketFilter(), params); - } - } - ); - } -} diff --git a/view/src/main/java/DatabaseMigration.java b/view/src/main/java/DatabaseMigration.java deleted file mode 100644 index 442e3003e4..0000000000 --- a/view/src/main/java/DatabaseMigration.java +++ /dev/null @@ -1,35 +0,0 @@ -import org.flywaydb.core.Flyway; - -import javax.naming.InitialContext; -import javax.naming.NamingException; -import jakarta.servlet.ServletContextEvent; -import jakarta.servlet.ServletContextListener; -import javax.sql.DataSource; - -public class DatabaseMigration implements ServletContextListener { - @Override - public void contextInitialized(ServletContextEvent sce) { - migrateDatabase(); - } - - private void migrateDatabase() { - Flyway flyway = Flyway.configure() - .dataSource(getDataSource()) - .baselineOnMigrate(true) - .table("schema_version") - .load(); - flyway.migrate(); - } - - private DataSource getDataSource() { - try { - return InitialContext.doLookup("java:comp/env/jdbc/sciproDS"); - } catch (NamingException e) { - throw new RuntimeException(e); - } - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - } -} diff --git a/view/src/main/java/se/su/dsv/scipro/FileSystemStore.java b/view/src/main/java/se/su/dsv/scipro/FileSystemStore.java index 7e80019776..3d0eafc255 100644 --- a/view/src/main/java/se/su/dsv/scipro/FileSystemStore.java +++ b/view/src/main/java/se/su/dsv/scipro/FileSystemStore.java @@ -12,7 +12,7 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; -class FileSystemStore implements FileStore { +public class FileSystemStore implements FileStore { private static final int FILES_PER_SUBDIRECTORY = 1000; private static final String FILE_ROOT = "/scipro-files"; diff --git a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java index ebbc21afa8..521595f7c3 100755 --- a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java +++ b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java @@ -53,7 +53,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; @@ -347,7 +346,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); diff --git a/view/src/main/java/se/su/dsv/scipro/SciProModule.java b/view/src/main/java/se/su/dsv/scipro/SciProModule.java deleted file mode 100644 index 26e7f0a6ba..0000000000 --- a/view/src/main/java/se/su/dsv/scipro/SciProModule.java +++ /dev/null @@ -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); - } -} diff --git a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminCreateProjectConfirmationPage.java b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminCreateProjectConfirmationPage.java index 5b1e8d22fe..0b3b45f8ae 100644 --- a/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminCreateProjectConfirmationPage.java +++ b/view/src/main/java/se/su/dsv/scipro/admin/pages/AdminCreateProjectConfirmationPage.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.admin.pages; -import com.google.inject.Inject; +import jakarta.inject.Inject; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.Link; diff --git a/view/src/main/java/se/su/dsv/scipro/admin/panels/AdminEditFooterAddressPanel.java b/view/src/main/java/se/su/dsv/scipro/admin/panels/AdminEditFooterAddressPanel.java index 48e268a040..eb36d66e9e 100644 --- a/view/src/main/java/se/su/dsv/scipro/admin/panels/AdminEditFooterAddressPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/admin/panels/AdminEditFooterAddressPanel.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.admin.panels; -import com.google.inject.persist.Transactional; +import jakarta.transaction.Transactional; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.panel.Panel; diff --git a/view/src/main/java/se/su/dsv/scipro/crosscutting/CrosscuttingModule.java b/view/src/main/java/se/su/dsv/scipro/crosscutting/CrosscuttingModule.java deleted file mode 100644 index fc50e7ff37..0000000000 --- a/view/src/main/java/se/su/dsv/scipro/crosscutting/CrosscuttingModule.java +++ /dev/null @@ -1,17 +0,0 @@ -package se.su.dsv.scipro.crosscutting; - -import com.google.common.eventbus.EventBus; -import com.google.inject.AbstractModule; -import se.su.dsv.scipro.reviewing.ReviewerAssignedDeadline; - -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(); - } -} diff --git a/view/src/main/java/se/su/dsv/scipro/match/SupervisorIdeaDetailsPage.java b/view/src/main/java/se/su/dsv/scipro/match/SupervisorIdeaDetailsPage.java index da362486f4..51f921ae60 100644 --- a/view/src/main/java/se/su/dsv/scipro/match/SupervisorIdeaDetailsPage.java +++ b/view/src/main/java/se/su/dsv/scipro/match/SupervisorIdeaDetailsPage.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.match; -import com.google.inject.Inject; +import jakarta.inject.Inject; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyIdeas; diff --git a/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewFilterDetailsPanel.java b/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewFilterDetailsPanel.java index 5cca6a2310..144dd24f30 100644 --- a/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewFilterDetailsPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewFilterDetailsPanel.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.peer; -import com.google.inject.Inject; +import jakarta.inject.Inject; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; diff --git a/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewStatusStatisticsPanel.java b/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewStatusStatisticsPanel.java index 18381874c6..2193555a56 100644 --- a/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewStatusStatisticsPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/peer/PeerReviewStatusStatisticsPanel.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.peer; -import com.google.inject.Inject; +import jakarta.inject.Inject; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; diff --git a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorApprovalPanel.java b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorApprovalPanel.java index 3a39a1088c..32920d25d7 100644 --- a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorApprovalPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorApprovalPanel.java @@ -1,6 +1,6 @@ package se.su.dsv.scipro.supervisor.panels; -import com.google.inject.Inject; +import jakarta.inject.Inject; import org.apache.wicket.feedback.FencedFeedbackPanel; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnEventHeaderItem; diff --git a/view/src/main/resources/META-INF/services/com.google.inject.Module b/view/src/main/resources/META-INF/services/com.google.inject.Module deleted file mode 100644 index c0c493be41..0000000000 --- a/view/src/main/resources/META-INF/services/com.google.inject.Module +++ /dev/null @@ -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 diff --git a/view/src/main/webapp/WEB-INF/web.xml b/view/src/main/webapp/WEB-INF/web.xml deleted file mode 100755 index bf2a938984..0000000000 --- a/view/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" - version="4.0" metadata-complete="true"> - - <display-name>SciPro</display-name> - - <filter> - <filter-name>guiceFilter</filter-name> - <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> - </filter> - <filter-mapping> - <filter-name>guiceFilter</filter-name> - <url-pattern>/*</url-pattern> - </filter-mapping> - - <listener> - <listener-class>ApplicationBootstrap</listener-class> - </listener> - - <listener> - <listener-class>DatabaseMigration</listener-class> - </listener> - - <session-config> - <session-timeout>480</session-timeout> - </session-config> -</web-app> diff --git a/view/src/test/java/se/su/dsv/scipro/SciProTest.java b/view/src/test/java/se/su/dsv/scipro/SciProTest.java index ee39fc8b41..e712c36790 100755 --- a/view/src/test/java/se/su/dsv/scipro/SciProTest.java +++ b/view/src/test/java/se/su/dsv/scipro/SciProTest.java @@ -1,17 +1,13 @@ 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; +import org.apache.wicket.spring.test.ApplicationContextMock; import org.apache.wicket.util.tester.WicketTester; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -364,9 +360,12 @@ public abstract class SciProTest { @BeforeEach public void setUpApplication() { final Class<? extends SciProTest> clazz = getClass(); - final Injector injector = Guice.createInjector(new MockModule(clazz)); + ApplicationContextMock applicationContext = new MockModule(clazz); - SciProApplication application = new SciProApplication(injector.getInstance(CurrentProfile.class)) { + CurrentProfile currentProfile = new CurrentProfile(); + currentProfile.setCurrentProfileString("TEST"); + + SciProApplication application = new SciProApplication(currentProfile) { @Override public Session newSession(Request request, Response response) { @@ -374,7 +373,7 @@ public abstract class SciProTest { } }; application.getComponentInstantiationListeners().add( - new GuiceComponentInjector(application, injector)); + new SpringComponentInjector(application, applicationContext)); tester = new WicketTester(application, System.getProperty("user.dir") + "/src/main/webapp"); setLoggedIn(true); @@ -467,27 +466,23 @@ public abstract class SciProTest { return sb.toString(); } - private class MockModule extends AbstractModule { + private class MockModule extends ApplicationContextMock { private final Class<? extends SciProTest> clazz; public MockModule(Class<? extends SciProTest> clazz) { this.clazz = clazz; + configure(); } @SuppressWarnings("unchecked") - @Override - protected void configure() { - Multibinder.newSetBinder(binder(), Lifecycle.class); - Multibinder.newSetBinder(binder(), UserImportService.class) - .addBinding().toInstance(userImportService); - bindConstant().annotatedWith(Names.named("profile")).to("TEST"); - bind(Clock.class).toInstance(Clock.systemDefaultZone()); + private void configure() { + putBean(Clock.systemDefaultZone()); for (Class<?> c = clazz; c != null; c = c.getSuperclass()) { for (Field f : c.getDeclaredFields()) { if (f.getAnnotation(Mock.class) != null && f.trySetAccessible()) { try { Class<Object> type = (Class<Object>) f.getType(); - bind(type).toInstance(f.get(SciProTest.this)); + putBean(f.getName(), f.get(SciProTest.this)); } catch (IllegalAccessException e) { throw new RuntimeException(e); } diff --git a/war/pom.xml b/war/pom.xml new file mode 100644 index 0000000000..2c4ad17242 --- /dev/null +++ b/war/pom.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>SciPro</artifactId> + <version>0.1-SNAPSHOT</version> + </parent> + + <artifactId>war</artifactId> + <packaging>war</packaging> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <exclusions> + <!-- exclude default logging implementation (logback) since we want log4j2 --> + <exclusion> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-logging</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-log4j2</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate.orm</groupId> + <artifactId>hibernate-core</artifactId> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-spring</artifactId> + </dependency> + + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> + </dependency> + + <dependency> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>view</artifactId> + <version>${project.version}</version> + <type>war</type> + </dependency> + <dependency> + <!-- needed only at compile time --> + <!-- the classes will be moved as part of the overlay by the war plugin --> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>view</artifactId> + <version>${project.version}</version> + <classifier>classes</classifier> + <optional>true</optional> + </dependency> + <dependency> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>api</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>3.4.0</version> + <configuration> + <overlays> + <overlay> + <groupId>se.su.dsv.scipro</groupId> + <artifactId>view</artifactId> + <type>war</type> + </overlay> + </overlays> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/war/src/main/java/se/su/dsv/scipro/war/ApiConfig.java b/war/src/main/java/se/su/dsv/scipro/war/ApiConfig.java new file mode 100644 index 0000000000..f8b410b8aa --- /dev/null +++ b/war/src/main/java/se/su/dsv/scipro/war/ApiConfig.java @@ -0,0 +1,72 @@ +package se.su.dsv.scipro.war; + +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; +import org.springframework.web.servlet.handler.HandlerMappingIntrospector; + +import java.util.List; + +@Configuration(proxyBeanMethods = false) +@ComponentScan("se.su.dsv.scipro.api") +public class ApiConfig { + @Bean + @Order(1) + public SecurityFilterChain documentationSecurity( + HttpSecurity http, + HandlerMappingIntrospector introspector, + WebMvcProperties webMvcProperties) + throws Exception + { + MvcRequestMatcher.Builder mvc = new MvcRequestMatcher.Builder(introspector) + .servletPath(webMvcProperties.getServlet().getPath()); + return http + .securityMatchers(matchers -> matchers + .requestMatchers( + mvc.pattern("/v3/api-docs/**"), + mvc.pattern("/swagger"), + mvc.pattern("/swagger-ui/**"))) + .authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll()) + .build(); + } + + @Bean + @Order(2) + public SecurityFilterChain apiSecurity( + HttpSecurity http, + HandlerMappingIntrospector introspector, + WebMvcProperties webMvcProperties) + throws Exception + { + MvcRequestMatcher.Builder mvc = new MvcRequestMatcher.Builder(introspector) + .servletPath(webMvcProperties.getServlet().getPath()); + return http + .securityMatcher(mvc.pattern("/**")) + .authorizeHttpRequests(authorize -> authorize + .anyRequest().authenticated()) + .oauth2ResourceServer(oauth2 -> oauth2.opaqueToken(Customizer.withDefaults())) + .build(); + } + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .security(List.of(new SecurityRequirement().addList("access-token"))) + .components(new Components() + .addSecuritySchemes("access-token", new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .in(SecurityScheme.In.HEADER) + .scheme("bearer") + .bearerFormat("opaque"))); + } +} diff --git a/core/src/main/java/se/su/dsv/scipro/mail/MailModule.java b/war/src/main/java/se/su/dsv/scipro/war/MailConfig.java similarity index 52% rename from core/src/main/java/se/su/dsv/scipro/mail/MailModule.java rename to war/src/main/java/se/su/dsv/scipro/war/MailConfig.java index c23bc66811..a96c89f56c 100644 --- a/core/src/main/java/se/su/dsv/scipro/mail/MailModule.java +++ b/war/src/main/java/se/su/dsv/scipro/war/MailConfig.java @@ -1,38 +1,40 @@ -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; +package se.su.dsv.scipro.war; import jakarta.mail.Session; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import se.su.dsv.scipro.data.facade.MailFacade; +import se.su.dsv.scipro.file.FileService; +import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService; +import se.su.dsv.scipro.mail.Mail; +import se.su.dsv.scipro.mail.Mailer; +import se.su.dsv.scipro.mail.PrintingMailer; +import se.su.dsv.scipro.mail.RedirectingMailer; +import se.su.dsv.scipro.profiles.CurrentProfile; + 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); +@Configuration(proxyBeanMethods = false) +public class MailConfig { + @Bean + public MailFacade mailFacade() { + return new MailFacade(); } - @Provides - @Exposed - public Mailer mailer(CurrentProfile currentProfile, Session session, FileService fileDescriptionService) { + @Bean + 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); + case TEST -> new RedirectingMailer(session, "scipro-mailtest@dsv.su.se", fileDescriptionService); }; } - @Provides + @Bean public Session session(GeneralSystemSettingsService generalSystemSettings) { String smtpHost = generalSystemSettings.getGeneralSystemSettingsInstance().getSmtpServer(); Properties properties = new Properties(); diff --git a/war/src/main/java/se/su/dsv/scipro/war/Main.java b/war/src/main/java/se/su/dsv/scipro/war/Main.java new file mode 100644 index 0000000000..026130dd7d --- /dev/null +++ b/war/src/main/java/se/su/dsv/scipro/war/Main.java @@ -0,0 +1,168 @@ +package se.su.dsv.scipro.war; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.servlet.ServletContainerInitializer; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.orm.jpa.SharedEntityManagerCreator; +import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; +import se.su.dsv.scipro.CoreConfig; +import se.su.dsv.scipro.CurrentUserFromWicketSession; +import se.su.dsv.scipro.FileSystemStore; +import se.su.dsv.scipro.RepositoryConfiguration; +import se.su.dsv.scipro.file.FileStore; +import se.su.dsv.scipro.finalthesis.PublishingConsentService; +import se.su.dsv.scipro.finalthesis.PublishingConsentUnavailable; +import se.su.dsv.scipro.profiles.CurrentProfile; +import se.su.dsv.scipro.system.AggregateUserSearch; +import se.su.dsv.scipro.system.Lifecycle; +import se.su.dsv.scipro.system.ResearchArea; +import se.su.dsv.scipro.system.User; +import se.su.dsv.scipro.system.UserImportService; +import se.su.dsv.scipro.system.UserSearchProvider; +import se.su.dsv.scipro.system.UserSearchService; +import se.su.dsv.scipro.system.UserService; + +import java.time.Clock; +import java.util.List; +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.Set; + +@SpringBootApplication(proxyBeanMethods = false) +@EntityScan("se.su.dsv.scipro") +@Import({ + CoreConfig.class, + ApiConfig.class, + WorkerConfig.class, + MailConfig.class, + RepositoryConfiguration.class, + WicketConfiguration.class +}) +public class Main extends SpringBootServletInitializer implements ServletContainerInitializer { + @Override + public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException { + onStartup(ctx); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + for (PluginConfiguration pluginConfiguration : ServiceLoader.load(PluginConfiguration.class)) { + builder.sources(pluginConfiguration.getClass()); + } + return builder.sources(Main.class); + } + + @Bean + public EntityManagerFactoryBuilderCustomizer entityManagerFactoryCustomizer() { + return factoryBuilder -> { + factoryBuilder.setBootstrapExecutor(new SimpleAsyncTaskExecutor()); + }; + } + + @Bean + public OpenEntityManagerInViewFilter openEntityManagerInViewFilter() { + return new OpenEntityManagerInViewFilter(); + } + + @Bean + public CurrentProfile currentProfile(@Value("${profile}" ) String profile) { + CurrentProfile currentProfile = new CurrentProfile(); + currentProfile.setCurrentProfileString(profile); + return currentProfile; + } + + @Bean + public CurrentUserFromWicketSession currentUserFromWicketSession() { + return new CurrentUserFromWicketSession(); + } + + @Bean + public FileStore fileStore() { + return new FileSystemStore(); + } + + @Bean + public Clock clock() { + return Clock.systemDefaultZone(); + } + + /** + * Allow injecting of {@link EntityManager} directly instead of {@link EntityManagerFactory} + */ + @Bean + public EntityManager entityManager(EntityManagerFactory emf) { + return SharedEntityManagerCreator.createSharedEntityManager(emf); + } + + /** + * Exists because Spring refuses to inject a collection of beans if there are no beans of that type. + */ + @Bean + public UserImportService dummyUserImportService() { + return new UserImportService() { + @Override + public Optional<User> importUser(String userName) { + return Optional.empty(); + } + + @Override + public List<ImportableUser> search(String searchTerm) { + return List.of(); + } + + @Override + public void importUser(ImportableUser importableUser) { + // do nothing + } + + @Override + public Set<ResearchArea> importResearchAreasForSupervisor(User supervisor) { + return Set.of(); + } + }; + } + + /** + * Exists because Spring refuses to inject a collection of beans if there are no beans of that type. + */ + @Bean + public Lifecycle dummyLifecycle() { + return new Lifecycle() { + @Override + public void start() { + // do nothing + } + + @Override + public void stop() { + // do nothing + } + }; + } + + @Bean + public UserSearchService aggregateSearchService( + Set<UserSearchProvider> userSearchProviders, + UserService userService) + { + return new AggregateUserSearch(userSearchProviders, userService); + } + + @Bean + @ConditionalOnMissingBean(PublishingConsentService.class) + public PublishingConsentUnavailable publishingConsentService() { + return new PublishingConsentUnavailable(); + } +} diff --git a/war/src/main/java/se/su/dsv/scipro/war/SpringManagedWorkerTransactions.java b/war/src/main/java/se/su/dsv/scipro/war/SpringManagedWorkerTransactions.java new file mode 100644 index 0000000000..ae66a50e36 --- /dev/null +++ b/war/src/main/java/se/su/dsv/scipro/war/SpringManagedWorkerTransactions.java @@ -0,0 +1,50 @@ +package se.su.dsv.scipro.war; + +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import se.su.dsv.scipro.workerthreads.WorkerTransactionManager; + +public class SpringManagedWorkerTransactions implements WorkerTransactionManager { + private final PlatformTransactionManager platformTransactionManager; + + private TransactionStatus activeTransaction; + + public SpringManagedWorkerTransactions(PlatformTransactionManager platformTransactionManager) { + this.platformTransactionManager = platformTransactionManager; + } + + @Override + public void rollbackIfActive() { + if (this.activeTransaction != null) { + platformTransactionManager.rollback(this.activeTransaction); + this.activeTransaction = null; + } + } + + @Override + public void begin() { + if (this.activeTransaction != null) { + throw new IllegalStateException("A transaction is already active"); + } + this.activeTransaction = platformTransactionManager.getTransaction(TransactionDefinition.withDefaults()); + } + + @Override + public void commit() { + if (this.activeTransaction == null) { + throw new IllegalStateException("A transaction is not active"); + } + platformTransactionManager.commit(this.activeTransaction); + this.activeTransaction = null; + } + + @Override + public void rollback() { + if (this.activeTransaction == null) { + throw new IllegalStateException("A transaction is not active"); + } + platformTransactionManager.rollback(this.activeTransaction); + this.activeTransaction = null; + } +} diff --git a/war/src/main/java/se/su/dsv/scipro/war/WicketConfiguration.java b/war/src/main/java/se/su/dsv/scipro/war/WicketConfiguration.java new file mode 100644 index 0000000000..f31d390c16 --- /dev/null +++ b/war/src/main/java/se/su/dsv/scipro/war/WicketConfiguration.java @@ -0,0 +1,90 @@ +package se.su.dsv.scipro.war; + +import com.google.common.eventbus.EventBus; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.protocol.http.WicketFilter; +import org.apache.wicket.spring.injection.annot.SpringComponentInjector; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import se.su.dsv.scipro.SciProApplication; +import se.su.dsv.scipro.crosscutting.ForwardPhase2Feedback; +import se.su.dsv.scipro.crosscutting.ReviewerAssignedNotifications; +import se.su.dsv.scipro.crosscutting.ReviewerSupportMailer; +import se.su.dsv.scipro.crosscutting.ReviewingNotifications; +import se.su.dsv.scipro.forum.ProjectForumService; +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.profiles.CurrentProfile; +import se.su.dsv.scipro.reviewing.FinalSeminarApprovalService; +import se.su.dsv.scipro.reviewing.RoughDraftApprovalService; + +@Configuration +public class WicketConfiguration { + @Bean + public FilterRegistrationBean<WicketFilter> wicket( + WebApplication webApplication, + ApplicationContext applicationContext) + { + webApplication.getComponentInstantiationListeners() + .add(new SpringComponentInjector(webApplication, applicationContext)); + + WicketFilter filter = new WicketFilter(webApplication); + filter.setFilterPath(""); + + FilterRegistrationBean<WicketFilter> registration = new FilterRegistrationBean<>(); + registration.setFilter(filter); + registration.addUrlPatterns("/*"); + registration.setMatchAfter(true); + return registration; + } + + @Bean + public WebApplication webApplication(CurrentProfile currentProfile) { + return new SciProApplication(currentProfile); + } + + @Bean + public ReviewingNotifications reviewingNotifications( + EventBus eventBus, + NotificationController notificationController, + GeneralSystemSettingsService generalSystemSettingsService, + WebApplication webApplication) + { + return new ReviewingNotifications(eventBus, notificationController, generalSystemSettingsService, + webApplication); + } + + @Bean + public ForwardPhase2Feedback forwardPhase2Feedback( + EventBus eventBus, + WebApplication webApplication, + ProjectForumService projectForumService) + { + return new ForwardPhase2Feedback(webApplication, projectForumService, eventBus); + } + + // Not sure why this dependency lives in the view module + @Bean + public ReviewerSupportMailer reviewerSupportMailer( + EventBus eventBus, + GeneralSystemSettingsService generalSystemSettingsService, + MailEventService mailEventService) + { + return new ReviewerSupportMailer(eventBus, mailEventService, generalSystemSettingsService); + } + + // Not sure why this dependency lives in the view module + @Bean + public ReviewerAssignedNotifications reviewerAssignedNotifications( + EventBus eventBus, + NotificationController notificationController, + RoughDraftApprovalService roughDraftApprovalService, + FinalSeminarApprovalService finalSeminarApprovalService) + { + return new ReviewerAssignedNotifications(roughDraftApprovalService, + finalSeminarApprovalService, notificationController, eventBus); + } +} diff --git a/war/src/main/java/se/su/dsv/scipro/war/WorkerConfig.java b/war/src/main/java/se/su/dsv/scipro/war/WorkerConfig.java new file mode 100644 index 0000000000..076bc219fc --- /dev/null +++ b/war/src/main/java/se/su/dsv/scipro/war/WorkerConfig.java @@ -0,0 +1,245 @@ +package se.su.dsv.scipro.war; + +import com.google.common.eventbus.EventBus; +import jakarta.inject.Provider; +import jakarta.persistence.EntityManagerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Scope; +import org.springframework.transaction.PlatformTransactionManager; +import se.su.dsv.scipro.file.FileService; +import se.su.dsv.scipro.finalseminar.FinalSeminarService; +import se.su.dsv.scipro.firstmeeting.FirstMeetingReminderWorker; +import se.su.dsv.scipro.firstmeeting.FirstMeetingService; +import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettingsService; +import se.su.dsv.scipro.mail.MailEventService; +import se.su.dsv.scipro.mail.MailEventWorker; +import se.su.dsv.scipro.mail.Mailer; +import se.su.dsv.scipro.match.AllowAllIdeaCreationJudge; +import se.su.dsv.scipro.match.ApplicationPeriodService; +import se.su.dsv.scipro.match.IdeaCreationJudge; +import se.su.dsv.scipro.match.IdeaService; +import se.su.dsv.scipro.misc.DaysService; +import se.su.dsv.scipro.peer.ExpiredRequestWorker; +import se.su.dsv.scipro.peer.ExpiredReviewResetWorker; +import se.su.dsv.scipro.peer.PeerWorkerSchedules; +import se.su.dsv.scipro.plagiarism.PlagiarismRequestRepository; +import se.su.dsv.scipro.plagiarism.PlagiarismSubmitter; +import se.su.dsv.scipro.plagiarism.urkund.StatusPollingWorker; +import se.su.dsv.scipro.plagiarism.urkund.UrkundApi; +import se.su.dsv.scipro.plagiarism.urkund.UrkundService; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSettings; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSettingsRepository; +import se.su.dsv.scipro.plagiarism.urkund.UrkundSubmissionRepository; +import se.su.dsv.scipro.project.ProjectService; +import se.su.dsv.scipro.projectpartner.ProjectPartnerRepository; +import se.su.dsv.scipro.projectpartner.RemoveFulfilledPartnerAdsWorker; +import se.su.dsv.scipro.reviewing.MyReviewService; +import se.su.dsv.scipro.reviewing.ReviewerDecisionReminderWorker; +import se.su.dsv.scipro.sukat.Sukat; +import se.su.dsv.scipro.workerthreads.GradeFinalSeminarParticipantReminderWorker; +import se.su.dsv.scipro.workerthreads.IdeaExportWorker; +import se.su.dsv.scipro.workerthreads.ManualMatchRemindWorker; +import se.su.dsv.scipro.workerthreads.NotificationCompilationWorker; +import se.su.dsv.scipro.workerthreads.Scheduler; +import se.su.dsv.scipro.workerthreads.SchedulerImpl; +import se.su.dsv.scipro.workerthreads.TemporaryWorkerScheduler; +import se.su.dsv.scipro.workerthreads.ThesisUploadDeadlineWorker; +import se.su.dsv.scipro.workerthreads.ThesisUploadReminderWorker; +import se.su.dsv.scipro.workerthreads.WorkerTransactionManager; + +import java.time.Clock; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +@Configuration(proxyBeanMethods = false) +@Import(WorkerConfig.Workers.class) +public class WorkerConfig { + private static final int NUMBER_OF_WORKER_THREADS = 4; + + @Bean + public ScheduledExecutorService scheduledExecutorService() { + return Executors.newScheduledThreadPool(NUMBER_OF_WORKER_THREADS); + } + + @Bean + public SchedulerImpl scheduler( + ScheduledExecutorService scheduledExecutorService, + EntityManagerFactory entityManagerFactory) + { + return new SchedulerImpl(scheduledExecutorService, entityManagerFactory); + } + + @Bean + public TemporaryWorkerScheduler temporaryWorkerScheduler( + Scheduler scheduler, + Provider<MailEventWorker> mailEventWorker, + Provider<NotificationCompilationWorker> notificationCompilationWorker, + Provider<IdeaExportWorker> ideaExportWorker, + Provider<ThesisUploadReminderWorker> thesisUploadReminderWorker, + Provider<ThesisUploadDeadlineWorker> thesisUploadDeadlineWorker, + Provider<ManualMatchRemindWorker> manualMatchRemindWorkerProvider, + Provider<ReviewerDecisionReminderWorker> reviewerDecisionReminderWorker, + Provider<PlagiarismSubmitter> plagiarismSubmitter, + Provider<StatusPollingWorker> urkundPoller, + Provider<RemoveFulfilledPartnerAdsWorker> removeFulfilledPartnerAds, + Provider<GradeFinalSeminarParticipantReminderWorker> gradeFinalSeminarParticipantReminderWorkerProvider) + { + return new TemporaryWorkerScheduler(scheduler, mailEventWorker, notificationCompilationWorker, ideaExportWorker, thesisUploadReminderWorker, thesisUploadDeadlineWorker, manualMatchRemindWorkerProvider, reviewerDecisionReminderWorker, plagiarismSubmitter, urkundPoller, removeFulfilledPartnerAds, gradeFinalSeminarParticipantReminderWorkerProvider); + } + + @Bean + public FirstMeetingReminderWorker.FirstMeetingReminderWorkerSchedule firstMeetingReminderWorkerScheduler( + Scheduler scheduler, + Provider<FirstMeetingReminderWorker> firstMeetingReminderWorkerProvider) + { + return new FirstMeetingReminderWorker.FirstMeetingReminderWorkerSchedule(scheduler, firstMeetingReminderWorkerProvider); + } + + @Bean + public PeerWorkerSchedules peerWorkerSchedules( + Scheduler scheduler, + Provider<ExpiredRequestWorker> expiredRequestWorker, + Provider<ExpiredReviewResetWorker> expiredReviewResetWorker) + { + return new PeerWorkerSchedules(scheduler, expiredRequestWorker, expiredReviewResetWorker); + } + + @Bean + @ConditionalOnMissingBean(IdeaCreationJudge.class) + public IdeaCreationJudge ideaCreationJudge() { + return new AllowAllIdeaCreationJudge(); + } + + @Bean + public PlagiarismSubmitter plagiarismSubmitter( + Provider<UrkundSettings> urkundSettings, + PlagiarismRequestRepository plagiarismRequestRepository, + UrkundService urkundService, + FileService fileService) + { + return new PlagiarismSubmitter(urkundSettings, plagiarismRequestRepository, urkundService, fileService); + } + + @Bean + public UrkundSettings urkundSettings(UrkundSettingsRepository urkundSettingsRepository) { + return urkundSettingsRepository.getSettings(); + } + + @Bean + @Scope("prototype") + public WorkerTransactionManager workerTransactionManager(PlatformTransactionManager platformTransactionManager) { + return new SpringManagedWorkerTransactions(platformTransactionManager); + } + + @Configuration + public static class Workers { + @Bean + public MailEventWorker mailEventWorker( + MailEventService mailEventService, + GeneralSystemSettingsService generalSystemSettingsService, + Mailer mailer) + { + return new MailEventWorker(mailEventService, generalSystemSettingsService, mailer); + } + + @Bean + public NotificationCompilationWorker notificationCompilationWorker() { + return new NotificationCompilationWorker(); + } + + @Bean + public IdeaExportWorker ideaExportWorker( + IdeaService ideaService, + MailEventService mailEventService, + ProjectService projectService, + IdeaCreationJudge ideaCreationJudge, + EventBus eventBus, + FirstMeetingService firstMeetingService) + { + return new IdeaExportWorker(ideaService, mailEventService, projectService, ideaCreationJudge, eventBus, + firstMeetingService); + } + + @Bean + public ThesisUploadReminderWorker thesisUploadReminderWorker() { + return new ThesisUploadReminderWorker(); + } + + @Bean + public ThesisUploadDeadlineWorker thesisUploadDeadlineWorker() { + return new ThesisUploadDeadlineWorker(); + } + + @Bean + public ManualMatchRemindWorker manualMatchRemindWorker( + ApplicationPeriodService applicationPeriodService, + MailEventService mailEventService, + GeneralSystemSettingsService generalSystemSettingsService, + IdeaService ideaService, + Clock clock) + { + return new ManualMatchRemindWorker(applicationPeriodService, mailEventService, generalSystemSettingsService, + ideaService, clock); + } + + @Bean + public ReviewerDecisionReminderWorker reviewerDecisionReminderWorker( + MyReviewService myReviewService, + DaysService daysService, + MailEventService mailEventService) + { + return new ReviewerDecisionReminderWorker(myReviewService, daysService, mailEventService); + } + + @Bean + public StatusPollingWorker statusPollingWorker( + UrkundSubmissionRepository urkundSubmissionRepository, + UrkundApi urkundApi, + Provider<UrkundSettings> urkundSettingsProvider, + Sukat sukat) + { + return new StatusPollingWorker(urkundSubmissionRepository, urkundApi, urkundSettingsProvider, sukat); + } + + @Bean + public RemoveFulfilledPartnerAdsWorker removeFulfilledPartnerAdsWorker( + IdeaService ideaService, + ProjectPartnerRepository projectPartnerRepository) + { + return new RemoveFulfilledPartnerAdsWorker(ideaService, projectPartnerRepository); + } + + @Bean + public GradeFinalSeminarParticipantReminderWorker gradeFinalSeminarParticipantReminderWorker( + MailEventService mailEventService, + GeneralSystemSettingsService generalSystemSettingsService, + FinalSeminarService finalSeminarService) + { + return new GradeFinalSeminarParticipantReminderWorker(finalSeminarService, mailEventService, generalSystemSettingsService); + } + + @Bean + public FirstMeetingReminderWorker firstMeetingReminderWorker( + IdeaService ideaService, + DaysService daysService, + MailEventService mailEventService, + GeneralSystemSettingsService generalSystemSettingsService, + Clock clock) + { + return new FirstMeetingReminderWorker(ideaService, daysService, mailEventService, generalSystemSettingsService, clock); + } + + @Bean + public ExpiredReviewResetWorker expiredReviewResetWorker() { + return new ExpiredReviewResetWorker(); + } + + @Bean + public ExpiredRequestWorker expiredRequestWorker() { + return new ExpiredRequestWorker(); + } + } +} diff --git a/core/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java b/war/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java similarity index 63% rename from core/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java rename to war/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java index d8ecf35252..0acb56920c 100755 --- a/core/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java +++ b/war/src/main/java/se/su/dsv/scipro/workerthreads/SchedulerImpl.java @@ -1,12 +1,18 @@ package se.su.dsv.scipro.workerthreads; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.orm.jpa.EntityManagerFactoryUtils; +import org.springframework.orm.jpa.EntityManagerHolder; +import org.springframework.transaction.support.TransactionSynchronizationManager; import se.su.dsv.scipro.system.Lifecycle; import jakarta.inject.Inject; import jakarta.inject.Provider; import jakarta.inject.Singleton; + import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -19,13 +25,15 @@ public class SchedulerImpl implements Lifecycle, Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(SchedulerImpl.class); private final ScheduledExecutorService scheduledExecutorService; + private final EntityManagerFactory emf; private final Set<Task> tasks = new TreeSet<>(new Task.ByDescriptionComparator()); private final Set<Task> runningWorkers = Collections.synchronizedSet(new HashSet<>()); @Inject - public SchedulerImpl(ScheduledExecutorService scheduledExecutorService) { + public SchedulerImpl(ScheduledExecutorService scheduledExecutorService, EntityManagerFactory emf) { this.scheduledExecutorService = scheduledExecutorService; + this.emf = emf; } @Override @@ -43,6 +51,14 @@ public class SchedulerImpl implements Lifecycle, Scheduler { private Runnable tracked(final Task task) { return () -> { try { + // Since we're not in a web request when running a scheduled job, Spring's OpenEntityManagerInView + // filter is not active. Therefore, we need to manually bind a new EntityManager to the current thread + // to be shared by all DAOs. If we do not, we will get problems with detached entity passed to persist + // since every read and write from the database will be in a new EntityManager. + EntityManager em = emf.createEntityManager(); + EntityManagerHolder emHolder = new EntityManagerHolder(em); + TransactionSynchronizationManager.bindResource(emf, emHolder); + runningWorkers.add(task); task.execute(); } @@ -51,6 +67,11 @@ public class SchedulerImpl implements Lifecycle, Scheduler { } finally { runningWorkers.remove(task); + + // Clean up the shared EntityManager + EntityManagerHolder emHolder = (EntityManagerHolder) + TransactionSynchronizationManager.unbindResource(emf); + EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager()); } }; } diff --git a/core/src/main/java/se/su/dsv/scipro/workerthreads/TaskScheduling.java b/war/src/main/java/se/su/dsv/scipro/workerthreads/TaskScheduling.java similarity index 100% rename from core/src/main/java/se/su/dsv/scipro/workerthreads/TaskScheduling.java rename to war/src/main/java/se/su/dsv/scipro/workerthreads/TaskScheduling.java diff --git a/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer b/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer new file mode 100644 index 0000000000..ad4ffa3bbd --- /dev/null +++ b/war/src/main/resources/META-INF/services/jakarta.servlet.ServletContainerInitializer @@ -0,0 +1 @@ +se.su.dsv.scipro.war.Main diff --git a/war/src/main/resources/application.properties b/war/src/main/resources/application.properties new file mode 100644 index 0000000000..753d0e323c --- /dev/null +++ b/war/src/main/resources/application.properties @@ -0,0 +1,20 @@ +spring.datasource.jndi-name=java:/comp/env/jdbc/sciproDS +spring.flyway.table=schema_version + +# Spring Boot changes Hibernates default naming strategy to convert camelCase to snake_case +# We currently rely on the names to be treated as they are in Java, so we need to set it back to the default +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +# We also need to set the implicit strategy to be JPA compliant, as we rely on this naming strategy for certain +# join tables (idea_Keyword vs idea_keyword) +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl + +spring.mvc.servlet.path=/api + +springdoc.swagger-ui.path=/swagger +springdoc.swagger-ui.persist-authorization=true + +# These will be overwritten by configuration in the environment of servers it is deployed to +spring.security.oauth2.resourceserver.opaquetoken.client-id=scipro-api-client +spring.security.oauth2.resourceserver.opaquetoken.client-secret=scipro-api-secret +spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=http://localhost:59733/introspect diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 0000000000..b346f3b49c --- /dev/null +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" metadata-complete="true"> + + <display-name>SciPro</display-name> + + <!-- disables Spring's built in ServletContainerInitializer which causes a slow class path scanning --> + <absolute-ordering/> + + <session-config> + <session-timeout>480</session-timeout> + </session-config> +</web-app> diff --git a/core/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java b/war/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java similarity index 83% rename from core/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java rename to war/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java index 45e9ec4f67..f79a05cd26 100644 --- a/core/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java +++ b/war/src/test/java/se/su/dsv/scipro/workerthreads/SchedulerImplTest.java @@ -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; @@ -24,6 +26,8 @@ public class SchedulerImplTest { private Worker abstractWorker; @Mock private Task task; + @Mock(answer = Answers.RETURNS_MOCKS) + private EntityManagerFactory emf; @InjectMocks private SchedulerImpl scheduler; @@ -31,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)); }