Skip to content

Commit

Permalink
Merge pull request #25 from medizininformatik-initiative/develop
Browse files Browse the repository at this point in the history
Release v0.3.0
  • Loading branch information
DiCanio authored Aug 15, 2022
2 parents 7286dc7 + 4143b33 commit 6da8593
Show file tree
Hide file tree
Showing 16 changed files with 158 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-request"
]
},
"instantiatesUri": "http://medizininformatik-initiative.de/bpe/Process/feasibilityRequest/0.2.0",
"instantiatesUri": "http://medizininformatik-initiative.de/bpe/Process/feasibilityRequest/0.3.0",
"status": "requested",
"intent": "order",
"authoredOn": "2022",
Expand Down
4 changes: 2 additions & 2 deletions feasibility-dsf-process-docker-test-setup/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ services:
ORG_HIGHMED_DSF_BPE_FHIR_SERVER_BASE_URL: https://dic-2/fhir
DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_CLIENT_STORE_BASE_URL: http://dic-2-store:8080/fhir
DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_STRATEGY: cql
DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_OBFUSCATE: "false"
DE_MEDIZININFORMATIK_INITIATIVE_FEASIBILITY_DSF_PROCESS_EVALUATION_OBFUSCATE: "true"
networks:
dic-2-bpe-frontend:
dic-2-bpe-backend:
Expand All @@ -459,7 +459,7 @@ services:

# ---- DIC-2 - FHIR Data Store ----------------------------------------------
dic-2-store:
image: samply/blaze:0.16.4
image: samply/blaze:0.17.12
restart: on-failure
ports:
- "127.0.0.1:8080:8080"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>de.medizininformatik-initiative</groupId>
<artifactId>feasibility-dsf-process-tools</artifactId>
<version>0.2.0</version>
<version>0.3.0</version>
</parent>

<name>MII Feasibility Process Test Data Generator</name>
Expand Down
2 changes: 1 addition & 1 deletion feasibility-dsf-process-tools/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<parent>
<groupId>de.medizininformatik-initiative</groupId>
<artifactId>feasibility-dsf-process-parent</artifactId>
<version>0.2.0</version>
<version>0.3.0</version>
</parent>

<modules>
Expand Down
4 changes: 2 additions & 2 deletions feasibility-dsf-process/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>feasibility-dsf-process</artifactId>
<version>0.2.0</version>
<version>0.3.0</version>

<parent>
<groupId>de.medizininformatik-initiative</groupId>
<artifactId>feasibility-dsf-process-parent</artifactId>
<version>0.2.0</version>
<version>0.3.0</version>
</parent>

<name>MII Feasibility DSF Process</name>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,57 @@
package de.medizininformatik_initiative.feasibility_dsf_process;

import java.util.Random;

import static java.util.Objects.requireNonNull;

