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

Commit 6d7c968

Browse files
authored
Merge pull request #26 from num-codex/obfuscate-feasibility-counts
Obfuscate feasibility counts
2 parents f66e823 + 09d52e4 commit 6d7c968

21 files changed

Lines changed: 449 additions & 140 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility;
2+
3+
/**
4+
* Provides different settings required for evaluating a measure.
5+
*/
6+
public interface EvaluationSettingsProvider {
7+
8+
/**
9+
* Returns a string representation of the evaluation strategy.
10+
*
11+
* @return Representation of the evaluation strategy.
12+
*/
13+
String evaluationStrategyRepresentation();
14+
15+
/**
16+
* Returns whether evaluation result obfuscation is enabled.
17+
*
18+
* @return True if evaluation result obfuscation is enabled and false otherwise.
19+
*/
20+
boolean evaluationResultObfuscationEnabled();
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility;
2+
3+
import java.util.Objects;
4+
5+
/**
6+
* Can provide several information necessary for running the evaluation pipeline step.
7+
*/
8+
public class EvaluationSettingsProviderImpl implements EvaluationSettingsProvider {
9+
10+
private final EvaluationStrategy evaluationStrategy;
11+
private final boolean evaluationResultObfuscationEnabled;
12+
13+
public EvaluationSettingsProviderImpl(EvaluationStrategy evaluationStrategy,
14+
Boolean evaluationResultObfuscationEnabled) {
15+
this.evaluationStrategy = Objects.requireNonNull(evaluationStrategy);
16+
this.evaluationResultObfuscationEnabled = Objects.requireNonNull(evaluationResultObfuscationEnabled);
17+
}
18+
19+
@Override
20+
public String evaluationStrategyRepresentation() {
21+
return evaluationStrategy.getStrategyRepresentation();
22+
}
23+
24+
@Override
25+
public boolean evaluationResultObfuscationEnabled() {
26+
return evaluationResultObfuscationEnabled;
27+
}
28+
}

codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/EvaluationStrategy.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/**
77
* Determines which evaluation strategy to be used within the process.
88
*/
9-
public enum EvaluationStrategy implements EvaluationStrategyProvider {
9+
public enum EvaluationStrategy {
1010

1111
/**
1212
* Measures will be evaluated using CQL.
@@ -47,9 +47,4 @@ public static EvaluationStrategy fromStrategyRepresentation(String strategyRepre
4747
.findFirst()
4848
.orElseThrow(() -> new IllegalArgumentException("No known evaluation strategy with the representation: " + strategyRepresentation));
4949
}
50-
51-
@Override
52-
public EvaluationStrategy provideEvaluationStrategy() {
53-
return this;
54-
}
5550
}

codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/EvaluationStrategyProvider.java

Lines changed: 0 additions & 10 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility;
2+
3+
/**
4+
* Obfuscator for obfuscating feasibility counts.
5+
*/
6+
public class FeasibilityCountObfuscator {
7+
8+
/**
9+
* Obfuscates the given feasibility count by calculating the same count rounded to the nearest ten.
10+
*
11+
* @param feasibilityCount The feasibility count that shall be obfuscated.
12+
* @return The obfuscated feasibility count.
13+
*/
14+
public int obfuscate(int feasibilityCount) {
15+
return feasibilityCount - (feasibilityCount % 10) + 10;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service;
2+
3+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.FeasibilityCountObfuscator;
4+
import org.camunda.bpm.engine.delegate.DelegateExecution;
5+
import org.highmed.dsf.bpe.delegate.AbstractServiceDelegate;
6+
import org.highmed.dsf.fhir.client.FhirWebserviceClientProvider;
7+
import org.highmed.dsf.fhir.task.TaskHelper;
8+
import org.hl7.fhir.r4.model.MeasureReport;
9+
import org.springframework.beans.factory.InitializingBean;
10+
11+
import java.util.Objects;
12+
13+
import static de.netzwerk_universitaetsmedizin.codex.processes.feasibility.variables.ConstantsFeasibility.VARIABLE_MEASURE_REPORT;
14+
15+
public class ObfuscateEvaluationResult extends AbstractServiceDelegate implements InitializingBean {
16+
17+
private final FeasibilityCountObfuscator obfuscator;
18+
19+
public ObfuscateEvaluationResult(FhirWebserviceClientProvider clientProvider, TaskHelper taskHelper,
20+
FeasibilityCountObfuscator obfuscator) {
21+
super(clientProvider, taskHelper);
22+
this.obfuscator = obfuscator;
23+
}
24+
25+
@Override
26+
public void afterPropertiesSet() throws Exception {
27+
super.afterPropertiesSet();
28+
Objects.requireNonNull(obfuscator, "obfuscator");
29+
}
30+
31+
@Override
32+
protected void doExecute(DelegateExecution execution) {
33+
var measureReport = (MeasureReport) execution.getVariable(VARIABLE_MEASURE_REPORT);
34+
execution.setVariable(VARIABLE_MEASURE_REPORT, obfuscateFeasibilityCount(measureReport));
35+
}
36+
37+
private MeasureReport obfuscateFeasibilityCount(MeasureReport measureReport) {
38+
var obfuscatedFeasibilityCount = obfuscator.obfuscate(measureReport.getGroupFirstRep().
39+
getPopulationFirstRep().getCount());
40+
41+
var obfuscatedMeasureReport = measureReport.copy();
42+
obfuscatedMeasureReport.getGroupFirstRep().getPopulationFirstRep().setCount(obfuscatedFeasibilityCount);
43+
return obfuscatedMeasureReport;
44+
}
45+
}

codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/service/PrepareEvaluationStrategy.java renamed to codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/service/SetupEvaluationSettings.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service;
22

3-
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationStrategyProvider;
3+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationSettingsProvider;
44
import org.camunda.bpm.engine.delegate.DelegateExecution;
55
import org.highmed.dsf.bpe.delegate.AbstractServiceDelegate;
66
import org.highmed.dsf.fhir.client.FhirWebserviceClientProvider;
@@ -9,27 +9,30 @@
99

1010
import java.util.Objects;
1111

12+
import static de.netzwerk_universitaetsmedizin.codex.processes.feasibility.variables.ConstantsFeasibility.VARIABLE_EVALUATION_OBFUSCATION;
1213
import static de.netzwerk_universitaetsmedizin.codex.processes.feasibility.variables.ConstantsFeasibility.VARIABLE_EVALUATION_STRATEGY;
1314

14-
public class PrepareEvaluationStrategy extends AbstractServiceDelegate implements InitializingBean {
15+
public class SetupEvaluationSettings extends AbstractServiceDelegate implements InitializingBean {
1516

16-
private final EvaluationStrategyProvider evaluationStrategyProvider;
17+
private final EvaluationSettingsProvider evaluationSettingsProvider;
1718

18-
public PrepareEvaluationStrategy(FhirWebserviceClientProvider clientProvider, TaskHelper taskHelper,
19-
EvaluationStrategyProvider evaluationStrategyProvider) {
19+
public SetupEvaluationSettings(FhirWebserviceClientProvider clientProvider, TaskHelper taskHelper,
20+
EvaluationSettingsProvider evaluationSettingsProvider) {
2021
super(clientProvider, taskHelper);
21-
this.evaluationStrategyProvider = evaluationStrategyProvider;
22+
this.evaluationSettingsProvider = evaluationSettingsProvider;
2223
}
2324

2425
@Override
2526
public void afterPropertiesSet() throws Exception {
2627
super.afterPropertiesSet();
27-
Objects.requireNonNull(evaluationStrategyProvider, "evaluationStrategyProvider");
28+
Objects.requireNonNull(evaluationSettingsProvider, "executionSettingsProvider");
2829
}
2930

3031
@Override
3132
protected void doExecute(DelegateExecution execution) {
3233
execution.setVariable(VARIABLE_EVALUATION_STRATEGY,
33-
evaluationStrategyProvider.provideEvaluationStrategy().getStrategyRepresentation().toLowerCase());
34+
evaluationSettingsProvider.evaluationStrategyRepresentation());
35+
execution.setVariable(VARIABLE_EVALUATION_OBFUSCATION,
36+
evaluationSettingsProvider.evaluationResultObfuscationEnabled());
3437
}
3538
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package de.netzwerk_universitaetsmedizin.codex.processes.feasibility.spring.config;
22

33
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationStrategy;
4-
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationStrategyProvider;
4+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationSettingsProvider;
5+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationSettingsProviderImpl;
56
import org.springframework.beans.factory.annotation.Value;
67
import org.springframework.context.annotation.Bean;
78
import org.springframework.context.annotation.Configuration;
@@ -12,8 +13,14 @@ public class EvaluationConfig {
1213
@Value("${de.netzwerk_universitaetsmedizin.codex.processes.feasibility.evaluation.strategy:cql}")
1314
private String evaluationStrategy;
1415

16+
@Value("${de.netzwerk_universitaetsmedizin.codex.processes.feasibility.evaluation.obfuscate:true}")
17+
private boolean obfuscateEvaluationResult;
18+
1519
@Bean
16-
public EvaluationStrategyProvider evaluationStrategy() {
17-
return EvaluationStrategy.fromStrategyRepresentation(evaluationStrategy);
20+
public EvaluationSettingsProvider executionSettingsProvider() {
21+
return new EvaluationSettingsProviderImpl(
22+
EvaluationStrategy.fromStrategyRepresentation(evaluationStrategy),
23+
obfuscateEvaluationResult
24+
);
1825
}
1926
}

codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/spring/config/FeasibilityConfig.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import ca.uhn.fhir.rest.client.api.IGenericClient;
55
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EnhancedFhirWebserviceClientProvider;
66
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EnhancedFhirWebserviceClientProviderImpl;
7-
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationStrategyProvider;
7+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.EvaluationSettingsProvider;
8+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.FeasibilityCountObfuscator;
89
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.FlareWebserviceClient;
910
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.message.SendDicRequest;
1011
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.message.SendDicResponse;
@@ -13,10 +14,11 @@
1314
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.DownloadMeasureReport;
1415
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.EvaluateCqlMeasure;
1516
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.EvaluateStructuredQueryMeasure;
16-
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.PrepareEvaluationStrategy;
17+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.ObfuscateEvaluationResult;
1718
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.PrepareForFurtherEvaluation;
1819
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.SelectRequestTargets;
1920
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.SelectResponseTarget;
21+
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.SetupEvaluationSettings;
2022
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.StoreFeasibilityResources;
2123
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.StoreLiveResult;
2224
import de.netzwerk_universitaetsmedizin.codex.processes.feasibility.service.StoreMeasureReport;
@@ -35,22 +37,22 @@ public class FeasibilityConfig {
3537
private final OrganizationProvider organizationProvider;
3638
private final TaskHelper taskHelper;
3739
private final FhirContext fhirContext;
38-
private final EvaluationStrategyProvider evaluationStrategyProvider;
40+
private final EvaluationSettingsProvider evaluationSettingsProvider;
3941
private final FlareWebserviceClient flareWebserviceClient;
4042

4143
public FeasibilityConfig(@Qualifier("clientProvider") FhirWebserviceClientProvider fhirClientProvider,
4244
@Qualifier("store") IGenericClient storeClient,
4345
OrganizationProvider organizationProvider,
4446
TaskHelper taskHelper,
4547
FhirContext fhirContext,
46-
EvaluationStrategyProvider evaluationStrategyProvider,
48+
EvaluationSettingsProvider evaluationSettingsProvider,
4749
FlareWebserviceClient flareWebserviceClient) {
4850
this.fhirClientProvider = fhirClientProvider;
4951
this.storeClient = storeClient;
5052
this.organizationProvider = organizationProvider;
5153
this.taskHelper = taskHelper;
5254
this.fhirContext = fhirContext;
53-
this.evaluationStrategyProvider = evaluationStrategyProvider;
55+
this.evaluationSettingsProvider = evaluationSettingsProvider;
5456
this.flareWebserviceClient = flareWebserviceClient;
5557
}
5658

@@ -59,6 +61,11 @@ public EnhancedFhirWebserviceClientProvider enhancedFhirClientProvider() {
5961
return new EnhancedFhirWebserviceClientProviderImpl(fhirClientProvider);
6062
}
6163

64+
@Bean
65+
public FeasibilityCountObfuscator feasibilityCountObfuscator() {
66+
return new FeasibilityCountObfuscator();
67+
}
68+
6269
//
6370
// process requestSimpleFeasibility implementations
6471
//
@@ -98,14 +105,14 @@ public AggregateMeasureReports aggregateMeasureReports() {
98105
//
99106

100107
@Bean
101-
public DownloadFeasibilityResources downloadFeasibilityResources(
102-
EnhancedFhirWebserviceClientProvider enhancedFhirClientProvider) {
103-
return new DownloadFeasibilityResources(enhancedFhirClientProvider, taskHelper, organizationProvider);
108+
public SetupEvaluationSettings setupEvaluationSettings() {
109+
return new SetupEvaluationSettings(fhirClientProvider, taskHelper, evaluationSettingsProvider);
104110
}
105111

106112
@Bean
107-
public PrepareEvaluationStrategy prepareEvaluationStrategy() {
108-
return new PrepareEvaluationStrategy(fhirClientProvider, taskHelper, evaluationStrategyProvider);
113+
public DownloadFeasibilityResources downloadFeasibilityResources(
114+
EnhancedFhirWebserviceClientProvider enhancedFhirClientProvider) {
115+
return new DownloadFeasibilityResources(enhancedFhirClientProvider, taskHelper, organizationProvider);
109116
}
110117

111118
@Bean
@@ -114,7 +121,7 @@ public StoreFeasibilityResources storeFeasibilityResources() {
114121
}
115122

116123
@Bean
117-
public EvaluateCqlMeasure evaluateMeasure() {
124+
public EvaluateCqlMeasure evaluateCqlMeasure() {
118125
return new EvaluateCqlMeasure(fhirClientProvider, taskHelper, storeClient);
119126
}
120127

@@ -123,6 +130,11 @@ public EvaluateStructuredQueryMeasure evaluateStructureQueryMeasure() {
123130
return new EvaluateStructuredQueryMeasure(fhirClientProvider, taskHelper, flareWebserviceClient);
124131
}
125132

133+
@Bean
134+
public ObfuscateEvaluationResult obfuscateEvaluationResult(FeasibilityCountObfuscator feasibilityCountObfuscator) {
135+
return new ObfuscateEvaluationResult(fhirClientProvider, taskHelper, feasibilityCountObfuscator);
136+
}
137+
126138
@Bean
127139
public StoreMeasureReport storeMeasureReport() {
128140
return new StoreMeasureReport(fhirClientProvider, taskHelper);

codex-process-feasibility/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/feasibility/variables/ConstantsFeasibility.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public interface ConstantsFeasibility {
88
String VARIABLE_MEASURE_REPORT_ID = "measure-report-id";
99
String VARIABLE_MEASURE_REPORT_MAP = "measure-report-map";
1010
String VARIABLE_EVALUATION_STRATEGY = "evaluation-strategy";
11+
String VARIABLE_EVALUATION_OBFUSCATION = "evaluation-obfuscation";
1112

1213
String CODESYSTEM_FEASIBILITY = "https://www.netzwerk-universitaetsmedizin.de/fhir/CodeSystem/feasibility";
1314
String CODESYSTEM_FEASIBILITY_VALUE_MEASURE_REFERENCE = "measure-reference";

0 commit comments

Comments
 (0)