Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 5ae2966

Browse files
lgallgal
authored andcommitted
Merge branch '#3136_sormas-to-sormas-bulk' into 3210_sormas-to-sormas-samples
# Conflicts: # sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasFacadeEjb.java
2 parents b02210f + b2019ac commit 5ae2966

29 files changed

Lines changed: 226 additions & 129 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/caze/classification/ClassificationHtmlRenderer.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
*******************************************************************************/
1818
package de.symeda.sormas.api.caze.classification;
1919

20+
import static de.symeda.sormas.api.utils.HtmlHelper.escapeAndUnescapeBasicTags;
21+
import static de.symeda.sormas.api.utils.HtmlHelper.unescapeBasicTags;
22+
2023
import java.util.Date;
2124
import java.util.List;
2225

2326
import org.apache.commons.lang3.StringUtils;
27+
import org.apache.commons.text.StringEscapeUtils;
2428

2529
import de.symeda.sormas.api.Disease;
2630
import de.symeda.sormas.api.FacadeProvider;
@@ -31,7 +35,6 @@
3135
import de.symeda.sormas.api.utils.DataHelper;
3236
import de.symeda.sormas.api.utils.DateHelper;
3337
import de.symeda.sormas.api.utils.InfoProvider;
34-
import org.apache.commons.text.StringEscapeUtils;
3538

3639
/**
3740
* Provides methods that create HTML Strings to visualize the automatic classification rules.
@@ -131,18 +134,16 @@ public static String createHtmlForDownload(String sormasServerUrl, List<Disease>
131134
" padding: 8px;\r\n" +
132135
"}\r\n" +
133136
".classification-rules .main-criteria.main-criteria-suspect {\r\n" +
134-
" background: rgba(255, 215, 0, 0.6);\r\n" +
135-
" margin-bottom: 16px;\r\n" +
137+
" background: rgba(255, 215, 0, 0.6);\r\n" +
136138
"}\r\n" +
137139
".classification-rules .main-criteria.main-criteria-probable {\r\n" +
138-
" background: rgba(255, 140, 0, 0.6);\r\n" +
139-
" margin-bottom: 16px;\r\n" +
140+
" background: rgba(255, 140, 0, 0.6);\r\n" +
140141
"}\r\n" +
141142
".classification-rules .main-criteria.main-criteria-confirmed {\r\n" +
142143
" background: rgba(255, 0, 0, 0.6);\r\n" +
143144
"}\r\n" +
144145
".classification-rules .main-criteria.main-criteria-not_a_case {\r\n" +
145-
" background: rgba(201, 201, 201, 0.6);\r\n" +
146+
" background: rgba(160, 160, 160, 0.6);\r\n" +
146147
"}\r\n" +
147148
".classification-rules .headline {\r\n" +
148149
" font-weight: bold;\r\n" +
@@ -188,6 +189,7 @@ public static String createHtmlForDownload(String sormasServerUrl, List<Disease>
188189
html.append(createSuspectHtmlString(diseaseCriteria));
189190
html.append(createProbableHtmlString(diseaseCriteria));
190191
html.append(createConfirmedHtmlString(diseaseCriteria));
192+
html.append(createNotACaseHtmlString(diseaseCriteria));
191193
}
192194
}
193195
html.append("</body></html>");
@@ -239,7 +241,7 @@ private static String buildSubCriteriaDiv(
239241
for (ClassificationCriteriaDto subCriteria : ((ClassificationCollectiveCriteria) criteria).getSubCriteria()) {
240242
if (!(subCriteria instanceof ClassificationCollectiveCriteria) || subCriteria instanceof ClassificationCompactCriteria) {
241243
// For non-collective or compact collective criteria, add the description as a list item
242-
subCriteriaSb.append("- " + subCriteria.buildDescription() + "</br>");
244+
subCriteriaSb.append("- " + escapeAndUnescapeBasicTags(subCriteria.buildDescription() + "</br>"));
243245
} else if (subCriteria instanceof ClassificationCollectiveCriteria
244246
&& !(subCriteria instanceof ClassificationAllOfCriteriaDto)
245247
&& !(subCriteria.getClass() == ClassificationXOfCriteriaDto.class)) {
@@ -273,7 +275,7 @@ private static String createSurroundingDiv(ClassificationCriteriaType criteriaTy
273275
+ "<div class='main-criteria main-criteria-"
274276
+ StringEscapeUtils.escapeHtml4(criteriaType.toString())
275277
+ "'>"
276-
+ StringEscapeUtils.escapeHtml4(content)
278+
+ content
277279
+ "</div></div>";
278280
//@formatter:on
279281
}
@@ -294,11 +296,13 @@ private static String createHeadlineDiv(String headline) {
294296
* Creates a div containing an info text.
295297
*/
296298
private static String createInfoDiv() {
297-
return I18nProperties.getString(Strings.classificationInfoText);
299+
return unescapeBasicTags(StringEscapeUtils.escapeHtml4(I18nProperties.getString(Strings.classificationInfoText)));
298300
}
299301