/**
* Obfuscator for obfuscating feasibility counts.
*/
public class FeasibilityCountObfuscator {
public class FeasibilityCountObfuscator implements Obfuscator<Integer> {

private static final Integer MAX_RANDOM_OBFUSCATOR_VALUE = 10;

// Obfuscated feasibility counts less than this value get discarded by setting
// the obfuscation result to 0.
private static final Integer MIN_ALLOWED_OBFUSCATED_RESULT = 5;

// We can't use RandomGenerator of Java 17 since this plugin will run within a framework still
// using Java 11 and is built for this version. Thus, using a lightweight wrapper should be fine.
private final RandomNumberGenerator randomGenerator;

public FeasibilityCountObfuscator(RandomNumberGenerator randomGenerator) {
this.randomGenerator = requireNonNull(randomGenerator, "random number generator must not be null");
}

/**
* Obfuscates the given feasibility count by calculating the same count rounded to the nearest ten.
* Obfuscates the given feasibility count by randomly adding a value in the range of [-5, 5] to it.
* <p>
* Important:
* <b>Returns 0, should the obfuscated result be less than 5.</b>
* </p>
*
* @param feasibilityCount The feasibility count that shall be obfuscated.
* @return The obfuscated feasibility count.
*/
public int obfuscate(int feasibilityCount) {
return feasibilityCount - (feasibilityCount % 10) + 10;
public Integer obfuscate(Integer feasibilityCount) {
var obfuscationOffset = randomGenerator.generateRandomNumber(MAX_RANDOM_OBFUSCATOR_VALUE + 1)
- (MAX_RANDOM_OBFUSCATOR_VALUE / 2);

var obfuscatedFeasibilityCount = feasibilityCount + obfuscationOffset;
return (obfuscatedFeasibilityCount < MIN_ALLOWED_OBFUSCATED_RESULT) ? 0 : obfuscatedFeasibilityCount;
}

public static class ObfuscationRandomNumberGenerator implements RandomNumberGenerator {

private final Random random;

public ObfuscationRandomNumberGenerator() {
random = new Random();
}

@Override
public int generateRandomNumber(int bound) {
return random.nextInt(bound);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

public class FeasibilityProcessPluginDefinition implements ProcessPluginDefinition {

public static final String VERSION = "0.2.0";
public static final String VERSION = "0.3.0";

@Override
public String getName() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.medizininformatik_initiative.feasibility_dsf_process;

/**
* Describes how values of a type T can get obfuscated.
*
* @param <T> The type of the value that shall get obfuscated.
*/
public interface Obfuscator<T> {

/**
* Obfuscates the specified value and returns the result.
*
* @param value Gets obfuscated.
* @return The obfuscated value.
*/
T obfuscate(T value);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package de.medizininformatik_initiative.feasibility_dsf_process;

/**
* Describes a simple random number generator.
*/
public interface RandomNumberGenerator {

/**
* Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive).
*
* @param bound The upper bound (must be positive).
* @return A pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive)
*/
int generateRandomNumber(int bound);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package de.medizininformatik_initiative.feasibility_dsf_process.service;

import de.medizininformatik_initiative.feasibility_dsf_process.FeasibilityCountObfuscator;
import de.medizininformatik_initiative.feasibility_dsf_process.Obfuscator;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.highmed.dsf.bpe.delegate.AbstractServiceDelegate;
import org.highmed.dsf.fhir.authorization.read.ReadAccessHelper;
Expand All @@ -15,10 +15,10 @@

public class ObfuscateEvaluationResult extends AbstractServiceDelegate implements InitializingBean {

private final FeasibilityCountObfuscator obfuscator;
private final Obfuscator<Integer> obfuscator;

public ObfuscateEvaluationResult(FhirWebserviceClientProvider clientProvider, TaskHelper taskHelper,
ReadAccessHelper readAccessHelper, FeasibilityCountObfuscator obfuscator) {
ReadAccessHelper readAccessHelper, Obfuscator<Integer> obfuscator) {
super(clientProvider, taskHelper, readAccessHelper);
this.obfuscator = obfuscator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,7 @@
import de.medizininformatik_initiative.feasibility_dsf_process.client.flare.FlareWebserviceClient;
import de.medizininformatik_initiative.feasibility_dsf_process.message.SendDicRequest;
import de.medizininformatik_initiative.feasibility_dsf_process.message.SendDicResponse;
import de.medizininformatik_initiative.feasibility_dsf_process.service.AggregateMeasureReports;
import de.medizininformatik_initiative.feasibility_dsf_process.service.DownloadFeasibilityResources;
import de.medizininformatik_initiative.feasibility_dsf_process.service.DownloadMeasureReport;
import de.medizininformatik_initiative.feasibility_dsf_process.service.EvaluateCqlMeasure;
import de.medizininformatik_initiative.feasibility_dsf_process.service.EvaluateStructuredQueryMeasure;
import de.medizininformatik_initiative.feasibility_dsf_process.service.ObfuscateEvaluationResult;
import de.medizininformatik_initiative.feasibility_dsf_process.service.PrepareForFurtherEvaluation;
import de.medizininformatik_initiative.feasibility_dsf_process.service.SelectRequestTargets;
import de.medizininformatik_initiative.feasibility_dsf_process.service.SelectResponseTarget;
import de.medizininformatik_initiative.feasibility_dsf_process.service.SetupEvaluationSettings;
import de.medizininformatik_initiative.feasibility_dsf_process.service.StoreFeasibilityResources;
import de.medizininformatik_initiative.feasibility_dsf_process.service.StoreLiveResult;
import de.medizininformatik_initiative.feasibility_dsf_process.service.StoreMeasureReport;
import de.medizininformatik_initiative.feasibility_dsf_process.service.*;
import org.highmed.dsf.fhir.authorization.read.ReadAccessHelper;
import org.highmed.dsf.fhir.client.FhirWebserviceClientProvider;
import org.highmed.dsf.fhir.organization.EndpointProvider;
Expand Down Expand Up @@ -71,7 +59,8 @@ public EnhancedFhirWebserviceClientProvider enhancedFhirClientProvider() {

@Bean
public FeasibilityCountObfuscator feasibilityCountObfuscator() {
return new FeasibilityCountObfuscator();
var randomNumberGenerator = new FeasibilityCountObfuscator.ObfuscationRandomNumberGenerator();
return new FeasibilityCountObfuscator(randomNumberGenerator);
}

//
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_0drkcb5" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:process id="medizininformatik-initiativede_feasibilityExecute" isExecutable="true" camunda:versionTag="0.2.0">
<bpmn:process id="medizininformatik-initiativede_feasibilityExecute" isExecutable="true" camunda:versionTag="0.3.0">
<bpmn:startEvent id="StartEvent" name="start">
<bpmn:outgoing>SequenceFlow_14cn0vs</bpmn:outgoing>
<bpmn:messageEventDefinition id="MessageEventDefinition_0sjtzj6" messageRef="Message_1yz2a31" />
Expand All @@ -14,8 +14,8 @@
<bpmn:extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="messageName">feasibilitySingleDicResultMessage</camunda:inputParameter>
<camunda:inputParameter name="instantiatesUri">http://medizininformatik-initiative.de/bpe/Process/feasibilityRequest/0.2.0</camunda:inputParameter>
<camunda:inputParameter name="profile">http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-single-dic-result|0.2.0</camunda:inputParameter>
<camunda:inputParameter name="instantiatesUri">http://medizininformatik-initiative.de/bpe/Process/feasibilityRequest/0.3.0</camunda:inputParameter>
<camunda:inputParameter name="profile">http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-single-dic-result|0.3.0</camunda:inputParameter>
</camunda:inputOutput>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0ascyjc</bpmn:incoming>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_0inb4ax" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0">
<bpmn:process id="medizininformatik-initiativede_feasibilityRequest" name="storeResult" isExecutable="true" camunda:versionTag="0.2.0">
<bpmn:process id="medizininformatik-initiativede_feasibilityRequest" name="storeResult" isExecutable="true" camunda:versionTag="0.3.0">
<bpmn:startEvent id="StartEvent" name="start">
<bpmn:outgoing>SequenceFlow_11k77gx</bpmn:outgoing>
<bpmn:messageEventDefinition id="MessageEventDefinition_10c2suu" messageRef="Message_1pq9qxp" />
Expand All @@ -12,9 +12,9 @@
<bpmn:sendTask id="sendRequestToDics" name="send request to dics" camunda:class="de.medizininformatik_initiative.feasibility_dsf_process.message.SendDicRequest">
<bpmn:extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="instantiatesUri">http://medizininformatik-initiative.de/bpe/Process/feasibilityExecute/0.2.0</camunda:inputParameter>
<camunda:inputParameter name="instantiatesUri">http://medizininformatik-initiative.de/bpe/Process/feasibilityExecute/0.3.0</camunda:inputParameter>
<camunda:inputParameter name="messageName">feasibilityExecuteMessage</camunda:inputParameter>
<camunda:inputParameter name="profile">http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-execute|0.2.0</camunda:inputParameter>
<camunda:inputParameter name="profile">http://medizininformatik-initiative.de/fhir/StructureDefinition/feasibility-task-execute|0.3.0</camunda:inputParameter>
</camunda:inputOutput>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0b5s4ef</bpmn:incoming>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,50 @@
package de.medizininformatik_initiative.feasibility_dsf_process;

import de.medizininformatik_initiative.feasibility_dsf_process.FeasibilityCountObfuscator;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Arrays;
import java.util.Collection;
import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertIterableEquals;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.when;

@RunWith(Parameterized.class)
@RunWith(MockitoJUnitRunner.class)
public class FeasibilityCountObfuscatorTest {

private FeasibilityCountObfuscator obfuscator;
@Mock
private RandomNumberGenerator randomNumberGenerator;

@Before
public void setUp() {
obfuscator = new FeasibilityCountObfuscator();
}

@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{0, 10}, {5, 10}, {10, 20}, {20, 30}, {100, 110}, {113, 120}
});
}
@InjectMocks
private FeasibilityCountObfuscator feasibilityCountObfuscator;

@Parameter
public int feasibilityCount;
@Test
public void testObfuscateFeasibility_ObfuscatedResultsLowerThanFiveGetReturnedAsZero() {
when(randomNumberGenerator.generateRandomNumber(anyInt())).thenReturn(1, 2, 3, 4);

@Parameter(1)
public int expectedObfuscatedFeasibilityCount;
int nonObfuscatedFeasibilityResult = 5;
List<Integer> obfuscatedFeasibilityResults = new ArrayList<>();
for (int i = 0; i < 4; i++) {
obfuscatedFeasibilityResults.add(feasibilityCountObfuscator.obfuscate(nonObfuscatedFeasibilityResult));
}

assertIterableEquals(List.of(0, 0, 0, 0), obfuscatedFeasibilityResults);
}

@Test
public void testObfuscateFeasibility() {
assertEquals(expectedObfuscatedFeasibilityCount, obfuscator.obfuscate(feasibilityCount));
public void testObfuscateFeasibility_ObfustedResultsGreaterOrEqualToFiveAreKept() {
when(randomNumberGenerator.generateRandomNumber(anyInt())).thenReturn(0, 5, 10);

int nonObfuscatedFeasibilityResult = 10;
List<Integer> obfuscatedFeasibilityResults = new ArrayList<>();
for (int i = 0; i < 3; i++) {
obfuscatedFeasibilityResults.add(feasibilityCountObfuscator.obfuscate(nonObfuscatedFeasibilityResult));
}

assertIterableEquals(List.of(5, 10, 15), obfuscatedFeasibilityResults);
}
}
Loading

0 comments on commit 6da8593

Please sign in to comment.