Skip to content

Commit b33f1a4

Browse files
committed
Merge branch 'release/0.3.0' into main
2 parents 9122ac8 + 457d14e commit b33f1a4

17 files changed

+308
-132
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>dev.dsf</groupId>
88
<artifactId>dsf-fhir-validator</artifactId>
9-
<version>0.2.0</version>
9+
<version>0.3.0</version>
1010

1111
<properties>
1212
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

src/main/java/dev/dsf/fhir/validator/client/TerminologyServerClient.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dev.dsf.fhir.validator.client;
22

3+
import java.util.List;
34
import java.util.Objects;
45

56
import org.hl7.fhir.r4.model.CapabilityStatement;
7+
import org.hl7.fhir.r4.model.CodeSystem;
68
import org.hl7.fhir.r4.model.Coding;
79
import org.hl7.fhir.r4.model.OperationOutcome;
810
import org.hl7.fhir.r4.model.ValueSet;
@@ -15,6 +17,14 @@ record ValidationResult(boolean result, String message, OperationOutcome outome)
1517
{
1618
}
1719

20+
record UrlAndVersion(String url, String version)
21+
{
22+
public static UrlAndVersion fromCodeSystem(CodeSystem cs)
23+
{
24+
return new UrlAndVersion(cs.getUrl(), cs.getVersion());
25+
}
26+
}
27+
1828
/**
1929
* @param valueSet
2030
* not <code>null</code>
@@ -55,4 +65,12 @@ default ValidationResult validate(String system, String code, String display, St
5565

5666
return validate(new Coding(system, code, display).setVersion(version));
5767
}
68+
69+
/**
70+
* @param url
71+
* not <code>null</code>
72+
* @return
73+
* @throws WebApplicationException
74+
*/
75+
List<UrlAndVersion> getSupportedCodeSystemVersion(String url) throws WebApplicationException;
5876
}

src/main/java/dev/dsf/fhir/validator/client/TerminologyServerClientJersey.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.dsf.fhir.validator.client;
22

33
import java.security.KeyStore;
4+
import java.util.List;
45
import java.util.Objects;
56
import java.util.concurrent.TimeUnit;
67
import java.util.logging.Level;
@@ -15,7 +16,10 @@
1516
import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
1617
import org.glassfish.jersey.logging.LoggingFeature;
1718
import org.glassfish.jersey.logging.LoggingFeature.Verbosity;
19+
import org.hl7.fhir.r4.model.Bundle;
20+
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
1821
import org.hl7.fhir.r4.model.CapabilityStatement;
22+
import org.hl7.fhir.r4.model.CodeSystem;
1923
import org.hl7.fhir.r4.model.Coding;
2024
import org.hl7.fhir.r4.model.OperationOutcome;
2125
import org.hl7.fhir.r4.model.Parameters;
@@ -143,4 +147,16 @@ public CapabilityStatement getMetadata() throws WebApplicationException
143147
{
144148
return getResource().path("metadata").request(Constants.CT_FHIR_JSON_NEW).get(CapabilityStatement.class);
145149
}
150+
151+
@Override
152+
public List<UrlAndVersion> getSupportedCodeSystemVersion(String url) throws WebApplicationException
153+
{
154+
Bundle resultBundle = getResource().path("CodeSystem").queryParam("url", url).queryParam("_summary", "true")
155+
.request(Constants.CT_FHIR_JSON_NEW).get(Bundle.class);
156+
157+
return resultBundle.getEntry().stream().filter(BundleEntryComponent::hasResource)
158+
.map(BundleEntryComponent::getResource).filter(r -> r instanceof CodeSystem).map(r -> (CodeSystem) r)
159+
.filter(cs -> cs.hasVersionElement() && cs.getVersionElement().hasValue())
160+
.map(UrlAndVersion::fromCodeSystem).distinct().toList();
161+
}
146162
}

