1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.xds.core.validate;
17
18 import static org.openehealth.ipf.commons.ihe.xds.core.validate.ValidationMessage.*;
19 import static org.openehealth.ipf.commons.ihe.xds.core.validate.ValidatorAssertions.*;
20
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Objects;
24 import java.util.Set;
25
26 import org.apache.commons.lang3.StringUtils;
27 import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLObjectContainer;
28 import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLRegistryObject;
29 import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLSlot;
30 import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLSlotList;
31
32 import static org.openehealth.ipf.commons.ihe.xds.core.XdsJaxbDataBinding.isExtraMetadataSlotName;
33
34
35
36
37
38
39
40 public class SlotLengthAndNameUniquenessValidator {
41
42
43
44
45
46
47
48
49 public void validateContainer(EbXMLObjectContainer container) throws XDSMetaDataException {
50 validateRegistryObjects(container.getAssociations());
51 validateRegistryObjects(container.getExtrinsicObjects());
52 validateRegistryObjects(container.getRegistryPackages());
53 validateSlotLists(container.getClassifications());
54 }
55
56 private void validateRegistryObjects(List<? extends EbXMLRegistryObject> regObjects) throws XDSMetaDataException {
57 validateSlotLists(regObjects);
58 for (EbXMLRegistryObject regObj : regObjects) {
59 validateSlotLists(regObj.getClassifications());
60 }
61 }
62
63 private void validateSlotLists(List<? extends EbXMLSlotList> slotListContainers) throws XDSMetaDataException {
64 for (EbXMLSlotList slotList : slotListContainers) {
65 doValidateSlots(slotList.getSlots(), false, null);
66 }
67 }
68
69 public void validateQuerySlots(
70 List<? extends EbXMLSlot> slots,
71 Set<String> allowedSlotNamesMultiple) throws XDSMetaDataException {
72 doValidateSlots(slots, true, allowedSlotNamesMultiple);
73 }
74
75
76
77
78
79
80
81
82
83 private void doValidateSlots(
84 List<? extends EbXMLSlot> slots,
85 boolean queryMode,
86 Set<String> allowedSlotNamesMultiple) throws XDSMetaDataException {
87 HashSet<String> names = new HashSet<>();
88 for (EbXMLSlot slot : slots) {
89
90 String name = slot.getName();
91 metaDataAssert(StringUtils.isNotEmpty(name), MISSING_SLOT_NAME);
92
93 if (queryMode) {
94 metaDataAssert((name.length() > 1) && (name.charAt(0) == '$'), WRONG_QUERY_SLOT_NAME, name);
95 metaDataAssert(names.add(name)
96 || allowedSlotNamesMultiple.contains(name)
97 || isExtraMetadataSlotName(name.substring(1)),
98 DUPLICATE_SLOT_NAME, name);
99 } else {
100 metaDataAssert(names.add(name), DUPLICATE_SLOT_NAME, name);
101 }
102
103
104 slot.getValueList().stream()
105 .filter(Objects::nonNull)
106 .forEach(value -> metaDataAssert(value.length() <= slot.getValueLengthLimit(), SLOT_VALUE_TOO_LONG, name));
107 }
108 }
109
110 }