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/daisy-integration/pom.xml b/daisy-integration/pom.xml index 891a45a81e..7c31d026ff 100644 --- a/daisy-integration/pom.xml +++ b/daisy-integration/pom.xml @@ -16,6 +16,10 @@ <groupId>se.su.dsv.scipro</groupId> <artifactId>core</artifactId> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-servlet</artifactId> 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/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/war/src/main/java/se/su/dsv/scipro/war/Main.java b/war/src/main/java/se/su/dsv/scipro/war/Main.java index 083ac279c4..0767aa6107 100644 --- a/war/src/main/java/se/su/dsv/scipro/war/Main.java +++ b/war/src/main/java/se/su/dsv/scipro/war/Main.java @@ -34,6 +34,7 @@ import se.su.dsv.scipro.system.UserService; import java.util.List; import java.util.Optional; +import java.util.ServiceLoader; import java.util.Set; @SpringBootApplication(proxyBeanMethods = false) @@ -47,6 +48,9 @@ public class Main extends SpringBootServletInitializer implements ServletContain @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + for (PluginConfiguration pluginConfiguration : ServiceLoader.load(PluginConfiguration.class)) { + builder.sources(pluginConfiguration.getClass()); + } return builder.sources(Main.class); }