-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #25 from medizininformatik-initiative/develop
Release v0.3.0
- Loading branch information
Showing
16 changed files
with
158 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 44 additions & 4 deletions
48
...a/de/medizininformatik_initiative/feasibility_dsf_process/FeasibilityCountObfuscator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
...ess/src/main/java/de/medizininformatik_initiative/feasibility_dsf_process/Obfuscator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
15 changes: 15 additions & 0 deletions
15
...n/java/de/medizininformatik_initiative/feasibility_dsf_process/RandomNumberGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
60 changes: 33 additions & 27 deletions
60
.../medizininformatik_initiative/feasibility_dsf_process/FeasibilityCountObfuscatorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
Oops, something went wrong.