Skip to content
This repository was archived by the owner on Oct 6, 2025. It is now read-only.

Commit 9ab0080

Browse files
committed
Merge branch 'release/0.5.1' into main
2 parents f5aaa4e + 23a9c6b commit 9ab0080

File tree

29 files changed

+1237
-107
lines changed

29 files changed

+1237
-107
lines changed

codex-process-data-transfer/pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>de.netzwerk-universitaetsmedizin.codex</groupId>
88
<artifactId>codex-processes-ap1</artifactId>
9-
<version>0.5.0</version>
9+
<version>0.5.1</version>
1010
</parent>
1111

1212
<properties>
@@ -234,6 +234,7 @@
234234
<descriptors>
235235
<descriptor>src/assembly/zip.xml</descriptor>
236236
</descriptors>
237+
<finalName>codex-process-data-transfer-validator-${project.version}</finalName>
237238
</configuration>
238239
<executions>
239240
<execution>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate=client_certificate.pem
2+
de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key=client_private-key.pem
3+
#de.netzwerk.universitaetsmedizin.codex.gecco.validation.valueset.expansion.client.authentication.certificate.private.key.password=

codex-process-data-transfer/src/assembly/zip.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
<include>*.jar</include>
1616
</includes>
1717
</fileSet>
18+
<fileSet>
19+
<directory>${project.basedir}/src/assembly</directory>
20+
<outputDirectory></outputDirectory>
21+
<includes>
22+
<include>application.properties</include>
23+
</includes>
24+
</fileSet>
1825
<fileSet>
1926
<directory>${project.build.directory}/lib</directory>
2027
<outputDirectory>lib</outputDirectory>

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/DataTransferProcessPluginDefinition.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public class DataTransferProcessPluginDefinition implements ProcessPluginDefinit
3636
{
3737
private static final Logger logger = LoggerFactory.getLogger(DataTransferProcessPluginDefinition.class);
3838

39-
public static final String VERSION = "0.5.0";
40-
public static final LocalDate DATE = LocalDate.of(2022, 6, 21);
39+
public static final String VERSION = "0.5.1";
40+
public static final LocalDate DATE = LocalDate.of(2022, 6, 25);
4141

4242
@Override
4343
public String getName()

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/client/fhir/AbstractComplexFhirClient.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ protected Optional<Patient> findPatientInLocalFhirStore(String pseudonym)
171171
}
172172
catch (UnprocessableEntityException e)
173173
{
174-
logger.warn("Error while search for Patient with pseudonym {}|{}, message: {}, status: {}",
174+
logger.warn("Error while searching for Patient with pseudonym {}|{}, message: {}, status: {}",
175175
NAMING_SYSTEM_NUM_CODEX_CRR_PSEUDONYM, pseudonym, e.getMessage(), e.getStatusCode());
176176

177177
IBaseOperationOutcome outcome = e.getOperationOutcome();
@@ -183,14 +183,20 @@ protected Optional<Patient> findPatientInLocalFhirStore(String pseudonym)
183183
}
184184
catch (BaseServerResponseException e)
185185
{
186-
logger.warn("Error while search for Patient with pseudonym {}|{}, message: {}, status: {}",
186+
logger.warn("Error while searching for Patient with pseudonym {}|{}, message: {}, status: {}",
187187
NAMING_SYSTEM_NUM_CODEX_CRR_PSEUDONYM, pseudonym, e.getMessage(), e.getStatusCode());
188+
189+
IBaseOperationOutcome outcome = e.getOperationOutcome();
190+
191+
if (outcome != null && outcome instanceof OperationOutcome)
192+
outcomeLogger.logOutcome((OperationOutcome) outcome);
193+
188194
throw e;
189195
}
190196
catch (Exception e)
191197
{
192-
logger.warn("Error while search for Patient with pseudonym " + NAMING_SYSTEM_NUM_CODEX_CRR_PSEUDONYM + "|"
193-
+ pseudonym, e);
198+
logger.warn("Error while searching for Patient with pseudonym " + NAMING_SYSTEM_NUM_CODEX_CRR_PSEUDONYM
199+
+ "|" + pseudonym, e);
194200
throw e;
195201
}
196202
}
@@ -221,10 +227,10 @@ public Stream<DomainResource> getNewData(String pseudonym, DateWithPrecision exp
221227
logger.debug("Search-Bundle result: {}",
222228
geccoClient.getFhirContext().newJsonParser().encodeResourceToString(resultBundle));
223229

224-
return Stream.concat(Stream.of(localPatient.get()),
230+
return distinctById(Stream.concat(Stream.of(localPatient.get()),
225231
resultBundle.getEntry().stream().filter(BundleEntryComponent::hasResource)
226232
.map(BundleEntryComponent::getResource).filter(r -> r instanceof Bundle).map(r -> (Bundle) r)
227-
.flatMap(this::getDomainResources));
233+
.flatMap(this::getDomainResources)));
228234
}
229235

230236
private Optional<Patient> findPatientInLocalFhirStore(String system, String pseudonym)

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/client/fhir/AbstractFhirClient.java

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
3131
import org.hl7.fhir.r4.model.Bundle.BundleType;
3232
import org.hl7.fhir.r4.model.Bundle.HTTPVerb;
33+
import org.hl7.fhir.r4.model.Bundle.SearchEntryMode;
3334
import org.hl7.fhir.r4.model.DomainResource;
3435
import org.hl7.fhir.r4.model.IdType;
3536
import org.hl7.fhir.r4.model.Identifier;
@@ -59,6 +60,54 @@ public abstract class AbstractFhirClient implements GeccoFhirClient
5960
private static final Logger logger = LoggerFactory.getLogger(AbstractFhirClient.class);
6061
private static final OutcomeLogger outcomeLogger = new OutcomeLogger(logger);
6162

63+
private static final class DomainResourceUniqueByUnqualifiedVersionlessId
64+
{
65+
private final DomainResource resource;
66+
private final String unqualifiedVersionlessIdValue;
67+
68+
public DomainResourceUniqueByUnqualifiedVersionlessId(DomainResource resource)
69+
{
70+
this.resource = resource;
71+
72+
unqualifiedVersionlessIdValue = resource.getIdElement().toUnqualifiedVersionless().getValue();
73+
}
74+
75+
public DomainResource getResource()
76+
{
77+
return resource;
78+
}
79+
80+
@Override
81+
public int hashCode()
82+
{
83+
final int prime = 31;
84+
int result = 1;
85+
result = prime * result
86+
+ ((unqualifiedVersionlessIdValue == null) ? 0 : unqualifiedVersionlessIdValue.hashCode());
87+
return result;
88+
}
89+
90+
@Override
91+
public boolean equals(Object obj)
92+
{
93+
if (this == obj)
94+
return true;
95+
if (obj == null)
96+
return false;
97+
if (getClass() != obj.getClass())
98+
return false;
99+
DomainResourceUniqueByUnqualifiedVersionlessId other = (DomainResourceUniqueByUnqualifiedVersionlessId) obj;
100+
if (unqualifiedVersionlessIdValue == null)
101+
{
102+
if (other.unqualifiedVersionlessIdValue != null)
103+
return false;
104+
}
105+
else if (!unqualifiedVersionlessIdValue.equals(other.unqualifiedVersionlessIdValue))
106+
return false;
107+
return true;
108+
}
109+
}
110+
62111
private static final List<String> RESOURCES_WITH_PATIENT_REF = Arrays.asList("AllergyIntolerance", "CarePlan",
63112
"CareTeam", "ClinicalImpression", "Composition", "Condition", "Consent", "DetectedIssue", "DeviceRequest",
64113
"DeviceUseStatement", "DiagnosticReport", "DocumentManifest", "DocumentReference", "Encounter",
@@ -539,9 +588,16 @@ protected Stream<DomainResource> getDomainResources(Bundle bundle)
539588

540589
private Stream<DomainResource> getDomainResourcesFromBundle(Bundle bundle)
541590
{
542-
return bundle.getEntry().stream().filter(BundleEntryComponent::hasResource)
543-
.map(BundleEntryComponent::getResource).filter(r -> r instanceof DomainResource)
544-
.map(r -> (DomainResource) r);
591+
// includes first
592+
return Stream.concat(
593+
bundle.getEntry().stream().filter(BundleEntryComponent::hasResource)
594+
.filter(e -> e.hasSearch() && SearchEntryMode.INCLUDE.equals(e.getSearch().getMode()))
595+
.map(BundleEntryComponent::getResource).filter(r -> r instanceof DomainResource)
596+
.map(r -> (DomainResource) r),
597+
bundle.getEntry().stream().filter(BundleEntryComponent::hasResource)
598+
.filter(e -> e.hasSearch() && SearchEntryMode.MATCH.equals(e.getSearch().getMode()))
599+
.map(BundleEntryComponent::getResource).filter(r -> r instanceof DomainResource)
600+
.map(r -> (DomainResource) r));
545601
}
546602

547603
private Stream<DomainResource> doGetDomainResources(String nextUrl, int subTotal)
@@ -624,4 +680,10 @@ public void updatePatient(Patient patient)
624680
throw e;
625681
}
626682
}
683+
684+
protected Stream<DomainResource> distinctById(Stream<DomainResource> resources)
685+
{
686+
return resources.map(DomainResourceUniqueByUnqualifiedVersionlessId::new).distinct()
687+
.map(DomainResourceUniqueByUnqualifiedVersionlessId::getResource);
688+
}
627689
}

0 commit comments

Comments
 (0)