From 6c716b37a522eecb6f42edadbf05faf155066911 Mon Sep 17 00:00:00 2001 From: ramari16 Date: Tue, 12 Mar 2024 18:13:56 -0300 Subject: [PATCH] ALS-5387: Remove stack from resources table (#186) * [ALS-5422] Add persistence.xml to visualization resource (#161) (#162) The visualization resource is failing to start due to an error injecting persistence unit into CDI managed bean. It is unable to find a persistence unit named ''. * ALS-5387: Remove stack from resources table * ALS-5387: More robust implementation of feature --------- Co-authored-by: Gcolon021 <34667267+Gcolon021@users.noreply.github.com> Co-authored-by: GeorgeC --- .../dbmi/avillach/data/entity/Resource.java | 34 ++++++- .../data/repository/ResourceRepository.java | 2 +- .../avillach/service/PicsureInfoService.java | 88 +++++++++---------- 3 files changed, 77 insertions(+), 47 deletions(-) diff --git a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Resource.java b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Resource.java index 3faf9ddc..b2cb4367 100644 --- a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Resource.java +++ b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Resource.java @@ -1,12 +1,12 @@ package edu.harvard.dbmi.avillach.data.entity; import java.io.StringReader; +import java.util.Optional; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; -import javax.persistence.Column; -import javax.persistence.Entity; +import javax.persistence.*; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -18,6 +18,9 @@ public class Resource extends BaseEntity{ @Column(length = 8192) private String description; private String targetURL; + + + @Convert(converter = ResourcePathConverter.class) private String resourceRSPath; @Column(length = 8192) @@ -102,4 +105,31 @@ public String toString() { .add("metadata", metadataObj) .build().toString(); } + + /** + * This resource path converter allows resource paths to contain a reference to a specific stack that is + * imputed at runtime based an an environment parameter. This allows multiple stacks to share the same database. + * + * The ___target_stack___ token in any resource path value will be replaced with the TARGET_STACK environment variable + */ + @Converter + public static class ResourcePathConverter implements AttributeConverter { + + public ResourcePathConverter() { + } + + private static final Optional targetStack = Optional.ofNullable(System.getProperty("TARGET_STACK", null)); + + @Override + public String convertToDatabaseColumn(String attribute) { + return attribute; + } + + @Override + public String convertToEntityAttribute(String dbData) { + return targetStack + .map(stack -> dbData.replace("___target_stack___", stack)) + .orElse(dbData); + } + } } diff --git a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/ResourceRepository.java b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/ResourceRepository.java index 8bb400f4..f377c9d6 100644 --- a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/ResourceRepository.java +++ b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/ResourceRepository.java @@ -15,5 +15,5 @@ protected ResourceRepository() { super(Resource.class); } - + } diff --git a/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureInfoService.java b/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureInfoService.java index 922746f8..a64cf005 100644 --- a/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureInfoService.java +++ b/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureInfoService.java @@ -21,55 +21,55 @@ public class PicsureInfoService { - private final Logger logger = LoggerFactory.getLogger(PicsureQueryService.class); + private final Logger logger = LoggerFactory.getLogger(PicsureQueryService.class); - private final static ObjectMapper mapper = new ObjectMapper(); + private final static ObjectMapper mapper = new ObjectMapper(); - @Inject - ResourceRepository resourceRepo; + @Inject + ResourceRepository resourceRepo; - @Inject - ResourceWebClient resourceWebClient; + @Inject + ResourceWebClient resourceWebClient; - /** - * Retrieve resource info for a specific resource. - * - * @param resourceId - Resource UUID - * @param credentialsQueryRequest - Contains resource specific credentials map - * @return a {@link edu.harvard.dbmi.avillach.domain.ResourceInfo ResourceInfo} - */ - public ResourceInfo info(UUID resourceId, QueryRequest credentialsQueryRequest, HttpHeaders headers) { - Resource resource = resourceRepo.getById(resourceId); - if (resource == null){ - throw new ProtocolException(ProtocolException.RESOURCE_NOT_FOUND + resourceId.toString()); - } - if (resource.getResourceRSPath() == null){ - throw new ApplicationException(ApplicationException.MISSING_RESOURCE_PATH); - } - if (credentialsQueryRequest == null){ - credentialsQueryRequest = new GeneralQueryRequest(); - } - if (credentialsQueryRequest.getResourceCredentials() == null){ - credentialsQueryRequest.setResourceCredentials(new HashMap()); - } + /** + * Retrieve resource info for a specific resource. + * + * @param resourceId - Resource UUID + * @param credentialsQueryRequest - Contains resource specific credentials map + * @return a {@link edu.harvard.dbmi.avillach.domain.ResourceInfo ResourceInfo} + */ + public ResourceInfo info(UUID resourceId, QueryRequest credentialsQueryRequest, HttpHeaders headers) { + Resource resource = resourceRepo.getById(resourceId); + if (resource == null) { + throw new ProtocolException(ProtocolException.RESOURCE_NOT_FOUND + resourceId.toString()); + } + if (resource.getResourceRSPath() == null) { + throw new ApplicationException(ApplicationException.MISSING_RESOURCE_PATH); + } + if (credentialsQueryRequest == null) { + credentialsQueryRequest = new GeneralQueryRequest(); + } + if (credentialsQueryRequest.getResourceCredentials() == null) { + credentialsQueryRequest.setResourceCredentials(new HashMap()); + } - logger.info("path=/info/{resourceId}, resourceId={}, requestSource={}, credentialsQueryRequest={}", - resourceId, - Utilities.getRequestSourceFromHeader(headers), - Utilities.convertQueryRequestToString(mapper, credentialsQueryRequest) - ); + logger.info( + "path=/info/{resourceId}, resourceId={}, requestSource={}, credentialsQueryRequest={}", resourceId, + Utilities.getRequestSourceFromHeader(headers), Utilities.convertQueryRequestToString(mapper, credentialsQueryRequest) + ); - credentialsQueryRequest.getResourceCredentials().put(ResourceWebClient.BEARER_TOKEN_KEY, resource.getToken()); - return resourceWebClient.info(resource.getResourceRSPath(), credentialsQueryRequest); - } + credentialsQueryRequest.getResourceCredentials().put(ResourceWebClient.BEARER_TOKEN_KEY, resource.getToken()); + return resourceWebClient.info(resource.getResourceRSPath(), credentialsQueryRequest); + } - /** - * Retrieve a list of all available resources. - * - * @return List containing limited metadata about all available resources and ids. - */ - public Map resources(HttpHeaders headers) { - logger.info("path=/info/resources, requestSource={}", Utilities.getRequestSourceFromHeader(headers)); - return resourceRepo.list().stream().collect(Collectors.toMap(Resource::getUuid, Resource::getName)); - } + /** + * Retrieve a list of all available resources. + * + * @return List containing limited metadata about all available resources and ids. + */ + public Map resources(HttpHeaders headers) { + logger.info("path=/info/resources, requestSource={}", Utilities.getRequestSourceFromHeader(headers)); + return resourceRepo.list().stream().filter(resource -> !resource.getHidden()) + .collect(Collectors.toMap(Resource::getUuid, Resource::getName)); + } }