Skip to content

Commit

Permalink
Merge pull request #96 from medizininformatik-initiative/release-1.0.0.3
Browse files Browse the repository at this point in the history
Release Version 1.0.0.3
  • Loading branch information
EmteZogaf authored Dec 7, 2023
2 parents a0ae79f + 4aea40f commit 0afdbee
Show file tree
Hide file tree
Showing 34 changed files with 159 additions and 96 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ http {
add_header Strict-Transport-Security "max-age=63072000" always;

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;

location / {
auth_basic "dic_3_store_auth";
Expand All @@ -45,4 +46,4 @@ http {
proxy_read_timeout 43200s;
}
}
}
}
5 changes: 5 additions & 0 deletions feasibility-dsf-process-docker-test-setup/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,11 @@ services:
dedicated-dic-3-store-proxy:
image: nginx:1.25.1
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "curl -ks https://localhost || exit 1"]
interval: 10s
timeout: 5s
retries: 5
ports:
- "127.0.0.1:10443:443"
secrets:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
public interface EvaluationSettingsProvider {

/**
* Returns a string representation of the evaluation strategy.
* Returns the evaluation strategy.
*
* @return Representation of the evaluation strategy.
* @return the evaluation strategy.
*/
String evaluationStrategyRepresentation();
EvaluationStrategy evaluationStrategy();

/**
* Returns whether evaluation result obfuscation is enabled.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public EvaluationSettingsProviderImpl(EvaluationStrategy evaluationStrategy,
}

@Override
public String evaluationStrategyRepresentation() {
return evaluationStrategy.getStrategyRepresentation();
public EvaluationStrategy evaluationStrategy() {
return evaluationStrategy;
}

@Override
Expand All @@ -67,4 +67,5 @@ public Integer getRateLimitCount() {
public Duration getRateLimitTimeIntervalDuration() {
return rateLimitTimeIntervalDuration;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public enum EvaluationStrategy {
*
* @return The evaluation strategy's string representation.
*/
public String getStrategyRepresentation() {
@Override
public String toString() {
return strategyRepresentation;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;

import java.io.IOException;
import java.util.List;

import static de.medizininformatik_initiative.feasibility_dsf_process.variables.ConstantsFeasibility.FEASIBILITY_EXECUTE_PROCESS_ID;
Expand Down Expand Up @@ -47,15 +46,15 @@ public void onProcessesDeployed(List<String> processes) {
.execute();
logger.info("Connection test OK ({} - {})", statement.getSoftware().getName(),
statement.getSoftware().getVersion());
} catch (RuntimeException e) {
logger.warn("Connection test FAILED - error: {} - {}", e.getClass().getName(), e.getMessage());
} catch (Exception e) {
logger.error("Connection test FAILED - error: {} - {}", e.getClass().getName(), e.getMessage());
}
} else {
try {
flareWebserviceClient.testConnection();
logger.info("Connection test OK (flare)");
} catch (IOException e) {
logger.warn("Connection test FAILED (flare) - error: {} - {}", e.getClass().getName(),
} catch (Exception e) {
logger.error("Connection test FAILED (flare) - error: {} - {}", e.getClass().getName(),
e.getMessage());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package de.medizininformatik_initiative.feasibility_dsf_process.client.flare;

import org.apache.http.client.ClientProtocolException;

import java.io.IOException;

/**
Expand All @@ -28,7 +26,6 @@ public interface FlareWebserviceClient {
* </p>
*
* @throws IOException in case of a problem or the connection was aborted
* @throws ClientProtocolException in case of an http protocol error
*/
void testConnection() throws ClientProtocolException, IOException;
void testConnection() throws IOException;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package de.medizininformatik_initiative.feasibility_dsf_process.client.flare;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
Expand Down Expand Up @@ -42,7 +41,7 @@ private URI resolve(String path) {
}

@Override
public void testConnection() throws ClientProtocolException, IOException {
public void testConnection() throws IOException {
var req = new HttpGet(resolve("/cache/stats"));

httpClient.execute(req, new BasicResponseHandler());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package de.medizininformatik_initiative.feasibility_dsf_process.client.flare;

import de.medizininformatik_initiative.feasibility_dsf_process.EvaluationSettingsProvider;
import de.medizininformatik_initiative.feasibility_dsf_process.EvaluationStrategy;
import de.medizininformatik_initiative.feasibility_dsf_process.client.store.TlsClientFactory;
import de.medizininformatik_initiative.feasibility_dsf_process.spring.config.BaseConfig;
import de.medizininformatik_initiative.feasibility_dsf_process.spring.config.EvaluationConfig;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.auth.AuthScope;
Expand Down Expand Up @@ -33,12 +36,11 @@

import static ca.uhn.fhir.rest.api.Constants.HEADER_AUTHORIZATION;
import static ca.uhn.fhir.rest.api.Constants.HEADER_AUTHORIZATION_VALPREFIX_BEARER;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.lang.String.format;

@Configuration
@Import(BaseConfig.class)
@Import({ BaseConfig.class, EvaluationConfig.class })
public class FlareWebserviceClientSpringConfig {

@Value("${de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url:}")
Expand Down Expand Up @@ -69,60 +71,76 @@ public class FlareWebserviceClientSpringConfig {
private String bearerAuthToken;

@Bean
public FlareWebserviceClient flareWebserviceClient(HttpClient httpClient) {
return new FlareWebserviceClient() {

FlareWebserviceClient client;
public FlareWebserviceClient flareWebserviceClient(HttpClient httpClient,
EvaluationSettingsProvider evaluationSettingsProvider) {
if (EvaluationStrategy.STRUCTURED_QUERY == evaluationSettingsProvider.evaluationStrategy()) {
return createFlareClient(httpClient);
} else {
return new ErrorFlareWebserviceClient(new IllegalStateException(
format("EVALUATION_STRATEGY is not set to '%s'.", EvaluationStrategy.STRUCTURED_QUERY)));
}
}

@Override
public int requestFeasibility(byte[] structuredQuery) throws IOException, InterruptedException {
return getClient().requestFeasibility(structuredQuery);
private FlareWebserviceClient createFlareClient(HttpClient httpClient) {
if (isNullOrEmpty(flareBaseUrl)) {
return new ErrorFlareWebserviceClient(new IllegalArgumentException("FLARE_BASE_URL is not set."));
} else {
try {
URI parsedFlareBaseUrl = new URI(flareBaseUrl);
return new FlareWebserviceClientImpl(httpClient, parsedFlareBaseUrl);
} catch (URISyntaxException e) {
return new ErrorFlareWebserviceClient(new IllegalArgumentException(
format("Could not parse FLARE_BASE_URL '%s' as URI.", flareBaseUrl), e));
}
}
}

private FlareWebserviceClient getClient() {
if (client == null) {
checkArgument(!isNullOrEmpty(flareBaseUrl), "FLARE_BASE_URL is not set.");
try {
URI parsedFlareBaseUrl = new URI(flareBaseUrl);
client = new FlareWebserviceClientImpl(httpClient, parsedFlareBaseUrl);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(
format("Could not parse FLARE_BASE_URL '%s' as URI.", flareBaseUrl), e);
}
@Bean
public HttpClient flareHttpClient(@Qualifier("base-client") SSLContext sslContext,
EvaluationSettingsProvider evaluationSettingsProvider) {
if (EvaluationStrategy.STRUCTURED_QUERY == evaluationSettingsProvider.evaluationStrategy()) {
HttpClientBuilder builder = new TlsClientFactory(null, sslContext).getNativeHttpClientBuilder();

BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();

if (!isNullOrEmpty(proxyHost) && proxyPort != null) {
HttpHost proxy = new HttpHost(proxyHost, proxyPort);
builder.setProxy(proxy);
if (!isNullOrEmpty(proxyUsername) && !isNullOrEmpty(proxyPassword)) {
builder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
credentialsProvider.setCredentials(new AuthScope(proxy),
new UsernamePasswordCredentials(proxyUsername, proxyPassword));
}
return client;
}

@Override
public void testConnection() throws ClientProtocolException, IOException {
getClient().testConnection();
if (!isNullOrEmpty(basicAuthUsername) && !isNullOrEmpty(basicAuthPassword)) {
URI flareUri = URI.create(flareBaseUrl);
credentialsProvider.setCredentials(new AuthScope(new HttpHost(flareUri.getHost(), flareUri.getPort())),
new UsernamePasswordCredentials(basicAuthUsername, basicAuthPassword));
} else if (!isNullOrEmpty(bearerAuthToken)) {
return new BearerHttpClient(builder.setDefaultCredentialsProvider(credentialsProvider).build());
}
};
return builder.setDefaultCredentialsProvider(credentialsProvider).build();
} else {
return HttpClientBuilder.create().build();
}
}

@Bean
public HttpClient flareHttpClient(@Qualifier("base-client") SSLContext sslContext) {
HttpClientBuilder builder = new TlsClientFactory(null, sslContext).getNativeHttpClientBuilder();

BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();

if (!isNullOrEmpty(proxyHost) && proxyPort != null) {
HttpHost proxy = new HttpHost(proxyHost, proxyPort);
builder.setProxy(proxy);
if (!isNullOrEmpty(proxyUsername) && !isNullOrEmpty(proxyPassword)) {
builder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
credentialsProvider.setCredentials(new AuthScope(proxy),
new UsernamePasswordCredentials(proxyUsername, proxyPassword));
}
private final class ErrorFlareWebserviceClient implements FlareWebserviceClient {
private final RuntimeException exception;

private ErrorFlareWebserviceClient(RuntimeException exception) {
this.exception = exception;
}

@Override
public void testConnection() throws IOException {
throw exception;
}
if (!isNullOrEmpty(basicAuthUsername) && !isNullOrEmpty(basicAuthPassword)) {
URI flareUri = URI.create(flareBaseUrl);
credentialsProvider.setCredentials(new AuthScope(new HttpHost(flareUri.getHost(), flareUri.getPort())),
new UsernamePasswordCredentials(basicAuthUsername, basicAuthPassword));
} else if (!isNullOrEmpty(bearerAuthToken)) {
return new BearerHttpClient(builder.setDefaultCredentialsProvider(credentialsProvider).build());

@Override
public int requestFeasibility(byte[] structuredQuery) throws IOException, InterruptedException {
throw exception;
}
return builder.setDefaultCredentialsProvider(credentialsProvider).build();
}

private final class BearerHttpClient extends CloseableHttpClient {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public void afterPropertiesSet() throws Exception {
@Override
protected void doExecute(DelegateExecution execution, Variables variables) {
variables.setString(VARIABLE_EVALUATION_STRATEGY,
evaluationSettingsProvider.evaluationStrategyRepresentation());
evaluationSettingsProvider.evaluationStrategy().toString());
variables.setBoolean(VARIABLE_EVALUATION_OBFUSCATION,
evaluationSettingsProvider.evaluationResultObfuscationEnabled());
variables.setDouble(VARIABLE_EVALUATION_OBFUSCATION_LAPLACE_SENSITIVITY,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import de.medizininformatik_initiative.feasibility_dsf_process.EnhancedFhirWebserviceClientProvider;
import de.medizininformatik_initiative.feasibility_dsf_process.EnhancedFhirWebserviceClientProviderImpl;
import de.medizininformatik_initiative.feasibility_dsf_process.EvaluationSettingsProvider;
import de.medizininformatik_initiative.feasibility_dsf_process.EvaluationStrategy;
import de.medizininformatik_initiative.feasibility_dsf_process.FeasibilityCachingLaplaceCountObfuscator;
import de.medizininformatik_initiative.feasibility_dsf_process.FeasibilityProcessPluginDeploymentStateListener;
import de.medizininformatik_initiative.feasibility_dsf_process.Obfuscator;
Expand Down Expand Up @@ -186,9 +185,7 @@ public SendDicResponse sendDicResponse() {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public FeasibilityProcessPluginDeploymentStateListener deploymentStateListener() {
return new FeasibilityProcessPluginDeploymentStateListener(
EvaluationStrategy
.fromStrategyRepresentation(evaluationSettingsProvider.evaluationStrategyRepresentation()),
return new FeasibilityProcessPluginDeploymentStateListener(evaluationSettingsProvider.evaluationStrategy(),
storeClient, flareWebserviceClient);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import java.time.Duration;

import static java.time.Duration.ofSeconds;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class EvaluationSettingsProviderImplTest {
Expand All @@ -19,7 +19,7 @@ public void testEvaluationStrategyRepresentation() {
EvaluationSettingsProvider provider;
for (EvaluationStrategy strategy : EvaluationStrategy.values()) {
provider = new EvaluationSettingsProviderImpl(strategy, false, 0d, 0d, 0, Duration.ofSeconds(1));
assertEquals(strategy.getStrategyRepresentation(), provider.evaluationStrategyRepresentation());
assertEquals(strategy, provider.evaluationStrategy());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import org.junit.jupiter.api.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class EvaluationStrategyTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ static void dynamicProperties(DynamicPropertyRegistry registry) {
var proxyHost = forwardProxy.getHost();
var proxyPort = forwardProxy.getFirstMappedPort();

registry.add("de.medizininformatik_initiative.feasibility_dsf_process.evaluation.strategy",
() -> "structured-query");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url",
() -> "http://flare:8080/");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.store.proxy.host",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ static void dynamicProperties(DynamicPropertyRegistry registry) {
var proxyHost = forwardProxy.getHost();
var proxyPort = forwardProxy.getFirstMappedPort();

registry.add("de.medizininformatik_initiative.feasibility_dsf_process.evaluation.strategy",
() -> "structured-query");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url",
() -> "http://proxy:8080/");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.store.proxy.host",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ static void dynamicProperties(DynamicPropertyRegistry registry) {
var proxyHost = forwardProxy.getHost();
var proxyPort = forwardProxy.getFirstMappedPort();

registry.add("de.medizininformatik_initiative.feasibility_dsf_process.evaluation.strategy",
() -> "structured-query");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url",
() -> "https://proxy:8443/");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.store.trust_store_path",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ static void dynamicProperties(DynamicPropertyRegistry registry) {
var proxyHost = forwardProxy.getHost();
var proxyPort = forwardProxy.getFirstMappedPort();

registry.add("de.medizininformatik_initiative.feasibility_dsf_process.evaluation.strategy",
() -> "structured-query");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url",
() -> "http://flare:8080/");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.store.proxy.host",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ static void dynamicProperties(DynamicPropertyRegistry registry) {
var proxyHost = forwardProxy.getHost();
var proxyPort = forwardProxy.getFirstMappedPort();

registry.add("de.medizininformatik_initiative.feasibility_dsf_process.evaluation.strategy",
() -> "structured-query");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.flare.base_url",
() -> "http://proxy:8080/");
registry.add("de.medizininformatik_initiative.feasibility_dsf_process.client.store.proxy.host",
Expand Down
Loading

0 comments on commit 0afdbee

Please sign in to comment.