Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • fit-connect/sdk-java
1 result
Show changes
Commits on Source (25)
Showing
with 193 additions and 44 deletions
package dev.fitko.fitconnect.api.config;
import lombok.Data;
@Data
public class BuildInfo {
private String productName;
private String productVersion;
private String commit;
}
......@@ -71,6 +71,14 @@
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
......@@ -105,8 +113,23 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<executions>
<execution>
<id>get-the-git-infos</id>
<goals>
<goal>revision</goal>
</goals>
<phase>initialize</phase>
</execution>
</executions>
<configuration>
<commitIdGenerationMode>full</commitIdGenerationMode>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package dev.fitko.fitconnect.client.factory;
import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.config.BuildInfo;
import dev.fitko.fitconnect.api.exceptions.InitializationException;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
......@@ -11,13 +12,15 @@ import java.nio.file.Path;
public final class ApplicationConfigLoader {
private ApplicationConfigLoader() { }
private static final String BUILD_INFO_PATH = "buildinfo.yaml";
private ApplicationConfigLoader() {
}
/**
* Load ApplicationConfig from path.
*
* @param configPath path to config file
*
* @return ApplicationConfig
* @throws InitializationException if the config file could not be loaded
*/
......@@ -33,24 +36,31 @@ public final class ApplicationConfigLoader {
* Load ApplicationConfig from path string.
*
* @param configPath string of path to config file
*
* @return ApplicationConfig
* @throws InitializationException if the config file could not be loaded
*/
public static ApplicationConfig loadConfig(final String configPath) {
return loadConfig(Path.of(configPath));
return loadConfig(Path.of(configPath));
}
/**
* Load ApplicationConfig from yaml string.
*
* @param configYaml string content of the yaml config file
*
* @return ApplicationConfig
*/
public static ApplicationConfig loadConfigFromYaml(final String configYaml) {
final Constructor constructor = new Constructor(ApplicationConfig.class);
final Yaml yaml = new Yaml(constructor);
return yaml.load(configYaml);
final Yaml applicationPropertiesYaml = new Yaml(new Constructor(ApplicationConfig.class));
ApplicationConfig applicationConfig = applicationPropertiesYaml.load(configYaml);
return applicationConfig;
}
public static BuildInfo loadBuildInfo() {
final Yaml buildInfoYaml = new Yaml(new Constructor(BuildInfo.class));
return buildInfoYaml.load(ApplicationConfigLoader.class.getClassLoader().getResourceAsStream(BUILD_INFO_PATH));
}
}
......@@ -3,6 +3,7 @@ package dev.fitko.fitconnect.client.factory;
import com.nimbusds.jose.jwk.JWK;
import com.nimbusds.jose.jwk.RSAKey;
import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.config.BuildInfo;
import dev.fitko.fitconnect.api.config.SchemaConfig;
import dev.fitko.fitconnect.api.config.SubscriberConfig;
import dev.fitko.fitconnect.api.exceptions.InitializationException;
......@@ -64,8 +65,7 @@ public final class ClientFactory {
* @return the sender client
*/
public static SenderClient senderClient() {
final ApplicationConfig config = loadConfig();
return senderClient(config);
return senderClient(loadConfig());
}
/**
......@@ -75,7 +75,7 @@ public final class ClientFactory {
*/
public static SenderClient senderClient(final ApplicationConfig config) {
LOGGER.info("Initializing sender client ...");
return new SenderClient(getSender(config));
return new SenderClient(getSender(config, ApplicationConfigLoader.loadBuildInfo()));
}
......@@ -85,8 +85,7 @@ public final class ClientFactory {
* @return the subscriber client
*/
public static SubscriberClient subscriberClient() {
final ApplicationConfig config = loadConfig();
return subscriberClient(config);
return subscriberClient(loadConfig());
}
/**
......@@ -96,7 +95,7 @@ public final class ClientFactory {
*/
public static SubscriberClient subscriberClient(final ApplicationConfig config) {
LOGGER.info("Initializing subscriber client ...");
final Subscriber subscriber = getSubscriber(config);
final Subscriber subscriber = getSubscriber(config, ApplicationConfigLoader.loadBuildInfo());
final SubscriberConfig subscriberConfig = config.getSubscriberConfig();
LOGGER.info("Reading private decryption key from {} ", subscriberConfig.getPrivateDecryptionKeyPath());
......@@ -106,8 +105,8 @@ public final class ClientFactory {
return new SubscriberClient(subscriber, privateKey);
}
private static Subscriber getSubscriber(final ApplicationConfig config) {
final RestTemplate restTemplate = getRestTemplate(config);
private static Subscriber getSubscriber(final ApplicationConfig config, final BuildInfo buildInfo) {
final RestTemplate restTemplate = getRestTemplate(config, buildInfo);
final SchemaProvider schemaProvider = getSchemaProvider();
final MessageDigestService messageDigestService = getMessageDigestService();
......@@ -124,8 +123,8 @@ public final class ClientFactory {
return new SubmissionSubscriber(submissionService, eventLogService, cryptoService, validator, setService);
}
private static Sender getSender(final ApplicationConfig config) {
final RestTemplate restTemplate = getRestTemplate(config);
private static Sender getSender(final ApplicationConfig config, final BuildInfo buildInfo) {
final RestTemplate restTemplate = getRestTemplate(config, buildInfo);
final SchemaProvider schemaProvider = getSchemaProvider();
final MessageDigestService messageDigestService = getMessageDigestService();
......@@ -169,8 +168,8 @@ public final class ClientFactory {
return new JWECryptoService(messageDigestService);
}
private static RestTemplate getRestTemplate(final ApplicationConfig config) {
final ProxyConfig proxyConfig = new ProxyConfig(config.getHttpProxyHost(), config.getHttpProxyPort());
private static RestTemplate getRestTemplate(final ApplicationConfig config, final BuildInfo buildInfo) {
final ProxyConfig proxyConfig = new ProxyConfig(config.getHttpProxyHost(), config.getHttpProxyPort(), buildInfo);
return proxyConfig.proxyRestTemplate();
}
......
productName: "${project.name}"
productVersion: "${project.version}"
commit: "${git.commit.id.full}"
\ No newline at end of file
......@@ -22,8 +22,8 @@ import dev.fitko.fitconnect.api.services.crypto.CryptoService;
import dev.fitko.fitconnect.client.factory.ClientFactory;
import dev.fitko.fitconnect.client.sender.EncryptedSubmissionBuilder;
import dev.fitko.fitconnect.client.sender.SubmissionBuilder;
import dev.fitko.fitconnect.client.subscriber.ReceivedSubmission;
import dev.fitko.fitconnect.client.sender.model.AttachmentPayload;
import dev.fitko.fitconnect.client.subscriber.ReceivedSubmission;
import dev.fitko.fitconnect.client.util.SubmissionUtil;
import dev.fitko.fitconnect.core.auth.DefaultOAuthService;
import dev.fitko.fitconnect.core.crypto.HashService;
......
......@@ -16,9 +16,7 @@ import java.nio.file.Path;
import java.util.Objects;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.*;
import static org.junit.jupiter.api.Assertions.assertNotNull;
class ApplicationConfigLoaderTest {
......
package dev.fitko.fitconnect.client.factory;
import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.config.Environment;
import dev.fitko.fitconnect.api.config.EnvironmentName;
import dev.fitko.fitconnect.api.config.SenderConfig;
import dev.fitko.fitconnect.api.config.SubscriberConfig;
import dev.fitko.fitconnect.api.config.*;
import dev.fitko.fitconnect.api.exceptions.InitializationException;
import dev.fitko.fitconnect.api.exceptions.InvalidKeyException;
import org.junit.jupiter.api.Test;
......
package dev.fitko.fitconnect.core.http;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.fitko.fitconnect.api.config.BuildInfo;
import dev.fitko.fitconnect.core.util.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.List;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
......@@ -17,16 +20,18 @@ public class ProxyConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyConfig.class);
private final String host;
private final int port;
private BuildInfo buildInfo;
private String host;
private int port;
public ProxyConfig(final String host, final int port) {
public ProxyConfig(String host, int port, BuildInfo buildInfo) {
this.host = host;
this.port = port;
this.buildInfo = buildInfo;
}
ProxyConfig() {
this(null, 0);
this(null, 0, new BuildInfo());
}
public RestTemplate proxyRestTemplate() {
......@@ -58,9 +63,13 @@ public class ProxyConfig {
}
private void setLoggingInterceptor(final RestTemplate restTemplate) {
restTemplate.getInterceptors().add(new ApiRequestInterceptor());
final List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
interceptors.add(new ApiRequestInterceptor());
interceptors.add(new UserAgentInterceptor(this.buildInfo));
restTemplate.setInterceptors(interceptors);
}
private void setupTemplate(final RestTemplate restTemplate){
private void setupTemplate(final RestTemplate restTemplate) {
setLoggingInterceptor(restTemplate);
setMappingConverter(restTemplate);
}
......
package dev.fitko.fitconnect.core.http;
import dev.fitko.fitconnect.api.config.BuildInfo;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
public class UserAgentInterceptor implements ClientHttpRequestInterceptor {
private final String productName;
private final String productVersion;
private final String commit;
public UserAgentInterceptor(BuildInfo buildInfo) {
this.productName = buildInfo.getProductName();
this.productVersion = buildInfo.getProductVersion();
this.commit = buildInfo.getCommit();
}
@Override
public ClientHttpResponse intercept(final HttpRequest req, final byte[] reqBody,
final ClientHttpRequestExecution ex) throws IOException {
req.getHeaders().set(HttpHeaders.USER_AGENT, String.format("%s/%s (commit:%s;os:%s)",
this.productName, this.productVersion, this.commit, System.getProperty("os.name")));
return ex.execute(req, reqBody);
}
}
......@@ -5,6 +5,8 @@ import com.github.tomakehurst.wiremock.client.WireMock;
import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.config.Environment;
import dev.fitko.fitconnect.api.config.EnvironmentName;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import java.util.Map;
......@@ -12,14 +14,19 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMoc
public abstract class RestEndpointBase {
public static WireMockServer wireMockServer;
public static WireMockServer wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());
static {
wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());
@BeforeEach
public void startWireMock() {
wireMockServer.start();
WireMock.configureFor("localhost", wireMockServer.port());
}
@AfterEach
public void shutDownWireMock() {
wireMockServer.stop();
}
protected ApplicationConfig getTestConfig(final String fakeBaseUrl) {
final var envName = new EnvironmentName("TESTING");
......
package dev.fitko.fitconnect.core.http;
import dev.fitko.fitconnect.api.config.BuildInfo;
import org.junit.jupiter.api.Test;
import org.springframework.http.client.InterceptingClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
......@@ -14,8 +15,9 @@ class ProxyConfigTest {
@Test
void proxyRestTemplate() {
// Given
underTest = new ProxyConfig("http://testhost.de", 8080);
underTest = new ProxyConfig("http://testhost.de", 8080, new BuildInfo());
// When
final RestTemplate template = underTest.proxyRestTemplate();
......@@ -28,8 +30,9 @@ class ProxyConfigTest {
@Test
void hasProxySet() {
// Given
underTest = new ProxyConfig("http://testhost.de", 8080);
underTest = new ProxyConfig("http://testhost.de", 8080, new BuildInfo());
// When
final boolean proxySet = underTest.hasProxySet();
......@@ -40,8 +43,9 @@ class ProxyConfigTest {
@Test
void hasProxyNotSet() {
// Given
underTest = new ProxyConfig(null, 0);
underTest = new ProxyConfig(null, 0, new BuildInfo());
// When
final boolean proxySet = underTest.hasProxySet();
......@@ -52,8 +56,9 @@ class ProxyConfigTest {
@Test
void testToString() {
// Given
underTest = new ProxyConfig("http://testhost.de", 8080);
underTest = new ProxyConfig("http://testhost.de", 8080, new BuildInfo());
// When
final String configAsString = underTest.toString();
......
package dev.fitko.fitconnect.core.http;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import dev.fitko.fitconnect.api.config.BuildInfo;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
public class ProxyRestTemplateTest {
private final WireMockServer wireMockServer = new WireMockServer();
@BeforeEach
public void startWireMock() {
this.wireMockServer.start();
}
@AfterEach
public void shutDownWireMock() {
this.wireMockServer.stop();
}
@Test
void userAgentIsCorrect() {
WireMock.configureFor("localhost", 8080);
this.wireMockServer.stubFor(get(urlEqualTo("/test"))
.withHeader("User-Agent", equalTo("productName/productVersion (commit:commit;os:" + System.getProperty("os.name") + ")"))
.willReturn(ok().withBody(""))
);
BuildInfo buildInfo = new BuildInfo();
buildInfo.setProductName("productName");
buildInfo.setProductVersion("productVersion");
buildInfo.setCommit("commit");
RestTemplate restTemplate = new ProxyConfig(null, 0, buildInfo).proxyRestTemplate();
restTemplate.exchange("http://localhost:8080/test", HttpMethod.GET, null, String.class);
verify(getRequestedFor(urlPathEqualTo("/test"))
.withHeader("User-Agent", equalTo("productName/productVersion (commit:commit;os:" + System.getProperty("os.name") + ")")));
}
}
......@@ -2,6 +2,7 @@ package dev.fitko.fitconnect.core.http;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.fitko.fitconnect.api.config.BuildInfo;
import dev.fitko.fitconnect.api.domain.model.metadata.Metadata;
import dev.fitko.fitconnect.api.domain.model.metadata.SignatureType;
import dev.fitko.fitconnect.api.domain.model.metadata.data.MimeType;
......@@ -33,7 +34,7 @@ public class RestTemplateTest extends RestEndpointBase {
@BeforeEach
void setup() {
underTest = new ProxyConfig().proxyRestTemplate();
underTest = new ProxyConfig(null, 0, new BuildInfo()).proxyRestTemplate();
}
@Test
......
......@@ -83,6 +83,7 @@
<maven-checkstyle-plugin.version>3.2.1</maven-checkstyle-plugin.version>
<maven-assembly-plugin.version>3.4.2</maven-assembly-plugin.version>
<maven-javadoc-plugin.version>3.4.1</maven-javadoc-plugin.version>
<git-commit-id-maven-plugin.version>5.0.0</git-commit-id-maven-plugin.version>
</properties>
......@@ -325,6 +326,11 @@
<additionalJOption>-Xdoclint:none</additionalJOption>
</configuration>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<version>${git-commit-id-maven-plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
......