Skip to content
Snippets Groups Projects
Verified Commit 49d6b278 authored by Martin Weise's avatar Martin Weise
Browse files
parent a7a28c2b
No related branches found
No related tags found
1 merge request!398Refactored DOI WIP
This commit is part of merge request !398. Comments created here will be created in the context of that merge request.
Showing
with 114 additions and 63 deletions
package at.ac.tuwien.ifs.dbrepo.gateway;
<<<<<<<< HEAD:dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java
import at.tuwien.api.crossref.CrossrefDto;
import at.tuwien.exception.DoiNotFoundException;
import at.tuwien.test.AbstractUnitTest;
========
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossrefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.core.exception.DoiNotFoundException;
import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
>>>>>>>> dev:dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossrefGatewayUnitTest.java
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpEntity;
......@@ -29,24 +24,20 @@ import static org.mockito.Mockito.*;
@Log4j2
@SpringBootTest
@ExtendWith(SpringExtension.class)
<<<<<<<< HEAD:dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java
public class CrossRefGatewayUnitTest extends AbstractUnitTest {
========
public class CrossrefGatewayUnitTest extends BaseTest {
>>>>>>>> dev:dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossrefGatewayUnitTest.java
public class CrossRefGatewayUnitTest extends BaseTest {
@MockBean
@Qualifier("crossRefServiceRestTemplate")
private RestTemplate restTemplate;
@Autowired
private CrossRefServiceGateway crossRefGateway;
private CrossRefGateway crossRefGateway;
@Test
public void findById_succeeds() throws DoiNotFoundException {
/* mock */
when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(CrossrefDto.class)))
when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(CrossRefDto.class)))
.thenReturn(ResponseEntity.status(HttpStatus.OK)
.build());
......@@ -60,7 +51,7 @@ public class CrossrefGatewayUnitTest extends BaseTest {
/* mock */
doThrow(HttpServerErrorException.class)
.when(restTemplate)
.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(CrossrefDto.class));
.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(CrossRefDto.class));
/* test */
assertThrows(DoiNotFoundException.class, () -> {
......
package at.ac.tuwien.ifs.dbrepo.service;
import at.tuwien.api.crossref.CrossrefDto;
import at.tuwien.api.orcid.OrcidDto;
import at.tuwien.api.ror.RorDto;
import at.tuwien.api.user.external.ExternalMetadataDto;
import at.tuwien.api.user.external.affiliation.ExternalAffiliationDto;
import at.tuwien.exception.*;
import at.tuwien.gateway.CrossrefGateway;
import at.tuwien.gateway.OrcidGateway;
import at.tuwien.gateway.RorGateway;
import at.tuwien.oaipmh.OaiErrorType;
import at.tuwien.oaipmh.OaiListIdentifiersParameters;
import at.tuwien.oaipmh.OaiRecordParameters;
import at.tuwien.test.AbstractUnitTest;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.orcid.OrcidDto;
import at.ac.tuwien.ifs.dbrepo.core.api.ror.RorDto;
import at.ac.tuwien.ifs.dbrepo.core.api.user.external.ExternalMetadataDto;
import at.ac.tuwien.ifs.dbrepo.core.api.user.external.affiliation.ExternalAffiliationDto;
import at.ac.tuwien.ifs.dbrepo.core.exception.*;
import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
import at.ac.tuwien.ifs.dbrepo.gateway.CrossRefGateway;
import at.ac.tuwien.ifs.dbrepo.gateway.OrcidGateway;
import at.ac.tuwien.ifs.dbrepo.gateway.RorGateway;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiErrorType;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiListIdentifiersParameters;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiRecordParameters;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.log4j.Log4j2;
......@@ -48,7 +48,7 @@ public class MetadataServiceUnitTest extends BaseTest {
private RorGateway rorGateway;
@MockBean
private CrossRefServiceGateway crossrefGateway;
private CrossRefGateway crossRefGateway;
@MockBean
private IdentifierService identifierService;
......@@ -203,11 +203,11 @@ public class MetadataServiceUnitTest extends BaseTest {
@Test
public void findByUrl_doi_succeeds() throws OrcidNotFoundException, RorNotFoundException, IOException,
DoiNotFoundException, IdentifierNotSupportedException {
final CrossrefDto doi = objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.readValue(new File("src/test/resources/json/doi_ec.json"), CrossrefDto.class);
final CrossRefDto doi = objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.readValue(new File("src/test/resources/json/doi_ec.json"), CrossRefDto.class);
/* mock */
when(crossrefGateway.findById(FUNDER_1_IDENTIFIER_ID_ONLY))
when(crossRefGateway.findById(FUNDER_1_IDENTIFIER_ID_ONLY))
.thenReturn(doi);
/* test */
......@@ -223,7 +223,7 @@ public class MetadataServiceUnitTest extends BaseTest {
/* mock */
doThrow(DoiNotFoundException.class)
.when(crossrefGateway)
.when(crossRefGateway)
.findById(anyString());
/* test */
......
package at.ac.tuwien.ifs.dbrepo.gateway;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.core.exception.DoiNotFoundException;
public interface CrossRefGateway {
/**
* Retrieves metadata from the CrossRef funder database for a given CrossRef id.
*
* @param id The CrossRef id.
* @return The CrossRef metadata from the CrossRef funder database.
* @throws DoiNotFoundException The metadata was not found in the CrossRef funder database.
*/
CrossRefDto findById(String id) throws DoiNotFoundException;
}
package at.ac.tuwien.ifs.dbrepo.gateway.impl;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig;
import at.ac.tuwien.ifs.dbrepo.core.exception.DoiNotFoundException;
import at.ac.tuwien.ifs.dbrepo.gateway.CrossRefGateway;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
@Log4j2
@Service
public class CrossRefGatewayImpl implements CrossRefGateway {
private final RestTemplate restTemplate;
private final GatewayConfig gatewayConfig;
@Autowired
public CrossRefGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig) {
this.restTemplate = restTemplate;
this.gatewayConfig = gatewayConfig;
}
@Override
public CrossRefDto findById(String id) throws DoiNotFoundException {
final String path = "/fundingdata/funder/" + id;
log.trace("find crossref metadata by id from endpoint {} with path {}", gatewayConfig.getCrossRefEndpoint(), path);
final ResponseEntity<CrossRefDto> response;
try {
response = restTemplate.exchange(gatewayConfig.getCrossRefEndpoint() + path, HttpMethod.GET, HttpEntity.EMPTY, CrossRefDto.class);
} catch (HttpServerErrorException e) {
log.error("Failed to retrieve crossref metadata: {}", e.getMessage());
throw new DoiNotFoundException("Failed to retrieve crossref metadata: " + e.getMessage(), e);
}
return response.getBody();
}
}
\ No newline at end of file
package at.ac.tuwien.ifs.dbrepo.service.impl;
import at.tuwien.api.crossref.CrossrefDto;
import at.tuwien.api.orcid.OrcidDto;
import at.tuwien.api.ror.RorDto;
import at.tuwien.api.user.external.ExternalMetadataDto;
import at.tuwien.config.MetadataConfig;
import at.tuwien.entities.identifier.Identifier;
import at.tuwien.exception.*;
import at.tuwien.gateway.CrossrefGateway;
import at.tuwien.gateway.OrcidGateway;
import at.tuwien.gateway.RorGateway;
import at.tuwien.mapper.MetadataMapper;
import at.tuwien.oaipmh.OaiErrorType;
import at.tuwien.oaipmh.OaiListIdentifiersParameters;
import at.tuwien.oaipmh.OaiRecordParameters;
import at.tuwien.repository.IdentifierRepository;
import at.tuwien.service.IdentifierService;
import at.tuwien.service.MetadataService;
import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.orcid.OrcidDto;
import at.ac.tuwien.ifs.dbrepo.core.api.ror.RorDto;
import at.ac.tuwien.ifs.dbrepo.core.api.user.external.ExternalMetadataDto;
import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.Identifier;
import at.ac.tuwien.ifs.dbrepo.core.exception.*;
import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper;
import at.ac.tuwien.ifs.dbrepo.gateway.CrossRefGateway;
import at.ac.tuwien.ifs.dbrepo.gateway.OrcidGateway;
import at.ac.tuwien.ifs.dbrepo.gateway.RorGateway;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiErrorType;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiListIdentifiersParameters;
import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiRecordParameters;
import at.ac.tuwien.ifs.dbrepo.repository.IdentifierRepository;
import at.ac.tuwien.ifs.dbrepo.service.IdentifierService;
import at.ac.tuwien.ifs.dbrepo.service.MetadataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -39,19 +39,21 @@ public class MetadataServiceImpl implements MetadataService {
private final MetadataConfig metadataConfig;
private final MetadataMapper metadataMapper;
private final TemplateEngine templateEngine;
private final CrossRefGateway crossRefGateway;
private final IdentifierService identifierService;
private final IdentifierRepository identifierRepository;
@Autowired
public MetadataServiceImpl(RorGateway rorGateway, OrcidGateway orcidGateway, MetadataConfig metadataConfig,
MetadataMapper metadataMapper, TemplateEngine templateEngine,
IdentifierService identifierService,
CrossRefGateway crossRefGateway, IdentifierService identifierService,
IdentifierRepository identifierRepository) {
this.rorGateway = rorGateway;
this.orcidGateway = orcidGateway;
this.metadataConfig = metadataConfig;
this.metadataMapper = metadataMapper;
this.templateEngine = templateEngine;
this.crossRefGateway = crossRefGateway;
this.identifierService = identifierService;
this.identifierRepository = identifierRepository;
}
......@@ -175,7 +177,7 @@ public class MetadataServiceImpl implements MetadataService {
throw new RorNotFoundException("Failed to find metadata from CrossRef URL: too short");
}
final String id = url.substring(idx + 8);
final CrossrefDto crossrefDto = CrossRefServiceGateway.findById(id);
final CrossRefDto crossrefDto = crossRefGateway.findById(id);
return metadataMapper.crossrefDtoToExternalMetadataDto(crossrefDto);
}
log.error("Failed to find metadata: unsupported identifier {}", url);
......
package at.ac.tuwien.ifs.dbrepo.core.api.crossref;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.label.CrossrefPrefLabelDto;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.label.CrossRefPrefLabelDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.extern.jackson.Jacksonized;
......@@ -13,11 +13,11 @@ import lombok.extern.jackson.Jacksonized;
@AllArgsConstructor
@Jacksonized
@ToString
public class CrossrefDto {
public class CrossRefDto {
@Schema(example = "https://doi.org/10.13039/100000001")
private String id;
private CrossrefPrefLabelDto prefLabel;
private CrossRefPrefLabelDto prefLabel;
}
......@@ -12,7 +12,7 @@ import lombok.extern.jackson.Jacksonized;
@AllArgsConstructor
@Jacksonized
@ToString
public class CrossrefLiteralFormDto {
public class CrossRefLiteralFormDto {
@Schema(example = "en")
private String lang;
......
package at.ac.tuwien.ifs.dbrepo.core.api.crossref.label;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.form.CrossrefLiteralFormDto;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.form.CrossRefLiteralFormDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.extern.jackson.Jacksonized;
......@@ -13,9 +13,9 @@ import lombok.extern.jackson.Jacksonized;
@AllArgsConstructor
@Jacksonized
@ToString
public class CrossrefLabelDto {
public class CrossRefLabelDto {
private CrossrefLiteralFormDto literalForm;
private CrossRefLiteralFormDto literalForm;
@Schema(example = "http://data.crossref.org/fundingdata/vocabulary/Label-36515")
private String about;
......
......@@ -12,9 +12,9 @@ import lombok.extern.jackson.Jacksonized;
@AllArgsConstructor
@Jacksonized
@ToString
public class CrossrefPrefLabelDto {
public class CrossRefPrefLabelDto {
@JsonProperty("Label")
private CrossrefLabelDto label;
private CrossRefLabelDto label;
}
......@@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.container.image.DataTypeDto;
import at.ac.tuwien.ifs.dbrepo.core.api.container.image.ImageBriefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.container.image.ImageCreateDto;
import at.ac.tuwien.ifs.dbrepo.core.api.container.image.ImageDto;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossrefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.database.*;
import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableBriefDto;
import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto;
......@@ -355,7 +355,7 @@ public interface MetadataMapper {
.build();
}
default ExternalMetadataDto crossrefDtoToExternalMetadataDto(CrossrefDto data) {
default ExternalMetadataDto crossrefDtoToExternalMetadataDto(CrossRefDto data) {
return ExternalMetadataDto.builder()
.affiliations(new ExternalAffiliationDto[]{
ExternalAffiliationDto.builder()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment