more checking slice min and max

This commit is contained in:
Grahame Grieve 2023-05-24 22:28:53 +10:00
parent a94b76e464
commit 442d9286b5
1 changed files with 46 additions and 13 deletions

View File

@ -133,7 +133,8 @@ import org.hl7.fhir.utilities.xml.SchematronWriter.Section;
public class ProfileUtilities extends TranslatingUtilities { public class ProfileUtilities extends TranslatingUtilities {
public class ElementDefinitionCounter { public class ElementDefinitionCounter {
int count = 0; int countMin = 0;
int countMax = 0;
ElementDefinition focus; ElementDefinition focus;
Set<String> names = new HashSet<>(); Set<String> names = new HashSet<>();
@ -141,15 +142,40 @@ public class ProfileUtilities extends TranslatingUtilities {
focus = ed; focus = ed;
} }
public int update() { public int checkMin() {
if (count > focus.getMin()) { if (countMin > focus.getMin()) {
return count; return countMin;
} } else {
return -1; return -1;
}
}
public int checkMax() {
if (countMax > max(focus.getMax())) {
return countMax;
} else {
return -1;
}
}
private int max(String max) {
if ("*".equals(max)) {
return Integer.MAX_VALUE;
} else {
return Integer.parseInt(max);
}
} }
public boolean count(ElementDefinition ed, String name) { public boolean count(ElementDefinition ed, String name) {
count = count + ed.getMin(); countMin = countMin + ed.getMin();
if (countMax < Integer.MAX_VALUE) {
int m = max(ed.getMax());
if (m == Integer.MAX_VALUE) {
countMax = m;
} else {
countMax = countMax + m;
}
}
boolean ok = !names.contains(name); boolean ok = !names.contains(name);
names.add(name); names.add(name);
return ok; return ok;
@ -159,6 +185,9 @@ public class ProfileUtilities extends TranslatingUtilities {
return focus; return focus;
} }
public boolean checkMinMax() {
return countMin <= countMax;
}
} }
public enum MappingMergeModeOption { public enum MappingMergeModeOption {
@ -727,13 +756,11 @@ public class ProfileUtilities extends TranslatingUtilities {
if (tn.contains("/")) { if (tn.contains("/")) {
tn = tn.substring(tn.lastIndexOf("/")+1); tn = tn.substring(tn.lastIndexOf("/")+1);
} }
// System.out.println("Check slicing for "+derived.getVersionedUrl());
Map<String, ElementDefinitionCounter> slices = new HashMap<>(); Map<String, ElementDefinitionCounter> slices = new HashMap<>();
int i = 0; int i = 0;
for (ElementDefinition ed : derived.getSnapshot().getElement()) { for (ElementDefinition ed : derived.getSnapshot().getElement()) {
if (ed.hasSlicing()) { if (ed.hasSlicing()) {
slices.put(ed.getPath(), new ElementDefinitionCounter(ed)); slices.put(ed.getPath(), new ElementDefinitionCounter(ed));
// System.out.println("Entering slicing for "+ed.getPath()+" ["+i+"]");
} else { } else {
Set<String> toRemove = new HashSet<>(); Set<String> toRemove = new HashSet<>();
for (String s : slices.keySet()) { for (String s : slices.keySet()) {
@ -742,14 +769,20 @@ public class ProfileUtilities extends TranslatingUtilities {
} }
} }
for (String s : toRemove) { for (String s : toRemove) {
int count = slices.get(s).update(); int count = slices.get(s).checkMin();
if (count > -1) { if (count > -1) {
String msg = "The slice definition for "+slices.get(s).getFocus().getId()+" has a minimum of "+slices.get(s).getFocus().getMin()+" but the slices add up to a minimum of "+count; String msg = "The slice definition for "+slices.get(s).getFocus().getId()+" has a minimum of "+slices.get(s).getFocus().getMin()+" but the slices add up to a minimum of "+count;
//+" so the value has been adjusted in the snapshot"; we don't adjust it because of downstream effects. But if it's for publication, they better get it right.
// System.out.println(msg);
messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.VALUE, url+"#"+ed.getId(), msg, forPublication ? ValidationMessage.IssueSeverity.ERROR : ValidationMessage.IssueSeverity.INFORMATION)); messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.VALUE, url+"#"+ed.getId(), msg, forPublication ? ValidationMessage.IssueSeverity.ERROR : ValidationMessage.IssueSeverity.INFORMATION));
} }
// System.out.println("Exiting slicing for "+s+" at "+ed.getPath()+" ["+i+"]"); count = slices.get(s).checkMax();
if (count > -1) {
String msg = "The slice definition for "+slices.get(s).getFocus().getId()+" has a maximum of "+slices.get(s).getFocus().getMax()+" but the slices add up to a maximum of "+count+". Check that this is what is intended";
messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.VALUE, url+"#"+ed.getId(), msg, ValidationMessage.IssueSeverity.INFORMATION));
}
if (!slices.get(s).checkMinMax()) {
String msg = "The slice definition for "+slices.get(s).getFocus().getId()+" has a maximum of "+slices.get(s).getFocus().getMin()+" which is less than the minimum of "+slices.get(s).getFocus().getMin();
messages.add(new ValidationMessage(Source.ProfileValidator, ValidationMessage.IssueType.VALUE, url+"#"+ed.getId(), msg, ValidationMessage.IssueSeverity.WARNING));
}
slices.remove(s); slices.remove(s);
} }
} }