300302
private static String createInfoDiv(int requirementsNumber) {
301-
return String.format(I18nProperties.getString(Strings.classificationInfoNumberText), DataHelper.parseNumberToString(requirementsNumber));
303+
return unescapeBasicTags(
304+
StringEscapeUtils.escapeHtml4(
305+
String.format(I18nProperties.getString(Strings.classificationInfoNumberText), DataHelper.parseNumberToString(requirementsNumber))));
302306
}
303307

304308
/**
@@ -308,7 +312,7 @@ private static String createCriteriaSurroundingDiv(String content) {
308312

309313
//@formatter:off
310314
return "<div class='criteria'>"
311-
+ StringEscapeUtils.escapeHtml4(content)
315+
+ content
312316
+ "</div>";
313317
//@formatter:on
314318
}
@@ -320,16 +324,17 @@ private static String createSubCriteriaSurroundingDiv(String content) {
320324

321325
//@formatter:off
322326
return "<div class='sub-criteria'><div class='sub-criteria-content'>"
323-
+ StringEscapeUtils.escapeHtml4(content)
327+
+ content
324328
+ "</div></div>";
325329
//@formatter:on
326330
}
327331

328332
/**
329333
* Creates the div for an actual criteria containing its description.
334+
* Specific tags are allowed to be contained in i18n strings and are thus unescaped
330335
*/
331336
private static String createCriteriaItemDiv(String text) {
332-
return StringEscapeUtils.escapeHtml4(text) + "<br/>";
337+
return unescapeBasicTags(StringEscapeUtils.escapeHtml4(text) + "<br>");
333338
}
334339

