Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release #190

Merged
merged 5 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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<String, String> {

public ResourcePathConverter() {
}

private static final Optional<String> 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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,25 @@
import edu.harvard.dbmi.avillach.data.entity.Query;

import javax.enterprise.context.ApplicationScoped;
import javax.persistence.PersistenceException;
import javax.transaction.Transactional;
import java.util.UUID;

@Transactional
@ApplicationScoped
public class QueryRepository extends BaseRepository<Query, UUID>{
public class QueryRepository extends BaseRepository<Query, UUID> {

protected QueryRepository() {super(Query.class);}
protected QueryRepository() {
super(Query.class);
}

public Query getQueryUUIDFromCommonAreaUUID(UUID caID) {
String caIDRegex = "%commonAreaUUID\":\"" + caID + "\"%";
String query = "SELECT * FROM query WHERE CONVERT(metadata USING utf8) LIKE ?";
try {
return (Query) em().createNativeQuery(query, Query.class).setParameter(1, caIDRegex).getSingleResult();
} catch (PersistenceException ignored) {
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ protected ResourceRepository() {
super(Resource.class);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ public class PicSureWarInit {
@Resource(mappedName = "java:global/token_introspection_token")
private String token_introspection_token;

//to be able to pre modified
@Resource(mappedName = "java:global/defaultApplicationUUID")
private String default_application_uuid;

// to be able to pre modified
public static final ObjectMapper objectMapper = new ObjectMapper();

// check the example from Apache HttpClient official website:
Expand All @@ -39,19 +42,23 @@ public class PicSureWarInit {
static {
HTTP_CLIENT_CONNECTION_MANAGER = new PoolingHttpClientConnectionManager();
HTTP_CLIENT_CONNECTION_MANAGER.setMaxTotal(100);
CLOSEABLE_HTTP_CLIENT = HttpClients
.custom()
.setConnectionManager(HTTP_CLIENT_CONNECTION_MANAGER)
.useSystemProperties()
.build();
CLOSEABLE_HTTP_CLIENT = HttpClients.custom().setConnectionManager(HTTP_CLIENT_CONNECTION_MANAGER).useSystemProperties().build();
}


public String getToken_introspection_url() {
return token_introspection_url;
}

public String getToken_introspection_token() {
return token_introspection_token;
}

/**
* This method is used to get the default application UUID. This value is either the open or auth hpds resource UUID.
*
* @return the default application UUID
*/
public String getDefaultApplicationUUID() {
return this.default_application_uuid;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String>());
}
/**
* 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<String, String>());
}

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<UUID, String> 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<UUID, String> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ public Response querySync(QueryRequest queryRequest, HttpHeaders headers) {
*/
public QueryStatus queryMetadata(UUID queryId, HttpHeaders headers) {
Query query = queryRepo.getById(queryId);
query = query == null ? queryRepo.getQueryUUIDFromCommonAreaUUID(queryId) : query;
if (query == null) {
throw new ProtocolException(ProtocolException.QUERY_NOT_FOUND + queryId.toString());
}
Expand Down
Loading
Loading