From f620e4486e25905e6be8e64e5706f6dd04bc4111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20F=C3=B6rster?= Date: Thu, 13 Feb 2025 16:54:44 +0100 Subject: [PATCH 1/3] [METASVC-143] LobidClient: flexible server URL --- .../cudami/lobid/client/LobidBaseClient.java | 13 +++--- .../cudami/lobid/client/LobidClient.java | 10 +++-- .../cudami/lobid/client/LobidClientIT.java | 3 +- .../cudami/model/config/CudamiConfig.java | 43 ++++--------------- .../SpringConfigBackendTestDatabase.java | 3 +- .../config/SpringConfigBackendLobid.java | 5 ++- .../server/config/ApplicationConfig.java | 11 ++++- .../webapp/src/main/resources/application.yml | 1 + 8 files changed, 39 insertions(+), 50 deletions(-) diff --git a/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidBaseClient.java b/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidBaseClient.java index 067a6e79d..4d6c80a58 100644 --- a/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidBaseClient.java +++ b/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidBaseClient.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import de.digitalcollections.lobid.model.LobidEntity; import de.digitalcollections.model.exception.TechnicalException; import de.digitalcollections.model.exception.http.HttpErrorDecoder; import java.io.IOException; @@ -13,7 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class LobidBaseClient { +public class LobidBaseClient { private static final Logger LOGGER = LoggerFactory.getLogger(LobidBaseClient.class); @@ -51,10 +52,10 @@ private HttpRequest createGetRequest(String requestUrl) { } protected T doGetRequestForObject(String requestUrl) throws TechnicalException { - return (T) doGetRequestForObject(requestUrl, targetType); + return doGetRequestForObject(requestUrl, targetType); } - protected Object doGetRequestForObject(String requestUrl, Class targetType) + protected U doGetRequestForObject(String requestUrl, Class targetType) throws TechnicalException { HttpRequest req = createGetRequest(requestUrl); try { @@ -68,7 +69,7 @@ protected Object doGetRequestForObject(String requestUrl, Class targetType) if (body == null || body.length == 0) { return null; } - T result = mapper.readerFor(targetType).readValue(body); + U result = mapper.readerFor(targetType).readValue(body); return result; } catch (IOException | InterruptedException e) { LOGGER.warn("Failed to retrieve response due to connection error", e); @@ -76,7 +77,7 @@ protected Object doGetRequestForObject(String requestUrl, Class targetType) } } - protected List doGetRequestForObjectList(String requestUrl, Class targetType) + protected List doGetRequestForObjectList(String requestUrl, Class targetType) throws TechnicalException { HttpRequest req = createGetRequest(requestUrl); // TODO add creation of a request id if needed @@ -92,7 +93,7 @@ protected List doGetRequestForObjectList(String requestUrl, Class targetType) if (body == null || body.length == 0) { return null; } - List result = mapper.readerForListOf(targetType).readValue(body); + List result = mapper.readerForListOf(targetType).readValue(body); return result; } catch (IOException | InterruptedException e) { LOGGER.warn("Failed to retrieve response due to connection error", e); diff --git a/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidClient.java b/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidClient.java index c36046465..ecb92b75f 100644 --- a/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidClient.java +++ b/metasvc-lobid-client/src/main/java/de/digitalcollections/cudami/lobid/client/LobidClient.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.digitalcollections.lobid.jackson.LobidObjectMapper; import java.net.http.HttpClient; +import java.net.http.HttpClient.Version; import java.time.Duration; public class LobidClient { @@ -16,10 +17,6 @@ public class LobidClient { private final LobidSubjectsClient lobidSubjectsClient; private final LobidWorksClient lobidWorksClient; - public LobidClient() { - this("https://lobid.org", new LobidObjectMapper()); - } - public LobidClient(HttpClient http, String serverUrl, ObjectMapper mapper) { this.http = http; this.lobidCorporateBodiesClient = new LobidCorporateBodiesClient(http, serverUrl, mapper); @@ -36,11 +33,16 @@ public LobidClient(String serverUrl, ObjectMapper mapper) { HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.ALWAYS) .connectTimeout(Duration.ofSeconds(10)) + .version(Version.HTTP_1_1) .build(), serverUrl, mapper); } + public LobidClient(String serverUrl) { + this(serverUrl, new LobidObjectMapper()); + } + public LobidCorporateBodiesClient forCorporateBodies() { return lobidCorporateBodiesClient; } diff --git a/metasvc-lobid-client/src/test/java/de/digitalcollections/cudami/lobid/client/LobidClientIT.java b/metasvc-lobid-client/src/test/java/de/digitalcollections/cudami/lobid/client/LobidClientIT.java index 946003d92..75f4495cd 100644 --- a/metasvc-lobid-client/src/test/java/de/digitalcollections/cudami/lobid/client/LobidClientIT.java +++ b/metasvc-lobid-client/src/test/java/de/digitalcollections/cudami/lobid/client/LobidClientIT.java @@ -12,7 +12,8 @@ public LobidClientIT() {} @Test public void getCorporateBodyByGndId() throws TechnicalException { - CorporateBody corporateBody = new LobidClient().forCorporateBodies().getByGndId("2007744-0"); + CorporateBody corporateBody = + new LobidClient("https://lobid.org").forCorporateBodies().getByGndId("2007744-0"); assertEquals("Deutsche Forschungsgemeinschaft (DFG)", corporateBody.getLabel().getText()); assertEquals("https://www.dfg.de", corporateBody.getHomepageUrl().toString()); assertEquals("2007744-0", corporateBody.getIdentifierByNamespace("gnd").getId()); diff --git a/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java b/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java index a883e4d74..fb1765b10 100644 --- a/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java +++ b/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java @@ -7,8 +7,11 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import lombok.Getter; import org.springframework.util.StringUtils; +@SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +@Getter public class CudamiConfig { private Defaults defaults; @@ -16,17 +19,16 @@ public class CudamiConfig { private String repositoryFolderPath; private TypeDeclarations typeDeclarations; private UrlAlias urlAlias; + private String lobidUrl; - @SuppressFBWarnings( - value = "EI_EXPOSE_REP2", - justification = "typeDeclarations are partially filled at runtime") @JsonCreator(mode = Mode.PROPERTIES) public CudamiConfig( @JsonProperty(value = "defaults") Defaults defaults, @JsonProperty(value = "offsetForAlternativePaging") int offsetForAlternativePaging, @JsonProperty(value = "repositoryFolderPath") String repositoryFolderPath, @JsonProperty(value = "typeDeclarations") TypeDeclarations typeDeclarations, - @JsonProperty(value = "urlAlias") UrlAlias urlAlias) { + @JsonProperty(value = "urlAlias") UrlAlias urlAlias, + @JsonProperty(value = "lobidUrl") String lobidUrl) { if (defaults == null) { throw new IllegalStateException("Required `cudami.defaults` configuration missing."); } @@ -40,29 +42,10 @@ public CudamiConfig( repositoryFolderPath.replace("~/", System.getProperty("user.home") + "/"); this.typeDeclarations = typeDeclarations; this.urlAlias = urlAlias; + this.lobidUrl = lobidUrl; } - public Defaults getDefaults() { - return defaults; - } - - public int getOffsetForAlternativePaging() { - return offsetForAlternativePaging; - } - - public String getRepositoryFolderPath() { - return repositoryFolderPath; - } - - @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "partially filled at runtime") - public TypeDeclarations getTypeDeclarations() { - return typeDeclarations; - } - - public UrlAlias getUrlAlias() { - return new UrlAlias(urlAlias); - } - + @Getter public static class Defaults { private String language; @@ -82,14 +65,6 @@ public Defaults( } this.locale = locale; } - - public String getLanguage() { - return language; - } - - public Locale getLocale() { - return locale; - } } public static class UrlAlias { @@ -109,7 +84,7 @@ public UrlAlias( @JsonProperty(value = "generationExcludes") List generationExcludes, @JsonProperty(value = "maxLength") int maxLength) { this.generationExcludes = - generationExcludes != null ? List.copyOf(generationExcludes) : Collections.EMPTY_LIST; + generationExcludes != null ? List.copyOf(generationExcludes) : Collections.emptyList(); if (maxLength > DB_MAX_LENGTH) { throw new RuntimeException( "The maxLength you configured is invalid, because it is greater than " diff --git a/metasvc-server/backend-jdbi/src/test/java/io/github/dbmdz/metadata/server/backend/impl/database/config/SpringConfigBackendTestDatabase.java b/metasvc-server/backend-jdbi/src/test/java/io/github/dbmdz/metadata/server/backend/impl/database/config/SpringConfigBackendTestDatabase.java index fa3c48a32..141742298 100644 --- a/metasvc-server/backend-jdbi/src/test/java/io/github/dbmdz/metadata/server/backend/impl/database/config/SpringConfigBackendTestDatabase.java +++ b/metasvc-server/backend-jdbi/src/test/java/io/github/dbmdz/metadata/server/backend/impl/database/config/SpringConfigBackendTestDatabase.java @@ -38,7 +38,8 @@ public class SpringConfigBackendTestDatabase { 5000, "/tmp/cudami/fileResources", null, - new UrlAlias(new ArrayList<>(), 64)); + new UrlAlias(new ArrayList<>(), 64), + ""); private static PostgreSQLContainer postgreSQLContainer; diff --git a/metasvc-server/backend-lobid/src/main/java/io/github/dbmdz/metadata/server/config/SpringConfigBackendLobid.java b/metasvc-server/backend-lobid/src/main/java/io/github/dbmdz/metadata/server/config/SpringConfigBackendLobid.java index b5e87ff82..0f64e9310 100644 --- a/metasvc-server/backend-lobid/src/main/java/io/github/dbmdz/metadata/server/config/SpringConfigBackendLobid.java +++ b/metasvc-server/backend-lobid/src/main/java/io/github/dbmdz/metadata/server/config/SpringConfigBackendLobid.java @@ -1,6 +1,7 @@ package io.github.dbmdz.metadata.server.config; import de.digitalcollections.cudami.lobid.client.LobidClient; +import de.digitalcollections.cudami.model.config.CudamiConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; @@ -14,7 +15,7 @@ public class SpringConfigBackendLobid { private static final Logger LOGGER = LoggerFactory.getLogger(SpringConfigBackendLobid.class); @Bean - public LobidClient lobidClient() { - return new LobidClient(); + public LobidClient lobidClient(CudamiConfig config) { + return new LobidClient(config.getLobidUrl()); } } diff --git a/metasvc-server/webapp/src/main/java/io/github/dbmdz/metadata/server/config/ApplicationConfig.java b/metasvc-server/webapp/src/main/java/io/github/dbmdz/metadata/server/config/ApplicationConfig.java index fdeb80b48..ad6d62e6f 100644 --- a/metasvc-server/webapp/src/main/java/io/github/dbmdz/metadata/server/config/ApplicationConfig.java +++ b/metasvc-server/webapp/src/main/java/io/github/dbmdz/metadata/server/config/ApplicationConfig.java @@ -14,7 +14,14 @@ public ApplicationConfig( int offsetForAlternativePaging, String repositoryFolderPath, TypeDeclarations typeDeclarations, - UrlAlias urlAlias) { - super(defaults, offsetForAlternativePaging, repositoryFolderPath, typeDeclarations, urlAlias); + UrlAlias urlAlias, + String lobidUrl) { + super( + defaults, + offsetForAlternativePaging, + repositoryFolderPath, + typeDeclarations, + urlAlias, + lobidUrl); } } diff --git a/metasvc-server/webapp/src/main/resources/application.yml b/metasvc-server/webapp/src/main/resources/application.yml index e74077d29..3d7f6c413 100644 --- a/metasvc-server/webapp/src/main/resources/application.yml +++ b/metasvc-server/webapp/src/main/resources/application.yml @@ -9,6 +9,7 @@ application: urlalias: generationExcludes: [] maxlength: 64 + lobidUrl: https://lobid.org iiif: identifier: From 178430ada5e2a6bf49a845a6de17f457363fbe33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20F=C3=B6rster?= Date: Tue, 18 Feb 2025 12:47:08 +0100 Subject: [PATCH 2/3] Use lombok for class `CudamiConfig.UrlAlias` --- .../cudami/model/config/CudamiConfig.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java b/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java index fb1765b10..05f8c93b6 100644 --- a/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java +++ b/metasvc-model/src/main/java/de/digitalcollections/cudami/model/config/CudamiConfig.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Locale; import lombok.Getter; +import lombok.Setter; import org.springframework.util.StringUtils; @SuppressFBWarnings(value = {"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @@ -67,6 +68,8 @@ public Defaults( } } + @Getter + @Setter public static class UrlAlias { private static final int DB_MAX_LENGTH = 256; @@ -98,21 +101,5 @@ public UrlAlias(UrlAlias other) { this.generationExcludes = other.generationExcludes; this.maxLength = other.maxLength; } - - public List getGenerationExcludes() { - return List.copyOf(generationExcludes); - } - - public void setGenerationExcludes(List generationExcludes) { - this.generationExcludes = generationExcludes != null ? List.copyOf(generationExcludes) : null; - } - - public int getMaxLength() { - return maxLength; - } - - public void setMaxLength(int maxLength) { - this.maxLength = maxLength; - } } } From ca48e1b55b7481f5a19e722a6836b1e377063530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20F=C3=B6rster?= Date: Tue, 18 Feb 2025 13:01:23 +0100 Subject: [PATCH 3/3] Add changelog entry --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d776bea0..a6c9114f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## Unreleased +### Added + +- Property to application.yml: `application.lobidUrl` + +### Fixed + +- Use generics in Lobid clients properly + +### Changed + +- **Breaking**: Removed default constructor of `LobidClient`; URL must be provided as parameter + ## [9.5.2](https://github.com/dbmdz/metadata-service/releases/tag/9.5.2) - 2025-02-10 ### Added