335340
private enum ClassificationCriteriaType {

sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityDto.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
*******************************************************************************/
1818
package de.symeda.sormas.api.facility;
1919

20+
import java.util.Arrays;
2021
import java.util.Date;
22+
import java.util.List;
2123

2224
import de.symeda.sormas.api.EntityDto;
2325
import de.symeda.sormas.api.region.CommunityReferenceDto;
@@ -32,6 +34,7 @@ public class FacilityDto extends EntityDto {
3234
public static final String I18N_PREFIX = "Facility";
3335
public static final String OTHER_FACILITY_UUID = "SORMAS-CONSTID-OTHERS-FACILITY";
3436
public static final String NONE_FACILITY_UUID = "SORMAS-CONSTID-ISNONE-FACILITY";
37+
public static final List<String> CONSTANT_FACILITY_UUIDS = Arrays.asList(OTHER_FACILITY_UUID, NONE_FACILITY_UUID);
3538
public static final String OTHER_FACILITY = "OTHER_FACILITY";
3639
public static final String NO_FACILITY = "NO_FACILITY";
3740
public static final String NAME = "name";

sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/PointOfEntryDto.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.symeda.sormas.api.infrastructure;
22

3+
import java.util.Arrays;
34
import java.util.Date;
5+
import java.util.List;
46

57
import de.symeda.sormas.api.EntityDto;
68
import de.symeda.sormas.api.region.DistrictReferenceDto;
@@ -15,6 +17,8 @@ public class PointOfEntryDto extends EntityDto {
1517
public static final String OTHER_SEAPORT_UUID = "SORMAS-CONSTID-OTHERS-SEAPORTX";
1618
public static final String OTHER_GROUND_CROSSING_UUID = "SORMAS-CONSTIG-OTHERS-GROUNDCR";
1719
public static final String OTHER_POE_UUID = "SORMAS-CONSTID-OTHERS-OTHERPOE";
20+
public static final List<String> CONSTANT_POE_UUIDS =
21+
Arrays.asList(OTHER_AIRPORT_UUID, OTHER_SEAPORT_UUID, OTHER_GROUND_CROSSING_UUID, OTHER_POE_UUID);
1822
public static final String OTHER_AIRPORT = "OTHER_AIRPORT";
1923
public static final String OTHER_SEAPORT = "OTHER_SEAPORT";
2024
public static final String OTHER_GROUND_CROSSING = "OTHER_GROUND_CROSSING";
@@ -173,4 +177,8 @@ public void setExternalID(String externalID) {
173177
public String toString() {
174178
return InfrastructureHelper.buildPointOfEntryString(getUuid(), name);
175179
}
180+
181+
public PointOfEntryReferenceDto toReference() {
182+
return new PointOfEntryReferenceDto(getUuid(), toString());
183+
}
176184
}

sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasErrorResponse.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,24 @@
1616
package de.symeda.sormas.api.sormastosormas;
1717

1818
import java.io.Serializable;
19-
import java.util.List;
2019
import java.util.Map;
2120

2221
public class SormasToSormasErrorResponse implements Serializable {
2322

24-
private Map<String, Map<String, List<String>>> errors;
23+
private Map<String, ValidationErrors> errors;
2524

2625
public SormasToSormasErrorResponse() {
2726
}
2827

29-
public SormasToSormasErrorResponse(Map<String, Map<String, List<String>>> errors) {
28+
public SormasToSormasErrorResponse(Map<String, ValidationErrors> errors) {
3029
this.errors = errors;
3130
}
3231

33-
public Map<String, Map<String, List<String>>> getErrors() {
32+
public Map<String, ValidationErrors> getErrors() {
3433
return errors;
3534
}
3635

37-
public void setErrors(Map<String, Map<String, List<String>>> errors) {
36+
public void setErrors(Map<String, ValidationErrors> errors) {
3837
this.errors = errors;
3938
}
4039
}

sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasException.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,26 @@
1515

1616
package de.symeda.sormas.api.sormastosormas;
1717

18-
import java.util.List;
1918
import java.util.Map;
2019

2120
public class SormasToSormasException extends Exception {
2221

23-
private Map<String, Map<String, List<String>>> errors;
22+
private Map<String, ValidationErrors> errors;
2423

2524
public SormasToSormasException(String message) {
2625
super(message);
2726
}
2827

29-
public SormasToSormasException(String message, Map<String, Map<String, List<String>>> errors) {
28+
public SormasToSormasException(String message, Map<String, ValidationErrors> errors) {
3029
super(message);
3130
this.errors = errors;
3231
}
3332

34-
public Map<String, Map<String, List<String>>> getErrors() {
33+
public Map<String, ValidationErrors> getErrors() {
3534
return errors;
3635
}
3736

38-
public void setErrors(Map<String, Map<String, List<String>>> errors) {
37+
public void setErrors(Map<String, ValidationErrors> errors) {
3938
this.errors = errors;
4039
}
4140
}

sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasValidationException.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,17 @@
1515

1616
package de.symeda.sormas.api.sormastosormas;
1717

18-
import java.util.List;
1918
import java.util.Map;
2019

2120
public class SormasToSormasValidationException extends Exception {
2221

23-
private final Map<String, Map<String, List<String>>> errors;
22+
private final Map<String, ValidationErrors> errors;
2423

25-
public SormasToSormasValidationException(Map<String, Map<String, List<String>>> errors) {
24+
public SormasToSormasValidationException(Map<String, ValidationErrors> errors) {
2625
this.errors = errors;
2726
}
2827

29-
public Map<String, Map<String, List<String>>> getErrors() {
28+
public Map<String, ValidationErrors> getErrors() {
3029
return errors;
3130
}
3231
}

sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/ValidationErrors.java renamed to sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/ValidationErrors.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@
1313
* along with this program. If not, see <https://www.gnu.org/licenses/>.
1414
*/
1515

16-
package de.symeda.sormas.backend.sormastosormas;
16+
package de.symeda.sormas.api.sormastosormas;
1717

18+
import java.io.Serializable;
1819
import java.util.ArrayList;
1920
import java.util.HashMap;
2021
import java.util.List;
2122
import java.util.Map;
2223

23-
public class ValidationErrors {
24+
public class ValidationErrors implements Serializable {
2425

25-
private Map<String, List<String>> errors;
26+
private static final long serialVersionUID = 1635651082132555214L;
27+
28+
private final Map<String, List<String>> errors;
2629

2730
public ValidationErrors() {
2831
errors = new HashMap<>();
@@ -42,9 +45,11 @@ public void add(String group, String message) {
4245
}
4346

4447
public void addAll(ValidationErrors errors) {
45-
errors.errors.forEach((group, messages) -> {
46-
messages.forEach(message -> add(group, message));
47-
});
48+
for (Map.Entry<String, List<String>> error : errors.errors.entrySet()) {
49+
for (String message : error.getValue()) {
50+
add(error.getKey(), message);
51+
}
52+
}
4853
}
4954

5055
public Map<String, List<String>> getErrors() {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package de.symeda.sormas.api.utils;
2+
3+
import org.apache.commons.text.StringEscapeUtils;
4+
5+
public class HtmlHelper {
6+
7+
// unescape specific tags (<b>,<i>,<br>,<li>,<ul>) escaped using StringEscapeUtils.escapeHtml4(String)
8+
public static String unescapeBasicTags(String escapedString) {
9+
String res = escapedString;
10+
11+
// <b> Tags
12+
res = res.replaceAll("&lt;b&gt;", "<b>");
13+
res = res.replaceAll("&lt;/b&gt;", "</b>");
14+
// <i> Tags
15+
res = res.replaceAll("&lt;i&gt;", "<i>");
16+
res = res.replaceAll("&lt;/i&gt;", "</i>");
17+
// <ul> Tags
18+
res = res.replaceAll("&lt;ul&gt;", "<ul>");
19+
res = res.replaceAll("&lt;/ul&gt;", "</ul>");
20+
// <li> Tags
21+
res = res.replaceAll("&lt;li&gt;", "<li>");
22+
res = res.replaceAll("&lt;/li&gt;", "</li>");
23+
// <br> Tags
24+
res = res.replaceAll("&lt;br&gt;", "<br>");
25+
res = res.replaceAll("&lt;/br&gt;", "<br>");
26+
res = res.replaceAll("&lt;br/&gt;", "<br>");
27+
28+
return res;
29+
}
30+
31+
// escapes html4 and then unescapes specific tags
32+
public static String escapeAndUnescapeBasicTags(String text) {
33+
return unescapeBasicTags(StringEscapeUtils.escapeHtml4(text));
34+
}
35+
}

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,6 @@ public boolean isCaseEditAllowed(Case caze) {
11471147
return caze.getSormasToSormasOriginInfo().isOwnershipHandedOver();
11481148
}
11491149

1150-
return caseJurisdictionChecker.isInJurisdictionOrOwned(caze) && !sormasToSormasShareInfoService.isCaseOwnershipHandedOver(caze);
1150+
return caseJurisdictionChecker.isInJurisdictionOrOwned(caze);
11511151
}
11521152
}

sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,6 @@ public boolean isContactEditAllowed(Contact contact) {
12161216
return contact.getSormasToSormasOriginInfo().isOwnershipHandedOver();
12171217
}
12181218

1219-
return contactJurisdictionChecker.isInJurisdictionOrOwned(contact) && !sormasToSormasShareInfoService.isContactOwnershipHandedOver(contact);
1219+
return contactJurisdictionChecker.isInJurisdictionOrOwned(contact);
12201220
}
12211221
}

0 commit comments

Comments
 (0)