diff --git a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Query.java b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Query.java index 9b06fa14..1d63a7cb 100644 --- a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Query.java +++ b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/entity/Query.java @@ -1,7 +1,10 @@ package edu.harvard.dbmi.avillach.data.entity; import java.io.*; +import java.nio.charset.StandardCharsets; import java.sql.Date; +import java.util.Optional; +import java.util.UUID; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -12,7 +15,6 @@ @Entity(name = "query") public class Query extends BaseEntity { - //TODO may not need these two things private Date startTime; private Date readyTime; @@ -80,18 +82,19 @@ public String getQuery() { return ""; } - String outStr = ""; - try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(this.query)); - BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));){ - + StringBuilder outStr = new StringBuilder(); + try ( + GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(this.query)); + BufferedReader bf = new BufferedReader(new InputStreamReader(gis, StandardCharsets.UTF_8)) + ){ String line; - while ((line=bf.readLine())!=null) { - outStr += line; + while ((line = bf.readLine()) != null) { + outStr.append(line); } } catch (IOException e) { e.printStackTrace(); } - return outStr; + return outStr.toString(); } public void setQuery(String queryStr) { @@ -102,7 +105,7 @@ public void setQuery(String queryStr) { try (ByteArrayOutputStream obj=new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(obj);){ - gzip.write(queryStr.getBytes("UTF-8")); + gzip.write(queryStr.getBytes(StandardCharsets.UTF_8)); gzip.close(); this.query = obj.toByteArray(); } catch (IOException e) { diff --git a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/BaseRepository.java b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/BaseRepository.java index 61aae96a..bb47e6f2 100644 --- a/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/BaseRepository.java +++ b/pic-sure-api-data/src/main/java/edu/harvard/dbmi/avillach/data/repository/BaseRepository.java @@ -84,8 +84,8 @@ public T getById(K id){ * @return */ public List getByColumn(String columnName, Object value){ - CriteriaQuery query = query(); - Root root = root(query); + CriteriaQuery query = query(); + Root root = root(query); return getByColumns(query, root, eq(cb(),root,columnName,value)); } diff --git a/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureQueryService.java b/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureQueryService.java index 3d60944c..aacbbd21 100644 --- a/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureQueryService.java +++ b/pic-sure-api-war/src/main/java/edu/harvard/dbmi/avillach/service/PicsureQueryService.java @@ -30,6 +30,9 @@ public class PicsureQueryService { public static final String QUERY_RESULT_METADATA_FIELD = "queryResultMetadata"; private static final String QUERY_JSON_FIELD = "queryJson"; + private static final String COMMON_AREA_ID = "commonAreaId"; + + private final Logger logger = LoggerFactory.getLogger(PicsureQueryService.class); private final static ObjectMapper mapper = new ObjectMapper(); @@ -62,7 +65,8 @@ public QueryStatus query(QueryRequest dataQueryRequest, HttpHeaders headers) { QueryStatus results = resourceWebClient.query(resource.getResourceRSPath(), dataQueryRequest); - Query queryEntity = copyQuery(dataQueryRequest, resource, results); + String commonAreaId = dataQueryRequest.getResourceCredentials().get(COMMON_AREA_ID); + Query queryEntity = copyQuery(dataQueryRequest, resource, results, commonAreaId); queryRepo.persist(queryEntity); logger.debug("PicsureQueryService() persisted queryEntity with id: " + queryEntity.getUuid()); @@ -192,19 +196,12 @@ public Response querySync(QueryRequest queryRequest, HttpHeaders headers) { Query queryEntity = new Query(); queryEntity.setResource(resource); queryEntity.setStartTime(new Date(Calendar.getInstance().getTime().getTime())); + extractQueryJson(queryRequest) + .ifPresentOrElse( + queryEntity::setQuery, + () -> { throw new ProtocolException(ProtocolException.INCORRECTLY_FORMATTED_REQUEST); } + ); - - String queryJson = null; - if( queryRequest.getQuery() != null) { - try { - ObjectMapper mapper = new ObjectMapper(); - queryJson = mapper.writeValueAsString( queryRequest); - } catch (JsonProcessingException e) { - throw new ProtocolException(ProtocolException.INCORRECTLY_FORMATTED_REQUEST); - } - } - - queryEntity.setQuery(queryJson); queryRepo.persist(queryEntity); queryRequest.getResourceCredentials().put(ResourceWebClient.BEARER_TOKEN_KEY, resource.getToken()); @@ -233,7 +230,19 @@ public Response querySync(QueryRequest queryRequest, HttpHeaders headers) { return syncResponse; } - /** + private Optional extractQueryJson(QueryRequest queryRequest) { + if( queryRequest.getQuery() != null) { + try { + ObjectMapper mapper = new ObjectMapper(); + return Optional.of(mapper.writeValueAsString(queryRequest)); + } catch (JsonProcessingException e) { + return Optional.empty(); + } + } + return Optional.of(""); + } + + /** * @param queryId The UUID of the query to get metadata about * @return a QueryStatus object containing the metadata stored about the given query */ @@ -280,17 +289,32 @@ public QueryStatus institutionalQuery(QueryRequest dataQueryRequest, HttpHeaders Resource resource = verifyQueryRequest(dataQueryRequest, headers); dataQueryRequest.getResourceCredentials().put(ResourceWebClient.BEARER_TOKEN_KEY, resource.getToken()); + // Start by persisting the basic query. We do this to generate the common area ID + Query initialQuery = new Query(); + initialQuery.setResource(resource); + initialQuery.setStartTime(new Date(Calendar.getInstance().getTime().getTime())); + extractQueryJson(dataQueryRequest) + .ifPresentOrElse( + initialQuery::setQuery, + () -> { throw new ProtocolException(ProtocolException.INCORRECTLY_FORMATTED_REQUEST); } + ); + + queryRepo.persist(initialQuery); + dataQueryRequest.getResourceCredentials().put(COMMON_AREA_ID, initialQuery.getUuid().toString()); + + QueryStatus response = resourceWebClient.query(resource.getResourceRSPath(), dataQueryRequest); - Query queryEntity = copyQuery(dataQueryRequest, resource, response); + Query queryEntity = copyQuery(dataQueryRequest, resource, response, null); + queryRepo.persist(queryEntity); // we don't want the user to see the common area ID for now, but this could be useful later // for editing the query - response.getResultMetadata().put("commonAreaId", queryEntity.getUuid().toString()); + response.getResultMetadata().put(COMMON_AREA_ID, queryEntity.getUuid().toString()); return response; } - private Query copyQuery(QueryRequest dataQueryRequest, Resource resource, QueryStatus response) { + private Query copyQuery(QueryRequest dataQueryRequest, Resource resource, QueryStatus response, String commonId) { Query queryEntity = new Query(); queryEntity.setResourceResultId(response.getResourceResultId()); queryEntity.setResource(resource); @@ -307,6 +331,10 @@ private Query copyQuery(QueryRequest dataQueryRequest, Resource resource, QueryS } } + if (commonId != null && !commonId.isEmpty() && response.getResultMetadata() != null) { + response.getResultMetadata().put(COMMON_AREA_ID, commonId); + } + queryEntity.setQuery(queryJson); if (response.getResultMetadata() != null) {