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/2] 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/2] 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());