|
1 | 1 | package fr.insee.pogues.persistence.service;
|
2 | 2 |
|
3 | 3 | import java.util.List;
|
| 4 | +import java.util.Map; |
4 | 5 |
|
| 6 | +import fr.insee.pogues.exception.NullReferenceException; |
| 7 | +import fr.insee.pogues.model.Questionnaire; |
| 8 | +import fr.insee.pogues.transforms.visualize.PoguesJSONToPoguesJSONDeref; |
| 9 | +import fr.insee.pogues.transforms.visualize.PoguesJSONToPoguesJSONDerefImpl; |
| 10 | +import fr.insee.pogues.transforms.visualize.composition.QuestionnaireComposition; |
| 11 | +import fr.insee.pogues.utils.PoguesDeserializer; |
| 12 | +import fr.insee.pogues.utils.PoguesSerializer; |
| 13 | +import fr.insee.pogues.utils.json.JSONFunctions; |
| 14 | +import org.apache.logging.log4j.LogManager; |
| 15 | +import org.apache.logging.log4j.Logger; |
5 | 16 | import org.json.simple.JSONObject;
|
| 17 | +import org.json.simple.parser.JSONParser; |
6 | 18 | import org.springframework.beans.factory.annotation.Autowired;
|
7 | 19 | import org.springframework.stereotype.Service;
|
8 | 20 |
|
9 | 21 | import fr.insee.pogues.persistence.query.EntityNotFoundException;
|
10 | 22 | import fr.insee.pogues.persistence.query.NonUniqueResultException;
|
11 | 23 | import fr.insee.pogues.persistence.query.QuestionnairesServiceQuery;
|
12 | 24 | import fr.insee.pogues.webservice.rest.PoguesException;
|
13 |
| - |
14 | 25 | /**
|
15 | 26 | * Questionnaire Service to assume the persistence of Pogues UI in JSON
|
16 | 27 | *
|
|
21 | 32 | @Service
|
22 | 33 | public class QuestionnairesServiceImpl implements QuestionnairesService {
|
23 | 34 |
|
| 35 | + static final Logger logger = LogManager.getLogger(QuestionnairesServiceImpl.class); |
24 | 36 | @Autowired
|
25 | 37 | private QuestionnairesServiceQuery questionnaireServiceQuery;
|
26 | 38 |
|
| 39 | + |
27 | 40 | public List<JSONObject> getQuestionnaireList() throws Exception {
|
28 | 41 | List<JSONObject> questionnaires = questionnaireServiceQuery.getQuestionnaires();
|
29 | 42 | if (questionnaires.isEmpty()) {
|
@@ -61,7 +74,22 @@ public JSONObject getQuestionnaireByID(String id) throws Exception {
|
61 | 74 | }
|
62 | 75 | return questionnaire;
|
63 | 76 | }
|
64 |
| - |
| 77 | + |
| 78 | + @Override |
| 79 | + public JSONObject getQuestionnaireByIDWithReferences(String id) throws Exception { |
| 80 | + JSONObject jsonQuestionnaire = this.getQuestionnaireByID(id); |
| 81 | + return getQuestionnaireWithReferences(jsonQuestionnaire); |
| 82 | + } |
| 83 | + |
| 84 | + @Override |
| 85 | + public JSONObject getQuestionnaireWithReferences(JSONObject jsonQuestionnaire) throws Exception { |
| 86 | + Questionnaire questionnaireWithReferences = this.deReference(jsonQuestionnaire); |
| 87 | + JSONObject jsonQuestionnaireWithReferences = (JSONObject) new JSONParser().parse( |
| 88 | + PoguesSerializer.questionnaireJavaToString(questionnaireWithReferences) |
| 89 | + ); |
| 90 | + return jsonQuestionnaireWithReferences; |
| 91 | + } |
| 92 | + |
65 | 93 | public JSONObject getJsonLunaticByID(String id) throws Exception {
|
66 | 94 | JSONObject questionnaireLunatic = this.questionnaireServiceQuery.getJsonLunaticByID(id);
|
67 | 95 | if (null == questionnaireLunatic) {
|
@@ -109,4 +137,32 @@ public void updateJsonLunatic(String id, JSONObject dataLunatic) throws Exceptio
|
109 | 137 | throw new PoguesException(404, "Not found", e.getMessage());
|
110 | 138 | }
|
111 | 139 | }
|
| 140 | + |
| 141 | + public Questionnaire deReference(JSONObject jsonQuestionnaire) throws Exception { |
| 142 | + |
| 143 | + Questionnaire questionnaire = PoguesDeserializer.questionnaireToJavaObject(jsonQuestionnaire); |
| 144 | + List<String> references = JSONFunctions.getChildReferencesFromQuestionnaire(jsonQuestionnaire); |
| 145 | + deReference(references, questionnaire); |
| 146 | + return questionnaire; |
| 147 | + } |
| 148 | + |
| 149 | + private void deReference(List<String> references, Questionnaire questionnaire) throws Exception { |
| 150 | + for (String reference : references) { |
| 151 | + JSONObject referencedJsonQuestionnaire = this.getQuestionnaireByID(reference); |
| 152 | + if (referencedJsonQuestionnaire == null) { |
| 153 | + throw new NullReferenceException(String.format( |
| 154 | + "Null reference behind reference '%s' in questionnaire '%s'.", |
| 155 | + reference, questionnaire.getId())); |
| 156 | + } else { |
| 157 | + Questionnaire referencedQuestionnaire = PoguesDeserializer.questionnaireToJavaObject(referencedJsonQuestionnaire); |
| 158 | + // Coherence check |
| 159 | + if (! reference.equals(referencedQuestionnaire.getId())) { |
| 160 | + logger.warn("Reference '{}' found in questionnaire '{}' mismatch referenced questionnaire's id '{}'", |
| 161 | + reference, questionnaire.getId(), referencedQuestionnaire.getId()); |
| 162 | + } |
| 163 | + // |
| 164 | + QuestionnaireComposition.insertReference(questionnaire, referencedQuestionnaire); |
| 165 | + } |
| 166 | + } |
| 167 | + } |
112 | 168 | }
|
0 commit comments