From b99c458160a55258750c91b6cfe9b0fd5a207a73 Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Mon, 13 Jan 2025 12:17:53 +0100
Subject: [PATCH 1/5] Allow a single author to start multiple ideas of
 different types (#70)

Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/70
Reviewed-by: Tom Zhao <tom.zhao@dsv.su.se>
Co-authored-by: Andreas Svanberg <andreass@dsv.su.se>
Co-committed-by: Andreas Svanberg <andreass@dsv.su.se>
---
 core/src/main/xsd/daisy_api.xsd               |  4 +++
 .../io/impl/ExternalExporterDaisyImpl.java    | 29 +++++++++++--------
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/core/src/main/xsd/daisy_api.xsd b/core/src/main/xsd/daisy_api.xsd
index 806769ad48..a01921eadd 100755
--- a/core/src/main/xsd/daisy_api.xsd
+++ b/core/src/main/xsd/daisy_api.xsd
@@ -75,6 +75,8 @@
         <xs:sequence>
             <xs:element name="level" type="educationalLevel" minOccurs="1">
             </xs:element>
+            <xs:element name="courseCredits" type="xs:decimal" minOccurs="0">
+            </xs:element>
             <xs:element name="department" type="serializableUnit" minOccurs="1">
             </xs:element>
         </xs:sequence>
@@ -615,6 +617,8 @@
             </xs:element>
             <xs:element name="break" type="xs:boolean" minOccurs="1">
             </xs:element>
+            <xs:element name="reparticipant" type="xs:boolean" minOccurs="1">
+            </xs:element>
             <xs:element name="inactive" type="xs:boolean" minOccurs="1">
             </xs:element>
             <xs:element name="userName" type="xs:string" minOccurs="0">
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java b/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
index 90aaca25c2..d9362a5d74 100755
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
@@ -2,9 +2,8 @@ package se.su.dsv.scipro.io.impl;
 
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
+import java.math.BigDecimal;
 import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
@@ -13,7 +12,6 @@ import se.su.dsv.scipro.io.dto.*;
 import se.su.dsv.scipro.io.exceptions.ExternalExportException;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.reusable.SciProUtilities;
-import se.su.dsv.scipro.system.DegreeType;
 import se.su.dsv.scipro.system.Unit;
 import se.su.dsv.scipro.system.User;
 
@@ -23,14 +21,6 @@ public class ExternalExporterDaisyImpl implements ExternalExporter {
 
     static final int MAX_TITLE_LENGTH = 255;
     private static final int DSV = 4;
-    private static Map<DegreeType, EducationalLevel> classMap = new HashMap<>() {
-        {
-            put(DegreeType.NONE, EducationalLevel.UNKNOWN);
-            put(DegreeType.BACHELOR, EducationalLevel.FIRST_CYCLE);
-            put(DegreeType.MAGISTER, EducationalLevel.SECOND_CYCLE);
-            put(DegreeType.MASTER, EducationalLevel.SECOND_CYCLE);
-        }
-    };
 
     private final DaisyAPI api;
 
@@ -82,7 +72,21 @@ public class ExternalExporterDaisyImpl implements ExternalExporter {
     }
 
     private EducationalLevel toDaisyLevel(Project project) {
-        return classMap.get(project.getProjectTypeDegreeType());
+        return switch (project.getProjectTypeDegreeType()) {
+            case NONE -> EducationalLevel.UNKNOWN;
+            case BACHELOR -> EducationalLevel.FIRST_CYCLE;
+            case MAGISTER -> EducationalLevel.SECOND_CYCLE;
+            case MASTER -> EducationalLevel.SECOND_CYCLE;
+        };
+    }
+
+    private static BigDecimal toDaisyCredits(Project project) {
+        return switch (project.getProjectTypeDegreeType()) {
+            case BACHELOR -> BigDecimal.valueOf(15);
+            case MAGISTER -> BigDecimal.valueOf(15);
+            case MASTER -> BigDecimal.valueOf(30);
+            case NONE -> null;
+        };
     }
 
     @Override
@@ -95,6 +99,7 @@ public class ExternalExporterDaisyImpl implements ExternalExporter {
         AddThesisAuthorCourse authorCourse = new AddThesisAuthorCourse();
         authorCourse.setLevel(toDaisyLevel(project));
         authorCourse.setDepartment(department);
+        authorCourse.setCourseCredits(toDaisyCredits(project));
 
         AddThesisAuthor addThesisAuthor = new AddThesisAuthor();
         addThesisAuthor.setCourse(authorCourse);

From e0e84df720d484cd741fe88fa0bf66841cf0a284 Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Tue, 14 Jan 2025 14:50:31 +0100
Subject: [PATCH 2/5] Reset the failure flag in workers on successful runs.
 (#76)

Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/76
Reviewed-by: Tom Zhao <tom.zhao@dsv.su.se>
Co-authored-by: Andreas Svanberg <andreass@dsv.su.se>
Co-committed-by: Andreas Svanberg <andreass@dsv.su.se>
---
 .../scipro/workerthreads/AbstractWorker.java  | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

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 9c97efdb03..940668b430 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,9 +1,6 @@
 package se.su.dsv.scipro.workerthreads;
 
 import jakarta.inject.Inject;
-import jakarta.inject.Provider;
-import jakarta.persistence.EntityManager;
-import jakarta.persistence.EntityTransaction;
 import java.util.Date;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,6 +55,22 @@ public abstract class AbstractWorker implements Worker {
              * Do manually transaction-handled work
              */
             try {
+                // When the switch from Guice to Spring happened all workers became singletons
+                // because that's the default in Spring. In Guice they were "prototype" scoped
+                // and therefore the worker object was re-created before each execution which
+                // reset the successfulWorker field to true.
+                //
+                // Now that they're singletons the field is never reset to true after a
+                // failure and the worker will be stuck in a failed state even after a
+                // subsequent successful run.
+                //
+                // TODO:
+                //  In the future this flag should be removed and any execution that does
+                //  not throw an exception should be considered successful.
+                //  If a worker needs to signal a non-exception as a failure that should
+                //  be an internal matter and not something the scheduler should consider.
+                setSuccessfulWorker(true);
+
                 doWork();
             } catch (RuntimeException ex) {
                 LOGGER.info("Worker {} threw an exception", getClass().getSimpleName());

From 2784bca8f6f1073098e951a95f9f209bc689aaf1 Mon Sep 17 00:00:00 2001
From: Tom Zhao <tom.zhao@dsv.su.se>
Date: Thu, 16 Jan 2025 13:55:38 +0100
Subject: [PATCH 3/5] Improve XJC-binding (Issue 73) (#74)

Fixes #73

In daisy.xsd there are two datatypes, one is called STATUS and another one is called Status. Since Windows file system is case insensitive, file STATUS.java and Status.java are considered as same name. This makes build on Windows impossible.

Solution: in XJC binding file, rename Status.java to Status2.java (the Status2.java belongs to Examination is endpoint/resource which is not used by Scipro).

Other small improvments:

- package name 'se.su.dsv.scipro.daisyExternal' is renamed to 'se.su.dsv.scipro.daisyexternal'.
- single import statements are applied.

Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/74
Reviewed-by: Andreas Svanberg <andreass@dsv.su.se>
Co-authored-by: Tom Zhao <tom.zhao@dsv.su.se>
Co-committed-by: Tom Zhao <tom.zhao@dsv.su.se>
---
 .../java/se/su/dsv/scipro/CoreConfig.java     |  2 +-
 .../exceptions/ExternalImportException.java   |  2 +-
 .../http/DaisyAPI.java                        | 23 +++++++++++--
 .../http/DaisyAPIImpl.java                    | 33 ++++++++++++++++---
 .../http/OrganisationalUnit.java              |  2 +-
 .../http/PhotoResult.java                     |  2 +-
 .../http/Semester.java                        |  2 +-
 core/src/main/xjb/daisy_api.xjb               | 14 ++++++--
 core/src/main/xsd/daisy_api.xsd               |  5 ++-
 .../http/DaisyAPIImplTest.java                |  2 +-
 .../ExternalImporter.java                     |  2 +-
 .../ImporterTransactions.java                 |  2 +-
 .../impl/ExternalImporterDaisyImpl.java       | 10 +++---
 .../impl/ImporterTransactionsImpl.java        | 32 ++++++++++++++----
 .../daisy/DaisyConsentService.java            |  2 +-
 .../daisy/DaisyIntegrationConfiguration.java  | 10 +++---
 .../daisy/DaisyUserSearchService.java         |  2 +-
 .../daisy/SyncReviewerWithDaisy.java          |  2 +-
 .../GradingCompletedMilestoneActivator.java   |  2 +-
 .../workers/ImportNationalCategories.java     |  2 +-
 .../daisy/workers/ProjectExporter.java        | 12 +++++--
 .../daisy/workers/ProjectFinalizer.java       |  2 +-
 .../daisy/workers/RejectedThesisWorker.java   |  2 +-
 .../daisy/workers/UserImportWorker.java       |  8 ++---
 .../io/impl/ExternalExporterDaisyImpl.java    | 14 ++++++--
 .../impl/ExternalImporterDaisyImplTest.java   |  6 ++--
 .../impl/ImporterTransactionsImplTest.java    | 11 +++++--
 ...radingCompletedMilestoneActivatorTest.java |  2 +-
 .../daisy/workers/ProjectExporterTest.java    |  9 +++--
 .../daisy/workers/ProjectFinalizerTest.java   |  2 +-
 .../daisy/workers/UserImportWorkerTest.java   | 12 ++++---
 .../impl/ExternalExporterDaisyImplTest.java   |  2 +-
 .../su/dsv/scipro/grading/SendToExaminer.java |  2 +-
 .../su/dsv/scipro/profile/DaisyPicture.java   |  4 +--
 .../java/se/su/dsv/scipro/SciProTest.java     |  4 +--
 35 files changed, 173 insertions(+), 72 deletions(-)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/exceptions/ExternalImportException.java (73%)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/DaisyAPI.java (70%)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/DaisyAPIImpl.java (92%)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/OrganisationalUnit.java (77%)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/PhotoResult.java (96%)
 rename core/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/Semester.java (95%)
 rename core/src/test/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/http/DaisyAPIImplTest.java (99%)
 rename daisy-integration/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/ExternalImporter.java (82%)
 rename daisy-integration/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/ImporterTransactions.java (92%)
 rename daisy-integration/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/impl/ExternalImporterDaisyImpl.java (97%)
 rename daisy-integration/src/main/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/impl/ImporterTransactionsImpl.java (91%)
 rename daisy-integration/src/test/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/impl/ExternalImporterDaisyImplTest.java (90%)
 rename daisy-integration/src/test/java/se/su/dsv/scipro/{daisyExternal => daisyexternal}/impl/ImporterTransactionsImplTest.java (90%)

diff --git a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
index 43c4d7ed10..b7c51b41f2 100644
--- a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
+++ b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
@@ -17,7 +17,7 @@ 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.daisyexternal.http.DaisyAPIImpl;
 import se.su.dsv.scipro.date.DateServiceImpl;
 import se.su.dsv.scipro.file.FileDescriptionRepo;
 import se.su.dsv.scipro.file.FileReferenceRepository;
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/exceptions/ExternalImportException.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/exceptions/ExternalImportException.java
similarity index 73%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/exceptions/ExternalImportException.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/exceptions/ExternalImportException.java
index 39e5ca95b6..18d0462a91 100755
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/exceptions/ExternalImportException.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/exceptions/ExternalImportException.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.exceptions;
+package se.su.dsv.scipro.daisyexternal.exceptions;
 
 public class ExternalImportException extends RuntimeException {
 
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPI.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPI.java
similarity index 70%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPI.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPI.java
index 19c17dfa1b..9b0b71a808 100644
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPI.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPI.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 import jakarta.ws.rs.core.Response;
 import java.io.InputStream;
@@ -6,7 +6,26 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.io.dto.AddThesisAuthor;
+import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
+import se.su.dsv.scipro.io.dto.CourseRegistration;
+import se.su.dsv.scipro.io.dto.Employee;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.Program;
+import se.su.dsv.scipro.io.dto.ProgramAdmission;
+import se.su.dsv.scipro.io.dto.ProjectParticipant;
+import se.su.dsv.scipro.io.dto.PublishingConsent;
+import se.su.dsv.scipro.io.dto.PublishingConsentLevel;
+import se.su.dsv.scipro.io.dto.ResearchArea;
+import se.su.dsv.scipro.io.dto.ResearchSubject;
+import se.su.dsv.scipro.io.dto.StudentProgramAdmission;
+import se.su.dsv.scipro.io.dto.Thesis;
+import se.su.dsv.scipro.io.dto.ThesisPublication;
+import se.su.dsv.scipro.io.dto.ThesisRejection;
+import se.su.dsv.scipro.io.dto.ThesisToBeCreated;
+import se.su.dsv.scipro.io.dto.ThesisToBeUpdated;
+import se.su.dsv.scipro.io.dto.Unit;
+import se.su.dsv.scipro.io.dto.UserName;
 
 public interface DaisyAPI {
     Set<ProjectParticipant> getContributors(Integer projectId);
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImpl.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImpl.java
similarity index 92%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImpl.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImpl.java
index aa41073c08..f930b51560 100755
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImpl.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 import static jakarta.ws.rs.client.Entity.xml;
 
@@ -16,9 +16,33 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import java.io.InputStream;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.io.dto.AddThesisAuthor;
+import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
+import se.su.dsv.scipro.io.dto.CourseRegistration;
+import se.su.dsv.scipro.io.dto.Employee;
+import se.su.dsv.scipro.io.dto.ObjectFactory;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.Program;
+import se.su.dsv.scipro.io.dto.ProgramAdmission;
+import se.su.dsv.scipro.io.dto.ProjectParticipant;
+import se.su.dsv.scipro.io.dto.PublishingConsent;
+import se.su.dsv.scipro.io.dto.PublishingConsentLevel;
+import se.su.dsv.scipro.io.dto.ResearchArea;
+import se.su.dsv.scipro.io.dto.ResearchSubject;
+import se.su.dsv.scipro.io.dto.StudentProgramAdmission;
+import se.su.dsv.scipro.io.dto.Thesis;
+import se.su.dsv.scipro.io.dto.ThesisPublication;
+import se.su.dsv.scipro.io.dto.ThesisRejection;
+import se.su.dsv.scipro.io.dto.ThesisToBeCreated;
+import se.su.dsv.scipro.io.dto.ThesisToBeUpdated;
+import se.su.dsv.scipro.io.dto.Unit;
+import se.su.dsv.scipro.io.dto.UserName;
 
 public class DaisyAPIImpl implements DaisyAPI {
 
@@ -364,8 +388,7 @@ public class DaisyAPIImpl implements DaisyAPI {
     @Override
     public OrganisationalUnit orgunit(final int unitId) {
         return () ->
-            target()
-                .path("orgunit")
+            units()
                 .path(Integer.toString(unitId))
                 .path("researchAreas")
                 .request(MediaType.APPLICATION_XML_TYPE)
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/OrganisationalUnit.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/OrganisationalUnit.java
similarity index 77%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/http/OrganisationalUnit.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/http/OrganisationalUnit.java
index 65f6699a53..7143685c68 100644
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/OrganisationalUnit.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/OrganisationalUnit.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 import java.util.List;
 import se.su.dsv.scipro.io.dto.ResearchArea;
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/PhotoResult.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/PhotoResult.java
similarity index 96%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/http/PhotoResult.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/http/PhotoResult.java
index 063c5cf9c1..dd75979b39 100644
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/PhotoResult.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/PhotoResult.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 import java.io.InputStream;
 import java.util.function.Function;
diff --git a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/Semester.java b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/Semester.java
similarity index 95%
rename from core/src/main/java/se/su/dsv/scipro/daisyExternal/http/Semester.java
rename to core/src/main/java/se/su/dsv/scipro/daisyexternal/http/Semester.java
index 9930163d84..fb47e26e55 100644
--- a/core/src/main/java/se/su/dsv/scipro/daisyExternal/http/Semester.java
+++ b/core/src/main/java/se/su/dsv/scipro/daisyexternal/http/Semester.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 public abstract class Semester {
 
diff --git a/core/src/main/xjb/daisy_api.xjb b/core/src/main/xjb/daisy_api.xjb
index abc4c4444f..a50ec543ca 100644
--- a/core/src/main/xjb/daisy_api.xjb
+++ b/core/src/main/xjb/daisy_api.xjb
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
-               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
+               xmlns:xs="http://www.w3.org/2001/XMLSchema"
+               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                version="3.0">
     <jaxb:globalBindings>
         <!-- Use java.util.Calendar instead of javax.xml.datatype.XMLGregorianCalendar for xs:dateTime -->
@@ -12,4 +13,11 @@
         <xjc:simple />
         <xjc:serializable uid="1" />
     </jaxb:globalBindings>
-</jaxb:bindings>
\ No newline at end of file
+
+    <jaxb:bindings schemaLocation="../xsd/daisy_api.xsd" node="/xs:schema">
+        <jaxb:bindings node="xs:simpleType[@name='status']" >
+            <jaxb:typesafeEnumClass name="Status2" />
+        </jaxb:bindings>
+    </jaxb:bindings>
+
+</jaxb:bindings>
diff --git a/core/src/main/xsd/daisy_api.xsd b/core/src/main/xsd/daisy_api.xsd
index a01921eadd..0fa8ed93e9 100755
--- a/core/src/main/xsd/daisy_api.xsd
+++ b/core/src/main/xsd/daisy_api.xsd
@@ -1,7 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<xs:schema version="1.0"
-
-           xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
     <xs:element name="addThesisAuthor" type="addThesisAuthor"/>
     <xs:element name="courseRegistrationForCourse" type="courseRegistrationGet"/>
@@ -62,6 +60,7 @@
     <xs:element name="degree" type="degree"/>
     <xs:element name="programAdmission" type="programAdmission"/>
     <xs:element name="student" type="student"/>
+
     <xs:complexType name="addThesisAuthor">
         <xs:sequence>
             <xs:element name="student" type="AddThesisAuthorStudent" minOccurs="1">
diff --git a/core/src/test/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImplTest.java b/core/src/test/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImplTest.java
similarity index 99%
rename from core/src/test/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImplTest.java
rename to core/src/test/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImplTest.java
index 44eb67b749..018db6224e 100644
--- a/core/src/test/java/se/su/dsv/scipro/daisyExternal/http/DaisyAPIImplTest.java
+++ b/core/src/test/java/se/su/dsv/scipro/daisyexternal/http/DaisyAPIImplTest.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.http;
+package se.su.dsv.scipro.daisyexternal.http;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ExternalImporter.java b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ExternalImporter.java
similarity index 82%
rename from daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ExternalImporter.java
rename to daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ExternalImporter.java
index 642668a636..f8800aa7e9 100755
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ExternalImporter.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ExternalImporter.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal;
+package se.su.dsv.scipro.daisyexternal;
 
 /**
  * Specifies interaction of an importing service component.
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ImporterTransactions.java b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ImporterTransactions.java
similarity index 92%
rename from daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ImporterTransactions.java
rename to daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ImporterTransactions.java
index bbf5af7707..1d8c59e6d5 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/ImporterTransactions.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/ImporterTransactions.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal;
+package se.su.dsv.scipro.daisyexternal;
 
 import java.util.Map;
 import se.su.dsv.scipro.io.dto.Person;
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
similarity index 97%
rename from daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImpl.java
rename to daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/impl/ExternalImporterDaisyImpl.java
index 6613b2e597..16cdfa3920 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,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.impl;
+package se.su.dsv.scipro.daisyexternal.impl;
 
 import jakarta.inject.Inject;
 import jakarta.transaction.Transactional;
@@ -6,10 +6,10 @@ import jakarta.ws.rs.ClientErrorException;
 import java.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.ExternalImporter;
-import se.su.dsv.scipro.daisyExternal.ImporterTransactions;
-import se.su.dsv.scipro.daisyExternal.exceptions.ExternalImportException;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.ExternalImporter;
+import se.su.dsv.scipro.daisyexternal.ImporterTransactions;
+import se.su.dsv.scipro.daisyexternal.exceptions.ExternalImportException;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.Employee;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.io.dto.Thesis;
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
similarity index 91%
rename from daisy-integration/src/main/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImpl.java
rename to daisy-integration/src/main/java/se/su/dsv/scipro/daisyexternal/impl/ImporterTransactionsImpl.java
index 395f5485ef..75b292c4da 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,23 +1,43 @@
-package se.su.dsv.scipro.daisyExternal.impl;
+package se.su.dsv.scipro.daisyexternal.impl;
 
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.transaction.Transactional;
 import jakarta.ws.rs.core.Response;
-import java.util.*;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Stream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.ImporterTransactions;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.daisyexternal.ImporterTransactions;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
+import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
+import se.su.dsv.scipro.io.dto.Course;
+import se.su.dsv.scipro.io.dto.CourseRegistration;
+import se.su.dsv.scipro.io.dto.EducationalLevel;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.ProgramType;
 import se.su.dsv.scipro.io.dto.ResearchArea;
+import se.su.dsv.scipro.io.dto.StudentProgramAdmission;
+import se.su.dsv.scipro.io.dto.Thesis;
+import se.su.dsv.scipro.io.dto.UserName;
 import se.su.dsv.scipro.match.ProgramService;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.project.ProjectService;
 import se.su.dsv.scipro.security.auth.roles.Roles;
-import se.su.dsv.scipro.system.*;
+import se.su.dsv.scipro.system.DegreeType;
+import se.su.dsv.scipro.system.Language;
 import se.su.dsv.scipro.system.Program;
+import se.su.dsv.scipro.system.ResearchAreaService;
+import se.su.dsv.scipro.system.User;
+import se.su.dsv.scipro.system.UserNameService;
+import se.su.dsv.scipro.system.UserService;
+import se.su.dsv.scipro.system.Username;
 import se.su.dsv.scipro.util.Pair;
 
 @Named
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyConsentService.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyConsentService.java
index ac3916fd07..b878f1998e 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyConsentService.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyConsentService.java
@@ -4,7 +4,7 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.WebApplicationException;
 import java.util.List;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.finalthesis.PublishingConsentService;
 import se.su.dsv.scipro.io.dto.PublishingConsentLevel;
 import se.su.dsv.scipro.project.Project;
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
index 9956543fb5..e5bd7507da 100644
--- 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
@@ -5,11 +5,11 @@ 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.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;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyUserSearchService.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyUserSearchService.java
index ad9a87d6d0..08b02e98a5 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyUserSearchService.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/DaisyUserSearchService.java
@@ -9,7 +9,7 @@ import java.util.Objects;
 import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.security.auth.roles.Roles;
 import se.su.dsv.scipro.system.User;
 import se.su.dsv.scipro.system.UserSearchProvider;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/SyncReviewerWithDaisy.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/SyncReviewerWithDaisy.java
index be10731801..e2788e0037 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/SyncReviewerWithDaisy.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/SyncReviewerWithDaisy.java
@@ -6,7 +6,7 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
 import java.util.Objects;
 import java.util.Set;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.io.dto.ProjectParticipant;
 import se.su.dsv.scipro.io.dto.Role;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivator.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivator.java
index 769507253b..0163896b67 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivator.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/GradingCompletedMilestoneActivator.java
@@ -9,7 +9,7 @@ import java.util.Optional;
 import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.grading.GradingCompletedEvent;
 import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
 import se.su.dsv.scipro.io.dto.Course;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ImportNationalCategories.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ImportNationalCategories.java
index 7ba4f4989e..39ed5e05d1 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ImportNationalCategories.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ImportNationalCategories.java
@@ -3,7 +3,7 @@ package se.su.dsv.scipro.integration.daisy.workers;
 import jakarta.inject.Inject;
 import java.util.List;
 import java.util.Optional;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.grading.NationalSubjectCategory;
 import se.su.dsv.scipro.grading.NationalSubjectCategoryService;
 import se.su.dsv.scipro.io.dto.ResearchSubject;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporter.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporter.java
index 3bd943ffca..d144f13d40 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporter.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectExporter.java
@@ -16,14 +16,22 @@ import java.util.function.Predicate;
 import java.util.stream.Stream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.finalseminar.FinalSeminar;
 import se.su.dsv.scipro.finalseminar.FinalSeminarParticipation;
 import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.finalthesis.FinalThesis;
 import se.su.dsv.scipro.finalthesis.FinalThesisService;
 import se.su.dsv.scipro.io.ExternalExporter;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.ProjectParticipant;
+import se.su.dsv.scipro.io.dto.ResearchAreaWithID;
+import se.su.dsv.scipro.io.dto.ResearchAreas;
+import se.su.dsv.scipro.io.dto.Role;
+import se.su.dsv.scipro.io.dto.Thesis;
+import se.su.dsv.scipro.io.dto.ThesisToBeUpdated;
+import se.su.dsv.scipro.io.dto.UnitWithID;
 import se.su.dsv.scipro.io.exceptions.ExternalExportException;
 import se.su.dsv.scipro.io.facade.ExporterFacade;
 import se.su.dsv.scipro.project.Project;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizer.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizer.java
index 26ebd3813b..b810269fee 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizer.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/ProjectFinalizer.java
@@ -6,7 +6,7 @@ import java.time.Instant;
 import java.util.Optional;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.grading.ThesisApprovedHistoryService;
 import se.su.dsv.scipro.io.dto.STATUS;
 import se.su.dsv.scipro.project.Project;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java
index ab796585ec..6b4bfe4a31 100644
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java
@@ -4,7 +4,7 @@ import jakarta.inject.Inject;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.finalthesis.FinalThesis;
 import se.su.dsv.scipro.finalthesis.FinalThesisService;
 import se.su.dsv.scipro.forum.ProjectForumService;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorker.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorker.java
index 77845ced07..9f24d5e9e3 100755
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorker.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorker.java
@@ -8,10 +8,10 @@ import java.util.*;
 import java.util.stream.Stream;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-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.http.Semester;
+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.http.Semester;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.io.dto.Program;
 import se.su.dsv.scipro.io.dto.ProgramAdmission;
diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java b/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
index d9362a5d74..7ffa26b12e 100755
--- a/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
+++ b/daisy-integration/src/main/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImpl.java
@@ -6,9 +6,19 @@ import java.math.BigDecimal;
 import java.util.Calendar;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.ExternalExporter;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.io.dto.AddThesisAuthor;
+import se.su.dsv.scipro.io.dto.AddThesisAuthorCourse;
+import se.su.dsv.scipro.io.dto.AddThesisAuthorStudent;
+import se.su.dsv.scipro.io.dto.EducationalLevel;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.ProjectParticipant;
+import se.su.dsv.scipro.io.dto.ResearchAreaWithID;
+import se.su.dsv.scipro.io.dto.ResearchAreas;
+import se.su.dsv.scipro.io.dto.Role;
+import se.su.dsv.scipro.io.dto.ThesisToBeCreated;
+import se.su.dsv.scipro.io.dto.UnitWithID;
 import se.su.dsv.scipro.io.exceptions.ExternalExportException;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.reusable.SciProUtilities;
diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImplTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ExternalImporterDaisyImplTest.java
similarity index 90%
rename from daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImplTest.java
rename to daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ExternalImporterDaisyImplTest.java
index 566ec3fd57..4d47af6ddb 100644
--- a/daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ExternalImporterDaisyImplTest.java
+++ b/daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ExternalImporterDaisyImplTest.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.impl;
+package se.su.dsv.scipro.daisyexternal.impl;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -9,8 +9,8 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.ImporterTransactions;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.ImporterTransactions;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.springdata.services.UnitService;
 import se.su.dsv.scipro.system.UserImportService;
diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImplTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ImporterTransactionsImplTest.java
similarity index 90%
rename from daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImplTest.java
rename to daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ImporterTransactionsImplTest.java
index baa7bda301..e47d29378b 100644
--- a/daisy-integration/src/test/java/se/su/dsv/scipro/daisyExternal/impl/ImporterTransactionsImplTest.java
+++ b/daisy-integration/src/test/java/se/su/dsv/scipro/daisyexternal/impl/ImporterTransactionsImplTest.java
@@ -1,4 +1,4 @@
-package se.su.dsv.scipro.daisyExternal.impl;
+package se.su.dsv.scipro.daisyexternal.impl;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.AdditionalAnswers.returnsFirstArg;
@@ -12,12 +12,17 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.io.dto.UserName;
 import se.su.dsv.scipro.match.ProgramService;
 import se.su.dsv.scipro.project.ProjectService;
-import se.su.dsv.scipro.system.*;
+import se.su.dsv.scipro.system.ProjectTypeService;
+import se.su.dsv.scipro.system.ResearchAreaService;
+import se.su.dsv.scipro.system.User;
+import se.su.dsv.scipro.system.UserNameService;
+import se.su.dsv.scipro.system.UserService;
+import se.su.dsv.scipro.system.Username;
 
 @ExtendWith(MockitoExtension.class)
 public class ImporterTransactionsImplTest {
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 ea13a62418..7a8e11d798 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
@@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.grading.GradingCompletedEvent;
 import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
 import se.su.dsv.scipro.io.dto.Course;
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 1cfcf78361..fec03c6a38 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
@@ -14,11 +14,16 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.finalthesis.FinalThesisService;
 import se.su.dsv.scipro.io.ExternalExporter;
-import se.su.dsv.scipro.io.dto.*;
+import se.su.dsv.scipro.io.dto.AuthorProjectParticipant;
+import se.su.dsv.scipro.io.dto.Person;
+import se.su.dsv.scipro.io.dto.ProjectParticipant;
+import se.su.dsv.scipro.io.dto.Role;
+import se.su.dsv.scipro.io.dto.Thesis;
+import se.su.dsv.scipro.io.dto.ThesisToBeUpdated;
 import se.su.dsv.scipro.io.facade.ExporterFacade;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.project.ProjectRepo;
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 133616e85a..e648f07ee5 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
@@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.grading.ThesisApprovedHistoryService;
 import se.su.dsv.scipro.io.dto.STATUS;
 import se.su.dsv.scipro.io.dto.Thesis;
diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorkerTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorkerTest.java
index 6789af1f8f..2ac5ec1138 100644
--- a/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorkerTest.java
+++ b/daisy-integration/src/test/java/se/su/dsv/scipro/integration/daisy/workers/UserImportWorkerTest.java
@@ -4,15 +4,19 @@ import static java.util.Arrays.asList;
 import static org.mockito.Mockito.*;
 
 import jakarta.persistence.EntityManager;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Optional;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-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.ExternalImporter;
+import se.su.dsv.scipro.daisyexternal.ImporterTransactions;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.Person;
 import se.su.dsv.scipro.io.dto.Thesis;
 import se.su.dsv.scipro.match.ProgramService;
diff --git a/daisy-integration/src/test/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImplTest.java b/daisy-integration/src/test/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImplTest.java
index 930ec58dc6..e9c044dabe 100644
--- a/daisy-integration/src/test/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImplTest.java
+++ b/daisy-integration/src/test/java/se/su/dsv/scipro/io/impl/ExternalExporterDaisyImplTest.java
@@ -16,7 +16,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.io.dto.ThesisToBeCreated;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.reusable.SciProUtilities;
diff --git a/view/src/main/java/se/su/dsv/scipro/grading/SendToExaminer.java b/view/src/main/java/se/su/dsv/scipro/grading/SendToExaminer.java
index 81528142ae..25c88e47b6 100644
--- a/view/src/main/java/se/su/dsv/scipro/grading/SendToExaminer.java
+++ b/view/src/main/java/se/su/dsv/scipro/grading/SendToExaminer.java
@@ -20,7 +20,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import se.su.dsv.scipro.components.BootstrapDatePicker;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
 import se.su.dsv.scipro.file.FileDescription;
 import se.su.dsv.scipro.file.FileService;
 import se.su.dsv.scipro.finalseminar.FinalSeminar;
diff --git a/view/src/main/java/se/su/dsv/scipro/profile/DaisyPicture.java b/view/src/main/java/se/su/dsv/scipro/profile/DaisyPicture.java
index 4ed217b535..d2e964e3b2 100644
--- a/view/src/main/java/se/su/dsv/scipro/profile/DaisyPicture.java
+++ b/view/src/main/java/se/su/dsv/scipro/profile/DaisyPicture.java
@@ -14,8 +14,8 @@ import org.apache.wicket.injection.Injector;
 import org.apache.wicket.request.resource.AbstractResource;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
-import se.su.dsv.scipro.daisyExternal.http.PhotoResult;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.PhotoResult;
 import se.su.dsv.scipro.data.dataobjects.Member;
 import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.project.Project;
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 768b84e0df..4c3fdfd589 100755
--- a/view/src/test/java/se/su/dsv/scipro/SciProTest.java
+++ b/view/src/test/java/se/su/dsv/scipro/SciProTest.java
@@ -30,8 +30,8 @@ import se.su.dsv.scipro.checklist.ChecklistCategoryRepo;
 import se.su.dsv.scipro.checklist.ChecklistQuestionRepo;
 import se.su.dsv.scipro.checklist.ChecklistService;
 import se.su.dsv.scipro.checklist.ChecklistTemplateService;
-import se.su.dsv.scipro.daisyExternal.http.DaisyAPI;
-import se.su.dsv.scipro.daisyExternal.http.PhotoResult;
+import se.su.dsv.scipro.daisyexternal.http.DaisyAPI;
+import se.su.dsv.scipro.daisyexternal.http.PhotoResult;
 import se.su.dsv.scipro.data.enums.DateStyle;
 import se.su.dsv.scipro.date.DateService;
 import se.su.dsv.scipro.examiner.pages.ExaminerStartPage;

From 5439d77d731dcbd2d4f674780eee0cba5ed3c013 Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Fri, 17 Jan 2025 09:45:27 +0100
Subject: [PATCH 4/5] Require authors to fill in background, literature,
 problem, method, and interests when submitting ideas (#72)

Require authors to fill in background, literature, method, problem, and interests when submitting an idea.

Fixes #37

## How to test
1. Navigate to https://scipro-student-idea-form-required-fields.branch.dsv.su.se/
2. Log in as `stig@example.com`
3. Go to "Ideas" / "My ideas"
4. Attempt to submit an idea without either of background, literature, method, problem, or interests

Co-authored-by: Nico Athanassiadis <nico@dsv.su.se>
Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/72
Reviewed-by: Nico Athanassiadis <nico@dsv.su.se>
Co-authored-by: Andreas Svanberg <andreass@dsv.su.se>
Co-committed-by: Andreas Svanberg <andreass@dsv.su.se>
---
 .../se/su/dsv/scipro/DataInitializer.java     |  5 ++
 .../match/IdeaTholanderCompletionPanel.html   |  5 ++
 .../match/IdeaTholanderCompletionPanel.java   | 47 +++++++------------
 .../match/ProjectIdeaSubmissionPanel.html     |  9 +++-
 .../ProjectIdeaSubmissionPanel.properties     |  2 +-
 5 files changed, 35 insertions(+), 33 deletions(-)

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 7ab805cd7a..85a1f413a7 100644
--- a/core/src/main/java/se/su/dsv/scipro/DataInitializer.java
+++ b/core/src/main/java/se/su/dsv/scipro/DataInitializer.java
@@ -172,6 +172,11 @@ public class DataInitializer implements Lifecycle {
         stina_student = createStudent(STUDENT_2);
         sid_student = createStudent(STUDENT_3);
         simon_student = createStudent(STUDENT_4);
+
+        // Used to test submitting ideas
+        // can not be used as author on any idea
+        // can not be used as author on any project
+        createStudent("Stig");
     }
 
     private User createStudent(String firstName) {
diff --git a/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.html b/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.html
index 40725f810c..6fd8e9a15e 100755
--- a/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.html
+++ b/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.html
@@ -8,6 +8,7 @@
 <wicket:panel>
     <div class="mb-3">
         <label class="col-form-label" wicket:for="background">Background</label>
+        <div wicket:id="background_feedback"></div>
         <textarea wicket:id="background" class="form-control" rows="4"></textarea>
         <small class="form-text text-body-secondary">
             Describe the background of your topic, preferably both theoretical, empirical and/or practical.
@@ -16,6 +17,7 @@
 
     <div class="mb-3">
         <label class="col-form-label" wicket:for="literature">Literature</label>
+        <div wicket:id="literature_feedback"></div>
         <textarea wicket:id="literature" class="form-control" rows="4"></textarea>
         <small class="form-text text-body-secondary">
             Describe the connection to your background, for example literature, theory and methodology related to the topic, courses that you have taken that relates to the topic.
@@ -24,6 +26,7 @@
 
     <div class="mb-3">
         <label class="col-form-label" wicket:for="problem">Problem</label>
+        <div wicket:id="problem_feedback"></div>
         <textarea wicket:id="problem" class="form-control" rows="4"></textarea>
         <small class="form-text text-body-secondary">
             Here you describe the problem you want to address and solve by your work, preferably formulated as a research question.
@@ -32,6 +35,7 @@
 
     <div class="mb-3">
         <label class="col-form-label" wicket:for="method">Method</label>
+        <div wicket:id="method_feedback"></div>
         <textarea wicket:id="method" class="form-control" rows="4"></textarea>
         <small class="form-text text-body-secondary">
             The method you plan to use in order to solve the problem and answer the research question.
@@ -40,6 +44,7 @@
 
     <div class="mb-3">
         <label class="col-form-label" wicket:for="interests">My interests</label>
+        <div wicket:id="interests_feedback"></div>
         <textarea wicket:id="interests" class="form-control" rows="4"></textarea>
         <small class="form-text text-body-secondary">
             Please note that when you propose your own topic, it is not guaranteed that your topic will be approved. In that case, you will be assigned a different topic by your supervisor. Specify which topics of interest you have, relating to the research fields or the courses that you have taken at DSV.
diff --git a/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.java b/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.java
index 26d4ce15c0..d2040c2644 100755
--- a/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/match/IdeaTholanderCompletionPanel.java
@@ -1,6 +1,7 @@
 package se.su.dsv.scipro.match;
 
 import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LambdaModel;
@@ -12,36 +13,20 @@ public class IdeaTholanderCompletionPanel extends Panel {
         super(id, model);
         final IModel<TholanderBox> tholanderBox = model.map(Idea::getTholanderBox);
 
-        final StringValidator lengthValidator = StringValidator.maximumLength(TholanderBox.MAX_CHARS);
-        add(
-            new TextArea<>(
-                "background",
-                LambdaModel.of(tholanderBox, TholanderBox::getBackground, TholanderBox::setBackground)
-            ).add(lengthValidator)
-        );
-        add(
-            new TextArea<>(
-                "literature",
-                LambdaModel.of(tholanderBox, TholanderBox::getLiterature, TholanderBox::setLiterature)
-            ).add(lengthValidator)
-        );
-        add(
-            new TextArea<>(
-                "problem",
-                LambdaModel.of(tholanderBox, TholanderBox::getProblem, TholanderBox::setProblem)
-            ).add(lengthValidator)
-        );
-        add(
-            new TextArea<>(
-                "method",
-                LambdaModel.of(tholanderBox, TholanderBox::getMethod, TholanderBox::setMethod)
-            ).add(lengthValidator)
-        );
-        add(
-            new TextArea<>(
-                "interests",
-                LambdaModel.of(tholanderBox, TholanderBox::getInterests, TholanderBox::setInterests)
-            ).add(lengthValidator)
-        );
+        textField("background", LambdaModel.of(tholanderBox, TholanderBox::getBackground, TholanderBox::setBackground));
+        textField("literature", LambdaModel.of(tholanderBox, TholanderBox::getLiterature, TholanderBox::setLiterature));
+        textField("problem", LambdaModel.of(tholanderBox, TholanderBox::getProblem, TholanderBox::setProblem));
+        textField("method", LambdaModel.of(tholanderBox, TholanderBox::getMethod, TholanderBox::setMethod));
+        textField("interests", LambdaModel.of(tholanderBox, TholanderBox::getInterests, TholanderBox::setInterests));
+    }
+
+    private void textField(String id, IModel<String> model) {
+        TextArea<String> textArea = new TextArea<>(id, model);
+        textArea.add(StringValidator.maximumLength(TholanderBox.MAX_CHARS));
+        textArea.setRequired(true);
+        add(textArea);
+
+        ComponentFeedbackPanel feedback = new ComponentFeedbackPanel(id + "_feedback", textArea);
+        add(feedback);
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.html b/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.html
index 0a61f7fb47..226197684d 100755
--- a/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.html
+++ b/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.html
@@ -17,7 +17,14 @@
         an idea if you couldn't find any suitable supervisor provided ideas.
     </div>
 
-    <form wicket:id="ideaForm">
+    <!--
+        Turn off all client-side validation using novalidate.
+        All input is validated server-side, and we want to validate it
+        that way to get nice error messages.
+        However, we also want to maintain the required/minlength/whatever
+        attributes on the input fields for accessibility.
+     -->
+    <form wicket:id="ideaForm" novalidate>
         <div class="mb-3">
             <label class="col-form-label" wicket:for="title">Title</label>
             <p class="form-text">
diff --git a/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.properties b/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.properties
index f713e10b6b..30169daf53 100644
--- a/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.properties
+++ b/view/src/main/java/se/su/dsv/scipro/match/ProjectIdeaSubmissionPanel.properties
@@ -26,7 +26,7 @@ you.are.partner.on.other.idea= You have already been added as a partner to anoth
 too.many.authors= Too many authors for a ${name}-idea. May not be more than ${maxAuthors} including yourself.
 too.few.authors= Too few authors for a ${name}-idea. Must be at least ${minAuthors} including yourself.
 keywordError= You need to select between 1 and 5 keywords.
-submissionFailed= Idea could not be submitted.
+submissionFailed= Idea could not be submitted. Correct the highlighted fields and try again.
 ideaSubmitted= You have successfully submitted your ${projectType.name} student idea, for the application period \
   ${applicationPeriod.name}.
 ideaUpdated= You have successfully updated your ${projectType.name} student idea, in the application period \

From 13efe4bada60e7bc5e30a1c7888d713f0366fc05 Mon Sep 17 00:00:00 2001
From: Nico Athanassiadis <nico@dsv.su.se>
Date: Thu, 23 Jan 2025 20:50:18 +0100
Subject: [PATCH 5/5] Updated Spring Boot and Springdoc versions (#91)

The updated versions should fix CVE-2024-45801.
Was forced to update spring-boot 3.4.1 to be able to use the latest version of springdoc as per the
springdoc compability matrix.

The compability matrix can be found [here](https://springdoc.org/#what-is-the-compatibility-matrix-of-springdoc-openapi-with-spring-boot)

fixes issue #80

Reviewed-on: https://gitea.dsv.su.se/DMC/scipro/pulls/91
Reviewed-by: Andreas Svanberg <andreass@dsv.su.se>
Co-authored-by: Nico Athanassiadis <nico@dsv.su.se>
Co-committed-by: Nico Athanassiadis <nico@dsv.su.se>
---
 pom.xml | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index a4b4f57961..3e5972cbae 100755
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,8 @@
         <jersey.version>3.1.6</jersey.version>
         <poi.version>5.2.5</poi.version>
         <jackson.version>2.17.0</jackson.version>
+        <spring.boot.version>3.4.1</spring.boot.version>
+        <springdoc.openapi.version>2.8.3</springdoc.openapi.version>
 
         <!-- Database stuff -->
         <database.showSql>false</database.showSql>
@@ -100,7 +102,7 @@
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-dependencies</artifactId>
-                <version>3.2.12</version>
+                <version>${spring.boot.version}</version>
                 <scope>import</scope>
                 <type>pom</type>
             </dependency>
@@ -261,7 +263,7 @@
             <dependency>
                 <groupId>org.springdoc</groupId>
                 <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
-                <version>2.5.0</version>
+                <version>${springdoc.openapi.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>