src/main/java/dev/dsf/fhir/validator/implementation_guide/ValidationPackage.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ private Consumer<ValidationPackageEntry> doParseResources(FhirContext context, L
151151
{
152152
return entry ->
153153
{
154-
if ("package/package.json".equals(entry.getFileName())
155-
|| (entry.getFileName() != null && (entry.getFileName().startsWith("package/example")
156-
|| entry.getFileName().endsWith(".index.json") || !entry.getFileName().endsWith(".json"))))
154+
if ("package/package.json".equals(entry.getFileName()) || (entry.getFileName() != null
155+
&& (entry.getFileName().startsWith("package/example") || entry.getFileName().endsWith(".index.json")
156+
|| entry.getFileName().endsWith(".schema.json") || !entry.getFileName().endsWith(".json"))))
157157
{
158158
logger.debug("Ignoring {}", entry.getFileName());
159159
return;
@@ -169,26 +169,26 @@ private Consumer<ValidationPackageEntry> doParseResources(FhirContext context, L
169169
resourceString = resourceString.replaceAll("<h2>[\\s\\w\\[\\]]*</tt>", "");
170170
IBaseResource resource = context.newJsonParser().parseResource(resourceString);
171171

172-
if (resource instanceof CodeSystem)
173-
codeSystems.add((CodeSystem) resource);
174-
else if (resource instanceof NamingSystem)
175-
namingSystems.add((NamingSystem) resource);
176-
else if (resource instanceof StructureDefinition)
172+
if (resource instanceof CodeSystem c)
173+
codeSystems.add(c);
174+
else if (resource instanceof NamingSystem n)
175+
namingSystems.add(n);
176+
else if (resource instanceof StructureDefinition s)
177177
{
178-
if (!StructureDefinitionKind.LOGICAL.equals(((StructureDefinition) resource).getKind()))
179-
structureDefinitions.add((StructureDefinition) resource);
178+
if (!StructureDefinitionKind.LOGICAL.equals(s.getKind()))
179+
structureDefinitions.add(s);
180180
else
181181
logger.debug("Ignoring StructureDefinition with kind = logical");
182182
}
183-
else if (resource instanceof ValueSet)
184-
valueSets.add((ValueSet) resource);
183+
else if (resource instanceof ValueSet v)
184+
valueSets.add(v);
185185
else
186186
logger.debug("Ignoring resource of type {}", resource.getClass().getName());
187187
}
188188
catch (Exception e)
189189
{
190-
logger.warn("Ignoring resource with error while parsing, {}: {}", e.getClass().getName(),
191-
e.getMessage());
190+
logger.warn("Ignoring resource with error while parsing {}, {}: {}", entry.getFileName(),
191+
e.getClass().getName(), e.getMessage());
192192
}
193193
};
194194
}

src/main/java/dev/dsf/fhir/validator/implementation_guide/ValidationPackageClientJersey.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ public ValidationPackage download(ValidationPackageIdentifier identifier)
9797
{
9898
Objects.requireNonNull(identifier, "identifier");
9999

100-
try (InputStream in = getResource().path(identifier.getName()).path(identifier.getVersion())
100+
try (InputStream in = getResource().path(identifier.name()).path(identifier.version())
101101
.request("application/tar+gzip").get(InputStream.class))
102102
{
103-
return ValidationPackage.from(identifier.getName(), identifier.getVersion(), in);
103+
return ValidationPackage.from(identifier.name(), identifier.version(), in);
104104
}
105105
}
106106

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package dev.dsf.fhir.validator.implementation_guide;
22

3-
import java.util.Objects;
4-
5-
public class ValidationPackageIdentifier
3+
public record ValidationPackageIdentifier(String name, String version)
64
{
75
public static ValidationPackageIdentifier fromString(String nameAndVersion)
86
{
@@ -14,65 +12,9 @@ public static ValidationPackageIdentifier fromString(String nameAndVersion)
1412
return new ValidationPackageIdentifier(split[0], split[1]);
1513
}
1614

17-
private final String name;
18-
private final String version;
19-
20-
public ValidationPackageIdentifier(String name, String version)
21-
{
22-
this.name = Objects.requireNonNull(name, "name");
23-
this.version = Objects.requireNonNull(version, "version");
24-
}
25-
26-
public String getName()
27-
{
28-
return name;
29-
}
30-
31-
public String getVersion()
32-
{
33-
return version;
34-
}
35-
3615
@Override
3716
public String toString()
3817
{
3918
return name + "|" + version;
4019
}
41-
42-
@Override
43-
public int hashCode()
44-
{
45-
final int prime = 31;
46-
int result = 1;
47-
result = prime * result + ((name == null) ? 0 : name.hashCode());
48-
result = prime * result + ((version == null) ? 0 : version.hashCode());
49-
return result;
50-
}
51-
52-
@Override
53-
public boolean equals(Object obj)
54-
{
55-
if (this == obj)
56-
return true;
57-
if (obj == null)
58-
return false;
59-
if (getClass() != obj.getClass())
60-
return false;
61-
ValidationPackageIdentifier other = (ValidationPackageIdentifier) obj;
62-
if (name == null)
63-
{
64-
if (other.name != null)
65-
return false;
66-
}
67-
else if (!name.equals(other.name))
68-
return false;
69-
if (version == null)
70-
{
71-
if (other.version != null)
72-
return false;
73-
}
74-
else if (!version.equals(other.version))
75-
return false;
76-
return true;
77-
}
7820
}

src/main/java/dev/dsf/fhir/validator/implementation_guide/ValidationPackageManager.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ default ValidationPackageWithDepedencies downloadPackageWithDependencies(String
2626
* @param identifier
2727
* @return validation package with dependencies
2828
*/
29-
ValidationPackageWithDepedencies downloadPackageWithDependencies(ValidationPackageIdentifier identifier);
29+
default ValidationPackageWithDepedencies downloadPackageWithDependencies(ValidationPackageIdentifier identifier)
30+
{
31+
return downloadPackagesWithDependencies(identifier).get(0);
32+
}
3033

3134
/**
3235
* Downloads the given FHIR packages and all its dependencies.

src/main/java/dev/dsf/fhir/validator/implementation_guide/ValidationPackageManagerImpl.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Map;
99
import java.util.Objects;
1010
import java.util.Optional;
11+
import java.util.stream.Collectors;
1112

1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
@@ -72,18 +73,13 @@ public List<ValidationPackageWithDepedencies> downloadPackagesWithDependencies(
7273
packages.add(ValidationPackageWithDepedencies.from(packagesByNameAndVersion, identifier));
7374
}
7475

75-
return packages;
76-
}
77-
78-
@Override
79-
public ValidationPackageWithDepedencies downloadPackageWithDependencies(ValidationPackageIdentifier identifier)
80-
{
81-
Objects.requireNonNull(identifier, "identifier");
76+
logger.info("Validating with packages {}",
77+
packages.stream().map(p -> p.getIdentifier().toString() + " {dependencies: "
78+
+ p.getDependencies().stream().map(ValidationPackage::getIdentifier)
79+
.map(ValidationPackageIdentifier::toString).sorted().collect(Collectors.joining(", "))
80+
+ "}").collect(Collectors.joining(", ", "[", "]")));
8281

83-
Map<ValidationPackageIdentifier, ValidationPackage> packagesByNameAndVersion = new HashMap<>();
84-
downloadPackageWithDependencies(identifier, packagesByNameAndVersion, new HashMap<>());
85-
86-
return ValidationPackageWithDepedencies.from(packagesByNameAndVersion, identifier);
82+
return packages;
8783
}
8884

8985
private void downloadPackageWithDependencies(ValidationPackageIdentifier identifier,
@@ -92,6 +88,9 @@ private void downloadPackageWithDependencies(ValidationPackageIdentifier identif
9288
{
9389
if (allPackagesByNameAndVersion.containsKey(identifier))
9490
{
91+
ValidationPackage dependency = allPackagesByNameAndVersion.get(identifier);
92+
packagesByNameAndVersion.put(identifier, dependency);
93+
9594
// already downloaded
9695
return;
9796
}
@@ -102,6 +101,23 @@ else if (noDownloadPackages.contains(identifier))
102101
}
103102

104103
ValidationPackage vPackage = downloadAndHandleException(identifier);
104+
identifier = vPackage.getIdentifier();
105+
106+
// check again, as the identifier may have changed from a A.B.x wildcard
107+
if (allPackagesByNameAndVersion.containsKey(identifier))
108+
{
109+
ValidationPackage dependency = allPackagesByNameAndVersion.get(identifier);
110+
packagesByNameAndVersion.put(identifier, dependency);
111+
112+
// already downloaded
113+
return;
114+
}
115+
else if (noDownloadPackages.contains(identifier))
116+
{
117+
logger.debug("Not using package {}", identifier.toString());
118+
return;
119+
}
120+
105121
packagesByNameAndVersion.put(identifier, vPackage);
106122
allPackagesByNameAndVersion.put(identifier, vPackage);
107123

@@ -112,15 +128,15 @@ else if (noDownloadPackages.contains(identifier))
112128

113129
private ValidationPackage downloadAndHandleException(ValidationPackageIdentifier identifier)
114130
{
115-
if (identifier.getVersion().matches("\\d+\\.\\d+\\.x"))
131+
if (identifier.version().matches("\\d+\\.\\d+\\.x"))
116132
{
117-
String versoinPrefix = identifier.getVersion().substring(0, identifier.getVersion().length() - 1);
133+
String versoinPrefix = identifier.version().substring(0, identifier.version().length() - 1);
118134

119-
PackageVersions versions = validationPackageClient.list(identifier.getName());
135+
PackageVersions versions = validationPackageClient.list(identifier.name());
120136
Optional<String> latest = versions.getLatest(versoinPrefix);
121137

122138
if (latest.isPresent())
123-
identifier = new ValidationPackageIdentifier(identifier.getName(), latest.get());
139+
identifier = new ValidationPackageIdentifier(identifier.name(), latest.get());
124140
}
125141

126142
try

src/main/java/dev/dsf/fhir/validator/implementation_guide/ValidationPackageWithDepedencies.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ private void logMissingValueSets(Set<String> neededValueSets, List<ValueSet> fou
256256
if (!missingValueSets.isEmpty())
257257
{
258258
logger.warn(
259-
"The following ValueSet are required for validation but could not be found in validation package {}|{} or its dependencies, this may result in incomplete valdidation: [{}]",
259+
"The following ValueSet are required for validation but could not be found in package (incl. dependencies) {}|{}, this may result in incomplete valdidation: [{}]",
260260
getName(), getVersion(), missingValueSets);
261261
}
262262
}

0 commit comments

Comments
 (0)