diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cd8a905a7f..b4d9d0904c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,13 @@ services:
variables:
DEPLOY_PATH: ~/gitlab
+ DOCKER_DRIVER: overlay2
+ DOCKER_TLS_CERTDIR: ""
+ DOCKER_TAG: $CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA
+ DOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:$DOCKER_TAG
+ DOCKER_PULL_SECRET: docker-registry-secret
+ APP_NAME: $CI_PROJECT_NAME
+
before_script:
- echo $CI_BUILD_REF
@@ -11,33 +18,71 @@ before_script:
- apk update && apk add git
stages:
+ - build
- package
- config
- deploy
-maven-package:
+maven-package-webapps-core:
image: ${CI_REGISTRY_IMAGE}/eclipse-temurin:17-jdk
- stage: package
+ stage: build
script:
- - './mvnw -q deploy -P embl-ebi -s ci_settings.xml -DskipTests -Dmaven.source.skip=true'
- - mkdir deployment
- - cp webapps/core/target/webapps-core-*.war deployment/webapps-core.war
- - cp webapps/core-v2/target/webapps-core-v2*.jar deployment/webapps-core-v2.jar
- - cp agents/solr/target/agents-solr-*.jar deployment/agents-solr.jar
- - cp agents/uploadworkers/target/agents-uploadworkers-*.jar deployment/agents-uploadworkers.jar
- - cp pipelines/curation/target/pipelines-curation-*.jar deployment/pipelines-curation.jar
- # - cp pipelines/ena/target/pipelines-ena-*.jar deployment/pipelines-ena.jar
- # - cp pipelines/ncbi-ena-link/target/pipelines-ncbi-ena-link-*.jar deployment/pipelines-ncbi-ena-link.jar
- - cp pipelines/sample-release/target/pipelines-sample-release-*.jar deployment/pipelines-sample-release.jar
- - cp pipelines/sample-post-release-action/target/pipelines-sample-post-release-action*.jar deployment/pipelines-sample-post-release-action.jar
- - cp pipelines/ncbi/target/pipelines-ncbi-*.jar deployment/pipelines-ncbi.jar
- - cp pipelines/reindex/target/pipelines-reindex-*.jar deployment/pipelines-reindex.jar
- - cp pipelines/sample-transformation-dtol/target/pipelines-sample-transformation-dtol-*.jar deployment/pipelines-sample-transformation-dtol.jar
+ - './mvnw -q deploy -pl webapps/core -am -P embl-ebi -s ci_settings.xml -DskipTests -Dmaven.source.skip=true'
artifacts:
paths:
- - deployment
+ - webapps/core/target/webapps-core-*.war
+
+ # maven-package:
+ # image: ${CI_REGISTRY_IMAGE}/eclipse-temurin:17-jdk
+ # stage: build
+ # script:
+ # - './mvnw -q deploy -P embl-ebi -s ci_settings.xml -DskipTests -Dmaven.source.skip=true'
+ # - mkdir deployment
+ # - cp webapps/core/target/webapps-core-*.war deployment/webapps-core.war
+ # - cp webapps/core-v2/target/webapps-core-v2*.jar deployment/webapps-core-v2.jar
+ # - cp agents/solr/target/agents-solr-*.jar deployment/agents-solr.jar
+ # - cp agents/uploadworkers/target/agents-uploadworkers-*.jar deployment/agents-uploadworkers.jar
+ # - cp pipelines/curation/target/pipelines-curation-*.jar deployment/pipelines-curation.jar
+ # - cp pipelines/ena/target/pipelines-ena-*.jar deployment/pipelines-ena.jar
+ # - cp pipelines/ncbi-ena-link/target/pipelines-ncbi-ena-link-*.jar deployment/pipelines-ncbi-ena-link.jar
+ # - cp pipelines/sample-release/target/pipelines-sample-release-*.jar deployment/pipelines-sample-release.jar
+ # - cp pipelines/sample-post-release-action/target/pipelines-sample-post-release-action*.jar deployment/pipelines-sample-post-release-action.jar
+ # - cp pipelines/ncbi/target/pipelines-ncbi-*.jar deployment/pipelines-ncbi.jar
+ # - cp pipelines/reindex/target/pipelines-reindex-*.jar deployment/pipelines-reindex.jar
+ # - cp pipelines/sample-transformation-dtol/target/pipelines-sample-transformation-dtol-*.jar deployment/pipelines-sample-transformation-dtol.jar
+ # artifacts:
+ # paths:
+ # - deployment
# when: manual
+build_docker_image:
+ stage: package
+ image: docker:stable
+ services:
+ - docker:stable-dind
+ before_script:
+ - echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
+ script:
+ - docker build --build-arg DOCKER_REGISTRY=${CI_REGISTRY_IMAGE} -t $DOCKER_IMAGE_NAME -f webapps/core/Dockerfile .
+ - docker push $DOCKER_IMAGE_NAME
+ after_script:
+ - docker logout ${CI_REGISTRY_IMAGE}
+
+deploy-dev-bsd-v1:
+ image: dtzar/helm-kubectl:3.11.0
+ stage: deploy
+ script:
+ - cd webapps/core
+ - sed -i "s|%DOCKER_IMAGE%|$DOCKER_IMAGE_NAME|g" core-deployment.yaml
+ - kubectl config set-cluster bsd-cluster --server="${K8_HL_SERVER}"
+ - kubectl config set clusters.bsd-cluster.certificate-authority-data ${K8_HL_CERTIFICATE_AUTHORITY_DATA}
+ - kubectl config set-credentials bsd-user --token="${K8_HL_CREDENTIALS}"
+ - kubectl config set-context bsd-context --cluster=bsd-cluster --user=bsd-user
+ - kubectl config use-context bsd-context
+ - kubectl apply -f core-deployment.yaml --namespace=biosamples-dev
+ - kubectl apply -f core-service.yaml --namespace=biosamples-dev
+ when: manual
+
clone-config-dev:
stage: config
script:
@@ -127,7 +172,7 @@ deploy-production:
parallel:
matrix:
- BSD_NODE_NAME: bsd_prod
- BSD_HOST_NAME: [wp-p2m-40, wp-p2m-41, wp-p1m-40, wp-p1m-41]
+ BSD_HOST_NAME: [ wp-p2m-40, wp-p2m-41, wp-p1m-40, wp-p1m-41 ]
environment:
name: prod-${BSD_HOST_NAME}
url: http://${BSD_HOST_NAME}:8081/biosamples/
@@ -144,7 +189,7 @@ deploy-production-solr:
parallel:
matrix:
- BSD_NODE_NAME: bsd_prod
- BSD_SOLR_HOST_NAME: [wp-p1m-42, wp-p2m-42]
+ BSD_SOLR_HOST_NAME: [ wp-p1m-42, wp-p2m-42 ]
environment:
name: prod-solr-${BSD_HOST_NAME}
url: http://${BSD_SOLR_HOST_NAME}.ebi.ac.uk:8983/solr
diff --git a/RELEASE.adoc b/RELEASE.adoc
index 4b69922de9..377a2ba102 100644
--- a/RELEASE.adoc
+++ b/RELEASE.adoc
@@ -3,6 +3,10 @@
This pages contains links to release notes for BioSamples for version 4.0.0 and higher. This release represents a comprehensive overhaul and therefore previous release notes are no longer applicable.
+[[v5.3.13]]
+== v5.3.13 Release notes
+* Zenodo archive for the publication
+
[[v5.3.12]]
== v5.3.12 Release notes
* EBI Survey banner
diff --git a/agents/pom.xml b/agents/pom.xml
index 703dc7fc4b..0fb28d4248 100644
--- a/agents/pom.xml
+++ b/agents/pom.xml
@@ -9,7 +9,7 @@
uk.ac.ebi.biosamples
biosamples
- 5.3.12
+ 5.3.13-SNAPSHOT
diff --git a/agents/solr/pom.xml b/agents/solr/pom.xml
index aa79d7ac59..a0e3442f42 100644
--- a/agents/solr/pom.xml
+++ b/agents/solr/pom.xml
@@ -7,7 +7,7 @@
uk.ac.ebi.biosamples
biosamples
- 5.3.12
+ 5.3.13-SNAPSHOT
../../
@@ -15,22 +15,12 @@
uk.ac.ebi.biosamples
properties
- 5.3.12
+ 5.3.13-SNAPSHOT
uk.ac.ebi.biosamples
- models-solr
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- messaging
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- utils-ols
- 5.3.12
+ core
+ 5.3.13-SNAPSHOT
@@ -38,6 +28,10 @@
spring-hateoas
1.3.4
+
+ org.springframework.boot
+ spring-boot-starter-web
+
com.github.ben-manes.caffeine
caffeine
diff --git a/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolr.java b/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolr.java
index fb785dd50b..444a54bd01 100644
--- a/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolr.java
+++ b/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolr.java
@@ -19,10 +19,10 @@
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
-import uk.ac.ebi.biosamples.MessageContent;
-import uk.ac.ebi.biosamples.Messaging;
-import uk.ac.ebi.biosamples.model.Attribute;
-import uk.ac.ebi.biosamples.model.Sample;
+import uk.ac.ebi.biosamples.core.model.Attribute;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.messaging.MessagingConstants;
+import uk.ac.ebi.biosamples.messaging.model.MessageContent;
import uk.ac.ebi.biosamples.solr.model.SolrSample;
import uk.ac.ebi.biosamples.solr.repo.SolrSampleRepository;
import uk.ac.ebi.biosamples.solr.service.SampleToSolrSampleConverter;
@@ -51,14 +51,14 @@ public MessageHandlerSolr(
}
@RabbitListener(
- queues = Messaging.INDEXING_QUEUE,
+ queues = MessagingConstants.INDEXING_QUEUE,
containerFactory = "biosamplesAgentSolrContainerFactory")
public void handleIndexing(final MessageContent messageContent) {
handle(messageContent);
}
@RabbitListener(
- queues = Messaging.REINDEXING_QUEUE,
+ queues = MessagingConstants.REINDEXING_QUEUE,
containerFactory = "biosamplesAgentSolrContainerFactory")
public void handleReindexing(final MessageContent messageContent) {
handle(messageContent);
diff --git a/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/SolrRunner.java b/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/SolrRunner.java
index f9ea5182f0..9e449c844e 100644
--- a/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/SolrRunner.java
+++ b/agents/solr/src/main/java/uk/ac/ebi/biosamples/solr/SolrRunner.java
@@ -17,8 +17,8 @@
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import uk.ac.ebi.biosamples.BioSamplesProperties;
-import uk.ac.ebi.biosamples.MessageUtils;
-import uk.ac.ebi.biosamples.Messaging;
+import uk.ac.ebi.biosamples.messaging.MessagingConstants;
+import uk.ac.ebi.biosamples.messaging.service.MessageUtils;
@Component
public class SolrRunner implements ApplicationRunner {
@@ -36,9 +36,9 @@ public void run(final ApplicationArguments args) throws Exception {
|| messageCount == null
|| messageCount > 0) {
Thread.sleep(1000);
- messageCount = messageUtils.getQueueCount(Messaging.INDEXING_QUEUE);
+ messageCount = messageUtils.getQueueCount(MessagingConstants.INDEXING_QUEUE);
- log.trace("Messages remaining in " + Messaging.INDEXING_QUEUE + " " + messageCount);
+ log.trace("Messages remaining in " + MessagingConstants.INDEXING_QUEUE + " " + messageCount);
}
}
}
diff --git a/agents/solr/src/test/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolrTest.java b/agents/solr/src/test/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolrTest.java
index a7d3a0169e..943ad5081d 100644
--- a/agents/solr/src/test/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolrTest.java
+++ b/agents/solr/src/test/java/uk/ac/ebi/biosamples/solr/MessageHandlerSolrTest.java
@@ -25,9 +25,9 @@
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
-import uk.ac.ebi.biosamples.model.Attribute;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.model.SampleStatus;
+import uk.ac.ebi.biosamples.core.model.Attribute;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.core.model.SampleStatus;
public class MessageHandlerSolrTest {
diff --git a/agents/uploadworkers/pom.xml b/agents/uploadworkers/pom.xml
index 8c0eb9fbb5..1d0068a670 100644
--- a/agents/uploadworkers/pom.xml
+++ b/agents/uploadworkers/pom.xml
@@ -1,22 +1,38 @@
-
-4.0.0
+
+ 4.0.0
agents-uploadworkers
jar
uk.ac.ebi.biosamples
biosamples
- 5.3.12
+ 5.3.13-SNAPSHOT
../../
+
+
uk.ac.ebi.biosamples
biosamples-spring-boot-starter
- 5.3.12
+ 5.3.13-SNAPSHOT
+
+ uk.ac.ebi.biosamples
+ properties
+ 5.3.13-SNAPSHOT
+
+
+ uk.ac.ebi.biosamples
+ core
+ 5.3.13-SNAPSHOT
+
+
+
org.springframework.boot
spring-boot-starter-web
@@ -30,31 +46,14 @@
spring-hateoas
1.3.4
-
- uk.ac.ebi.biosamples
- properties
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- utils-webapp
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- messaging
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- models-mongo
- 5.3.12
-
+
+
org.apache.commons
commons-csv
1.8
+
@@ -72,4 +71,5 @@
+
diff --git a/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/runner/FileUploadMessageQueueRunner.java b/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/runner/FileUploadMessageQueueRunner.java
index 5b95fcce6d..51fb886933 100644
--- a/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/runner/FileUploadMessageQueueRunner.java
+++ b/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/runner/FileUploadMessageQueueRunner.java
@@ -16,8 +16,8 @@
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
-import uk.ac.ebi.biosamples.MessageUtils;
-import uk.ac.ebi.biosamples.Messaging;
+import uk.ac.ebi.biosamples.messaging.MessagingConstants;
+import uk.ac.ebi.biosamples.messaging.service.MessageUtils;
@Component
public class FileUploadMessageQueueRunner implements ApplicationRunner {
@@ -30,9 +30,9 @@ public void run(final ApplicationArguments args) {
while (true) {
log.trace(
"Messages remaining in "
- + Messaging.UPLOAD_QUEUE
+ + MessagingConstants.UPLOAD_QUEUE
+ " "
- + messageUtils.getQueueCount(Messaging.UPLOAD_QUEUE));
+ + messageUtils.getQueueCount(MessagingConstants.UPLOAD_QUEUE));
}
}
}
diff --git a/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/submission/FileUploadSubmissionService.java b/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/submission/FileUploadSubmissionService.java
index c529e08e20..aa59fb0797 100644
--- a/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/submission/FileUploadSubmissionService.java
+++ b/agents/uploadworkers/src/main/java/uk/ac/ebi/biosamples/submission/FileUploadSubmissionService.java
@@ -27,11 +27,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
-import uk.ac.ebi.biosamples.Messaging;
import uk.ac.ebi.biosamples.client.BioSamplesClient;
-import uk.ac.ebi.biosamples.exceptions.GlobalExceptions;
-import uk.ac.ebi.biosamples.model.Relationship;
-import uk.ac.ebi.biosamples.model.Sample;
+import uk.ac.ebi.biosamples.core.model.Relationship;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.exception.GlobalExceptions;
+import uk.ac.ebi.biosamples.messaging.MessagingConstants;
import uk.ac.ebi.biosamples.model.SubmissionFile;
import uk.ac.ebi.biosamples.mongo.model.MongoFileUpload;
import uk.ac.ebi.biosamples.mongo.repository.MongoFileUploadRepository;
@@ -56,7 +56,7 @@ public class FileUploadSubmissionService {
@Autowired MongoSampleRepository mongoSampleRepository;
@RabbitListener(
- queues = Messaging.UPLOAD_QUEUE,
+ queues = MessagingConstants.UPLOAD_QUEUE,
containerFactory = "biosamplesFileUploadSubmissionContainerFactory")
public void receiveMessageFromBioSamplesFileUploaderQueue(final String mongoFileId) {
handleMessage(mongoFileId);
diff --git a/client/client/pom.xml b/client/client/pom.xml
index 2193f2b599..3e5091f2bf 100644
--- a/client/client/pom.xml
+++ b/client/client/pom.xml
@@ -21,15 +21,15 @@
uk.ac.ebi.biosamples
biosamples
- 5.3.12
+ 5.3.13-SNAPSHOT
../../
uk.ac.ebi.biosamples
- models-core
- 5.3.12
+ core
+ 5.3.13-SNAPSHOT
org.springframework.hateoas
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesClient.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesClient.java
index 40b3c978db..881b5cef25 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesClient.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesClient.java
@@ -32,13 +32,10 @@
import org.springframework.web.util.UriComponentsBuilder;
import uk.ac.ebi.biosamples.client.service.*;
import uk.ac.ebi.biosamples.client.utils.ClientProperties;
-import uk.ac.ebi.biosamples.model.Curation;
-import uk.ac.ebi.biosamples.model.CurationLink;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.model.SubmissionReceipt;
-import uk.ac.ebi.biosamples.model.filter.Filter;
-import uk.ac.ebi.biosamples.model.structured.StructuredData;
-import uk.ac.ebi.biosamples.service.SampleValidator;
+import uk.ac.ebi.biosamples.core.model.*;
+import uk.ac.ebi.biosamples.core.model.filter.Filter;
+import uk.ac.ebi.biosamples.core.model.structured.StructuredData;
+import uk.ac.ebi.biosamples.core.service.SampleValidator;
/**
* This is the primary class for interacting with BioSamples.
@@ -57,6 +54,7 @@ public class BioSamplesClient implements AutoCloseable {
private final CurationSubmissionService curationSubmissionService;
private final StructuredDataSubmissionService structuredDataSubmissionService;
private final SampleValidator sampleValidator;
+
/**
* -- GETTER -- Gets the public client.
*
@@ -101,15 +99,13 @@ public BioSamplesClient(
sampleRetrievalService = new SampleRetrievalService(restOperations, traverson);
samplePageRetrievalService = new SamplePageRetrievalService(restOperations, traverson);
- sampleCursorRetrievalService =
- new SampleCursorRetrievalService(
- restOperations, traverson, clientProperties.getBiosamplesClientPagesize());
+ sampleCursorRetrievalService = new SampleCursorRetrievalService(restOperations, traverson);
sampleSubmissionService = new SampleSubmissionService(restOperations, traverson);
sampleSubmissionServiceV2 = new SampleSubmissionServiceV2(restOperations, uriV2);
sampleRetrievalServiceV2 = new SampleRetrievalServiceV2(restOperations, uriV2);
curationRetrievalService =
new CurationRetrievalService(
- restOperations, traverson, clientProperties.getBiosamplesClientPagesize());
+ restOperations, traverson, clientProperties.getBiosamplesClientMaxPages());
/*TODO: In CurationSubmissionService and StructuredDataSubmissionService webin auth is handled more elegantly, replicate it in all other services*/
curationSubmissionService = new CurationSubmissionService(restOperations, traverson);
structuredDataSubmissionService =
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesWebinGetClient.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesWebinGetClient.java
index b0507d9535..f775f738d9 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesWebinGetClient.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesWebinGetClient.java
@@ -34,12 +34,13 @@
import uk.ac.ebi.biosamples.client.service.SampleRetrievalServiceV2;
import uk.ac.ebi.biosamples.client.service.WebinAuthClientService;
import uk.ac.ebi.biosamples.client.utils.ClientProperties;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.service.SampleValidator;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.core.service.SampleValidator;
public class BioSamplesWebinGetClient implements AutoCloseable {
private final Logger log = LoggerFactory.getLogger(getClass());
private final SampleRetrievalServiceV2 sampleRetrievalServiceV2;
+
/** -- GETTER -- Gets the public client. */
@Getter private final Optional publicClient;
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationRetrievalService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationRetrievalService.java
index 1c5db6bdfa..bfc20a09ea 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationRetrievalService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationRetrievalService.java
@@ -21,8 +21,8 @@
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestOperations;
import uk.ac.ebi.biosamples.client.utils.IterableResourceFetchAll;
-import uk.ac.ebi.biosamples.model.Curation;
-import uk.ac.ebi.biosamples.model.CurationLink;
+import uk.ac.ebi.biosamples.core.model.Curation;
+import uk.ac.ebi.biosamples.core.model.CurationLink;
public class CurationRetrievalService {
private final Traverson traverson;
@@ -43,17 +43,13 @@ public Iterable> fetchAll() {
}
public Iterable> fetchAll(final String jwt) {
- final MultiValueMap params = new LinkedMultiValueMap<>();
-
- params.add("size", Integer.toString(pageSize));
-
return new IterableResourceFetchAll<>(
executor,
traverson,
restOperations,
new ParameterizedTypeReference>>() {},
jwt,
- params,
+ null,
"curations");
}
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationSubmissionService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationSubmissionService.java
index e3090d311b..47f31efd1e 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationSubmissionService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/CurationSubmissionService.java
@@ -24,7 +24,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestOperations;
-import uk.ac.ebi.biosamples.model.CurationLink;
+import uk.ac.ebi.biosamples.core.model.CurationLink;
public class CurationSubmissionService {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleCursorRetrievalService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleCursorRetrievalService.java
index 627ad47bce..ef524e7670 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleCursorRetrievalService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleCursorRetrievalService.java
@@ -23,8 +23,8 @@
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestOperations;
import uk.ac.ebi.biosamples.client.utils.IterableResourceFetchAll;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.model.filter.Filter;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.core.model.filter.Filter;
public class SampleCursorRetrievalService {
private static final ParameterizedTypeReference>>
@@ -33,14 +33,12 @@ public class SampleCursorRetrievalService {
private final Traverson traverson;
private final ExecutorService executor;
private final RestOperations restOperations;
- private final int pageSize;
public SampleCursorRetrievalService(
- final RestOperations restOperations, final Traverson traverson, final int pageSize) {
+ final RestOperations restOperations, final Traverson traverson) {
this.restOperations = restOperations;
this.traverson = traverson;
this.executor = Executors.newSingleThreadExecutor();
- this.pageSize = pageSize;
}
public Iterable> fetchAll(
@@ -64,17 +62,14 @@ public Iterable> fetchAll(
final String jwt,
final boolean addCurations) {
MultiValueMap params = new LinkedMultiValueMap<>();
+
params.add("text", text);
for (final Filter filter : filterCollection) {
params.add("filter", filter.getSerialization());
}
- params.add("size", Integer.toString(pageSize));
-
- if (!addCurations) {
- params.add("applyCurations", "false");
- }
+ params.add("applyCurations", String.valueOf(addCurations));
params = encodePlusInQueryParameters(params);
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SamplePageRetrievalService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SamplePageRetrievalService.java
index cc80d5815d..5d9297eb79 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SamplePageRetrievalService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SamplePageRetrievalService.java
@@ -29,8 +29,8 @@
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestOperations;
import org.springframework.web.util.UriComponentsBuilder;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.model.filter.Filter;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.core.model.filter.Filter;
public class SamplePageRetrievalService {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalService.java
index 6f89701a04..ff4146743e 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalService.java
@@ -24,7 +24,7 @@
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestOperations;
import org.springframework.web.util.UriComponentsBuilder;
-import uk.ac.ebi.biosamples.model.Sample;
+import uk.ac.ebi.biosamples.core.model.Sample;
public class SampleRetrievalService {
/*TODO: check if private sample fetch work - jwt not used*/
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalServiceV2.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalServiceV2.java
index aef17078fe..f81b9f126a 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalServiceV2.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleRetrievalServiceV2.java
@@ -23,7 +23,7 @@
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestOperations;
import org.springframework.web.util.UriComponentsBuilder;
-import uk.ac.ebi.biosamples.model.Sample;
+import uk.ac.ebi.biosamples.core.model.Sample;
public class SampleRetrievalServiceV2 {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionService.java
index f8fc2c9e44..fa33e979bc 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionService.java
@@ -28,7 +28,7 @@
import org.springframework.web.client.RestClientResponseException;
import org.springframework.web.client.RestOperations;
import org.springframework.web.util.UriComponentsBuilder;
-import uk.ac.ebi.biosamples.model.Sample;
+import uk.ac.ebi.biosamples.core.model.Sample;
public class SampleSubmissionService {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionServiceV2.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionServiceV2.java
index 101ab67100..179049aa7d 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionServiceV2.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/SampleSubmissionServiceV2.java
@@ -25,8 +25,8 @@
import org.springframework.web.client.RestClientResponseException;
import org.springframework.web.client.RestOperations;
import org.springframework.web.util.UriComponentsBuilder;
-import uk.ac.ebi.biosamples.model.Sample;
-import uk.ac.ebi.biosamples.model.SubmissionReceipt;
+import uk.ac.ebi.biosamples.core.model.Sample;
+import uk.ac.ebi.biosamples.core.model.SubmissionReceipt;
public class SampleSubmissionServiceV2 {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/StructuredDataSubmissionService.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/StructuredDataSubmissionService.java
index 0d32601088..cec256b02d 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/StructuredDataSubmissionService.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/service/StructuredDataSubmissionService.java
@@ -23,7 +23,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestOperations;
-import uk.ac.ebi.biosamples.model.structured.StructuredData;
+import uk.ac.ebi.biosamples.core.model.structured.StructuredData;
public class StructuredDataSubmissionService {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/ClientProperties.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/ClientProperties.java
index 096ff238f2..840e904c11 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/ClientProperties.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/ClientProperties.java
@@ -28,7 +28,7 @@ public class ClientProperties {
private URI biosamplesClientUriV2;
@Value("${biosamples.client.pagesize:499}")
- private int biosamplesClientPagesize;
+ private int biosamplesClientMaxPages;
// in milliseconds
@Value("${biosamples.client.timeout:60000}")
diff --git a/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/IterableResourceFetchAll.java b/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/IterableResourceFetchAll.java
index 83f1b7aa67..ec99ea5b23 100644
--- a/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/IterableResourceFetchAll.java
+++ b/client/client/src/main/java/uk/ac/ebi/biosamples/client/utils/IterableResourceFetchAll.java
@@ -13,12 +13,14 @@
import java.net.URI;
import java.util.Arrays;
import java.util.Iterator;
+import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.ParameterizedTypeReference;
@@ -36,6 +38,7 @@
import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriTemplate;
+@Slf4j
public class IterableResourceFetchAll implements Iterable> {
private final Traverson traverson;
private final RestOperations restOperations;
@@ -82,8 +85,9 @@ public IterableResourceFetchAll(
@Override
public Iterator> iterator() {
-
+ boolean applyCurations = true;
TraversalBuilder traversonBuilder = null;
+
for (final Hop hop : hops) {
if (traversonBuilder == null) {
traversonBuilder = traverson.follow(hop);
@@ -92,29 +96,49 @@ public Iterator> iterator() {
}
}
- // get the first page
- final URI uri =
- UriComponentsBuilder.fromHttpUrl(traversonBuilder.asLink().getHref())
- .queryParams(params)
- .build()
- .toUri();
+ final String href = traversonBuilder.asLink().getHref();
+ // Remove the existing 'applyCurations' parameter while preserving encoding
+ final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(href);
- final RequestEntity requestEntity =
- IteratorResourceFetchAll.NextPageCallable.buildRequestEntity(jwt, uri);
+ uriBuilder.replaceQueryParam("applyCurations"); // removes all instances
+
+ // Add query parameters while preserving their encoding
+ if (params != null) {
+ for (final String key : params.keySet()) {
+ final List values = params.get(key);
+
+ if (values != null) {
+ for (final String value : values) {
+ uriBuilder.queryParam(key, value);
+ }
+ }
+ }
+ }
+ // Build the URI with encoding disabled to preserve existing encoding
+ final URI finalUri = uriBuilder.build(false).toUri();
+ final RequestEntity requestEntity =
+ IteratorResourceFetchAll.NextPageCallable.buildRequestEntity(jwt, finalUri);
final ResponseEntity>> responseEntity =
restOperations.exchange(requestEntity, parameterizedTypeReference);
+
+ if (params != null
+ && params.get("applyCurations") != null
+ && Objects.equals(params.getFirst("applyCurations"), "false")) {
+ applyCurations = false;
+ }
+
return new IteratorResourceFetchAll<>(
Objects.requireNonNull(responseEntity.getBody()),
restOperations,
parameterizedTypeReference,
executor,
- jwt);
+ jwt,
+ applyCurations);
}
private static class IteratorResourceFetchAll implements Iterator> {
private final Logger log = LoggerFactory.getLogger(getClass());
-
private final RestOperations restOperations;
private final ExecutorService executor;
private final ParameterizedTypeReference>> parameterizedTypeReference;
@@ -122,37 +146,48 @@ private static class IteratorResourceFetchAll implements Iterator> pageIterator;
private Future>> nextPageFuture;
private final String jwt;
+ private final boolean applyCurations;
IteratorResourceFetchAll(
final PagedModel> page,
final RestOperations restOperations,
final ParameterizedTypeReference>> parameterizedTypeReference,
final ExecutorService executor,
- final String jwt) {
-
+ final String jwt,
+ final boolean applyCurations) {
this.page = page;
- pageIterator = page.iterator();
this.restOperations = restOperations;
this.executor = executor;
this.parameterizedTypeReference = parameterizedTypeReference;
this.jwt = jwt;
+ this.applyCurations = applyCurations;
+
+ pageIterator = page.iterator();
}
@Override
public synchronized boolean hasNext() {
// pre-emptively grab the next page as a future
if (nextPageFuture == null && page.hasLink(IanaLinkRelations.NEXT)) {
-
final Link nextLink = page.getLink(IanaLinkRelations.NEXT).get();
- final URI uri;
+ URI uri;
+
if (nextLink.isTemplated()) {
final UriTemplate uriTemplate = new UriTemplate(nextLink.getHref());
+
uri = uriTemplate.expand();
} else {
uri = URI.create(nextLink.getHref());
}
- log.trace("getting next page uri " + uri);
+
+ uri =
+ UriComponentsBuilder.fromUri(uri)
+ .queryParam("applyCurations", applyCurations)
+ .build(true)
+ .toUri();
+
+ log.trace("Getting next page uri " + uri);
nextPageFuture =
executor.submit(
@@ -171,8 +206,10 @@ public synchronized boolean hasNext() {
throw new RuntimeException(e);
}
pageIterator = page.iterator();
+
return hasNext();
}
+
return false;
}
@@ -191,6 +228,7 @@ public EntityModel next() {
} catch (final InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
+
if (pageIterator.hasNext()) {
return pageIterator.next();
}
@@ -228,6 +266,7 @@ public PagedModel> call() {
private static RequestEntity buildRequestEntity(final String jwt, final URI uri) {
final MultiValueMap headers = new LinkedMultiValueMap<>();
+
headers.add(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON.toString());
if (jwt != null) {
diff --git a/client/client/src/test/java/uk/ac/ebi/biosamples/model/ResourceSerializationTest.java b/client/client/src/test/java/uk/ac/ebi/biosamples/model/ResourceSerializationTest.java
index 9fc33a956a..924a65c574 100644
--- a/client/client/src/test/java/uk/ac/ebi/biosamples/model/ResourceSerializationTest.java
+++ b/client/client/src/test/java/uk/ac/ebi/biosamples/model/ResourceSerializationTest.java
@@ -36,6 +36,7 @@
import org.springframework.hateoas.EntityModel;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
+import uk.ac.ebi.biosamples.core.model.*;
@RunWith(SpringRunner.class)
@JsonTest
diff --git a/client/pom.xml b/client/pom.xml
index 91882c0667..a8a37ad7e0 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -14,7 +14,7 @@
uk.ac.ebi.biosamples
biosamples
- 5.3.12
+ 5.3.13-SNAPSHOT
../
diff --git a/client/starter/pom.xml b/client/starter/pom.xml
index 98faef15c8..69eb5752a4 100644
--- a/client/starter/pom.xml
+++ b/client/starter/pom.xml
@@ -4,8 +4,7 @@
uk.ac.ebi.biosamples
biosamples-spring-boot-starter
- 5.3.12
-
+ 5.3.13-SNAPSHOT
jar
@@ -17,7 +16,7 @@
uk.ac.ebi.biosamples
client
- 5.3.12
+ 5.3.13-SNAPSHOT
org.springframework.boot
@@ -89,55 +88,33 @@
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 3.1.1
+
com.diffplug.spotless
spotless-maven-plugin
- 2.0.2
+ 2.43.0
-
-
-
-
-
- *.md
- .gitignore
- *.json
- *.xml
- *.properties
-
-
-
-
-
- true
- 4
-
-
-
-
-
src/main/java/**/*.java
src/test/java/**/*.java
-
-
- java,javax,org,com,uk,
-
+
+ java,javax,org,com,uk,
-
-
-
-
- 1.7
-
-
-
+
+
+ 1.24.0
+
+
/*
-* Copyright 2019 EMBL - European Bioinformatics Institute
+* Copyright 2021 EMBL - European Bioinformatics Institute
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
@@ -146,9 +123,26 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-
+
+
+
+
+ *.md
+ .gitignore
+ *.json
+ *.xml
+ *.properties
+
+
+
+
+ true
+ 4
+
+
+
diff --git a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesAutoConfiguration.java b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesAutoConfiguration.java
index c5206559bf..a11a5b78a3 100644
--- a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesAutoConfiguration.java
+++ b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesAutoConfiguration.java
@@ -1,5 +1,5 @@
/*
-* Copyright 2019 EMBL - European Bioinformatics Institute
+* Copyright 2021 EMBL - European Bioinformatics Institute
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
@@ -49,8 +49,8 @@
import uk.ac.ebi.biosamples.client.service.ClientService;
import uk.ac.ebi.biosamples.client.service.WebinAuthClientService;
import uk.ac.ebi.biosamples.client.utils.ClientProperties;
-import uk.ac.ebi.biosamples.service.AttributeValidator;
-import uk.ac.ebi.biosamples.service.SampleValidator;
+import uk.ac.ebi.biosamples.core.service.AttributeValidator;
+import uk.ac.ebi.biosamples.core.service.SampleValidator;
@Configuration
@AutoConfigureAfter(WebClientAutoConfiguration.class)
diff --git a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicator.java b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicator.java
index 26444f418d..eef4740e11 100644
--- a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicator.java
+++ b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicator.java
@@ -1,5 +1,5 @@
/*
-* Copyright 2019 EMBL - European Bioinformatics Institute
+* Copyright 2021 EMBL - European Bioinformatics Institute
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
diff --git a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicatorConfiguration.java b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicatorConfiguration.java
index ea3c9a3aed..6133763008 100644
--- a/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicatorConfiguration.java
+++ b/client/starter/src/main/java/uk/ac/ebi/biosamples/client/BioSamplesHealthIndicatorConfiguration.java
@@ -1,5 +1,5 @@
/*
-* Copyright 2019 EMBL - European Bioinformatics Institute
+* Copyright 2021 EMBL - European Bioinformatics Institute
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
diff --git a/commons/pom.xml b/commons/pom.xml
deleted file mode 100644
index 2442cf95ac..0000000000
--- a/commons/pom.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-
-4.0.0
-
-commons
-commons
-
- uk.ac.ebi.biosamples
- biosamples
- 5.3.12
-
-
-
- 17
- 17
- 17
-
-
-
-
- org.springframework
- spring-webmvc
-
-
- uk.ac.ebi.biosamples
- models-mongo
- 5.3.12
-
-
- uk.ac.ebi.biosamples
- models-core
- 5.3.12
-
-
- com.fasterxml.jackson.core
- jackson-annotations
- 2.12.5
-
-
- com.google.protobuf
- protobuf-java
- 3.16.1
-
-
- com.google.protobuf
- protobuf-java-util
- 3.8.0
-
-
- org.phenopackets
- phenopacket-schema
- 1.0.0
-
-
-
diff --git a/core/pom.xml b/core/pom.xml
new file mode 100644
index 0000000000..74ffc450e1
--- /dev/null
+++ b/core/pom.xml
@@ -0,0 +1,183 @@
+
+
+
+ 4.0.0
+
+
+ uk.ac.ebi.biosamples
+ biosamples
+ 5.3.13-SNAPSHOT
+
+
+ core
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+
+ uk.ac.ebi.biosamples
+ properties
+ 5.3.13-SNAPSHOT
+
+
+ uk.ac.ebi.ena.taxonomy
+ sub-taxonomy-client
+ 2.2.8
+
+
+
+
+ org.springframework
+ spring-web
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 1.5.15.RELEASE
+ test
+
+
+ org.springframework.data
+ spring-data-solr
+ 4.1.0.RELEASE
+
+
+ org.springframework.hateoas
+ spring-hateoas
+ 1.5.5
+
+
+ org.springframework.security.oauth
+ spring-security-oauth2
+ 2.5.0.RELEASE
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.12.5
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+
+
+ com.fasterxml.jackson.module
+ jackson-module-jaxb-annotations
+
+
+ org.codehaus.woodstox
+ woodstox-core-asl
+ 4.1.4
+
+
+
+
+ com.google.protobuf
+ protobuf-java
+ 3.16.1
+
+
+ com.google.protobuf
+ protobuf-java-util
+ 3.8.0
+
+
+ org.phenopackets
+ phenopacket-schema
+ 1.0.0
+
+
+
+
+ com.auth0
+ java-jwt
+ 4.0.0
+
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+
+
+ org.apache.commons
+ commons-collections4
+ 4.1
+
+
+ org.apache.commons
+ commons-csv
+ 1.8
+
+
+ org.apache.commons
+ commons-text
+ 1.8
+
+
+ org.neo4j.driver
+ neo4j-java-driver
+ 4.0.0
+
+
+
+
+ com.google.code
+ sitemapgen4j
+ 1.0.1
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+
+
+ javax.validation
+ validation-api
+
+
+
+
+
+
+
+
+ xml-apis
+ xml-apis
+ 1.4.01
+
+
+
+
+
diff --git a/utils/webapp/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java b/core/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java
similarity index 94%
rename from utils/webapp/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java
rename to core/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java
index 5cc4fba6f3..0e20b81d9b 100644
--- a/utils/webapp/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java
+++ b/core/src/main/java/uk/ac/ebi/biosamples/advice/AccessControlControllerAdvice.java
@@ -1,29 +1,29 @@
-/*
-* Copyright 2021 EMBL - European Bioinformatics Institute
-* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
-* file except in compliance with the License. You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software distributed under the
-* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-* CONDITIONS OF ANY KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations under the License.
-*/
-package uk.ac.ebi.biosamples.advice;
-
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.context.request.WebRequest;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-import uk.ac.ebi.biosamples.exceptions.GlobalExceptions;
-
-@ControllerAdvice
-public class AccessControlControllerAdvice extends ResponseEntityExceptionHandler {
- @ExceptionHandler(value = {GlobalExceptions.AccessControlException.class})
- protected ResponseEntity