diff --git a/pom.xml b/pom.xml index 897db063..cd636d8f 100644 --- a/pom.xml +++ b/pom.xml @@ -796,6 +796,11 @@ + + org.springframework.boot + spring-boot-starter-data-redis + 4.0.5 + org.springframework spring-webmvc diff --git a/src/main/java/de/imi/mopat/config/RedisCacheConfig.java b/src/main/java/de/imi/mopat/config/RedisCacheConfig.java new file mode 100644 index 00000000..bffe4ebc --- /dev/null +++ b/src/main/java/de/imi/mopat/config/RedisCacheConfig.java @@ -0,0 +1,34 @@ +package de.imi.mopat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.GenericJacksonJsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; + +@Configuration +public class RedisCacheConfig { + + @Bean + public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(5)) + .serializeKeysWith( + RedisSerializationContext.SerializationPair + .fromSerializer(new StringRedisSerializer()) + ) + .serializeValuesWith( + RedisSerializationContext.SerializationPair + .fromSerializer(GenericJacksonJsonRedisSerializer.builder().build()) + ) + .disableCachingNullValues(); + return RedisCacheManager.builder(connectionFactory) + .cacheDefaults(config) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/de/imi/mopat/controller/BundleController.java b/src/main/java/de/imi/mopat/controller/BundleController.java index ea31605c..d7f25e3f 100644 --- a/src/main/java/de/imi/mopat/controller/BundleController.java +++ b/src/main/java/de/imi/mopat/controller/BundleController.java @@ -3,18 +3,10 @@ import de.imi.mopat.dao.AnswerDao; import de.imi.mopat.dao.BundleDao; import de.imi.mopat.dao.ConditionDao; -import de.imi.mopat.dao.ExportTemplateDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.ScoreDao; import de.imi.mopat.dao.user.AclClassDao; import de.imi.mopat.dao.user.AclObjectIdentityDao; -import de.imi.mopat.helper.controller.AuthService; -import de.imi.mopat.helper.controller.BundleService; -import de.imi.mopat.helper.controller.LocaleHelper; -import de.imi.mopat.helper.controller.UserService; -import de.imi.mopat.helper.controller.ClinicService; -import de.imi.mopat.helper.model.BundleDTOMapper; -import de.imi.mopat.helper.model.QuestionnaireDTOMapper; +import de.imi.mopat.helper.controller.*; import de.imi.mopat.model.Answer; import de.imi.mopat.model.Bundle; import de.imi.mopat.model.BundleClinic; @@ -26,7 +18,6 @@ import de.imi.mopat.model.conditions.SelectAnswerCondition; import de.imi.mopat.model.conditions.SliderAnswerThresholdCondition; import de.imi.mopat.model.dto.BundleDTO; -import de.imi.mopat.model.dto.BundleQuestionnaireDTO; import de.imi.mopat.model.dto.QuestionnaireDTO; import de.imi.mopat.validator.BundleDTOValidator; @@ -62,7 +53,7 @@ public class BundleController { @Autowired private ScoreDao scoreDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private BundleDTOValidator bundleDTOValidator; @Autowired @@ -188,7 +179,7 @@ public String removeBundle(@RequestParam(value = "id", required = true) final Lo for (BundleQuestionnaire bundleQuestionnaire : bundle.getBundleQuestionnaires()) { Questionnaire questionnaire = bundleQuestionnaire.getQuestionnaire(); questionnaire.removeBundleQuestionnaire(bundleQuestionnaire); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); } // Delete the corresponding conditions diff --git a/src/main/java/de/imi/mopat/controller/ExportMappingController.java b/src/main/java/de/imi/mopat/controller/ExportMappingController.java index 2f3d3a6c..df719e2d 100644 --- a/src/main/java/de/imi/mopat/controller/ExportMappingController.java +++ b/src/main/java/de/imi/mopat/controller/ExportMappingController.java @@ -1,7 +1,5 @@ package de.imi.mopat.controller; -import ca.uhn.fhir.context.ConfigurationException; -import ca.uhn.fhir.parser.DataFormatException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; @@ -13,13 +11,12 @@ import de.imi.mopat.dao.ExportRuleFormatDao; import de.imi.mopat.dao.ExportTemplateDao; import de.imi.mopat.dao.QuestionDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.ScoreDao; import de.imi.mopat.helper.controller.Constants; import de.imi.mopat.helper.controller.FhirVersionHelper; import de.imi.mopat.io.importer.ImportQuestionnaireError; import de.imi.mopat.io.importer.ImportQuestionnaireValidation; -import de.imi.mopat.io.importer.fhir.FhirDstu3Helper; +import de.imi.mopat.helper.controller.QuestionnaireService; import de.imi.mopat.helper.controller.StringUtilities; import de.imi.mopat.io.ExportTemplateImporter; import de.imi.mopat.io.importer.fhir.FhirImporter; @@ -55,15 +52,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; + import jakarta.servlet.http.HttpServletRequest; import javax.xml.parsers.ParserConfigurationException; @@ -108,7 +98,7 @@ public class ExportMappingController { @Autowired private ExportTemplateDao exportTemplateDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private ScoreDao scoreDao; @Autowired @@ -143,9 +133,8 @@ public void initListBinder(final WebDataBinder binder) { * object. */ public List getAllMappings(final Long id) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); - List exportTemplates = new ArrayList<>(questionnaire.getExportTemplates()); - return exportTemplates; + Optional questionnaire = questionnaireService.getQuestionnaireById(id); + return new ArrayList<>(questionnaire.get().getExportTemplates()); } /** @@ -170,14 +159,14 @@ public ArrayList getExportTemplateTypeList() { @PreAuthorize("hasRole('ROLE_EDITOR')") public String showMapping(@RequestParam(value = "id", required = true) final Long id, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); - if (questionnaire == null) { + Optional questionnaire = questionnaireService.getQuestionnaireById(id); + if (questionnaire.isEmpty()) { //clear the models attributes that are set in the @ModelAttribute // methods model.addAttribute("exportTemplateTypeList", null); return "redirect:/questionnaire/list"; } - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.get()); model.addAttribute("allMappings", this.getAllMappings(id)); return "mapping/list"; } @@ -195,9 +184,9 @@ public String showMapping(@RequestParam(value = "id", required = true) final Lon @PreAuthorize("hasRole('ROLE_EDITOR')") public String showUploadForm(@RequestParam(value = "id", required = true) final Long id, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); + Optional questionnaire = questionnaireService.getQuestionnaireById(id); model.addAttribute("export", new ExportTemplate()); - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.orElse(null)); return "mapping/uploadtemplate"; } @@ -288,7 +277,7 @@ public String handleUpload( return showUploadForm(questionnaireId, model); } - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); + Questionnaire questionnaire = questionnaireService.getQuestionnaireById(questionnaireId).orElse(null); List exportTemplates = ExportTemplate.createExportTemplates(name, exportTemplateType, file, configurationGroupDao, exportTemplateDao); @@ -311,7 +300,7 @@ public String handleUpload( } File uploadFile = new File(contextPath, uploadFilename); uploadFile.createNewFile(); - + //Do the upload for FHIR resource. if (ExportTemplateType.isExportTemplateTypeAFhirType(exportTemplateType)) { try { @@ -353,7 +342,7 @@ public String handleUpload( } // maybe not necessary - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); model.addAttribute("questionnaire", questionnaire); model.addAttribute("allMappings", this.getAllMappings(questionnaireId)); @@ -398,7 +387,7 @@ public String removeExportTemplate(@RequestParam(value = "id", required = true) } questionnaire.removeExportTemplate(exportTemplate); exportTemplateDao.remove(exportTemplate); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); } return showMapping(questionnaire.getId(), model); @@ -423,7 +412,7 @@ public String assignTemplate(@RequestParam(value = "id", required = true) final // reasons // using the questionnaireDao is a workaround to also get all recently // added questions of the questionnaire - questionnaire = questionnaireDao.getElementById(questionnaire.getId()); + questionnaire = questionnaireService.getQuestionnaireById(questionnaire.getId()).get(); // Sort the scores List scores = new ArrayList<>(); diff --git a/src/main/java/de/imi/mopat/controller/QuestionController.java b/src/main/java/de/imi/mopat/controller/QuestionController.java index eeef571d..76736a37 100644 --- a/src/main/java/de/imi/mopat/controller/QuestionController.java +++ b/src/main/java/de/imi/mopat/controller/QuestionController.java @@ -3,6 +3,7 @@ import de.imi.mopat.dao.*; import de.imi.mopat.helper.controller.Constants; import de.imi.mopat.helper.controller.LocaleHelper; +import de.imi.mopat.helper.controller.QuestionnaireService; import de.imi.mopat.helper.model.QuestionDTOMapper; import de.imi.mopat.helper.controller.StringUtilities; import de.imi.mopat.model.*; @@ -56,7 +57,7 @@ public class QuestionController { @Autowired private SliderAnswerValidator sliderAnswerValidator; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private SliderIconDao sliderIconDao; @@ -135,9 +136,9 @@ public ArrayList getQuestionTypeList() { @PreAuthorize("hasRole('ROLE_EDITOR')") public String showQuestions(@RequestParam(value = "id", required = true) final Long id, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); + Optional questionnaire = questionnaireService.getQuestionnaireById(id); - if (questionnaire == null) { + if (questionnaire.isEmpty()) { //clear the models attributes that are set in the @ModelAttribute // methods model.addAttribute("question", null); @@ -149,7 +150,7 @@ public String showQuestions(@RequestParam(value = "id", required = true) final L // map, which // contains the question texts grouped by the country and languages. Map>> localizedQuestionTextsForQuestion = new HashMap<>(); - for (Question question : questionnaire.getQuestions()) { + for (Question question : questionnaire.get().getQuestions()) { // Get the question texts grouped by country from the current // question SortedMap> groupedLocalizedQuestionTextByCountry = question.getLocalizedQuestionTextGroupedByCountry(); @@ -163,7 +164,7 @@ public String showQuestions(@RequestParam(value = "id", required = true) final L question.setHasScores(scoreDao.hasScore(question)); } model.addAttribute("localizedQuestionTextsForQuestion", localizedQuestionTextsForQuestion); - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.get()); return "question/list"; } @@ -330,8 +331,8 @@ public String editQuestion(@RequestParam final String action, return "question/edit"; } - Questionnaire questionnaire = questionnaireDao.getElementById( - questionDTO.getQuestionnaireId()); + Questionnaire questionnaire = questionnaireService.getQuestionnaireById( + questionDTO.getQuestionnaireId()).orElse(null); Integer minNumberAnswers = questionDTO.getMinNumberAnswers(); Integer maxNumberAnswers = questionDTO.getMaxNumberAnswers(); Map localizedQuestionText = removePTags(questionDTO); @@ -359,7 +360,7 @@ public String editQuestion(@RequestParam final String action, } // Merge in any case, because the questionnaire is already persisted questionDao.merge(question); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); // Since the next step is a redirect to a controller which loads a // new model, @@ -604,7 +605,7 @@ public String removeQuestion(@RequestParam(value = "id", required = true) final deleteFile.delete(); } - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); // Since the next step is a redirect to a controller which loads a // new model, @@ -628,7 +629,7 @@ public String removeQuestion(@RequestParam(value = "id", required = true) final public @ResponseBody String repositionQuestion( @RequestParam(value = "questionIds", required = true) final List questionIds, @RequestParam(value = "questionnaireId", required = true) final Long questionnaireId) { - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); + Questionnaire questionnaire = questionnaireService.getQuestionnaireById(questionnaireId).get(); // Check if any condition trigger is after its target for (int i = 0; i < questionIds.size(); i++) { @@ -661,7 +662,7 @@ public String removeQuestion(@RequestParam(value = "id", required = true) final for (Question question : questionnaire.getQuestions()) { question.setPosition((questionIds.indexOf(question.getId()) + 1)); } - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); return ""; } diff --git a/src/main/java/de/imi/mopat/controller/QuestionnaireController.java b/src/main/java/de/imi/mopat/controller/QuestionnaireController.java index 504fc16e..7ce34a12 100644 --- a/src/main/java/de/imi/mopat/controller/QuestionnaireController.java +++ b/src/main/java/de/imi/mopat/controller/QuestionnaireController.java @@ -1,15 +1,6 @@ package de.imi.mopat.controller; -import de.imi.mopat.dao.AnswerDao; -import de.imi.mopat.dao.BundleDao; -import de.imi.mopat.dao.ConditionDao; -import de.imi.mopat.dao.ConfigurationDao; -import de.imi.mopat.dao.ConfigurationGroupDao; -import de.imi.mopat.dao.ExportTemplateDao; -import de.imi.mopat.dao.OperatorDao; -import de.imi.mopat.dao.QuestionDao; -import de.imi.mopat.dao.QuestionnaireDao; -import de.imi.mopat.dao.ScoreDao; +import de.imi.mopat.dao.*; import de.imi.mopat.helper.controller.AuthService; import de.imi.mopat.helper.controller.FhirVersionHelper; import de.imi.mopat.helper.controller.LocaleHelper; @@ -46,16 +37,7 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.SortedMap; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.xml.parsers.DocumentBuilder; @@ -149,7 +131,7 @@ public class QuestionnaireController { @RequestMapping(value = "/questionnaire/list", method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_EDITOR')") public String listQuestionnaires(final Model model) { - List allQuestionnaires = questionnaireDao.getAllElements(); + List allQuestionnaires = questionnaireService.getAllQuestionnaires(); // This map contians a questionnaire id as key and a set with all // languages // which are available for all questions in this questionnaire. @@ -250,7 +232,7 @@ public String edit(@RequestParam final String action, Questionnaire questionnaire = questionnaireService.saveOrUpdateQuestionnaire( questionnaireDTO, logo, principalId); Boolean hasQuestionnaireConditions = questionnaireService.hasQuestionnaireConditions( - questionnaireDao.getElementById(questionnaireDTO.getId())); + questionnaireService.getQuestionnaireById(questionnaireDTO.getId()).orElse(null)); redirectAttributes.addFlashAttribute("hasQuestionnaireConditions", hasQuestionnaireConditions); if (action.equals("saveEditButton")) { @@ -272,10 +254,10 @@ private void fillModelForValidationErrors(QuestionnaireDTO questionnaireDTO, Mod boolean isEditableState = true; if (questionnaireDTO.getId() != null) { - Questionnaire existingQuestionnaire = questionnaireDao.getElementById( + Optional existingQuestionnaire = questionnaireService.getQuestionnaireById( questionnaireDTO.getId()); - if (existingQuestionnaire != null) { - questionnaireDTO.setLogo(existingQuestionnaire.getLogo()); + if (existingQuestionnaire.isPresent()) { + questionnaireDTO.setLogo(existingQuestionnaire.get().getLogo()); isEditableState = questionnaireService.editingQuestionnaireAllowed( questionnaireDTO); } @@ -298,11 +280,11 @@ private void fillModelForValidationErrors(QuestionnaireDTO questionnaireDTO, Mod @PreAuthorize("hasRole('ROLE_EDITOR')") public String removeQuestionnaire(@RequestParam(value = "id", required = true) final Long id, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); - if (questionnaire != null) { - if (questionnaire.isDeletable()) { + Optional questionnaire = questionnaireService.getQuestionnaireById(id); + if (questionnaire.isPresent()) { + if (questionnaire.get().isDeletable()) { // Delete the associated conditions - for (Condition condition : conditionDao.getConditionsByTarget(questionnaire)) { + for (Condition condition : conditionDao.getConditionsByTarget(questionnaire.get())) { if (condition instanceof SelectAnswerCondition || condition instanceof SliderAnswerThresholdCondition) { // Refresh the trigger so that multiple conditions of @@ -315,7 +297,7 @@ public String removeQuestionnaire(@RequestParam(value = "id", required = true) f conditionDao.remove(condition); } - for (ExportTemplate exportTemplate : questionnaire.getExportTemplates()) { + for (ExportTemplate exportTemplate : questionnaire.get().getExportTemplates()) { //Remove ExportTemplates manually to prevent integrity clashes with scores exportTemplateDao.remove(exportTemplate); } @@ -323,7 +305,7 @@ public String removeQuestionnaire(@RequestParam(value = "id", required = true) f // Collect all scores in an array list to make sure they will // be removed in correct order List scoresToDelete = new ArrayList<>(); - for (Score scoreToDelete : questionnaire.getScores()) { + for (Score scoreToDelete : questionnaire.get().getScores()) { List dependingScores = scoreToDelete.getDependingScores(); // Sort depending scores by amount of their depending // scores to prevent database errors @@ -351,7 +333,7 @@ public String removeQuestionnaire(@RequestParam(value = "id", required = true) f } // Delete connection to the bundles - for (BundleQuestionnaire bundleQuestionnaire : questionnaire.getBundleQuestionnaires()) { + for (BundleQuestionnaire bundleQuestionnaire : questionnaire.get().getBundleQuestionnaires()) { Bundle bundle = bundleQuestionnaire.getBundle(); bundle.removeBundleQuestionnaire(bundleQuestionnaire); //Update the position of all following bundleQuestionnaires @@ -364,17 +346,17 @@ public String removeQuestionnaire(@RequestParam(value = "id", required = true) f } bundleDao.merge(bundle); } - questionnaire.removeAllBundleQuestionnaires(); + questionnaire.get().removeAllBundleQuestionnaires(); questionnaireVersionGroupService.removeQuestionnaire( - questionnaire.getQuestionnaireVersionGroupId(), questionnaire); - questionnaireDao.remove(questionnaire); + questionnaire.get().getQuestionnaireVersionGroupId(), questionnaire.get()); + questionnaireService.removeQuestionnaire(questionnaire.get()); model.addAttribute("messageSuccess", messageSource.getMessage("questionnaire.error" + ".deleteQuestionnairePossible", - new Object[]{questionnaire.getName()}, LocaleContextHolder.getLocale())); + new Object[]{questionnaire.get().getName()}, LocaleContextHolder.getLocale())); } else { model.addAttribute("messageFail", messageSource.getMessage( "questionnaire.error" + ".deleteQuestionnaireNotPossible", - new Object[]{questionnaire.getName()}, LocaleContextHolder.getLocale())); + new Object[]{questionnaire.get().getName()}, LocaleContextHolder.getLocale())); } } return listQuestionnaires(model); @@ -397,9 +379,9 @@ public ResponseEntity downloadQuestionnaire( @RequestParam(value = "id", required = true) final Long id, @RequestParam(value = "type", required = true) final List types, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); + Optional questionnaire = questionnaireService.getQuestionnaireById(id); - if (questionnaire == null) { + if (questionnaire.isEmpty()) { HttpHeaders headers = new HttpHeaders(); headers.add("Location", "list"); return new ResponseEntity<>(null, headers, HttpStatus.FOUND); @@ -412,16 +394,16 @@ public ResponseEntity downloadQuestionnaire( MetadataExporter exporter = metadataExporterFactory.getMetadataExporter( MetadataFormat.valueOf(type)); - for (Question question : questionnaire.getQuestions()) { + for (Question question : questionnaire.get().getQuestions()) { question.setHasConditionsAsTarget(conditionDao.isConditionTarget(question)); } - byte[] data = exporter.export(questionnaire, messageSource, configurationDao, + byte[] data = exporter.export(questionnaire.get(), messageSource, configurationDao, configurationGroupDao, exportTemplateDao, questionnaireDao, questionDao, scoreDao); // Create a windows-compliant path/filename Path path = Paths.get( - questionnaire.getName().replaceAll("[\\\\/:;*?\"<>|]", "").replaceAll(" ", "_") + questionnaire.get().getName().replaceAll("[\\\\/:;*?\"<>|]", "").replaceAll(" ", "_") + "_" + type + MetadataFormat.valueOf(type).getFileExtension()); paths.add(path); @@ -455,7 +437,7 @@ public ResponseEntity downloadQuestionnaire( ByteArrayResource zipResource = new ByteArrayResource(baos.toByteArray()); String zipName = - questionnaire.getName().replaceAll("[\\\\/:;*?\"<>|]", "").replaceAll(" ", "_") + questionnaire.get().getName().replaceAll("[\\\\/:;*?\"<>|]", "").replaceAll(" ", "_") + "_exports.zip"; return ResponseEntity.ok() diff --git a/src/main/java/de/imi/mopat/controller/ScoreController.java b/src/main/java/de/imi/mopat/controller/ScoreController.java index 6e8fd483..c8f194b0 100644 --- a/src/main/java/de/imi/mopat/controller/ScoreController.java +++ b/src/main/java/de/imi/mopat/controller/ScoreController.java @@ -3,8 +3,8 @@ import de.imi.mopat.dao.ExportTemplateDao; import de.imi.mopat.dao.OperatorDao; import de.imi.mopat.dao.QuestionDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.ScoreDao; +import de.imi.mopat.helper.controller.QuestionnaireService; import de.imi.mopat.model.Question; import de.imi.mopat.model.Questionnaire; import de.imi.mopat.model.dto.ExpressionDTO; @@ -21,9 +21,7 @@ import de.imi.mopat.model.score.ValueOperator; import de.imi.mopat.validator.ScoreDTOValidator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -45,7 +43,7 @@ public class ScoreController { @Autowired private ExportTemplateDao exportTemplateDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private QuestionDao questionDao; @Autowired @@ -66,16 +64,16 @@ public class ScoreController { @RequestMapping(value = "/score/list", method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_ADMIN')") public String showScoresForQuestionnaire( - @RequestParam(value = "id", required = true) final Long id, final Model model) { - Questionnaire questionnaire = questionnaireDao.getElementById(id); + @RequestParam(value = "id", required = true) final Long id, final Model model) { + Optional questionnaire = questionnaireService.getQuestionnaireById(id); - if (questionnaire == null) { + if (questionnaire.isEmpty()) { return "redirect:/questionnaire/list"; } // Sort the scores List scores = new ArrayList<>(); - scores.addAll(questionnaire.getScores()); + scores.addAll(questionnaire.get().getScores()); Collections.sort(scores, (Score o1, Score o2) -> o1.getName().compareTo(o2.getName())); List scoreDTOs = new ArrayList<>(); @@ -84,7 +82,7 @@ public String showScoresForQuestionnaire( } model.addAttribute("scores", scoreDTOs); - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.get()); return "score/list"; } @@ -100,24 +98,24 @@ public String showScoresForQuestionnaire( @RequestMapping(value = "/score/fill", method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_EDITOR')") public String fillScore( - @RequestParam(value = "questionnaireId", required = true) final Long questionnaireId, - @RequestParam(value = "id", required = false) final Long scoreId, final Model model) { + @RequestParam(value = "questionnaireId", required = true) final Long questionnaireId, + @RequestParam(value = "id", required = false) final Long scoreId, final Model model) { // Get a new ScoreDTO ScoreDTO scoreDTO = new ScoreDTO(); // Get the Questionnaire and the Score - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); + Optional questionnaire = questionnaireService.getQuestionnaireById(questionnaireId); List availableScores; // If the scoreId is set, get the ScoreDTO representation from the score if (scoreId != null) { Score score = scoreDao.getElementById(scoreId); scoreDTO = score.toScoreDTO(); - availableScores = questionnaire.getAvailableScoresForScore(score); + availableScores = questionnaire.get().getAvailableScoresForScore(score); } else { - availableScores = new ArrayList<>(questionnaire.getScores()); + availableScores = new ArrayList<>(questionnaire.get().getScores()); } // Sort the available scores by name Collections.sort(availableScores, - (Score o1, Score o2) -> o1.getName().compareTo(o2.getName())); + (Score o1, Score o2) -> o1.getName().compareTo(o2.getName())); scoreDTO.setQuestionnaireId(questionnaireId); // Get all Operators @@ -126,11 +124,11 @@ public String fillScore( if (availableScores.isEmpty()) { operators.remove(operatorDao.getOperatorByDisplaySign("valueOfScore")); } - List availableQuestionsForScore = questionnaire.getAvailableQuestionsForScore(); + List availableQuestionsForScore = questionnaire.get().getAvailableQuestionsForScore(); if (availableQuestionsForScore == null || availableQuestionsForScore.isEmpty()) { operators.remove(operatorDao.getOperatorByDisplaySign("valueOf")); } - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.get()); model.addAttribute("operators", operators); model.addAttribute("availableQuestionsForScore", availableQuestionsForScore); model.addAttribute("availableScoresForScore", availableScores); @@ -152,10 +150,10 @@ public String fillScore( @RequestMapping(value = "/score/edit", method = RequestMethod.POST) @PreAuthorize("hasRole('ROLE_EDITOR')") public String editScore( - @RequestParam(value = "questionnaireId", required = true) final Long questionnaireId, - @RequestParam(required = false, value = "postAction") final String action, - @ModelAttribute("scoreDTO") final ScoreDTO scoreDTO, BindingResult result, - final Model model) { + @RequestParam(value = "questionnaireId", required = true) final Long questionnaireId, + @RequestParam(required = false, value = "postAction") final String action, + @ModelAttribute("scoreDTO") final ScoreDTO scoreDTO, BindingResult result, + final Model model) { if (action.equalsIgnoreCase("cancel")) { return "redirect:/score/list?id=" + questionnaireId; @@ -167,24 +165,24 @@ public String editScore( scoreDTOValidator.validate(scoreDTO, result); if (result.hasErrors()) { - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); + Optional questionnaire = questionnaireService.getQuestionnaireById(questionnaireId); List availableScores; if (scoreDTO.getId() != null) { - availableScores = questionnaire.getAvailableScoresForScore( - scoreDao.getElementById(scoreDTO.getId())); + availableScores = questionnaire.get().getAvailableScoresForScore( + scoreDao.getElementById(scoreDTO.getId())); } else { - availableScores = new ArrayList<>(questionnaire.getScores()); + availableScores = new ArrayList<>(questionnaire.get().getScores()); } // Sort the available scores by name Collections.sort(availableScores, - (Score o1, Score o2) -> o1.getName().compareTo(o2.getName())); + (Score o1, Score o2) -> o1.getName().compareTo(o2.getName())); // Get all Operators List operators = new ArrayList<>(operatorDao.getOperators()); // And delete value of score, if available scores are empty if (availableScores.isEmpty()) { operators.remove(operatorDao.getOperatorByDisplaySign("valueOfScore")); } - List availableQuestionsForScore = questionnaire.getAvailableQuestionsForScore(); + List availableQuestionsForScore = questionnaire.get().getAvailableQuestionsForScore(); if (availableQuestionsForScore == null || availableQuestionsForScore.isEmpty()) { operators.remove(operatorDao.getOperatorByDisplaySign("valueOf")); } @@ -193,11 +191,11 @@ public String editScore( model.addAttribute("availableScoresForScore", availableScores); // overwrite the spring errors and take the new one model.addAttribute("org.springframework.validation.BindingResult.scoreDTO", result); - model.addAttribute("questionnaire", questionnaire); + model.addAttribute("questionnaire", questionnaire.get()); return "score/edit"; } - Questionnaire questionnaire = questionnaireDao.getElementById( - scoreDTO.getQuestionnaireId()); + Optional questionnaire = questionnaireService.getQuestionnaireById( + scoreDTO.getQuestionnaireId()); Score score = null; @@ -206,17 +204,17 @@ public String editScore( score.setExpression(null); } else { score = new Score(); - score.setQuestionnaire(questionnaire); + score.setQuestionnaire(questionnaire.orElse(null)); } score.setName(scoreDTO.getName()); Expression expression = scoreDTO.getExpression() - .toExpression(operatorDao, questionDao, scoreDao); + .toExpression(operatorDao, questionDao, scoreDao); score.setExpression(expression); scoreDao.merge(score); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire.orElse(null)); return "redirect:/score/list?id=" + questionnaireId; } @@ -231,14 +229,13 @@ public String editScore( @RequestMapping(value = "/score/remove") @PreAuthorize("hasRole('ROLE_EDITOR')") public String removeScore(@RequestParam(value = "id", required = true) final Long scoreId, - final Model model) { + final Model model) { Score score = scoreDao.getElementById(scoreId); List dependingScores = score.getDependingScores(); // Sort depending scores by amount of their depending scores to // prevent database errors Collections.sort(dependingScores, - (Score o1, Score o2) -> o1.getDependingScores().size() - o2.getDependingScores() - .size()); + Comparator.comparingInt((Score o) -> o.getDependingScores().size())); // Safely delete all depending scores for (Score scoreToDelete : dependingScores) { scoreDao.remove(scoreToDelete); diff --git a/src/main/java/de/imi/mopat/controller/StatisticController.java b/src/main/java/de/imi/mopat/controller/StatisticController.java index 2392690b..a11040a2 100644 --- a/src/main/java/de/imi/mopat/controller/StatisticController.java +++ b/src/main/java/de/imi/mopat/controller/StatisticController.java @@ -2,8 +2,8 @@ import de.imi.mopat.dao.BundleDao; import de.imi.mopat.dao.EncounterDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.StatisticDao; +import de.imi.mopat.helper.controller.QuestionnaireService; import de.imi.mopat.model.dto.OneTimeStatisticDTO; import de.imi.mopat.model.dto.StatisticDTO; import de.imi.mopat.validator.OneTimeStatisticDTOValidator; @@ -41,7 +41,7 @@ public class StatisticController { @Autowired private OneTimeStatisticDTOValidator oneTimeStatisticDTOValidator; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private BundleDao bundleDao; @Autowired @@ -62,7 +62,7 @@ public String getOneTimeStatistic(final Model model) { OneTimeStatisticDTO oneTimeStatisticDTO = new OneTimeStatisticDTO(new Date(), new Date()); model.addAttribute("oneTimeStatisticDTO", oneTimeStatisticDTO); model.addAttribute("bundles", bundleDao.getAllElements()); - model.addAttribute("questionnaires", questionnaireDao.getAllElements()); + model.addAttribute("questionnaires", questionnaireService.getAllQuestionnaires()); model.addAttribute("patients", encounterDao.getAllCaseNumbers()); return "statistic/onetimestatistic"; } @@ -84,7 +84,7 @@ public String getOneTimeStatistics( final BindingResult result, final Model model) { oneTimeStatisticDTOValidator.validate(oneTimeStatisticDTO, result); model.addAttribute("bundles", bundleDao.getAllElements()); - model.addAttribute("questionnaires", questionnaireDao.getAllElements()); + model.addAttribute("questionnaires", questionnaireService.getAllQuestionnaires()); model.addAttribute("patients", encounterDao.getAllCaseNumbers()); if (result.hasErrors()) { return "statistic/onetimestatistic"; diff --git a/src/main/java/de/imi/mopat/controller/SurveyController.java b/src/main/java/de/imi/mopat/controller/SurveyController.java index 7ac94d20..b11e5c8a 100644 --- a/src/main/java/de/imi/mopat/controller/SurveyController.java +++ b/src/main/java/de/imi/mopat/controller/SurveyController.java @@ -12,7 +12,6 @@ import de.imi.mopat.dao.ConditionDao; import de.imi.mopat.dao.ConfigurationDao; import de.imi.mopat.dao.EncounterDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.ResponseDao; import de.imi.mopat.dao.ScoreDao; import de.imi.mopat.dao.user.PinAuthorizationDao; @@ -86,7 +85,7 @@ public class SurveyController { @Autowired private AnswerDao answerDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private ConditionDao conditionDao; @Autowired @@ -627,7 +626,7 @@ public String showQuestionnaire(final Model model, final HttpSession session) { QuestionnaireDTO questionnaireDTO = bundleQuestionnaireDTO.getQuestionnaireDTO(); // Get the boolean if this questionnaire has any conditions boolean hasConditionsAsTarget = conditionDao.isConditionTarget( - questionnaireDao.getElementById(questionnaireDTO.getId())); + questionnaireService.getQuestionnaireById(questionnaireDTO.getId()).orElse(null)); // Set the boolean in the QuestionnaireDTO questionnaireDTO.setHasConditionsAsTarget(hasConditionsAsTarget); } @@ -690,7 +689,7 @@ public String testBundle(@RequestParam(value = "id", required = false) final Lon QuestionnaireDTO questionnaireDTO = bundleQuestionnaireDTO.getQuestionnaireDTO(); // Get the boolean if this questionnaire has any conditions boolean hasConditionsAsTarget = conditionDao.isConditionTarget( - questionnaireDao.getElementById(questionnaireDTO.getId())); + questionnaireService.getQuestionnaireDTOById(questionnaireDTO.getId()).orElse(null)); // Set the boolean in the QuestionnaireDTO questionnaireDTO.setHasConditionsAsTarget(hasConditionsAsTarget); } @@ -926,7 +925,7 @@ public String showQuestionnaireScheduled( QuestionnaireDTO questionnaireDTO = bundleQuestionnaireDTO.getQuestionnaireDTO(); // Get the boolean if this questionnaire has any conditions boolean hasConditionsAsTarget = conditionDao.isConditionTarget( - questionnaireDao.getElementById(questionnaireDTO.getId())); + questionnaireService.getQuestionnaireById(questionnaireDTO.getId()).orElse(null)); // Set the boolean in the QuestionnaireDTO questionnaireDTO.setHasConditionsAsTarget(hasConditionsAsTarget); } @@ -992,7 +991,7 @@ public String showQuestionnaireScheduled( currentAnswer.removeResponse(responseToDelete); existingResponses.remove(responseToDelete); } - questionnaireDao.merge(currentAnswer.getQuestion().getQuestionnaire()); + questionnaireService.merge(currentAnswer.getQuestion().getQuestionnaire()); continue; } @@ -1102,7 +1101,7 @@ public String showQuestionnaireScheduled( Response response = createResponseObject(responseDTO, encounter, currentAnswer); existingResponses.add(response); } - questionnaireDao.merge(currentAnswer.getQuestion().getQuestionnaire()); + questionnaireService.merge(currentAnswer.getQuestion().getQuestionnaire()); } // Get all existing responses that were not in the DTO @@ -1115,7 +1114,7 @@ public String showQuestionnaireScheduled( encounter.getId()); answer.removeResponse(responseToDelete); existingResponses.remove(responseToDelete); - questionnaireDao.merge(answer.getQuestion().getQuestionnaire()); + questionnaireService.merge(answer.getQuestion().getQuestionnaire()); } // Update the response list of the encounter and merge it @@ -1278,9 +1277,9 @@ public void finishQuestionnaire( updateEncounter(encounterDTO); // Refresh encounter from database after storing of responses encounter = encounterDao.getElementByUUID(encounterDTO.getUuid()); - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); - if (encounter.getActiveQuestionnaires().contains(questionnaire.getId())) { - encounterExporter.export(encounter, questionnaire, false); + Optional questionnaire = questionnaireService.getQuestionnaireById(questionnaireId); + if (encounter.getActiveQuestionnaires().contains(questionnaire.get().getId())) { + encounterExporter.export(encounter, questionnaire.orElse(null), false); } } } @@ -1316,8 +1315,8 @@ private void finishQuestionnaireTest(final Long questionnaireId, if (bundle != null && !bundle.getIsPublished()) { - Questionnaire questionnaire = questionnaireDao.getElementById(questionnaireId); - if (encounterDTO.getActiveQuestionnaireIds().contains(questionnaire.getId())) { + Optional questionnaire = questionnaireService.getQuestionnaireById(questionnaireId); + if (encounterDTO.getActiveQuestionnaireIds().contains(questionnaire.get().getId())) { Encounter encounter = new Encounter(); encounter.setCaseNumber(encounterDTO.getCaseNumber()); encounter.setBundleLanguage(encounterDTO.getBundleLanguage()); @@ -1333,7 +1332,7 @@ private void finishQuestionnaireTest(final Long questionnaireId, } encounter.setResponses(responses); if(performExportTest) { - encounterExporter.export(encounter, questionnaire, true); + encounterExporter.export(encounter, questionnaire.orElse(null), true); } } } diff --git a/src/main/java/de/imi/mopat/helper/controller/BundleService.java b/src/main/java/de/imi/mopat/helper/controller/BundleService.java index f4ecd99c..9bf1879b 100644 --- a/src/main/java/de/imi/mopat/helper/controller/BundleService.java +++ b/src/main/java/de/imi/mopat/helper/controller/BundleService.java @@ -5,7 +5,6 @@ import de.imi.mopat.dao.BundleDao; import de.imi.mopat.dao.BundleQuestionnaireDao; import de.imi.mopat.dao.ExportTemplateDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.ScoreDao; import de.imi.mopat.helper.model.BundleDTOMapper; import de.imi.mopat.helper.model.QuestionnaireDTOMapper; @@ -38,8 +37,6 @@ public class BundleService { @Autowired private BundleDao bundleDao; @Autowired - private QuestionnaireDao questionnaireDao; - @Autowired private ScoreDao scoreDao; @Autowired private BundleQuestionnaireDao bundleQuestionnaireDao; @@ -77,7 +74,7 @@ public BundleDTO getBundleDTO(final Long id) { bundleDTO.getBundleQuestionnaireDTOs().forEach(bundleQuestionnaireDTO -> { QuestionnaireDTO questionnaireDTO = bundleQuestionnaireDTO.getQuestionnaireDTO(); if (questionnaireDTO != null && questionnaireDTO.getId() != null) { - questionnaireDTO.setHasScores(scoreDao.hasScore(questionnaireDao.getElementById(questionnaireDTO.getId()))); + questionnaireDTO.setHasScores(scoreDao.hasScore(questionnaireService.getQuestionnaireById(questionnaireDTO.getId()).orElse(null))); } }); @@ -286,10 +283,10 @@ private void persistBundleQuestionnaires(BundleDTO bundleDTO, Bundle bundle) { continue; } - Questionnaire questionnaire = questionnaireDao.getElementById(bundleQuestionnaireDTO.getQuestionnaireDTO().getId()); + Optional questionnaire = questionnaireService.getQuestionnaireById(bundleQuestionnaireDTO.getQuestionnaireDTO().getId()); BundleQuestionnaire bundleQuestionnaire = new BundleQuestionnaire( bundle, - questionnaire, + questionnaire.orElse(null), bundleQuestionnaireDTO.getPosition().intValue(), Optional.ofNullable(bundleQuestionnaireDTO.getIsEnabled()).orElse(false), Optional.ofNullable(bundleQuestionnaireDTO.getShowScores()).orElse(false) @@ -304,8 +301,8 @@ private void persistBundleQuestionnaires(BundleDTO bundleDTO, Bundle bundle) { }); bundle.addBundleQuestionnaire(bundleQuestionnaire); - questionnaire.addBundleQuestionnaire(bundleQuestionnaire); - questionnaireDao.merge(questionnaire); + questionnaire.get().addBundleQuestionnaire(bundleQuestionnaire); + questionnaireService.merge(questionnaire.get()); } } @@ -340,7 +337,7 @@ private void cleanupRemovedBundleQuestionnaires(Bundle bundle) { } Questionnaire questionnaire = toDelete.getQuestionnaire(); questionnaire.removeBundleQuestionnaire(toDelete); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); } bundle.removeAllBundleQuestionnaires(); bundleDao.merge(bundle); diff --git a/src/main/java/de/imi/mopat/helper/controller/ConditionService.java b/src/main/java/de/imi/mopat/helper/controller/ConditionService.java index 4589d447..187a35f1 100644 --- a/src/main/java/de/imi/mopat/helper/controller/ConditionService.java +++ b/src/main/java/de/imi/mopat/helper/controller/ConditionService.java @@ -3,7 +3,6 @@ import de.imi.mopat.dao.AnswerDao; import de.imi.mopat.dao.BundleDao; import de.imi.mopat.dao.QuestionDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.model.Answer; import de.imi.mopat.model.Bundle; import de.imi.mopat.model.NumberInputAnswer; @@ -23,7 +22,7 @@ public class ConditionService { @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private BundleDao bundleDao; @@ -45,7 +44,7 @@ public void mergeCondition(ConditionDTO conditionDTO) { // condition into the database if (conditionDTO.getBundleId() != null && conditionDTO.getTargetClass() .equalsIgnoreCase("de.imi.mopat.model.Questionnaire")) { - targetQuestionnaire = questionnaireDao.getElementById(conditionDTO.getTargetId()); + targetQuestionnaire = questionnaireService.getQuestionnaireById(conditionDTO.getTargetId()).orElse(null); bundle = bundleDao.getElementById(conditionDTO.getBundleId()); conditionDTO.setTargetAnswerQuestionId(null); } else { diff --git a/src/main/java/de/imi/mopat/helper/controller/QuestionService.java b/src/main/java/de/imi/mopat/helper/controller/QuestionService.java index 6f4b3995..e1d94d39 100644 --- a/src/main/java/de/imi/mopat/helper/controller/QuestionService.java +++ b/src/main/java/de/imi/mopat/helper/controller/QuestionService.java @@ -2,7 +2,6 @@ import de.imi.mopat.dao.AnswerDao; import de.imi.mopat.dao.BundleDao; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.model.Answer; import de.imi.mopat.model.Question; import de.imi.mopat.model.conditions.Condition; @@ -25,7 +24,7 @@ public class QuestionService { private AnswerDao answerDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private BundleDao bundleDao; @@ -105,9 +104,9 @@ Questionnaire duplicateQuestionsToNewQuestionnaire( copiedQuestions.add(newQuestion); } newQuestionnaire.setQuestions(copiedQuestions); - questionnaireDao.merge(newQuestionnaire); + questionnaireService.merge(newQuestionnaire); //Refetch questionnaire to get ids from db - return questionnaireDao.getElementById(newQuestionnaire.getId()); + return questionnaireService.getQuestionnaireById(newQuestionnaire.getId()).orElse(null); } MapHolder getMappingForDuplicatedQuestions( diff --git a/src/main/java/de/imi/mopat/helper/controller/QuestionnaireService.java b/src/main/java/de/imi/mopat/helper/controller/QuestionnaireService.java index c08e472a..327a52fc 100644 --- a/src/main/java/de/imi/mopat/helper/controller/QuestionnaireService.java +++ b/src/main/java/de/imi/mopat/helper/controller/QuestionnaireService.java @@ -47,6 +47,8 @@ import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; @@ -126,11 +128,12 @@ public void processLocalizedText(QuestionnaireDTO questionnaireDTO) { * @return A list of all {@link QuestionnaireDTO} objects. */ public List getAllQuestionnaireDTOs() { - return questionnaireDao.getAllElements().stream() + return getAllQuestionnaires().stream() .map(questionnaireDTOMapper) .collect(Collectors.toList()); } + @Cacheable(value = "questionnaires", key = "'all'") public List getAllQuestionnaires() { return questionnaireDao.getAllElements(); } @@ -158,6 +161,7 @@ public void validateQuestionnaire(QuestionnaireDTO questionnaireDTO, MultipartFi * @param userId The ID of the user performing the action. * @return The saved or updated {@link Questionnaire}. */ + @CacheEvict(value = "questionnaires", key = "'all'") public Questionnaire saveOrUpdateQuestionnaire(QuestionnaireDTO questionnaireDTO, MultipartFile logo, Long userId) { // Update questionnaire directly if editing is allowed @@ -174,6 +178,16 @@ public Questionnaire saveOrUpdateQuestionnaire(QuestionnaireDTO questionnaireDTO return createNewQuestionnaire(questionnaireDTO, logo, userId); } + @CacheEvict(value = "questionnaires", key = "'all'") + public void removeQuestionnaire(Questionnaire questionnaire) { + questionnaireDao.remove(questionnaire); + } + + @CacheEvict(value = "questionnaires", key = "'all'") + public void merge(Questionnaire questionnaire) { + questionnaireDao.merge(questionnaire); + } + /** * Retrieves a {@link QuestionnaireDTO} by its ID. * @@ -182,11 +196,14 @@ public Questionnaire saveOrUpdateQuestionnaire(QuestionnaireDTO questionnaireDTO * otherwise. */ public Optional getQuestionnaireDTOById(Long questionnaireId) { - if (questionnaireId == null || questionnaireId <= 0) { + return getQuestionnaireById(questionnaireId).map(questionnaireDTOMapper); + } + + public Optional getQuestionnaireById(Long id) { + if (id == null || id <= 0) { return Optional.empty(); } - return Optional.ofNullable(questionnaireDao.getElementById(questionnaireId)) - .map(questionnaireDTOMapper); + return Optional.ofNullable(questionnaireDao.getElementById(id)); } /** @@ -312,7 +329,7 @@ private Questionnaire createNewQuestionnaire(QuestionnaireDTO questionnaireDTO, userId, Boolean.TRUE ); - questionnaireDao.merge(newQuestionnaire); + merge(newQuestionnaire); QuestionnaireVersionGroup questionnaireVersionGroup = questionnaireVersionGroupService.createQuestionnaireGroup( newQuestionnaire.getName()); @@ -320,7 +337,7 @@ private Questionnaire createNewQuestionnaire(QuestionnaireDTO questionnaireDTO, copyLocalizedTextsToQuestionnaire(newQuestionnaire, questionnaireDTO); handleLogoUpload(newQuestionnaire, questionnaireDTO, logo); - questionnaireDao.merge(newQuestionnaire); + merge(newQuestionnaire); return newQuestionnaire; } @@ -343,7 +360,7 @@ private Questionnaire updateExistingQuestionnaire(QuestionnaireDTO questionnaire copyLocalizedTextsToQuestionnaire(existingQuestionnaire, questionnaireDTO); handleLogoUpload(existingQuestionnaire, questionnaireDTO, logo); - questionnaireDao.merge(existingQuestionnaire); + merge(existingQuestionnaire); return existingQuestionnaire; } @@ -365,7 +382,7 @@ private Questionnaire createQuestionnaireCopy(QuestionnaireDTO questionnaireDTO, userId, Boolean.TRUE ); - questionnaireDao.merge(newQuestionnaire); + merge(newQuestionnaire); newQuestionnaire = questionService.duplicateQuestionsToNewQuestionnaire(existingQuestionnaire.getQuestions(), newQuestionnaire); @@ -389,7 +406,7 @@ private Questionnaire createQuestionnaireCopy(QuestionnaireDTO questionnaireDTO, QuestionnaireVersionGroup existingGroup = existingQuestionnaire.getQuestionnaireVersionGroup(); questionnaireVersionGroupService.addQuestionnaireToGroup(existingGroup, newQuestionnaire); - questionnaireDao.merge(newQuestionnaire); + merge(newQuestionnaire); //Apparently Conditions are already persisted with the previous merge command //for(Condition condition : clonedConditions) @@ -563,7 +580,7 @@ public Boolean hasQuestionnaireConditions(Questionnaire questionnaire) { * @param questionnaireDTO The {@link QuestionnaireDTO} containing the logo information. * @param logo The {@link MultipartFile} containing the new logo file. */ - public void handleLogoUpload(Questionnaire questionnaire, QuestionnaireDTO questionnaireDTO, MultipartFile logo) { + private void handleLogoUpload(Questionnaire questionnaire, QuestionnaireDTO questionnaireDTO, MultipartFile logo) { try { String imagePath = configurationDao.getImageUploadPath() + "/" + Constants.IMAGE_QUESTIONNAIRE + "/" + questionnaire.getId().toString(); diff --git a/src/main/java/de/imi/mopat/helper/controller/QuestionnaireVersionGroupService.java b/src/main/java/de/imi/mopat/helper/controller/QuestionnaireVersionGroupService.java index 97f09d2c..db76b44c 100644 --- a/src/main/java/de/imi/mopat/helper/controller/QuestionnaireVersionGroupService.java +++ b/src/main/java/de/imi/mopat/helper/controller/QuestionnaireVersionGroupService.java @@ -1,6 +1,5 @@ package de.imi.mopat.helper.controller; -import de.imi.mopat.dao.QuestionnaireDao; import de.imi.mopat.dao.QuestionnaireVersionGroupDao; import de.imi.mopat.helper.model.QuestionnaireGroupDTOMapper; import de.imi.mopat.model.Questionnaire; @@ -26,7 +25,7 @@ public class QuestionnaireVersionGroupService { private QuestionnaireVersionGroupDao questionnaireVersionGroupDao; @Autowired - private QuestionnaireDao questionnaireDao; + private QuestionnaireService questionnaireService; @Autowired private QuestionnaireGroupDTOMapper questionnaireGroupDTOMapper; @@ -197,7 +196,7 @@ public void removeQuestionnaire(Long questionnaireVersionGroupId, Questionnaire // Unlink the questionnaire from the group questionnaire.setQuestionnaireVersionGroup(null); - questionnaireDao.merge(questionnaire); + questionnaireService.merge(questionnaire); if (questionnairesInGroup.isEmpty()){ //If there would be no questionnaire left, delete the group