diff --git a/agents/solr/pom.xml b/agents/solr/pom.xml index 2c8345d293..2164677fd4 100644 --- a/agents/solr/pom.xml +++ b/agents/solr/pom.xml @@ -12,11 +12,6 @@ - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - uk.ac.ebi.biosamples core 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 9e449c844e..88dd6deff8 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 @@ -16,9 +16,9 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.messaging.MessagingConstants; import uk.ac.ebi.biosamples.messaging.service.MessageUtils; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Component public class SolrRunner implements ApplicationRunner { diff --git a/agents/uploadworkers/pom.xml b/agents/uploadworkers/pom.xml index c121b50fd4..2cbe8ba8e1 100644 --- a/agents/uploadworkers/pom.xml +++ b/agents/uploadworkers/pom.xml @@ -21,11 +21,6 @@ biosamples-spring-boot-starter 5.3.15-SNAPSHOT - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - uk.ac.ebi.biosamples core diff --git a/core/pom.xml b/core/pom.xml index ad2e8b2111..accb8e699b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -22,11 +22,6 @@ - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - uk.ac.ebi.ena.taxonomy sub-taxonomy-client diff --git a/core/src/main/java/uk/ac/ebi/biosamples/advice/ModelAttributeControllerAdvice.java b/core/src/main/java/uk/ac/ebi/biosamples/advice/ModelAttributeControllerAdvice.java index 65d5b66edb..cf606f6bb3 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/advice/ModelAttributeControllerAdvice.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/advice/ModelAttributeControllerAdvice.java @@ -13,7 +13,7 @@ import java.net.URI; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ModelAttribute; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @ControllerAdvice public class ModelAttributeControllerAdvice { diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java b/core/src/main/java/uk/ac/ebi/biosamples/authentication/WebinAuthenticationService.java similarity index 98% rename from webapps/core/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java rename to core/src/main/java/uk/ac/ebi/biosamples/authentication/WebinAuthenticationService.java index 7d5a934b86..6f0bb750fc 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/authentication/WebinAuthenticationService.java @@ -8,25 +8,25 @@ * 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.service; +package uk.ac.ebi.biosamples.authentication; import java.time.Instant; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.CurationLink; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.core.model.structured.AbstractData; import uk.ac.ebi.biosamples.core.model.structured.StructuredData; import uk.ac.ebi.biosamples.core.model.structured.StructuredDataType; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.service.BioSamplesCrossSourceIngestAccessControlService; @Service public class WebinAuthenticationService { - public static final String ATLANTICO_DOMAIN = "self.AtlantECO"; private final SampleService sampleService; private final BioSamplesCrossSourceIngestAccessControlService bioSamplesCrossSourceIngestAccessControlService; diff --git a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java b/core/src/main/java/uk/ac/ebi/biosamples/core/service/SampleService.java similarity index 99% rename from webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java rename to core/src/main/java/uk/ac/ebi/biosamples/core/service/SampleService.java index 1f489704b3..07171c8ad1 100644 --- a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/core/service/SampleService.java @@ -8,10 +8,10 @@ * 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.service; +package uk.ac.ebi.biosamples.core.service; import static java.util.stream.Collectors.toSet; -import static uk.ac.ebi.biosamples.BioSamplesConstants.*; +import static uk.ac.ebi.biosamples.properties.BioSamplesConstants.*; import java.time.Instant; import java.time.LocalDateTime; @@ -25,20 +25,20 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Relationship; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.core.model.structured.AbstractData; -import uk.ac.ebi.biosamples.core.service.SampleValidator; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.model.MongoSample; import uk.ac.ebi.biosamples.mongo.model.MongoSampleMessage; import uk.ac.ebi.biosamples.mongo.repository.MongoSampleMessageRepository; import uk.ac.ebi.biosamples.mongo.repository.MongoSampleRepository; import uk.ac.ebi.biosamples.mongo.service.*; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.service.BioSamplesCrossSourceIngestAccessControlService; +import uk.ac.ebi.biosamples.service.MessagingService; /** * Service layer business logic for centralizing repository access and conversions between different diff --git a/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/MongoAccessionService.java b/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/MongoAccessionService.java index 98a56c91d0..d856656341 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/MongoAccessionService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/MongoAccessionService.java @@ -21,15 +21,17 @@ import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Update; -import uk.ac.ebi.biosamples.BioSamplesConstants; +import org.springframework.stereotype.Service; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.mongo.model.MongoRelationship; import uk.ac.ebi.biosamples.mongo.model.MongoSample; import uk.ac.ebi.biosamples.mongo.model.MongoSequence; import uk.ac.ebi.biosamples.mongo.repository.MongoSampleRepository; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; // this needs to be the spring exception, not the mongo one +@Service("SampleAccessionService") public class MongoAccessionService { private final Logger log = LoggerFactory.getLogger(getClass()); private final MongoSampleRepository mongoSampleRepository; diff --git a/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/SampleReadService.java b/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/SampleReadService.java index 06ef2a42f6..e2b1ceda32 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/SampleReadService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/mongo/service/SampleReadService.java @@ -20,14 +20,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesConstants; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.structured.StructuredData; import uk.ac.ebi.biosamples.mongo.model.MongoSample; import uk.ac.ebi.biosamples.mongo.model.MongoStructuredData; import uk.ac.ebi.biosamples.mongo.repository.MongoSampleRepository; import uk.ac.ebi.biosamples.mongo.repository.MongoStructuredDataRepository; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.utils.thread.AdaptiveThreadPoolExecutor; /** diff --git a/properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesConstants.java b/core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesConstants.java similarity index 97% rename from properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesConstants.java rename to core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesConstants.java index ede425022e..7fd0efc6dd 100644 --- a/properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesConstants.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesConstants.java @@ -8,7 +8,7 @@ * 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; +package uk.ac.ebi.biosamples.properties; import java.util.Set; diff --git a/properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesProperties.java b/core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesProperties.java similarity index 96% rename from properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesProperties.java rename to core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesProperties.java index 577493a9c9..e7085dcc9f 100644 --- a/properties/src/main/java/uk/ac/ebi/biosamples/BioSamplesProperties.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/properties/BioSamplesProperties.java @@ -1,149 +1,149 @@ -/* -* 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; - -import java.net.URI; -import lombok.*; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Data -@Component -public class BioSamplesProperties { - @Value("${biosamples.agent.solr.stayalive:false}") - private Boolean agentSolrStayalive; - - @Value("${biosamples.client.uri:http://localhost:8081}") - private URI biosamplesClientUri; - - @Value("${biosamples.client.uri.v2:http://localhost:8082}") - private URI biosamplesClientUriV2; - - @Value("${biosamples.client.pagesize:499}") - private int biosamplesClientPagesize; - - // in milliseconds - @Value("${biosamples.client.timeout:60000}") - private int biosamplesClientTimeout; - - @Value("${biosamples.client.connectioncount.max:8}") - private int connectionCountMax; - - @Value("${biosamples.client.connectioncount.default:8}") - private int connectionCountDefault; - - @Value("${biosamples.client.threadcount:1}") - private int threadCount; - - @Value("${biosamples.client.threadcount.max:8}") - private int threadCountMax; - - @Value("${biosamples.submit.max-files-size-kb:20}") - private long biosamplesFileUploaderMaxSameTimeUploadFileSize; - - @Value( - "${biosamples.client.webin.auth.token.uri:https://www.ebi.ac.uk/ena/submit/webin/auth/token}") - private URI biosamplesWebinAuthTokenUri; - - @Value( - "${biosamples.client.webin.auth.submissionaccount.uri:https://www.ebi.ac.uk/ena/submit/webin/auth/admin/submission-account}") - private URI biosamplesWebinAuthFetchSubmissionAccountUri; - - // can't use "null" because it will be a string - @Value("${biosamples.client.webin.username:Webin-40894}") - private String biosamplesClientWebinUsername; - - // can't use "null" because it will be a string - @Value("${biosamples.client.webin.password:#{null}}") - private String biosamplesClientWebinPassword; - - // max number of cache entries, 0 means no cache is used by the client - // This multiplied by the cache maxobjectsize value defines the max size of the cache - @Value("${biosamples.client.cache.maxentries:0}") - private int biosamplesClientCacheMaxEntries; - - // Set each cache object maximum size, 1024*1024 = 1048576 = 1Mb - @Value("${biosamples.client.cache.maxobjectsize:1048576}") - private int biosamplesClientCacheMaxObjectSize; - - @Value("${biosamples.ols:https://www.ebi.ac.uk/ols}") - private String ols; - - @Value("${biosamples.webapp.core.uri:http://localhost:8081/biosamples}") - private URI biosamplesWebappCoreUri; - - @Value("${biosamples.usi.core.uri:https://submission-dev.ebi.ac.uk/api/docs/guide_overview.html}") - private URI usiCoreUri; - - @Value("${biosamples.webapp.core.page.threadcount:64}") - private int webappCorePageThreadCount; - - @Value("${biosamples.webapp.core.page.threadcount.max:128}") - private int webappCorePageThreadCountMax; - - // in seconds - @Value("${biosamples.webapp.core.page.cache.maxage:300}") - private int webappCorePageCacheMaxAge; - - // cache facets upto 24 hours (in seconds) - @Value("${biosamples.webapp.core.facet.cache.maxage:86400}") - private int webappCoreFacetCacheMaxAge; - - @Value("${biosamples.schema.validator.uri:http://localhost:8085/validate}") - private URI biosamplesSchemaValidatorServiceUri; - - @Value("${biosamples.schemaValidator:http://localhost:3020/validate}") - private String schemaValidator; - - @Value("${biosamples.schemaStore:http://localhost:8085}") - private String schemaStore; - - @Value("${biosamples.schema.default:BSDC00001}") - private String biosamplesDefaultSchema; - - @Value("${biosamples.schema.restricted:ERC000011:0.1}") - private String biosamplesRestrictedSchema; - - @Value("${biosamples.bulksubmisison.webin.superuser.validation:false}") - private boolean enableBulkSubmissionWebinSuperUserValidation; - - public int getBiosamplesClientConnectionCountMax() { - return connectionCountMax; - } - - public int getBiosamplesClientThreadCount() { - return threadCount; - } - - public int getBiosamplesClientThreadCountMax() { - return threadCountMax; - } - - public int getBiosamplesClientConnectionCountDefault() { - return connectionCountDefault; - } - - public int getBiosamplesCorePageThreadCount() { - return webappCorePageThreadCount; - } - - public int getBiosamplesCorePageThreadCountMax() { - return webappCorePageThreadCountMax; - } - - public int getBiosamplesCorePageCacheMaxAge() { - return webappCorePageCacheMaxAge; - } - - public int getBiosamplesCoreFacetCacheMaxAge() { - return webappCoreFacetCacheMaxAge; - } -} +/* +* 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.properties; + +import java.net.URI; +import lombok.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Data +@Component +public class BioSamplesProperties { + @Value("${biosamples.agent.solr.stayalive:false}") + private Boolean agentSolrStayalive; + + @Value("${biosamples.client.uri:http://localhost:8081}") + private URI biosamplesClientUri; + + @Value("${biosamples.client.uri.v2:http://localhost:8082}") + private URI biosamplesClientUriV2; + + @Value("${biosamples.client.pagesize:499}") + private int biosamplesClientPagesize; + + // in milliseconds + @Value("${biosamples.client.timeout:60000}") + private int biosamplesClientTimeout; + + @Value("${biosamples.client.connectioncount.max:8}") + private int connectionCountMax; + + @Value("${biosamples.client.connectioncount.default:8}") + private int connectionCountDefault; + + @Value("${biosamples.client.threadcount:1}") + private int threadCount; + + @Value("${biosamples.client.threadcount.max:8}") + private int threadCountMax; + + @Value("${biosamples.submit.max-files-size-kb:20}") + private long biosamplesFileUploaderMaxSameTimeUploadFileSize; + + @Value( + "${biosamples.client.webin.auth.token.uri:https://www.ebi.ac.uk/ena/submit/webin/auth/token}") + private URI biosamplesWebinAuthTokenUri; + + @Value( + "${biosamples.client.webin.auth.submissionaccount.uri:https://www.ebi.ac.uk/ena/submit/webin/auth/admin/submission-account}") + private URI biosamplesWebinAuthFetchSubmissionAccountUri; + + // can't use "null" because it will be a string + @Value("${biosamples.client.webin.username:Webin-40894}") + private String biosamplesClientWebinUsername; + + // can't use "null" because it will be a string + @Value("${biosamples.client.webin.password:#{null}}") + private String biosamplesClientWebinPassword; + + // max number of cache entries, 0 means no cache is used by the client + // This multiplied by the cache maxobjectsize value defines the max size of the cache + @Value("${biosamples.client.cache.maxentries:0}") + private int biosamplesClientCacheMaxEntries; + + // Set each cache object maximum size, 1024*1024 = 1048576 = 1Mb + @Value("${biosamples.client.cache.maxobjectsize:1048576}") + private int biosamplesClientCacheMaxObjectSize; + + @Value("${biosamples.ols:https://www.ebi.ac.uk/ols}") + private String ols; + + @Value("${biosamples.webapp.core.uri:http://localhost:8081/biosamples}") + private URI biosamplesWebappCoreUri; + + @Value("${biosamples.usi.core.uri:https://submission-dev.ebi.ac.uk/api/docs/guide_overview.html}") + private URI usiCoreUri; + + @Value("${biosamples.webapp.core.page.threadcount:64}") + private int webappCorePageThreadCount; + + @Value("${biosamples.webapp.core.page.threadcount.max:128}") + private int webappCorePageThreadCountMax; + + // in seconds + @Value("${biosamples.webapp.core.page.cache.maxage:300}") + private int webappCorePageCacheMaxAge; + + // cache facets upto 24 hours (in seconds) + @Value("${biosamples.webapp.core.facet.cache.maxage:86400}") + private int webappCoreFacetCacheMaxAge; + + @Value("${biosamples.schema.validator.uri:http://localhost:8085/validate}") + private URI biosamplesSchemaValidatorServiceUri; + + @Value("${biosamples.schemaValidator:http://localhost:3020/validate}") + private String schemaValidator; + + @Value("${biosamples.schemaStore:http://localhost:8085}") + private String schemaStore; + + @Value("${biosamples.schema.default:BSDC00001}") + private String biosamplesDefaultSchema; + + @Value("${biosamples.schema.restricted:ERC000011:0.1}") + private String biosamplesRestrictedSchema; + + @Value("${biosamples.bulksubmisison.webin.superuser.validation:false}") + private boolean enableBulkSubmissionWebinSuperUserValidation; + + public int getBiosamplesClientConnectionCountMax() { + return connectionCountMax; + } + + public int getBiosamplesClientThreadCount() { + return threadCount; + } + + public int getBiosamplesClientThreadCountMax() { + return threadCountMax; + } + + public int getBiosamplesClientConnectionCountDefault() { + return connectionCountDefault; + } + + public int getBiosamplesCorePageThreadCount() { + return webappCorePageThreadCount; + } + + public int getBiosamplesCorePageThreadCountMax() { + return webappCorePageThreadCountMax; + } + + public int getBiosamplesCorePageCacheMaxAge() { + return webappCorePageCacheMaxAge; + } + + public int getBiosamplesCoreFacetCacheMaxAge() { + return webappCoreFacetCacheMaxAge; + } +} diff --git a/core/src/main/java/uk/ac/ebi/biosamples/security/service/BioSamplesCrossSourceIngestAccessControlService.java b/core/src/main/java/uk/ac/ebi/biosamples/security/service/BioSamplesCrossSourceIngestAccessControlService.java index 9ef41034f2..0e1ceeac69 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/security/service/BioSamplesCrossSourceIngestAccessControlService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/security/service/BioSamplesCrossSourceIngestAccessControlService.java @@ -14,10 +14,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.exception.GlobalExceptions; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Service public class BioSamplesCrossSourceIngestAccessControlService { diff --git a/core/src/main/java/uk/ac/ebi/biosamples/service/MessagingService.java b/core/src/main/java/uk/ac/ebi/biosamples/service/MessagingService.java index 958a4c6edc..7fa122f63a 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/service/MessagingService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/service/MessagingService.java @@ -49,7 +49,7 @@ void fetchThenSendMessage(final String accession) { fetchThenSendMessage(accession, Collections.emptyList()); } - void fetchThenSendMessage( + public void fetchThenSendMessage( final String accession, final List existingRelationshipTargets) { if (accession == null) { throw new IllegalArgumentException("accession cannot be null"); diff --git a/core/src/main/java/uk/ac/ebi/biosamples/service/validation/ElixirSchemaValidator.java b/core/src/main/java/uk/ac/ebi/biosamples/service/validation/ElixirSchemaValidator.java index 628f06485d..7b3fc8a921 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/service/validation/ElixirSchemaValidator.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/service/validation/ElixirSchemaValidator.java @@ -24,8 +24,8 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.exception.GlobalExceptions; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Service @Qualifier("elixirValidator") diff --git a/core/src/main/java/uk/ac/ebi/biosamples/service/validation/SchemaValidationService.java b/core/src/main/java/uk/ac/ebi/biosamples/service/validation/SchemaValidationService.java index 803bb2ebfa..5a06aef644 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/service/validation/SchemaValidationService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/service/validation/SchemaValidationService.java @@ -18,11 +18,11 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; -import uk.ac.ebi.biosamples.BioSamplesConstants; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.exception.GlobalExceptions; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Service public class SchemaValidationService { diff --git a/core/src/main/java/uk/ac/ebi/biosamples/solr/service/SolrFilterService.java b/core/src/main/java/uk/ac/ebi/biosamples/solr/service/SolrFilterService.java index 7ceecb839a..86aaba2c74 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/solr/service/SolrFilterService.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/solr/service/SolrFilterService.java @@ -17,9 +17,9 @@ import org.springframework.data.solr.core.query.FilterQuery; import org.springframework.data.solr.core.query.SimpleFilterQuery; import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.filter.AccessionFilter; import uk.ac.ebi.biosamples.core.model.filter.Filter; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.solr.model.field.SolrSampleField; @Service diff --git a/core/src/main/java/uk/ac/ebi/biosamples/utils/ols/OlsProcessor.java b/core/src/main/java/uk/ac/ebi/biosamples/utils/ols/OlsProcessor.java index e8c0897db7..562b21d41a 100644 --- a/core/src/main/java/uk/ac/ebi/biosamples/utils/ols/OlsProcessor.java +++ b/core/src/main/java/uk/ac/ebi/biosamples/utils/ols/OlsProcessor.java @@ -28,7 +28,7 @@ import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriUtils; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.utils.ClientUtils; @Service diff --git a/core/src/test/java/uk/ac/ebi/biosamples/solr/SolrServiceTests.java b/core/src/test/java/uk/ac/ebi/biosamples/solr/SolrServiceTests.java index 499bd47ea0..96117860aa 100644 --- a/core/src/test/java/uk/ac/ebi/biosamples/solr/SolrServiceTests.java +++ b/core/src/test/java/uk/ac/ebi/biosamples/solr/SolrServiceTests.java @@ -19,9 +19,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.solr.core.query.Criteria; import org.springframework.test.context.junit4.SpringRunner; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.core.model.filter.Filter; import uk.ac.ebi.biosamples.core.service.FilterBuilder; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.solr.model.field.*; import uk.ac.ebi.biosamples.solr.service.SolrFieldService; import uk.ac.ebi.biosamples.solr.service.SolrFilterService; diff --git a/core/src/test/java/uk/ac/ebi/biosamples/utils/ols/TestApplication.java b/core/src/test/java/uk/ac/ebi/biosamples/utils/ols/TestApplication.java index c05f69e1a3..240b18a385 100644 --- a/core/src/test/java/uk/ac/ebi/biosamples/utils/ols/TestApplication.java +++ b/core/src/test/java/uk/ac/ebi/biosamples/utils/ols/TestApplication.java @@ -14,7 +14,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Configuration @ComponentScan diff --git a/core/src/test/java/uk/ac/ebi/biosamples/validation/TestApplication.java b/core/src/test/java/uk/ac/ebi/biosamples/validation/TestApplication.java index 0700dd2b46..f809b59ba7 100644 --- a/core/src/test/java/uk/ac/ebi/biosamples/validation/TestApplication.java +++ b/core/src/test/java/uk/ac/ebi/biosamples/validation/TestApplication.java @@ -14,7 +14,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Configuration @ComponentScan diff --git a/docker-integration.sh b/docker-integration.sh index 5445dfea10..2dc18898f6 100755 --- a/docker-integration.sh +++ b/docker-integration.sh @@ -1,25 +1,25 @@ -#!/bin/bash -set -e - -./docker-webapp.sh --clean - - -docker-compose up -d biosamples-agents-solr -docker-compose up -d biosamples-agents-upload-workers - -#ARGS=--spring.profiles.active=big -for X in 1 2 3 4 5 6 -do - echo "============================================================================================================" - echo "=================================== STARTING INTEGRATION TESTS PHASE-"$X "=====================================" - echo "============================================================================================================" - #java -jar integration/target/integration-4.0.0-SNAPSHOT.jar --phase=$X $ARGS $@ - docker-compose run --rm --service-ports biosamples-integration java -jar integration-5.3.15-SNAPSHOT.jar --phase=$X $ARGS $@ - sleep 10 #solr is configured to commit every 5 seconds - -done - -#leave the agent up at the end -docker-compose up -d biosamples-agents-solr - -echo "Successfully completed" +#!/bin/bash +set -e + +./docker-webapp.sh --clean + + +docker-compose up -d biosamples-agents-solr +docker-compose up -d biosamples-agents-upload-workers + +#ARGS=--spring.profiles.active=big +for X in 1 2 3 4 5 6 +do + echo "============================================================================================================" + echo "=================================== STARTING INTEGRATION TESTS PHASE-"$X "=====================================" + echo "============================================================================================================" + #java -jar integration/target/integration-4.0.0-SNAPSHOT.jar --phase=$X $ARGS $@ + docker-compose run --rm --service-ports biosamples-integration java -jar integration-5.3.15-SNAPSHOT.jar --phase=$X $ARGS $@ + sleep 10 #solr is configured to commit every 5 seconds + +done + +#leave the agent up at the end +docker-compose up -d biosamples-agents-solr + +echo "Successfully completed" diff --git a/integration/pom.xml b/integration/pom.xml index 686ff0f9cd..af4d260643 100644 --- a/integration/pom.xml +++ b/integration/pom.xml @@ -21,12 +21,6 @@ biosamples-spring-boot-starter 5.3.15-SNAPSHOT - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - - org.springframework.hateoas diff --git a/integration/src/main/java/uk/ac/ebi/biosamples/ETagIntegration.java b/integration/src/main/java/uk/ac/ebi/biosamples/ETagIntegration.java index f1408368db..add941bc6a 100644 --- a/integration/src/main/java/uk/ac/ebi/biosamples/ETagIntegration.java +++ b/integration/src/main/java/uk/ac/ebi/biosamples/ETagIntegration.java @@ -32,6 +32,7 @@ import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Curation; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; @Component public class ETagIntegration extends AbstractIntegration { diff --git a/integration/src/main/java/uk/ac/ebi/biosamples/PhenopacketIntegration.java b/integration/src/main/java/uk/ac/ebi/biosamples/PhenopacketIntegration.java index 9a44237f57..df8658ea2a 100644 --- a/integration/src/main/java/uk/ac/ebi/biosamples/PhenopacketIntegration.java +++ b/integration/src/main/java/uk/ac/ebi/biosamples/PhenopacketIntegration.java @@ -31,6 +31,7 @@ import uk.ac.ebi.biosamples.client.utils.ClientProperties; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; @Component // @Order(1) diff --git a/integration/src/main/java/uk/ac/ebi/biosamples/XmlSearchIntegration.java b/integration/src/main/java/uk/ac/ebi/biosamples/XmlSearchIntegration.java index 96b84429cf..9f40f8379a 100644 --- a/integration/src/main/java/uk/ac/ebi/biosamples/XmlSearchIntegration.java +++ b/integration/src/main/java/uk/ac/ebi/biosamples/XmlSearchIntegration.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Component; import uk.ac.ebi.biosamples.client.BioSamplesClient; import uk.ac.ebi.biosamples.core.model.*; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; import uk.ac.ebi.biosamples.utils.IntegrationTestFailException; @Component diff --git a/pipelines/analytics/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/analytics/src/main/java/uk/ac/ebi/biosamples/Application.java index c3551f905c..889135df50 100644 --- a/pipelines/analytics/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/analytics/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/Application.java index eec9c94d58..af8908837a 100644 --- a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -33,6 +33,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/HelpdeskActionApplicationRunner.java b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/HelpdeskActionApplicationRunner.java index 18ad765d9b..241110a2aa 100644 --- a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/HelpdeskActionApplicationRunner.java +++ b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/HelpdeskActionApplicationRunner.java @@ -10,10 +10,18 @@ */ package uk.ac.ebi.biosamples; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; @@ -109,19 +117,114 @@ public void run(ApplicationArguments args) { args.containsOption("domain") ? args.getOptionValues("domain").get(0) : null; final String webinId = args.containsOption("webinId") ? args.getOptionValues("webinId").get(0) : null; + final String releaseFlag = + args.containsOption("release") ? args.getOptionValues("release").get(0) : null; + final String file = + args.containsOption("file") ? args.getOptionValues("file").get(0) : null; + final boolean release = releaseFlag != null && releaseFlag.equalsIgnoreCase("true"); if (webinId != null && domain != null) { - for (EntityModel sample : samplesCrawlerAuthChangeHandler.getSamples(domain)) { - samplesCrawlerAuthChangeHandler.handleAuth(sample, domain, webinId); + if (file == null) { + for (EntityModel sample : + samplesCrawlerAuthChangeHandler.getSamples(domain)) { + samplesCrawlerAuthChangeHandler.handleAuth(sample, domain, webinId, release); + } + } else { + final List accessions = readAccessions(file); + + if (accessions.isEmpty()) { + log.warn("No accessions found in file {}", file); + return; + } + + int threads = 20; + int batchSize = 1000; + int total = accessions.size(); + int processed = 0; + int successCount = 0; + int failCount = 0; + final ExecutorService executorService = Executors.newFixedThreadPool(threads); + + log.info( + "Starting auth change handling for {} samples using {} threads", total, threads); + + try { + for (final List batch : partition(accessions, batchSize)) { + final List> futures = new ArrayList<>(); + + for (final String accession : batch) { + futures.add( + executorService.submit( + () -> { + try { + final EntityModel sampleEntityModel = + samplesCrawlerAuthChangeHandler.getSample(accession); + + if (sampleEntityModel != null) { + samplesCrawlerAuthChangeHandler.handleAuth( + sampleEntityModel, domain, webinId, release); + + return true; + } else { + log.debug("Sample not found for {}", accession); + + return false; + } + } catch (final Exception e) { + log.error("Error processing sample {}", accession, e); + + return false; + } + })); + } + + for (final Future future : futures) { + try { + if (Boolean.TRUE.equals(future.get())) { + successCount++; + } else { + failCount++; + } + } catch (final Exception e) { + failCount++; + + log.error("Task execution failed", e); + } + + processed++; + } + + log.info( + "Processed {} / {} samples (success: {}, failed: {})", + processed, + total, + successCount, + failCount); + } + } finally { + // Stop accepting new tasks + executorService.shutdown(); + + try { + if (!executorService.awaitTermination(2, TimeUnit.HOURS)) { + log.warn("Timeout waiting for tasks to finish, forcing shutdown..."); + + executorService.shutdownNow(); + } + } catch (final InterruptedException e) { + log.error("Interrupted while waiting for executor shutdown", e); + + executorService.shutdownNow(); + Thread.currentThread().interrupt(); + } + } } } else { log.info("Please provide a valid AAP domain and a valid webin submission account ID"); } } - default -> { - log.warn("No valid --action argument provided. Nothing will run."); - } + default -> log.warn("No valid --action argument provided. Nothing will run."); } } catch (final Exception e) { @@ -129,4 +232,31 @@ public void run(ApplicationArguments args) { throw new RuntimeException(e); } } + + /** Splits list into batches */ + private static List> partition(List list, int size) { + List> parts = new ArrayList<>(); + + for (int i = 0; i < list.size(); i += size) { + parts.add(list.subList(i, Math.min(i + size, list.size()))); + } + + return parts; + } + + private static List readAccessions(String file) { + final List accessions = new ArrayList<>(); + + try (final BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + + while ((line = reader.readLine()) != null) { + accessions.add(line); + } + } catch (IOException e) { + log.error("Error reading sample list file", e); + throw new RuntimeException(e); + } + return accessions; + } } diff --git a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/auth/services/SamplesCrawlerAuthChangeHandler.java b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/auth/services/SamplesCrawlerAuthChangeHandler.java index e89719647e..f7b02332e1 100644 --- a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/auth/services/SamplesCrawlerAuthChangeHandler.java +++ b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/auth/services/SamplesCrawlerAuthChangeHandler.java @@ -10,6 +10,7 @@ */ package uk.ac.ebi.biosamples.auth.services; +import java.time.Instant; import java.util.List; import java.util.Objects; import lombok.extern.slf4j.Slf4j; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Service; import uk.ac.ebi.biosamples.client.BioSamplesClient; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.model.SampleStatus; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.core.model.filter.AuthenticationFilter; import uk.ac.ebi.biosamples.core.model.filter.Filter; @@ -44,7 +46,10 @@ public Iterable> getSamples(final String domain) { } public void handleAuth( - final EntityModel sampleEntityModel, final String domain, final String newWebinId) { + final EntityModel sampleEntityModel, + final String domain, + final String newWebinId, + final boolean release) { final Sample sample = sampleEntityModel.getContent(); log.info("Handling Sample {}", sample.getAccession()); @@ -64,11 +69,35 @@ public void handleAuth( if (sampleDomain != null && sampleDomain.equals(domain) && currentWebinId == null) { log.info("Sample authority needs to change for: " + accession + " setting to: " + newWebinId); - final Sample updatedSample = - Sample.Builder.fromSample(sample) - .withWebinSubmissionAccountId(newWebinId) - .withNoDomain() - .build(); + final Sample updatedSample; + + if (release) { + final Instant releaseDate = sample.getRelease(); + + if (releaseDate.isAfter(Instant.now())) { + updatedSample = + Sample.Builder.fromSample(sample) + .withWebinSubmissionAccountId(newWebinId) + .withNoDomain() + .withStatus(SampleStatus.PUBLIC) + .withRelease(Instant.now()) + .build(); + } else { + updatedSample = + Sample.Builder.fromSample(sample) + .withWebinSubmissionAccountId(newWebinId) + .withNoDomain() + .withStatus(SampleStatus.PUBLIC) + .build(); + } + } else { + updatedSample = + Sample.Builder.fromSample(sample) + .withWebinSubmissionAccountId(newWebinId) + .withNoDomain() + .build(); + } + final EntityModel savedSampleEntityModel = bioSamplesClient.persistSampleResource(updatedSample); @@ -82,7 +111,11 @@ public void handleAuth( log.info("Sample " + accession + " failed to be updated"); } } else { - log.info("Sample from some other domain, no change required"); + log.info("Sample from some other domain or already webin, no change required"); } } + + public EntityModel getSample(String accession) { + return bioSamplesClient.fetchSampleResource(accession).orElse(null); + } } diff --git a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleChecklistComplianceHandlerEVA.java b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleChecklistComplianceHandlerEVA.java index c059fabe09..cdec873424 100644 --- a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleChecklistComplianceHandlerEVA.java +++ b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleChecklistComplianceHandlerEVA.java @@ -31,7 +31,6 @@ public class SampleChecklistComplianceHandlerEVA { private static final Logger log = LoggerFactory.getLogger(SampleChecklistComplianceHandlerEVA.class); - private static final String GEOGRAPHIC_LOCATION_COUNTRY_AND_OR_SEA = "geographic location (country and/or sea)"; private static final String GEOGRAPHIC_LOCATION_REGION_AND_LOCALITY = diff --git a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleRestoreIPK.java b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleRestoreIPK.java index eb9766958c..6800f55b72 100644 --- a/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleRestoreIPK.java +++ b/pipelines/chain/src/main/java/uk/ac/ebi/biosamples/helpdesk/services/SampleRestoreIPK.java @@ -20,10 +20,10 @@ import org.springframework.hateoas.EntityModel; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesConstants; import uk.ac.ebi.biosamples.client.BioSamplesClient; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.properties.BioSamplesConstants; @Service @Slf4j diff --git a/pipelines/common/pom.xml b/pipelines/common/pom.xml index b3e357cc38..c512f50f6a 100644 --- a/pipelines/common/pom.xml +++ b/pipelines/common/pom.xml @@ -57,12 +57,6 @@ 5.3.15-SNAPSHOT compile - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - compile - xmlunit diff --git a/pipelines/common/src/main/java/uk/ac/ebi/biosamples/PipelinesHelper.java b/pipelines/common/src/main/java/uk/ac/ebi/biosamples/PipelinesHelper.java index 62033f13cf..f06e761e7d 100644 --- a/pipelines/common/src/main/java/uk/ac/ebi/biosamples/PipelinesHelper.java +++ b/pipelines/common/src/main/java/uk/ac/ebi/biosamples/PipelinesHelper.java @@ -24,6 +24,7 @@ import org.apache.http.protocol.HTTP; import org.springframework.boot.web.client.RestTemplateCustomizer; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; public class PipelinesHelper { public RestTemplateCustomizer getRestTemplateCustomizer( diff --git a/pipelines/copydown/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/copydown/src/main/java/uk/ac/ebi/biosamples/Application.java index 39841e7dfa..51c14983dc 100644 --- a/pipelines/copydown/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/copydown/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/curami/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/curami/src/main/java/uk/ac/ebi/biosamples/Application.java index c3551f905c..889135df50 100644 --- a/pipelines/curami/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/curami/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/curation/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/curation/src/main/java/uk/ac/ebi/biosamples/Application.java index 83dd6af292..3a4b3a010a 100644 --- a/pipelines/curation/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/curation/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -35,6 +35,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/curation/src/test/java/uk/ac/ebi/biosamples/curation/TestApplication.java b/pipelines/curation/src/test/java/uk/ac/ebi/biosamples/curation/TestApplication.java index b313bc3487..26a05e8cb5 100644 --- a/pipelines/curation/src/test/java/uk/ac/ebi/biosamples/curation/TestApplication.java +++ b/pipelines/curation/src/test/java/uk/ac/ebi/biosamples/curation/TestApplication.java @@ -23,12 +23,12 @@ import org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.client.BioSamplesClient; import uk.ac.ebi.biosamples.client.service.WebinAuthClientService; import uk.ac.ebi.biosamples.client.utils.ClientProperties; import uk.ac.ebi.biosamples.core.service.CurationApplicationService; import uk.ac.ebi.biosamples.core.service.SampleValidator; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.utils.ols.OlsProcessor; @Configuration diff --git a/pipelines/sample-transformation-dtol/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/sample-transformation-dtol/src/main/java/uk/ac/ebi/biosamples/Application.java index 2b7647e0c0..84d3367b6b 100644 --- a/pipelines/sample-transformation-dtol/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/sample-transformation-dtol/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/taxonimport/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/taxonimport/src/main/java/uk/ac/ebi/biosamples/Application.java index 6546881e66..2f5b9eba88 100644 --- a/pipelines/taxonimport/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/taxonimport/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pipelines/zooma/src/main/java/uk/ac/ebi/biosamples/Application.java b/pipelines/zooma/src/main/java/uk/ac/ebi/biosamples/Application.java index c3551f905c..889135df50 100644 --- a/pipelines/zooma/src/main/java/uk/ac/ebi/biosamples/Application.java +++ b/pipelines/zooma/src/main/java/uk/ac/ebi/biosamples/Application.java @@ -37,6 +37,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import uk.ac.ebi.biosamples.configuration.ExclusionConfiguration; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.EnaConfig; import uk.ac.ebi.biosamples.service.EnaSampleToBioSampleConversionService; import uk.ac.ebi.biosamples.service.EraProDao; diff --git a/pom.xml b/pom.xml index 6515a8f9bb..295b2b2631 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,6 @@ pipelines integration client - properties core diff --git a/properties/pom.xml b/properties/pom.xml deleted file mode 100644 index 267b9e1fbc..0000000000 --- a/properties/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - 4.0.0 - properties - jar - - - uk.ac.ebi.biosamples - biosamples - 5.3.15-SNAPSHOT - ../ - - - - - org.springframework - spring-core - - - org.springframework.boot - spring-boot-actuator-autoconfigure - - - diff --git a/webapps/core-v2/pom.xml b/webapps/core-v2/pom.xml index 0aaed09930..76736d91b6 100644 --- a/webapps/core-v2/pom.xml +++ b/webapps/core-v2/pom.xml @@ -19,11 +19,6 @@ core 5.3.15-SNAPSHOT - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - org.springframework.boot diff --git a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2.java b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2.java index 7e37c7e239..952a28cb61 100644 --- a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2.java +++ b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2.java @@ -30,14 +30,14 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Relationship; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmissionReceipt; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; @RestController diff --git a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SRAAccessionControllerV2.java b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SRAAccessionControllerV2.java index da230b7442..43373bd8e0 100644 --- a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SRAAccessionControllerV2.java +++ b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SRAAccessionControllerV2.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ResponseStatusException; -import uk.ac.ebi.biosamples.service.SampleService; +import uk.ac.ebi.biosamples.core.service.SampleService; @RestController @CrossOrigin diff --git a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SampleGetControllerV2.java b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SampleGetControllerV2.java index ef417c277a..1a82629e85 100644 --- a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SampleGetControllerV2.java +++ b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/controller/SampleGetControllerV2.java @@ -20,10 +20,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; @RestController @ExposesResourceFor(Sample.class) diff --git a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java b/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java deleted file mode 100644 index 7d5a934b86..0000000000 --- a/webapps/core-v2/src/main/java/uk/ac/ebi/biosamples/service/WebinAuthenticationService.java +++ /dev/null @@ -1,314 +0,0 @@ -/* -* 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.service; - -import java.time.Instant; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicBoolean; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.core.model.CurationLink; -import uk.ac.ebi.biosamples.core.model.Sample; -import uk.ac.ebi.biosamples.core.model.SubmittedViaType; -import uk.ac.ebi.biosamples.core.model.structured.AbstractData; -import uk.ac.ebi.biosamples.core.model.structured.StructuredData; -import uk.ac.ebi.biosamples.core.model.structured.StructuredDataType; -import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.security.service.BioSamplesCrossSourceIngestAccessControlService; - -@Service -public class WebinAuthenticationService { - public static final String ATLANTICO_DOMAIN = "self.AtlantECO"; - private final SampleService sampleService; - private final BioSamplesCrossSourceIngestAccessControlService - bioSamplesCrossSourceIngestAccessControlService; - private final BioSamplesProperties bioSamplesProperties; - - public WebinAuthenticationService( - final SampleService sampleService, - final BioSamplesCrossSourceIngestAccessControlService - bioSamplesCrossSourceIngestAccessControlService, - final BioSamplesProperties bioSamplesProperties) { - this.sampleService = sampleService; - this.bioSamplesCrossSourceIngestAccessControlService = - bioSamplesCrossSourceIngestAccessControlService; - this.bioSamplesProperties = bioSamplesProperties; - } - - public Sample handleWebinUserSubmission( - final Sample sample, final String principle, final Optional oldSample) { - final String proxyWebinId = bioSamplesProperties.getBiosamplesClientWebinUsername(); - final String webinIdInSample = sample.getWebinSubmissionAccountId(); - - if (principle != null && !principle.isEmpty()) { - final String webinIdToSetForSample = - (webinIdInSample != null && !webinIdInSample.isEmpty()) ? webinIdInSample : proxyWebinId; - - if (sample.getAccession() != null) { - return handleSampleUpdate( - sample, oldSample, principle, proxyWebinId, webinIdToSetForSample); - } else { - return handleNewSubmission(sample, principle, proxyWebinId, webinIdToSetForSample); - } - } else { - throw new GlobalExceptions.WebinUserLoginUnauthorizedException(); - } - } - - private Sample handleSampleUpdate( - final Sample sample, - final Optional oldSample, - final String webinIdFromAuthToken, - final String proxyWebinId, - final String webinIdToSetForSample) { - if (webinIdFromAuthToken.equalsIgnoreCase(proxyWebinId)) { - return handleWebinSuperUserSampleSubmission(sample, oldSample, webinIdToSetForSample); - } else { - return handleNormalSampleUpdate(sample, oldSample, webinIdFromAuthToken); - } - } - - private Sample handleNewSubmission( - final Sample sample, - final String webinIdFromAuthToken, - final String proxyWebinId, - final String webinIdToSetForSample) { - if (webinIdFromAuthToken.equalsIgnoreCase(proxyWebinId)) { - return buildSampleWithWebinId(sample, webinIdToSetForSample); - } else { - return buildSampleWithWebinId(sample, webinIdFromAuthToken); - } - } - - private Sample handleNormalSampleUpdate( - final Sample sample, final Optional oldSample, final String webinIdFromAuthToken) { - if (oldSample.isPresent()) { - final Sample oldSampleInDb = oldSample.get(); - - existingSampleAccessibilityChecks(sample, oldSampleInDb); - - if (!webinIdFromAuthToken.equalsIgnoreCase(oldSampleInDb.getWebinSubmissionAccountId())) { - throw new GlobalExceptions.NonSubmitterUpdateAttemptException(); - } else { - return buildSampleWithWebinId(sample, webinIdFromAuthToken); - } - } else { - throw new GlobalExceptions.SampleAccessionDoesNotExistException(); - } - } - - private void existingSampleAccessibilityChecks(final Sample sample, final Sample oldSampleInDb) { - bioSamplesCrossSourceIngestAccessControlService.accessControlPipelineImportedSamples( - oldSampleInDb, sample); - bioSamplesCrossSourceIngestAccessControlService - .accessControlWebinSourcedSampleByCheckingEnaChecklistAttribute(oldSampleInDb, sample); - bioSamplesCrossSourceIngestAccessControlService - .accessControlWebinSourcedSampleByCheckingSubmittedViaType(oldSampleInDb, sample); - } - - private Sample handleWebinSuperUserSampleSubmission( - final Sample sample, final Optional oldSample, final String webinIdToSetForSample) { - if (oldSample.isPresent()) { - final Sample oldSampleInDb = oldSample.get(); - final String webinIdInOldSample = oldSampleInDb.getWebinSubmissionAccountId(); - - if (sample.getSubmittedVia() == SubmittedViaType.FILE_UPLOADER) { - fileUploaderSampleSubmissionAccessibilityChecks(sample, oldSampleInDb, webinIdInOldSample); - } - - if (webinIdInOldSample != null && !webinIdInOldSample.isEmpty()) { - return buildSampleWithWebinId(sample, webinIdToSetForSample); - } else { - final String oldSampleAapDomain = oldSampleInDb.getDomain(); - - if (sampleService.isPipelineNcbiDomain(oldSampleAapDomain)) { - return sample; - } else { - return buildSampleWithWebinId(sample, webinIdToSetForSample); - } - } - } else { - return buildSampleWithWebinId(sample, webinIdToSetForSample); - } - } - - private boolean isOwnershipChangeFromAapToWebinAllowed() { - return true; - } - - private boolean isSameDomain(final String domain, final String oldSampleAapDomain) { - return domain != null && domain.equalsIgnoreCase(oldSampleAapDomain); - } - - private void fileUploaderSampleSubmissionAccessibilityChecks( - final Sample sample, final Sample oldSampleInDb, final String webinIdInOldSample) { - bioSamplesCrossSourceIngestAccessControlService.isOriginalSubmitterInSampleMetadata( - webinIdInOldSample, sample); - existingSampleAccessibilityChecks(sample, oldSampleInDb); - } - - /*Only used for sample migration purposes*/ - private boolean isOldRegistrationDomain(final String sampleDomain) { - if (sampleDomain != null) { - return sampleDomain.equals("self.Webin") - || sampleDomain.equals("3fa5e19ccafc88187d437f92cf29c3b6694c6c6f98efa236c8aa0aeaf5b23f15") - || sampleDomain.equals("self.BiosampleImportAcccession") - || sampleDomain.equals("self.BioSamplesMigration") - || sampleDomain.startsWith("self.BioSamples") - || sampleDomain.startsWith("self.BiosampleSyntheticData"); - } else { - return false; - } - } - - public Sample buildSampleWithWebinId(final Sample sample, final String webinId) { - return Sample.Builder.fromSample(sample) - .withWebinSubmissionAccountId(webinId) - .withNoDomain() - .build(); - } - - public CurationLink handleWebinUserSubmission( - final CurationLink curationLink, final String webinId) { - if (webinId != null && !webinId.isEmpty()) { - return CurationLink.build( - curationLink.getSample(), - curationLink.getCuration(), - null, - webinId, - curationLink.getCreated()); - } else { - throw new GlobalExceptions.SampleNotAccessibleException(); - } - } - - public void isStructuredDataAccessible( - final StructuredData structuredData, final String webinId) { - structuredData - .getData() - .forEach( - data -> { - final String structuredDataSubmittersWebinId = data.getWebinSubmissionAccountId(); - - if (structuredDataSubmittersWebinId == null - || structuredDataSubmittersWebinId.isEmpty()) { - throw new GlobalExceptions.StructuredDataWebinIdMissingException(); - } else if (!webinId.equalsIgnoreCase(structuredDataSubmittersWebinId)) { - throw new GlobalExceptions.WebinUserLoginUnauthorizedException(); - } - }); - } - - public boolean isSampleSubmitter(final Sample sample, final String webinId) { - final AtomicBoolean isValidWebinSubmitter = new AtomicBoolean(false); - - sample - .getData() - .forEach( - data -> { - if (data.getDataType() != null) { - final String structuredDataSubmittersWebinId = data.getWebinSubmissionAccountId(); - - if (structuredDataSubmittersWebinId == null) { - throw new GlobalExceptions.StructuredDataWebinIdMissingException(); - } - } - }); - - if (sample.hasAccession()) { - isValidWebinSubmitter.set(isStructuredDataAccessible(sample, webinId)); - } - - if (isValidWebinSubmitter.get()) { - return true; - } else { - throw new GlobalExceptions.StructuredDataNotAccessibleException(); - } - } - - private boolean isStructuredDataAccessible(final Sample sample, final String webinId) { - final AtomicBoolean isWebinIdValid = new AtomicBoolean(false); - - // fetch returns sample with curations applied - final Optional oldSample = sampleService.fetch(sample.getAccession(), true); - - if (oldSample.isPresent()) { - final Sample oldSampleInDb = oldSample.get(); - - sample - .getData() - .forEach( - data -> { - final StructuredDataType dataType = data.getDataType(); - - if (dataType != null) { - final Optional filteredData = - oldSampleInDb.getData().stream() - .filter( - oldSampleStructuredData -> - oldSampleStructuredData.getDataType().equals(dataType)) - .findFirst(); - - final String structuredDataSubmittersWebinId = data.getWebinSubmissionAccountId(); - - if (filteredData.isPresent()) { - final AbstractData fData = filteredData.get(); - - if (!structuredDataSubmittersWebinId.equalsIgnoreCase( - fData.getWebinSubmissionAccountId())) { - throw new GlobalExceptions.StructuredDataNotAccessibleException(); - } else { - isWebinIdValid.set(true); - } - } else { - if (webinId.equalsIgnoreCase(structuredDataSubmittersWebinId)) { - isWebinIdValid.set(true); - } - } - } - }); - } else { - sample - .getData() - .forEach( - data -> { - if (data.getDataType() != null) { - if (webinId.equalsIgnoreCase(data.getWebinSubmissionAccountId())) { - isWebinIdValid.set(true); - } - } - }); - } - - return isWebinIdValid.get(); - } - - public boolean isWebinSuperUser(final String webinId) { - return webinId != null - && webinId.equalsIgnoreCase(bioSamplesProperties.getBiosamplesClientWebinUsername()); - } - - public void isSampleAccessible(final Sample sample, final String webinId) { - if (webinId == null) { - if (!sample.getRelease().isBefore(Instant.now())) { - throw new GlobalExceptions.SampleNotAccessibleException(); - } - } else { - if (!sample.getRelease().isBefore(Instant.now())) { - if (!isWebinSuperUser(webinId)) { - if (!webinId.equals(sample.getWebinSubmissionAccountId())) { - throw new GlobalExceptions.SampleNotAccessibleException(); - } - } - } - } - } -} diff --git a/webapps/core-v2/src/test/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2Test.java b/webapps/core-v2/src/test/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2Test.java index f28845f756..0f01c8694f 100644 --- a/webapps/core-v2/src/test/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2Test.java +++ b/webapps/core-v2/src/test/java/uk/ac/ebi/biosamples/controller/BulkActionControllerV2Test.java @@ -31,10 +31,10 @@ import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.MockMvc; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.security.TestSecurityConfig; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; @SpringBootTest(properties = {"spring.cloud.gcp.project-id=no_project"}) @ContextConfiguration(classes = TestSecurityConfig.class) diff --git a/webapps/core/pom.xml b/webapps/core/pom.xml index 0cd1f73f19..9d5835ac07 100644 --- a/webapps/core/pom.xml +++ b/webapps/core/pom.xml @@ -21,11 +21,6 @@ core 5.3.15-SNAPSHOT - - uk.ac.ebi.biosamples - properties - 5.3.15-SNAPSHOT - org.springframework.boot diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/AccessionsGetController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/AccessionsGetController.java index b240cf5f9f..6eedd65285 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/AccessionsGetController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/AccessionsGetController.java @@ -21,8 +21,8 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import uk.ac.ebi.biosamples.core.model.Accession; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.service.AccessionsService; -import uk.ac.ebi.biosamples.service.SampleService; @RestController @RequestMapping("/accessions") diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/BioschemasGetController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/BioschemasGetController.java index 4dcb3dbb3b..20f7b3e16e 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/BioschemasGetController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/BioschemasGetController.java @@ -12,14 +12,14 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.jsonld.model.JsonLDDataCatalog; import uk.ac.ebi.biosamples.jsonld.model.JsonLDDataRecord; import uk.ac.ebi.biosamples.jsonld.model.JsonLDDataset; import uk.ac.ebi.biosamples.service.JsonLDService; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; @RestController @RequestMapping(produces = "application/ld+json") diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/DocumentationController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/DocumentationController.java deleted file mode 100644 index fad9ee0924..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/DocumentationController.java +++ /dev/null @@ -1,115 +0,0 @@ -/* -* 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.controller; - -import java.io.IOException; -import java.util.HashMap; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@RequestMapping("/docs") -public class DocumentationController { - private Resource[] cookbookResources; - private HashMap cookbookRecipiesMap; - - private final Logger log = LoggerFactory.getLogger(getClass()); - - public DocumentationController() { - final ClassLoader cl = getClass().getClassLoader(); - final ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); - cookbookResources = new Resource[] {}; - try { - cookbookResources = - resolver.getResources("classpath*:/templates/asciidoc/cookbook_recipes/*"); - cookbookRecipiesMap = new HashMap<>(); - for (final Resource res : cookbookResources) { - final Document doc = Jsoup.parse(res.getInputStream(), "UTF-8", ""); - final Element title = doc.getElementsByTag("title").first(); - final String linkText = title.text(); - final String linkUrl = res.getFilename().replaceFirst("cb_", ""); - cookbookRecipiesMap.put(linkText, linkUrl); - } - - } catch (final IOException e) { - log.error("Unable to load cookbook resources", e); - } - } - - // TODO: Convert this to use ControllerAdvice - @ModelAttribute - public void addCoreLink(final Model model) { - model.addAttribute("recipes", cookbookRecipiesMap); - } - - @GetMapping - public String helpIndex() { - return "docs/index"; - } - - @GetMapping(value = "/{page}") - public String helpBasePage(@PathVariable final String page) { - return "docs/" + page; - } - - @GetMapping(value = "/guides/") - public String helpGuideIndex() { - return "docs/guides/index"; - } - - @GetMapping(value = "/guides/{page}") - public String helpGuidePage(@PathVariable final String page) { - return "docs/guides/" + page; - } - - @GetMapping(value = "/references/") - public String helpReferenceIndex() { - return "docs/references/overview"; - } - - @GetMapping(value = "/references/{page}") - public String helpReferencePage(@PathVariable final String page) { - return "docs/references/" + page; - } - - @GetMapping(value = "/references/api") - public String helpApiReferenceHome() { - return "docs/references/api/overview"; - } - - @GetMapping(value = "/references/api/{page}") - public String helpApiReferencePage(@PathVariable final String page) { - return "docs/references/api/" + page; - } - - @GetMapping(value = {"/cookbook", "/cookbook/"}) - public String cookBookIndex() { - return "docs/cookbook/index"; - } - - @GetMapping(value = "/cookbook/{page}") - public String cookbookPage(final Model model, @PathVariable final String page) { - model.addAttribute("page", page); - return "docs/cookbook/cookbook_template"; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileDownloadController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileDownloadController.java index 62cf3d3f73..d1aa17b809 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileDownloadController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileDownloadController.java @@ -23,10 +23,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.filter.Filter; import uk.ac.ebi.biosamples.service.FileDownloadService; import uk.ac.ebi.biosamples.service.FilterService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.utils.LinkUtils; @Controller diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadController.java index 43b31ef119..d7c29fbc63 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadController.java @@ -32,9 +32,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.model.MongoFileUpload; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.model.AuthToken; import uk.ac.ebi.biosamples.security.service.AccessControlService; import uk.ac.ebi.biosamples.service.upload.FileQueueService; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadLoginController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadLoginController.java index 7935b0a79a..c526e56ca0 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadLoginController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/FileUploadLoginController.java @@ -23,9 +23,9 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.model.MongoFileUpload; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.model.AuthRealm; import uk.ac.ebi.biosamples.security.model.AuthRequestWebin; import uk.ac.ebi.biosamples.security.model.AuthToken; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleCurationLinksController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleCurationLinksController.java index aba882c85a..ccf98384cd 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleCurationLinksController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleCurationLinksController.java @@ -27,13 +27,13 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.CurationLink; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.service.CurationReadService; import uk.ac.ebi.biosamples.service.CurationLinkResourceAssembler; import uk.ac.ebi.biosamples.service.CurationPersistService; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; @RestController @RequestMapping("/samples/{accession}/curationlinks") diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleHtmlController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleHtmlController.java index 105d7b2dba..8e87d6bd57 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleHtmlController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleHtmlController.java @@ -33,15 +33,16 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.filter.Filter; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions.PaginationException; import uk.ac.ebi.biosamples.jsonld.model.JsonLDDataCatalog; import uk.ac.ebi.biosamples.jsonld.model.JsonLDDataset; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.model.AuthorizationProvider; import uk.ac.ebi.biosamples.service.*; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; /** * Primary controller for HTML operations. diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleRestController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleRestController.java index 18a7000384..525447943a 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleRestController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SampleRestController.java @@ -23,14 +23,14 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.core.model.structured.AbstractData; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.service.SampleManipulationService; import uk.ac.ebi.biosamples.service.SampleResourceAssembler; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.service.taxonomy.TaxonomyClientService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; import uk.ac.ebi.biosamples.utils.phenopacket.PhenopacketConverter; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SamplesRestController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SamplesRestController.java index e35fd0a99a..21916989bb 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SamplesRestController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/SamplesRestController.java @@ -33,15 +33,16 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import org.springframework.web.util.UriComponentsBuilder; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SubmittedViaType; import uk.ac.ebi.biosamples.core.model.filter.Filter; import uk.ac.ebi.biosamples.core.model.structured.AbstractData; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.exception.GlobalExceptions.PaginationException; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.service.*; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.service.taxonomy.TaxonomyClientService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; import uk.ac.ebi.biosamples.solr.repo.CursorArrayList; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/StructuredDataController.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/StructuredDataController.java index ad029c8010..34c3c5881b 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/StructuredDataController.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/controller/StructuredDataController.java @@ -19,11 +19,11 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.structured.StructuredData; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.service.SampleService; import uk.ac.ebi.biosamples.service.StructuredDataService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; /** Structured data operations */ @RestController diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/BioSamplesCertificationComplainceResult.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/BioSamplesCertificationComplainceResult.java deleted file mode 100644 index cba7d2d91a..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/BioSamplesCertificationComplainceResult.java +++ /dev/null @@ -1,46 +0,0 @@ -/* -* 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.model.certification; - -import java.util.ArrayList; -import java.util.List; - -public class BioSamplesCertificationComplainceResult { - private final List certificates = new ArrayList<>(); - - private final List recommendations = new ArrayList<>(); - - public List getRecommendations() { - return recommendations; - } - - public void add(Recommendation recommendation) { - recommendations.add(recommendation); - } - - public List getCertificates() { - return certificates; - } - - public void add(Certificate certificate) { - certificates.add(certificate); - } - - @Override - public String toString() { - return "BioSamplesCertificationComplainceResult{" - + "certificates=" - + certificates - + ", recommendations=" - + recommendations - + '}'; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Certificate.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Certificate.java deleted file mode 100644 index 8bbfaa2baa..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Certificate.java +++ /dev/null @@ -1,84 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import java.util.List; -import java.util.Objects; - -public class Certificate implements HasCuratedSample, HasChecklist { - private final SampleDocument sampleDocument; - private final List curationsResults; - private final Checklist checklist; - - @JsonPropertyOrder({"sampleDocument", "curationsResults", "checklist"}) - public Certificate(final HasCuratedSample hasCuratedSample, final Checklist checklist) { - this(hasCuratedSample.getSampleDocument(), hasCuratedSample.getCurationResults(), checklist); - } - - @JsonPropertyOrder({"sampleDocument", "curationsResults", "checklist"}) - public Certificate( - final SampleDocument sampleDocument, - final List curationsResults, - final Checklist checklist) { - this.sampleDocument = sampleDocument; - this.curationsResults = curationsResults; - this.checklist = checklist; - } - - @Override - public SampleDocument getSampleDocument() { - return sampleDocument; - } - - @Override - public Checklist getChecklist() { - return checklist; - } - - @Override - @JsonProperty(value = "curations") - public List getCurationResults() { - return curationsResults; - } - - @Override - public String toString() { - return "Certificate{" - + "sampleDocument=" - + sampleDocument - + ", curationsResults=" - + curationsResults - + ", checklist=" - + checklist - + '}'; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final Certificate that = (Certificate) o; - return sampleDocument.equals(that.sampleDocument) - && curationsResults.equals(that.curationsResults) - && checklist.equals(that.checklist); - } - - @Override - public int hashCode() { - return Objects.hash(sampleDocument, curationsResults, checklist); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CertificationResult.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CertificationResult.java deleted file mode 100644 index e0014032c8..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CertificationResult.java +++ /dev/null @@ -1,39 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import java.util.ArrayList; -import java.util.List; - -public class CertificationResult { - private final List certificates = new ArrayList<>(); - private String sampleAccession; - - public CertificationResult(final String sampleAccession) { - this.sampleAccession = sampleAccession; - } - - private CertificationResult() {} - - @JsonIgnore - public String getSampleAccession() { - return sampleAccession; - } - - public void add(final Certificate certificate) { - certificates.add(certificate); - } - - public List getCertificates() { - return certificates; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Checklist.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Checklist.java deleted file mode 100644 index f9d58dcfd0..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Checklist.java +++ /dev/null @@ -1,76 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class Checklist { - private String name; - private String version; - - @JsonProperty(value = "file") - private String fileName; - - private boolean block; - - public Checklist(String name, String version, String fileName, boolean block) { - this.name = name; - this.version = version; - this.fileName = fileName; - this.block = block; - } - - private Checklist() {} - - public String getName() { - return name; - } - - public String getVersion() { - return version; - } - - @JsonIgnore - public String getFileName() { - return fileName; - } - - @JsonIgnore - public String getID() { - return String.format("%s-%s", name, version); - } - - public void setName(String name) { - this.name = name; - } - - public void setVersion(String version) { - this.version = version; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public boolean isBlock() { - return block; - } - - public void setBlock(boolean block) { - this.block = block; - } - - @Override - public String toString() { - return getID(); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Config.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Config.java deleted file mode 100644 index 8257063494..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Config.java +++ /dev/null @@ -1,47 +0,0 @@ -/* -* 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.model.certification; - -import java.util.List; - -public class Config { - private List checklists; - - private List plans; - - private List recommendations; - - public List getRecommendations() { - return recommendations; - } - - public void setRecommendations(List recommendations) { - this.recommendations = recommendations; - } - - public List getChecklists() { - return checklists; - } - - public void setChecklists(List checklists) { - this.checklists = checklists; - } - - public List getPlans() { - return plans; - } - - public void setPlans(List plans) { - this.plans = plans; - } - - public Config() {} -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Curation.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Curation.java deleted file mode 100644 index a668dcc100..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Curation.java +++ /dev/null @@ -1,42 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Curation { - private String characteristic; - private String value; - - public Curation(String characteristic, String value) { - this.characteristic = characteristic; - this.value = value; - } - - private Curation() {} - - public String getCharacteristic() { - return characteristic; - } - - public void setCharacteristic(String characteristic) { - this.characteristic = characteristic; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CurationResult.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CurationResult.java deleted file mode 100644 index ef10b495b0..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/CurationResult.java +++ /dev/null @@ -1,65 +0,0 @@ -/* -* 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.model.certification; - -public class CurationResult { - private final String characteristic; - private final String before; - private final String after; - private final boolean applied; - - public CurationResult(String characteristic) { - this.applied = false; - this.characteristic = characteristic; - this.before = null; - this.after = null; - } - - public CurationResult(String characteristic, String before, String after) { - this.applied = true; - this.characteristic = characteristic; - this.before = before; - this.after = after; - } - - public boolean isApplied() { - return applied; - } - - public String getCharacteristic() { - return characteristic; - } - - public String getBefore() { - return before; - } - - public String getAfter() { - return after; - } - - @Override - public String toString() { - return "CurationResult{" - + "characteristic='" - + characteristic - + '\'' - + ", before='" - + before - + '\'' - + ", after='" - + after - + '\'' - + ", applied=" - + applied - + '}'; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasChecklist.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasChecklist.java deleted file mode 100644 index bf7395b608..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasChecklist.java +++ /dev/null @@ -1,15 +0,0 @@ -/* -* 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.model.certification; - -public interface HasChecklist { - Checklist getChecklist(); -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCuratedSample.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCuratedSample.java deleted file mode 100644 index a62b08b4d6..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCuratedSample.java +++ /dev/null @@ -1,13 +0,0 @@ -/* -* 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.model.certification; - -public interface HasCuratedSample extends HasSample, HasCurationResults {} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCurationResults.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCurationResults.java deleted file mode 100644 index 02b368e61d..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasCurationResults.java +++ /dev/null @@ -1,17 +0,0 @@ -/* -* 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.model.certification; - -import java.util.List; - -public interface HasCurationResults { - List getCurationResults(); -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasPlan.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasPlan.java deleted file mode 100644 index e61548600a..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasPlan.java +++ /dev/null @@ -1,15 +0,0 @@ -/* -* 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.model.certification; - -public interface HasPlan { - Plan getPlan(); -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasSample.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasSample.java deleted file mode 100644 index f83182a693..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/HasSample.java +++ /dev/null @@ -1,15 +0,0 @@ -/* -* 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.model.certification; - -public interface HasSample { - SampleDocument getSampleDocument(); -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/InterrogationResult.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/InterrogationResult.java deleted file mode 100644 index 1962240abd..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/InterrogationResult.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -* 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.model.certification; - -import java.util.List; - -public class InterrogationResult { - private final SampleDocument sampleDocument; - private final List checklists; - - public InterrogationResult(SampleDocument sampleDocument, List checklists) { - this.sampleDocument = sampleDocument; - this.checklists = checklists; - } - - public SampleDocument getSampleDocument() { - return sampleDocument; - } - - public List getChecklists() { - return checklists; - } - - @Override - public String toString() { - return "InterrogationResult{" - + "sampleDocument=" - + sampleDocument - + ", checklists=" - + checklists - + '}'; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Plan.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Plan.java deleted file mode 100644 index 5fbb47c3bc..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Plan.java +++ /dev/null @@ -1,94 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONObject; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Plan { - @JsonProperty(value = "candidate_checklist_id") - private String candidateChecklistID; - - @JsonProperty(value = "certification_checklist_id") - private String certificationChecklistID; - - private List curations; - - public Plan( - final String candidateChecklistID, - final String certificationChecklistID, - final List curations) { - this.candidateChecklistID = candidateChecklistID; - this.certificationChecklistID = certificationChecklistID; - this.curations = curations; - } - - private Plan() {} - - public String getID() { - return String.format("%s -> %s", candidateChecklistID, certificationChecklistID); - } - - public String getCandidateChecklistID() { - return candidateChecklistID; - } - - public void setCandidateChecklistID(final String candidateChecklistID) { - this.candidateChecklistID = candidateChecklistID; - } - - public String getCertificationChecklistID() { - return certificationChecklistID; - } - - public void setCertificationChecklistID(final String certificationChecklistID) { - this.certificationChecklistID = certificationChecklistID; - } - - public List getCurations() { - return curations; - } - - public void setCurations(final List curations) { - this.curations = curations; - } - - public CurationResult applyCuration( - final SampleDocument sampleDocument, final Curation curation) { - final JSONObject jsonObject = new JSONObject(sampleDocument.getDocument()); - final JSONObject sampleCharacteristics = jsonObject.getJSONObject("characteristics"); - final String targetCharateristic = curation.getCharacteristic(); - if (sampleCharacteristics.has(targetCharateristic)) { - final JSONArray jsonArray = sampleCharacteristics.getJSONArray(curation.getCharacteristic()); - final String before = jsonArray.getJSONObject(0).getString("text"); - final CurationResult curationResult = - new CurationResult(targetCharateristic, before, curation.getValue()); - return curationResult; - } - return new CurationResult(targetCharateristic); - } - - @Override - public String toString() { - return "Plan{" - + "candidateChecklistID='" - + candidateChecklistID - + '\'' - + ", certificationChecklistID='" - + certificationChecklistID - + '\'' - + '}'; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/PlanResult.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/PlanResult.java deleted file mode 100644 index 49728fb276..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/PlanResult.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -* 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.model.certification; - -import java.util.ArrayList; -import java.util.List; - -public class PlanResult implements HasCuratedSample, HasPlan { - private final SampleDocument sampleDocument; - private final Plan plan; - private final List curationResults; - - public PlanResult(SampleDocument sampleDocument, Plan plan) { - this.sampleDocument = sampleDocument; - this.plan = plan; - this.curationResults = new ArrayList<>(); - } - - public void addCurationResult(CurationResult curationResult) { - curationResults.add(curationResult); - } - - public List getCurationResults() { - return curationResults; - } - - public boolean curationsMade() { - for (CurationResult curationResult : curationResults) { - if (curationResult.isApplied()) { - return true; - } - } - return false; - } - - public SampleDocument getSampleDocument() { - return sampleDocument; - } - - public Plan getPlan() { - return plan; - } - - @Override - public String toString() { - return "PlanResult{" + "sampleDocument=" + sampleDocument + ", plan=" + plan + '}'; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Recommendation.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Recommendation.java deleted file mode 100644 index 8a457c0e08..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Recommendation.java +++ /dev/null @@ -1,106 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicBoolean; -import org.json.JSONObject; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Recommendation { - @JsonProperty(value = "certification_checklist_id") - private String certificationChecklistID; - - @JsonProperty(value = "suggestions") - private List suggestions; - - @JsonPropertyOrder({"certification_checklist_id", "suggestions"}) - public Recommendation(final String certificationChecklistID, final List suggestions) { - this.certificationChecklistID = certificationChecklistID; - this.suggestions = suggestions; - } - - private Recommendation() {} - - public String getCertificationChecklistID() { - return certificationChecklistID; - } - - public void setCertificationChecklistID(final String certificationChecklistID) { - this.certificationChecklistID = certificationChecklistID; - } - - public List getSuggestions() { - return suggestions; - } - - public void setSuggestions(final List suggestions) { - this.suggestions = suggestions; - } - - public String applySuggestion(final SampleDocument sampleDocument, final Suggestion suggestion) { - final JSONObject jsonObject = new JSONObject(sampleDocument.getDocument()); - final JSONObject sampleCharacteristics = jsonObject.getJSONObject("characteristics"); - final String[] targetCharateristic = suggestion.getCharacteristic(); - final AtomicBoolean mandatoryPresent = new AtomicBoolean(false); - - Arrays.asList(targetCharateristic) - .forEach( - characteristic -> { - if (sampleCharacteristics.has(characteristic)) { - mandatoryPresent.set(true); - } - }); - - if (!mandatoryPresent.get()) { - return "Sample not compliant with " - + certificationChecklistID - + " because of reason -> " - + suggestion.getComment(); - } else { - return "Compliant with " + certificationChecklistID; - } - } - - @Override - public String toString() { - return "Recommendation{" - + "certificationChecklistID='" - + certificationChecklistID - + '\'' - + ", suggestions=" - + suggestions - + '}'; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Recommendation)) { - return false; - } - final Recommendation that = (Recommendation) o; - return Objects.equals(getCertificationChecklistID(), that.getCertificationChecklistID()) - && Objects.equals(getSuggestions(), that.getSuggestions()); - } - - @Override - public int hashCode() { - return Objects.hash(getCertificationChecklistID(), getSuggestions()); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/SampleDocument.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/SampleDocument.java deleted file mode 100644 index fbcba90f08..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/SampleDocument.java +++ /dev/null @@ -1,88 +0,0 @@ -/* -* 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.model.certification; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import java.util.Objects; -import org.springframework.util.DigestUtils; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class SampleDocument { - private String accession; - private String document; - private String hash; - - public SampleDocument(final String accession, final String document) { - this.accession = accession; - this.document = document; - } - - public SampleDocument() {} - - public String getAccession() { - return accession; - } - - @JsonIgnore - public String getDocument() { - return document; - } - - public void setAccession(final String accession) { - this.accession = accession; - } - - public void setDocument(final String document) { - this.document = document; - } - - @Override - public String toString() { - return "SampleDocument{" - + "accession='" - + accession - + '\'' - + ", document='" - + document - + '\'' - + ", hash='" - + hash - + '\'' - + '}'; - } - - public String getHash() { - if (hash == null) { - hash = DigestUtils.md5DigestAsHex(document.getBytes()).toUpperCase(); - } - return hash; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final SampleDocument sampleDocument = (SampleDocument) o; - return accession.equals(sampleDocument.accession) - && document.equals(sampleDocument.document) - && hash.equals(sampleDocument.hash); - } - - @Override - public int hashCode() { - return Objects.hash(accession, document, hash); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Suggestion.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Suggestion.java deleted file mode 100644 index 3405c6b4e6..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/model/certification/Suggestion.java +++ /dev/null @@ -1,74 +0,0 @@ -/* -* 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.model.certification; - -import java.util.Arrays; -import java.util.Objects; - -public class Suggestion { - private String[] characteristic; - private boolean mandatory; - private String comment; - - public boolean isMandatory() { - return mandatory; - } - - public void setMandatory(boolean mandatory) { - this.mandatory = mandatory; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public String[] getCharacteristic() { - return characteristic; - } - - @Override - public String toString() { - return "Suggestion{" - + "characteristic=" - + Arrays.toString(characteristic) - + ", mandatory=" - + mandatory - + ", comment='" - + comment - + '\'' - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Suggestion)) return false; - Suggestion that = (Suggestion) o; - return isMandatory() == that.isMandatory() - && Arrays.equals(getCharacteristic(), that.getCharacteristic()) - && Objects.equals(getComment(), that.getComment()); - } - - @Override - public int hashCode() { - int result = Objects.hash(isMandatory(), getComment()); - result = 31 * result + Arrays.hashCode(getCharacteristic()); - return result; - } - - public void setCharacteristic(String[] characteristic) { - this.characteristic = characteristic; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/GraphSearchService.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/GraphSearchService.java index d2ac015657..8c04715a71 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/GraphSearchService.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/GraphSearchService.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.neo4j.model.GraphSearchQuery; import uk.ac.ebi.biosamples.neo4j.repo.NeoSampleRepository; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java deleted file mode 100644 index b619d02aff..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/SampleService.java +++ /dev/null @@ -1,768 +0,0 @@ -/* -* 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.service; - -import static java.util.stream.Collectors.toSet; -import static uk.ac.ebi.biosamples.BioSamplesConstants.*; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.*; -import java.util.stream.Stream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.core.model.*; -import uk.ac.ebi.biosamples.core.model.structured.AbstractData; -import uk.ac.ebi.biosamples.core.service.SampleValidator; -import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.mongo.model.MongoRelationship; -import uk.ac.ebi.biosamples.mongo.model.MongoSample; -import uk.ac.ebi.biosamples.mongo.model.MongoSampleMessage; -import uk.ac.ebi.biosamples.mongo.repository.MongoSampleMessageRepository; -import uk.ac.ebi.biosamples.mongo.repository.MongoSampleRepository; -import uk.ac.ebi.biosamples.mongo.service.*; -import uk.ac.ebi.biosamples.security.service.BioSamplesCrossSourceIngestAccessControlService; - -/** - * Service layer business logic for centralising repository access and conversions between different - * controller. Use this instead of linking to repositories directly. - * - * @author faulcon - */ -@Service -public class SampleService { - private static final Logger log = LoggerFactory.getLogger(SampleService.class); - private final MongoAccessionService mongoAccessionService; - private final MongoSampleRepository mongoSampleRepository; - private final MongoSampleMessageRepository mongoSampleMessageRepository; - private final MongoSampleToSampleConverter mongoSampleToSampleConverter; - private final SampleToMongoSampleConverter sampleToMongoSampleConverter; - private final MongoRelationshipToRelationshipConverter mongoRelationshipToRelationshipConverter; - private final SampleValidator sampleValidator; - private final SampleReadService sampleReadService; - private final MessagingService messagingService; - private final BioSamplesProperties bioSamplesProperties; - private final BioSamplesCrossSourceIngestAccessControlService - bioSamplesCrossSourceIngestAccessControlService; - - @Autowired - public SampleService( - @Qualifier("SampleAccessionService") final MongoAccessionService mongoAccessionService, - final MongoSampleRepository mongoSampleRepository, - final MongoSampleMessageRepository mongoSampleMessageRepository, - final MongoSampleToSampleConverter mongoSampleToSampleConverter, - final SampleToMongoSampleConverter sampleToMongoSampleConverter, - final MongoRelationshipToRelationshipConverter mongoRelationshipToRelationshipConverter, - final SampleValidator sampleValidator, - final SampleReadService sampleReadService, - final MessagingService messagingService, - final BioSamplesProperties bioSamplesProperties, - final BioSamplesCrossSourceIngestAccessControlService - bioSamplesCrossSourceIngestAccessControlService) { - this.mongoAccessionService = mongoAccessionService; - this.mongoSampleRepository = mongoSampleRepository; - this.mongoSampleMessageRepository = mongoSampleMessageRepository; - this.mongoSampleToSampleConverter = mongoSampleToSampleConverter; - this.sampleToMongoSampleConverter = sampleToMongoSampleConverter; - this.mongoRelationshipToRelationshipConverter = mongoRelationshipToRelationshipConverter; - this.sampleValidator = sampleValidator; - this.sampleReadService = sampleReadService; - this.messagingService = messagingService; - this.bioSamplesProperties = bioSamplesProperties; - this.bioSamplesCrossSourceIngestAccessControlService = - bioSamplesCrossSourceIngestAccessControlService; - } - - /** Throws an IllegalArgumentException of no sample with that accession exists */ - public Optional fetch(final String accession, final boolean applyCurations) { - return sampleReadService.fetch(accession, applyCurations); - } - - /* - Checks if the current sample that exists has no metadata, returns true if empty - */ - private boolean isStoredSampleEmpty( - final Sample newSample, final boolean isWebinSuperUser, final Sample oldSample) { - if (isWebinSuperUser) { - if (newSample.getSubmittedVia() == SubmittedViaType.FILE_UPLOADER) { - // file uploader submissions are done via superuser, but they are non-imported samples, - // needs to be handled safely - if (newSample.hasAccession()) { - return isStoredSampleEmpty(oldSample); - } - - return true; - } else { - // otherwise it is an ENA submission reference, cannot be an empty sample - return false; - } - } else { - if (newSample.hasAccession()) { - return isStoredSampleEmpty(oldSample); - } - } - - if (newSample.hasAccession()) { - return isStoredSampleEmpty(oldSample); - } - - return true; - } - - /* - Checks if the current sample that exists has no metadata, returns true if empty - */ - private boolean isStoredSampleEmpty(final Sample oldSample) { - if (oldSample.getTaxId() != null && oldSample.getTaxId() > 0) { - return false; - } - - if (!oldSample.getAttributes().isEmpty()) { - return false; - } - - if (!oldSample.getRelationships().isEmpty()) { - return false; - } - - if (!oldSample.getPublications().isEmpty()) { - return false; - } - - if (!oldSample.getContacts().isEmpty()) { - return false; - } - - if (!oldSample.getOrganizations().isEmpty()) { - return false; - } - - if (!oldSample.getData().isEmpty()) { - return false; - } - - if (!oldSample.getExternalReferences().isEmpty()) { - return false; - } - - return oldSample.getStructuredData().isEmpty(); - } - - // Because the fetch caches the sample, if an updated version is stored, we need to make - // sure - // that any cached version - // is removed. - // Note, pages of samples will not be cache busted, only single-accession sample retrieval - // @CacheEvict(cacheNames=WebappProperties.fetchUsing, key="#result.accession") - /* - Called by V1 endpoints to persist samples - */ - public Sample persistSample( - Sample newSample, final Sample oldSample, final boolean isWebinSuperUser) { - final Collection errors = sampleValidator.validate(newSample); - - if (!errors.isEmpty()) { - log.error("Sample validation failed : {}", errors); - - throw new GlobalExceptions.SampleMandatoryFieldsMissingException(String.join("|", errors)); - } - - if (newSample.hasAccession()) { - if (oldSample != null) { - newSample = updateFromCurrent(newSample, oldSample, isWebinSuperUser); - } else { - newSample = updateWhenNoneExists(newSample); - } - - MongoSample mongoSample = sampleToMongoSampleConverter.convert(newSample); - mongoSample = mongoSampleRepository.save(mongoSample); - - if (isTaxIdUpdated(oldSample, newSample)) { - mongoSampleMessageRepository.save( - new MongoSampleMessage(newSample.getAccession(), Instant.now(), newSample.getTaxId())); - } - - newSample = mongoSampleToSampleConverter.apply(mongoSample); - sendMessageToRabbitForIndexingToSolr( - newSample.getAccession(), getExistingRelationshipTargetsForIndexingInSolr(oldSample)); - } else { - newSample = createNew(newSample); - } - - // fetch returns sample with curations applied - final Optional sampleOptional = fetch(newSample.getAccession(), true); - - return sampleOptional.orElseThrow( - () -> - new RuntimeException( - "Failed to create sample. Please contact the BioSamples Helpdesk at biosamples@ebi.ac.uk")); - } - - private Sample updateWhenNoneExists(Sample newSample) { - log.error("Trying to update sample not in database, accession: {}", newSample.getAccession()); - - bioSamplesCrossSourceIngestAccessControlService - .validateFileUploaderSampleUpdateHasExistingAccession(newSample); - - final SortedSet newSampleAttributes = newSample.getAttributes(); - - if (newSampleAttributes.stream() - .noneMatch(attribute -> attribute.getType().equals(SRA_ACCESSION))) { - // Don't generate SRA accession (ERS sample accessions) for NCBI samples - if (!isNcbiImport(newSample)) { - final String sraAccession = generateOneSRAAccession(); - - newSampleAttributes.add(Attribute.build(SRA_ACCESSION, sraAccession)); - newSample = Sample.Builder.fromSample(newSample).withSraAccession(sraAccession).build(); - } - } else { - final List sraAccessionAttributeList = - newSampleAttributes.stream() - .filter(attribute -> attribute.getType().equals(SRA_ACCESSION)) - .toList(); - - if (sraAccessionAttributeList.size() > 1) { - throw new GlobalExceptions.InvalidSampleException(); - } - - final String sraAccession = sraAccessionAttributeList.get(0).getValue(); - - newSample = Sample.Builder.fromSample(newSample).withSraAccession(sraAccession).build(); - } - - return newSample; - } - - private Sample updateFromCurrent( - Sample newSample, final Sample oldSample, final boolean isWebinSuperUser) { - final boolean savedSampleEmpty = isStoredSampleEmpty(newSample, isWebinSuperUser, oldSample); - - if (savedSampleEmpty) { - newSample = Sample.Builder.fromSample(newSample).withSubmitted(Instant.now()).build(); - } - - final List existingRelationships = - getExistingRelationshipTargetsForIndexingInSolr( - newSample.getAccession(), - Objects.requireNonNull(sampleToMongoSampleConverter.convert(oldSample))); - - return compareWithExistingAndUpdateSample( - newSample, oldSample, existingRelationships, savedSampleEmpty, isWebinSuperUser); - } - - private Sample createNew(Sample newSample) { - final boolean noSraAccession = - newSample.getAttributes().stream() - .noneMatch(attribute -> attribute.getType().equals(SRA_ACCESSION)); - - if (!noSraAccession) { - newSample = validateAndPromoteSRAAccessionAttributeToField(newSample); - } - - newSample = mongoAccessionService.generateAccession(newSample, noSraAccession); - sendMessageToRabbitForIndexingToSolr(newSample.getAccession(), Collections.emptyList()); - - return newSample; - } - - private boolean isTaxIdUpdated(final Sample oldSample, final Sample sample) { - return oldSample != null - && oldSample.getTaxId() != null - && !oldSample.getTaxId().equals(sample.getTaxId()); - } - - private List getExistingRelationshipTargetsForIndexingInSolr(final Sample oldSample) { - final List existingRelationshipTargets = new ArrayList<>(); - - if (oldSample != null) { - final List existingRelationships = - getExistingRelationshipTargetsForIndexingInSolr( - oldSample.getAccession(), - Objects.requireNonNull(sampleToMongoSampleConverter.convert(oldSample))); - - existingRelationshipTargets.addAll( - existingRelationships.stream() - .map( - relationship -> { - if (relationship.getSource().equals(oldSample.getAccession())) { - return relationship.getTarget(); - } - - return null; - }) - .toList()); - } - - return existingRelationshipTargets; - } - - /* - Called by V2 endpoints to persist samples - */ - public Sample persistSampleV2( - Sample newSample, final Sample oldSample, final boolean isWebinSuperUser) { - final Collection errors = sampleValidator.validate(newSample); - - if (!errors.isEmpty()) { - log.error("Sample validation failed : {}", errors); - throw new GlobalExceptions.SampleMandatoryFieldsMissingException(String.join("|", errors)); - } - - if (newSample.hasAccession()) { - if (oldSample != null) { - log.info( - "Trying to update sample that exists in database, accession: {}", - newSample.getAccession()); - - final boolean savedSampleEmpty = - isStoredSampleEmpty(newSample, isWebinSuperUser, oldSample); - - if (savedSampleEmpty) { - // submitted is now if metadata is first submitted after accessioning - newSample = Sample.Builder.fromSample(newSample).withSubmitted(Instant.now()).build(); - } - - newSample = - compareWithExistingAndUpdateSample( - newSample, oldSample, null, savedSampleEmpty, isWebinSuperUser); - } else { - log.error( - "Trying to update sample not in database, accession: {}", newSample.getAccession()); - - newSample = updateWhenNoneExists(newSample); - } - - MongoSample mongoSample = sampleToMongoSampleConverter.convert(newSample); - - assert mongoSample != null; - - mongoSample = mongoSampleRepository.save(mongoSample); - newSample = mongoSampleToSampleConverter.apply(mongoSample); - - sendMessageToRabbitForIndexingToSolr(newSample.getAccession(), Collections.emptyList()); - } else { - newSample = createNew(newSample); - } - - return newSample; - } - - private void sendMessageToRabbitForIndexingToSolr( - final String accession, final List existingRelationshipTargets) { - try { - messagingService.fetchThenSendMessage(accession, existingRelationshipTargets); - } catch (final Exception e) { - log.error("Indexing failed for accession " + accession); - } - } - - /* - Called by V2 endpoints to build a sample with a newly generated sample accession - */ - public Sample accessionSample(Sample newSample) { - final Collection errors = sampleValidator.validate(newSample); - - if (!errors.isEmpty()) { - log.error("Sample validation failed : {}", errors); - - throw new GlobalExceptions.SampleMandatoryFieldsMissingException(String.join("|", errors)); - } - - if (newSample - .getWebinSubmissionAccountId() - .equalsIgnoreCase(bioSamplesProperties.getBiosamplesClientWebinUsername())) { - // accessioning from ENA, sample name is the SRA accession here - final Attribute sraAccessionAttribute = Attribute.build(SRA_ACCESSION, newSample.getName()); - - newSample.getAttributes().add(sraAccessionAttribute); - newSample = Sample.Builder.fromSample(newSample).build(); - - return mongoAccessionService.generateAccession(newSample, false); - } else { - return mongoAccessionService.generateAccession(newSample, true); - } - } - - public String generateOneSRAAccession() { - return mongoAccessionService.generateOneSRAAccession(); - } - - /* - Returns true if a sample does not exist in BioSamples - */ - public boolean isNotExistingAccession(final String accession) { - if (accession != null) { - return mongoSampleRepository.findById(accession).isEmpty(); - } else { - return true; - } - } - - private List getExistingRelationshipTargetsForIndexingInSolr( - final String accession, final MongoSample mongoOldSample) { - final List oldRelationshipTargets = new ArrayList<>(); - - for (final MongoRelationship mongoRelationship : mongoOldSample.getRelationships()) { - if (mongoRelationship.getSource().equals(accession)) { - oldRelationshipTargets.add( - mongoRelationshipToRelationshipConverter.convert(mongoRelationship)); - } - } - - return oldRelationshipTargets; - } - - private Sample compareWithExistingAndUpdateSample( - Sample newSample, - final Sample oldSample, - final List existingRelationships, - final boolean isEmptySample, - final boolean isWebinSuperUser) { - Set structuredData = new HashSet<>(); - boolean applyOldSampleStructuredData = false; - - // retain existing relationships for superuser submissions, pipelines, ENA POSTED, not for file - // uploads though - handleRelationships(newSample, existingRelationships); - handleSRAAccession(newSample, oldSample, isWebinSuperUser); - newSample = validateAndPromoteSRAAccessionAttributeToField(newSample); - - if (newSample.getData().isEmpty()) { - log.info("No structured data in new sample"); - - if (oldSample.getData() != null && !oldSample.getData().isEmpty()) { - structuredData = oldSample.getData(); - // Check if old sample has structured data, if yes, retain - applyOldSampleStructuredData = true; - - log.info("Old sample has structured data"); - } - } - - if (applyOldSampleStructuredData) { - log.info("Build sample and applying old sample structured data"); - log.trace("Old sample structured data size is " + structuredData.size()); - - return Sample.Builder.fromSample(newSample) - .withCreate(defineCreateDate(newSample, oldSample)) - .withSubmitted(defineSubmittedDate(newSample, oldSample, isEmptySample)) - .withData(structuredData) - .build(); - } else { - log.info("Building sample without structured data"); - - return Sample.Builder.fromSample(newSample) - .withCreate(defineCreateDate(newSample, oldSample)) - .withSubmitted(defineSubmittedDate(newSample, oldSample, isEmptySample)) - .build(); - } - } - - private Sample validateAndPromoteSRAAccessionAttributeToField(final Sample newSample) { - // Retrieve SRA accession attribute from new sample - final Optional newSampleSraAccessionOptional = - newSample.getAttributes().stream() - .filter(attribute -> attribute.getType().equalsIgnoreCase(SRA_ACCESSION)) - .findFirst(); - - // Retrieve SRA accession field from new sample - final String sraAccessionField = newSample.getSraAccession(); - - // Check if SRA accession field and attribute are both present - if (sraAccessionField != null && newSampleSraAccessionOptional.isPresent()) { - // Check for SRA accession mismatch - if (!sraAccessionField.equals(newSampleSraAccessionOptional.get().getValue())) { - throw new GlobalExceptions.InvalidSampleException(); - } else { - // If they match, return the new sample - return newSample; - } - } - - // Check if SRA accession field is null but the attribute is present - if (sraAccessionField == null && newSampleSraAccessionOptional.isPresent()) { - // Promote SRA accession attribute to the field and return the modified sample - return Sample.Builder.fromSample(newSample) - .withSraAccession(newSampleSraAccessionOptional.get().getValue()) - .build(); - } - - // Return the original new sample if no promotion or validation is needed - return newSample; - } - - private void handleRelationships( - final Sample newSample, final List existingRelationships) { - if (existingRelationships != null && !existingRelationships.isEmpty()) { - final String webinId = newSample.getWebinSubmissionAccountId(); - - // superuser and non-file upload submissions - if (webinId != null - && webinId.equals(bioSamplesProperties.getBiosamplesClientWebinUsername())) { - if (newSample.getSubmittedVia() != SubmittedViaType.FILE_UPLOADER) { - newSample.getRelationships().addAll(existingRelationships); - } - } - } - } - - private void handleSRAAccession( - final Sample newSample, final Sample oldSample, final boolean isWebinSuperUser) { - // Step 1: Initialization - final String newSampleSraAccessionField = newSample.getSraAccession(); - - // Step 3: Validation of SRA Accession Field in New Sample - if (newSampleSraAccessionField != null && !newSampleSraAccessionField.isEmpty()) { - if (oldSample != null) { - // Check if the SRA accession field has changed in the new sample - final String oldSampleSraAccessionField = oldSample.getSraAccession(); - - /* - *

This logic performs the following checks: - *

    - *
  • If the old SRA accession field is not null and not empty.
  • - *
  • If the new SRA accession field is different from the old SRA accession field.
  • - *
  • If the user is not a Webin Super User.
  • - *
  • If the sample is not an NCBI sample in an NCBI Super User domain.
  • - *
- */ - if (oldSampleSraAccessionField != null - && !oldSampleSraAccessionField.isEmpty() - && !newSampleSraAccessionField.equals(oldSampleSraAccessionField) - && !isWebinSuperUser - && !isNcbiImport(newSample)) { - throw new GlobalExceptions.ChangedSRAAccessionException(); - } - } - } - - final SortedSet newSampleAttributes = newSample.getAttributes(); - final List newSampleSraAccessionAttributes = - newSampleAttributes.stream() - .filter(attribute -> attribute.getType().equalsIgnoreCase(SRA_ACCESSION)) - .toList(); - - // Step 2: Validation of SRA Accession attributes in New Sample - if (newSampleSraAccessionAttributes.size() > 1) { - throw new GlobalExceptions.InvalidSampleException(); - } - - Attribute newSampleSraAccessionAttribute = - newSampleSraAccessionAttributes.isEmpty() ? null : newSampleSraAccessionAttributes.get(0); - - // Step 4: Validation of SRA Accession attributes in Old Sample - if (oldSample != null) { - final List oldSampleSraAccessionAttributes = - oldSample.getAttributes().stream() - .filter(attribute -> attribute.getType().equalsIgnoreCase(SRA_ACCESSION)) - .toList(); - - // Check if there are more than one SRA accession attributes in the old sample - if (oldSampleSraAccessionAttributes.size() > 1) { - throw new GlobalExceptions.InvalidSampleException(); - } - - final Attribute oldSampleSraAccessionAttribute = - oldSampleSraAccessionAttributes.isEmpty() ? null : oldSampleSraAccessionAttributes.get(0); - - // Step 5: Handling SRA Accessions in New Sample and Old Sample - if (newSampleSraAccessionAttribute == null) { - // If newSampleSraAccessionAttribute is null, use oldSampleSraAccession or generate a new - // one - newSampleSraAccessionAttribute = - Objects.requireNonNullElseGet( - oldSampleSraAccessionAttribute, - () -> Attribute.build(SRA_ACCESSION, generateOneSRAAccession())); - // Add newSampleSraAccessionAttribute to the attributes of the new sample - newSampleAttributes.add(newSampleSraAccessionAttribute); - } - - // Step 6: Validation of Changed SRA Accession (if Old Sample exists) - if (oldSampleSraAccessionAttribute != null - && !oldSampleSraAccessionAttribute - .getValue() - .equals(newSampleSraAccessionAttribute.getValue()) - && !isWebinSuperUser - && !isNcbiImport(newSample)) { - throw new GlobalExceptions.ChangedSRAAccessionException(); - } - } else { - // Step 7: Handling New Samples without Old Samples (Old Sample doesn't exist) - if (newSampleSraAccessionAttribute == null && isWebinSuperUser && !isNcbiImport(newSample)) { - // If oldSample doesn't exist, and newSampleSraAccessionAttribute is still null, create, a - // new one - // Doesn't generate SRA accession (ERS sample accessions) for NCBI samples while import - // (prefix checks) - newSampleSraAccessionAttribute = Attribute.build(SRA_ACCESSION, generateOneSRAAccession()); - // Add newSampleSraAccessionAttribute to the attributes of the new sample - newSampleAttributes.add(newSampleSraAccessionAttribute); - } - } - } - - private boolean isNcbiImport(final Sample newSample) { - return (newSample.getAccession().startsWith(NCBI_ACCESSION_PREFIX) - || newSample.getAccession().startsWith(DDBJ_ACCESSION_PREFIX)) - && newSample.getSubmittedVia() == SubmittedViaType.PIPELINE_IMPORT; - } - - private Instant defineCreateDate(final Sample newSample, final Sample oldSample) { - return (oldSample.getCreate() != null ? oldSample.getCreate() : newSample.getCreate()); - } - - public boolean isPipelineEnaDomain(final String domain) { - if (domain == null) { - return false; - } - - return domain.equalsIgnoreCase(ENA_IMPORT_DOMAIN); - } - - public boolean isPipelineNcbiDomain(final String domain) { - if (domain == null) { - return false; - } - - return domain.equalsIgnoreCase(NCBI_IMPORT_DOMAIN); - } - - private Instant defineSubmittedDate( - final Sample newSample, final Sample oldSample, final boolean isEmptySample) { - if (isEmptySample) { - return newSample.getSubmitted(); - } else { - return oldSample.getSubmitted() != null ? oldSample.getSubmitted() : newSample.getSubmitted(); - } - } - - public Instant defineCreateDate(final Sample sample, final boolean isWebinSuperUserSubmission) { - final Instant now = Instant.now(); - final Instant create = sample.getCreate(); - - return isWebinSuperUserSubmission ? (create != null ? create : now) : now; - } - - public Instant defineSubmittedDate( - final Sample sample, final boolean isWebinSuperUserSubmission) { - final Instant now = Instant.now(); - final Instant submitted = sample.getSubmitted(); - - return isWebinSuperUserSubmission ? (submitted != null ? submitted : now) : now; - } - - public Sample buildPrivateSample(final Sample sample) { - final Instant release = - Instant.ofEpochSecond( - LocalDateTime.now(ZoneOffset.UTC).plusYears(100).toEpochSecond(ZoneOffset.UTC)); - final Instant update = Instant.now(); - final SubmittedViaType submittedVia = - sample.getSubmittedVia() == null ? SubmittedViaType.JSON_API : sample.getSubmittedVia(); - - return Sample.Builder.fromSample(sample) - .withRelease(release) - .withUpdate(update) - .withSubmittedVia(submittedVia) - .build(); - } - - public Set handleSampleRelationshipsV2( - final Sample sample, - final Optional oldSampleOptional, - final boolean isSuperUserSubmission) { - final SortedSet sampleRelationships = sample.getRelationships(); - - if (!isSuperUserSubmission) { - if (sampleRelationships != null && !sampleRelationships.isEmpty()) { - throw new GlobalExceptions.SampleWithRelationshipSubmissionExceptionV2(); - } - } - - if (sample.hasAccession()) { - if (oldSampleOptional.isPresent()) { - final Sample oldSample = oldSampleOptional.get(); - - if (oldSample.getRelationships() != null && !oldSample.getRelationships().isEmpty()) { - return Stream.of(oldSample.getRelationships(), sampleRelationships) - .filter(Objects::nonNull) - .flatMap(Set::stream) - .collect(toSet()); - } - } else { - return sampleRelationships; - } - } else { - if (sampleRelationships != null && !sampleRelationships.isEmpty()) { - throw new GlobalExceptions.SampleWithRelationshipSubmissionExceptionV2(); - } - } - - return null; - } - - public Optional validateSampleWithAccessionsAgainstConditionsAndGetOldSample( - final Sample sample, final boolean isWebinSuperUser) { - if (!isWebinSuperUser) { - if (sample.hasAccession() - || sample.hasSraAccession() - || sample.getAttributes() != null - && sample.getAttributes().stream() - .anyMatch(attribute -> attribute.getType().equalsIgnoreCase(SRA_ACCESSION))) { - throw new GlobalExceptions.SampleWithAccessionSubmissionException(); - } - } else { - final List sraAccessionAttributeList = - sample.getAttributes().stream() - .filter(attribute -> attribute.getType().equalsIgnoreCase(SRA_ACCESSION)) - .toList(); - if (sraAccessionAttributeList.size() > 1) { - throw new GlobalExceptions.InvalidSampleException(); - } else { - String sraAccession = null; - - if (!sraAccessionAttributeList.isEmpty()) { - sraAccession = sraAccessionAttributeList.get(0).getValue(); - } - - if (sraAccession != null - && sample.getSraAccession() != null - && !Objects.equals(sraAccession, sample.getSraAccession())) { - throw new GlobalExceptions.InvalidSampleException(); - } - } - - if (sample.hasAccession() && !isNotExistingAccession(sample.getAccession())) { - // fetch old sample if sample exists, - // fetch returns sample with curations applied - return fetch(sample.getAccession(), false); - } - } - - return Optional.empty(); - } - - public String getPrinciple(final Authentication loggedInUser) { - if (loggedInUser == null || loggedInUser.getPrincipal() == null) { - log.warn("Unauthenticated access detected: returning null for principal"); - return null; - } - - return loggedInUser.getPrincipal() instanceof UserDetails - ? ((UserDetails) loggedInUser.getPrincipal()).getUsername() - : loggedInUser.getPrincipal().toString(); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Applicator.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Applicator.java deleted file mode 100644 index 78425d1598..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Applicator.java +++ /dev/null @@ -1,65 +0,0 @@ -/* -* 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.service.certification; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.CurationResult; -import uk.ac.ebi.biosamples.model.certification.HasCuratedSample; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; - -@Service -public class Applicator { - private static final Logger LOG = LoggerFactory.getLogger(Applicator.class); - - public SampleDocument apply(final HasCuratedSample curationApplicable) { - if (curationApplicable == null) { - final String message = "cannot apply a null curation applyable"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - final SampleDocument sampleDocument = curationApplicable.getSampleDocument(); - final String document = makePretty(sampleDocument.getDocument()); - String updatedDocument = document; - - for (final CurationResult curationResult : curationApplicable.getCurationResults()) { - final String pattern = - String.format( - "\\\"%s\\\"\\s?[:]\\s?\\[\\W+?text\\\"\\s?[:]\\s?\\s\\\"(%s)\\\"", - curationResult.getCharacteristic(), curationResult.getBefore()); - final Pattern p = Pattern.compile(pattern); - final Matcher m = p.matcher(updatedDocument); - if (m.find()) { - updatedDocument = updatedDocument.replace(m.group(1), curationResult.getAfter()); - } else { - LOG.warn( - String.format( - "%s failed to apply %s to sampleDocument", - sampleDocument.getAccession(), curationResult.getCharacteristic())); - } - } - - final SampleDocument curatedSampleDocument = - new SampleDocument(sampleDocument.getAccession(), updatedDocument); - - return curatedSampleDocument; - } - - private String makePretty(final String document) { - final JSONObject json = new JSONObject(document); - return json.toString(2); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Certifier.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Certifier.java deleted file mode 100644 index 6409bdd452..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Certifier.java +++ /dev/null @@ -1,267 +0,0 @@ -/* -* 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.service.certification; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import org.everit.json.schema.ValidationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.ResponseStatus; -import uk.ac.ebi.biosamples.model.certification.*; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@Service -public class Certifier { - private static final Logger LOG = LoggerFactory.getLogger(Certifier.class); - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - - private final ConfigLoader configLoader; - private final ValidatorI validator; - private final Applicator applicator; - - public Certifier( - final ConfigLoader configLoader, - @Qualifier("javaValidator") final ValidatorI validator, - final Applicator applicator) { - this.validator = validator; - this.configLoader = configLoader; - this.applicator = applicator; - } - - public CertificationResult certify( - final SampleDocument sampleDocument, final boolean isJustCertification) { - if (sampleDocument == null) { - final String message = "cannot certify a null sampleDocument"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - return certify(sampleDocument, Collections.EMPTY_LIST, isJustCertification); - } - - public CertificationResult certify( - final SampleDocument sampleDocument, - final boolean isJustCertification, - final String inputChecklist) { - if (sampleDocument == null) { - final String message = "cannot certify a null sampleDocument"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - return certify(sampleDocument, Collections.EMPTY_LIST, isJustCertification, inputChecklist); - } - - private CertificationResult certify( - final SampleDocument sampleDocument, - final List curationResults, - final boolean isJustCertification) { - final String accession = getAccession(sampleDocument); - final CertificationResult certificationResult = new CertificationResult(accession); - - final String message; - - if (accession != null && !accession.isEmpty()) { - message = accession; - } else { - message = "New sample"; - } - - boolean certified = false; - String suggestionMessage = ""; - - for (final Checklist checklist : configLoader.config.getChecklists()) { - try { - validator.validate(checklist.getFileName(), sampleDocument.getDocument()); - EVENTS.info( - String.format("%s validation successful against %s", message, checklist.getID())); - certified = true; - certificationResult.add(new Certificate(sampleDocument, curationResults, checklist)); - EVENTS.info(String.format("%s issued certificate %s", message, checklist.getID())); - } catch (final IOException ioe) { - LOG.error(String.format("cannot open schema at %s", checklist.getFileName()), ioe); - } catch (final ValidationException ve) { - EVENTS.info(String.format("%s validation failed against %s", message, checklist.getID())); - - if (!isJustCertification && checklist.isBlock()) { - final List recommendations = configLoader.config.getRecommendations(); - List matchedRecommendations = new ArrayList<>(); - List matchedSuggestions = new ArrayList<>(); - - if (recommendations != null && recommendations.size() > 0) { - matchedRecommendations = - configLoader.config.getRecommendations().stream() - .filter( - recommendation -> - recommendation.getCertificationChecklistID().equals(checklist.getID())) - .collect(Collectors.toList()); - } - - if (matchedRecommendations.size() > 0) { - matchedSuggestions = - matchedRecommendations.stream() - .map(Recommendation::getSuggestions) - .flatMap(List::stream) - .collect(Collectors.toList()); - } - - if (matchedSuggestions.size() > 0) { - suggestionMessage = - matchedSuggestions.stream() - .map(Suggestion::getComment) - .collect(Collectors.joining()); - } - - throw new SampleChecklistValidationFailureException( - checklist.getID(), suggestionMessage, ve); - } - } - } - - if (!certified) { - EVENTS.info(String.format("%s not certified", message)); - } - - return certificationResult; - } - - private String getAccession(final SampleDocument sampleDocument) { - return sampleDocument.getAccession(); - } - - private CertificationResult certify( - final SampleDocument sampleDocument, - final List curationResults, - final boolean isJustCertification, - final String inputChecklist) { - final String accession = getAccession(sampleDocument); - final CertificationResult certificationResult = new CertificationResult(accession); - - final String message; - - if (accession != null && !accession.isEmpty()) { - message = accession; - } else { - message = "New sample"; - } - - boolean certified = false; - String suggestionMessage = ""; - - final Optional filteredChecklist = - configLoader.config.getChecklists().stream() - .filter(checklist -> checklist.getName().equalsIgnoreCase(inputChecklist)) - .findAny(); - - if (filteredChecklist.isPresent()) { - final Checklist checklist = filteredChecklist.get(); - - try { - validator.validate(checklist.getFileName(), sampleDocument.getDocument()); - EVENTS.info( - String.format("%s validation successful against %s", message, checklist.getID())); - certified = true; - certificationResult.add(new Certificate(sampleDocument, curationResults, checklist)); - EVENTS.info(String.format("%s issued certificate %s", message, checklist.getID())); - } catch (final IOException ioe) { - LOG.error(String.format("cannot open schema at %s", checklist.getFileName()), ioe); - } catch (final ValidationException ve) { - EVENTS.info(String.format("%s validation failed against %s", message, checklist.getID())); - - if (!isJustCertification && checklist.isBlock()) { - final List recommendations = configLoader.config.getRecommendations(); - List matchedRecommendations = new ArrayList<>(); - List matchedSuggestions = new ArrayList<>(); - - if (recommendations != null && recommendations.size() > 0) { - matchedRecommendations = - configLoader.config.getRecommendations().stream() - .filter( - recommendation -> - recommendation.getCertificationChecklistID().equals(checklist.getID())) - .collect(Collectors.toList()); - } - - if (matchedRecommendations.size() > 0) { - matchedSuggestions = - matchedRecommendations.stream() - .map(Recommendation::getSuggestions) - .flatMap(List::stream) - .collect(Collectors.toList()); - } - - if (matchedSuggestions.size() > 0) { - suggestionMessage = - matchedSuggestions.stream() - .map(Suggestion::getComment) - .collect(Collectors.joining()); - } - - throw new SampleChecklistValidationFailureException( - checklist.getID(), suggestionMessage, ve); - } - } - } else { - throw new SampleChecklistMissingException(inputChecklist); - } - - if (!certified) { - EVENTS.info(String.format("%s not certified", message)); - } - - return certificationResult; - } - - public CertificationResult certify( - final HasCuratedSample hasCuratedSample, final boolean isJustCertification) { - if (hasCuratedSample == null) { - final String message = "cannot certify a null plan result"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - return certify( - applicator.apply(hasCuratedSample), - hasCuratedSample.getCurationResults(), - isJustCertification); - } - - @ResponseStatus(value = HttpStatus.BAD_REQUEST) - public static class SampleChecklistValidationFailureException extends RuntimeException { - SampleChecklistValidationFailureException( - final String checklistDetails, - final String matchedSuggestionMessages, - final ValidationException ve) { - super( - "Sample failed validation against BioSamples minimal checklist " - + checklistDetails - + " and hence submission couldn't be completed." - + " Reason - " - + matchedSuggestionMessages, - ve); - } - } - - @ResponseStatus(value = HttpStatus.BAD_REQUEST) - public static class SampleChecklistMissingException extends RuntimeException { - SampleChecklistMissingException(final String inputChecklist) { - super("Checklist by name " + inputChecklist + " doesn't exist"); - } - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/CertifyService.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/CertifyService.java deleted file mode 100644 index 3141a6b39c..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/CertifyService.java +++ /dev/null @@ -1,181 +0,0 @@ -/* -* 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.service.certification; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.stream.Collectors; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.core.model.Certificate; -import uk.ac.ebi.biosamples.model.certification.*; - -@Service -public class CertifyService { - private final Identifier identifier; - private final Interrogator interrogator; - private final Curator curator; - private final Certifier certifier; - private final Recorder recorder; - private final ConfigLoader configLoader; - - public CertifyService( - final Certifier certifier, - final Curator curator, - final Identifier identifier, - final Interrogator interrogator, - @Qualifier("nullRecorder") final Recorder recorder, - final ConfigLoader configLoader) { - this.certifier = certifier; - this.curator = curator; - this.identifier = identifier; - this.interrogator = interrogator; - this.recorder = recorder; - this.configLoader = configLoader; - } - - public List certify(final String data, final boolean isJustCertification) { - final Set certificationResults = new LinkedHashSet<>(); - final SampleDocument rawSampleDocument = identifier.identify(data); - certificationResults.add(certifier.certify(rawSampleDocument, isJustCertification)); - return getCertificatesFromCertificationResults(certificationResults); - } - - public List certify( - final String data, final boolean isJustCertification, final String inputChecklist) { - final Set certificationResults = new LinkedHashSet<>(); - final SampleDocument rawSampleDocument = identifier.identify(data); - certificationResults.add( - certifier.certify(rawSampleDocument, isJustCertification, inputChecklist)); - return getCertificatesFromCertificationResults(certificationResults); - } - - private List getCertificatesFromCertificationResults( - final Set certificationResults) { - final List certificates = new ArrayList<>(); - - certificationResults.forEach( - certificationResult -> - certificationResult - .getCertificates() - .forEach( - certificate -> { - final Checklist checklist = certificate.getChecklist(); - - final Certificate cert = - Certificate.build( - checklist.getName(), checklist.getVersion(), checklist.getFileName()); - certificates.add(cert); - })); - return certificates; - } - - public BioSamplesCertificationComplainceResult recordResult( - final String data, final boolean isJustCertification) { - final Set certificationResults = new LinkedHashSet<>(); - final SampleDocument rawSampleDocument = identifier.identify(data); - return doRecordResult(isJustCertification, certificationResults, rawSampleDocument); - } - - public BioSamplesCertificationComplainceResult recordResult( - final SampleDocument rawSampleDocument, final boolean isJustCertification) { - final Set certificationResults = new LinkedHashSet<>(); - return doRecordResult(isJustCertification, certificationResults, rawSampleDocument); - } - - private BioSamplesCertificationComplainceResult doRecordResult( - final boolean isJustCertification, - final Set certificationResults, - final SampleDocument rawSampleDocument) { - certificationResults.add(certifier.certify(rawSampleDocument, isJustCertification)); - - final InterrogationResult interrogationResult = interrogator.interrogate(rawSampleDocument); - - final List planResults = curator.runCurationPlans(interrogationResult); - - for (final PlanResult planResult : planResults) { - if (planResult.curationsMade()) { - certificationResults.add(certifier.certify(planResult, isJustCertification)); - } - } - - final List recommendations = curator.runRecommendations(interrogationResult); - - return recorder.record(certificationResults, recommendations); - } - - public String getCertificateByCertificateName(final String certificateName) throws IOException { - final Optional matchedChecklist = getChecklistByCertificateName(certificateName); - String fileName = null; - - if (matchedChecklist.isPresent()) { - fileName = matchedChecklist.get().getFileName(); - } - - if (fileName != null && !fileName.isEmpty()) { - try (final InputStream inputStream = - getClass().getClassLoader().getResourceAsStream(fileName)) { - final String jsonData = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); - - return jsonData; - } - } - - return ""; - } - - public String getCertificateFileNameByCertificateName(final String certificateName) { - final Optional matchedChecklist = getChecklistByCertificateName(certificateName); - String fileName = null; - - if (matchedChecklist.isPresent()) { - fileName = matchedChecklist.get().getFileName(); - } - - if (fileName != null && !fileName.isEmpty()) { - return fileName.substring(fileName.lastIndexOf("/") + 1); - } - - return ""; - } - - private Optional getChecklistByCertificateName(final String certificateName) { - return configLoader.config.getChecklists().stream() - .filter(checklist -> checklist.getName().equals(certificateName)) - .findFirst(); - } - - public List getAllCertificates() { - return configLoader.config.getChecklists().stream() - .map( - checklist -> { - try { - return IOUtils.toString( - getClass().getClassLoader().getResourceAsStream(checklist.getFileName()), - StandardCharsets.UTF_8.name()); - } catch (final IOException e) { - e.printStackTrace(); - } - - return null; - }) - .collect(Collectors.toList()); - } - - public List getAllCertificateNames() { - return configLoader.config.getChecklists().stream() - .map(checklist -> checklist.getName() /*+ "-" + checklist.getVersion()*/) - .collect(Collectors.toList()); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/ConfigLoader.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/ConfigLoader.java deleted file mode 100644 index 8c42e1cd1b..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/ConfigLoader.java +++ /dev/null @@ -1,42 +0,0 @@ -/* -* 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.service.certification; - -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import javax.annotation.PostConstruct; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.Config; - -@Service -public class ConfigLoader { - private final String configFile = "config.json"; - public Config config; - - @PostConstruct - public void init() { - final ObjectMapper mapper = new ObjectMapper(); - try { - // Convert JSON string from file to Object - config = - mapper.readValue( - getClass().getClassLoader().getResourceAsStream(configFile), Config.class); - } catch (final JsonGenerationException e) { - e.printStackTrace(); - } catch (final JsonMappingException e) { - e.printStackTrace(); - } catch (final IOException e) { - e.printStackTrace(); - } - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Curator.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Curator.java deleted file mode 100644 index bb95ab56d3..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Curator.java +++ /dev/null @@ -1,123 +0,0 @@ -/* -* 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.service.certification; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.*; - -@Service -public class Curator { - private static final Logger LOG = LoggerFactory.getLogger(Curator.class); - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - private final ConfigLoader configLoader; - private final Map plansByCandidateChecklistID = new HashMap<>(); - private final Map recommendationsByCertificationChecklistID = - new HashMap<>(); - - public Curator(final ConfigLoader configLoader) { - this.configLoader = configLoader; - } - - public List runCurationPlans(final InterrogationResult interrogationResult) { - final List planResults = new ArrayList<>(); - if (interrogationResult == null) { - final String message = "cannot run curation plans on null interrogation result"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - if (interrogationResult.getSampleDocument() == null) { - final String message = "cannot run curation plans on null sample"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - for (final Checklist checklist : interrogationResult.getChecklists()) { - final PlanResult planResult = - runCurationPlan(checklist, interrogationResult.getSampleDocument()); - - if (planResult != null) { - LOG.info("Plan result added for checklist " + checklist.getID()); - planResults.add(planResult); - } - } - - return planResults; - } - - private PlanResult runCurationPlan( - final Checklist checklist, final SampleDocument sampleDocument) { - final Plan plan = plansByCandidateChecklistID.get(checklist.getID()); - final PlanResult planResult = new PlanResult(sampleDocument, plan); - if (plan == null) { - EVENTS.info( - String.format( - "%s plan not found for %s", sampleDocument.getAccession(), checklist.getID())); - return null; - } - if (plansByCandidateChecklistID.containsKey(checklist.getID())) { - for (final Curation curation : plan.getCurations()) { - final CurationResult curationResult = plan.applyCuration(sampleDocument, curation); - if (curationResult != null) { - planResult.addCurationResult(curationResult); - } - } - } - - EVENTS.info(String.format("%s plan %s run", sampleDocument.getAccession(), plan.getID())); - - return planResult; - } - - @PostConstruct - public void init() { - for (final Plan plan : configLoader.config.getPlans()) { - plansByCandidateChecklistID.put(plan.getCandidateChecklistID(), plan); - } - - for (final Recommendation recommendation : configLoader.config.getRecommendations()) { - recommendationsByCertificationChecklistID.put( - recommendation.getCertificationChecklistID(), recommendation); - } - } - - public List runRecommendations(final InterrogationResult interrogationResult) { - if (interrogationResult == null) { - final String message = "cannot run curation plans on null interrogation result"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - if (interrogationResult.getSampleDocument() == null) { - final String message = "cannot run suggestion plans on null sample"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - return recommendationsByCertificationChecklistID.keySet().stream() - .filter( - checklist -> - !interrogationResult.getChecklists().stream() - .map(Checklist::getID) - .collect(Collectors.toList()) - .contains(checklist)) - .map(checklist -> recommendationsByCertificationChecklistID.get(checklist)) - .collect(Collectors.toList()); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/FileRecorder.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/FileRecorder.java deleted file mode 100644 index 692eb2212a..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/FileRecorder.java +++ /dev/null @@ -1,73 +0,0 @@ -/* -* 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.service.certification; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import java.io.IOException; -import java.util.List; -import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.BioSamplesCertificationComplainceResult; -import uk.ac.ebi.biosamples.model.certification.Certificate; -import uk.ac.ebi.biosamples.model.certification.CertificationResult; -import uk.ac.ebi.biosamples.model.certification.Recommendation; - -@Service -public class FileRecorder implements Recorder { - private static final Logger LOG = LoggerFactory.getLogger(FileRecorder.class); - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - - @Override - public BioSamplesCertificationComplainceResult record( - final Set certificationResults, - final List recommendations) { - final BioSamplesCertificationComplainceResult bioSamplesCertificationComplainceResult = - new BioSamplesCertificationComplainceResult(); - final ObjectMapper objectMapper = new ObjectMapper(); - - if (certificationResults == null) { - throw new IllegalArgumentException("cannot record a null certification result"); - } - - for (final CertificationResult certificationResult : certificationResults) { - for (final Certificate certificate : certificationResult.getCertificates()) { - EVENTS.info( - String.format( - "%s recorded %s certificate", - certificate.getSampleDocument().getAccession(), - certificate.getChecklist().getID())); - bioSamplesCertificationComplainceResult.add(certificate); - objectMapper.enable(SerializationFeature.INDENT_OUTPUT); - - try { - objectMapper.writeValueAsString(certificationResult); - } catch (final IOException e) { - LOG.error(String.format("failed to write")); - } - } - } - - for (final Recommendation recommendation : recommendations) { - bioSamplesCertificationComplainceResult.add(recommendation); - try { - objectMapper.writeValueAsString(recommendation); - } catch (final JsonProcessingException e) { - LOG.error(String.format("failed to write")); - } - } - - return bioSamplesCertificationComplainceResult; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Identifier.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Identifier.java deleted file mode 100644 index 8900e3e790..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Identifier.java +++ /dev/null @@ -1,55 +0,0 @@ -/* -* 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.service.certification; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.UUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; - -@Service -public class Identifier { - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - - public SampleDocument identify(final String data) { - if (data == null) { - throw new IllegalArgumentException("cannot identify a null data"); - } - - final ObjectMapper mapper = new ObjectMapper(); - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - - try { - final SampleDocument sampleDocument = mapper.readValue(data, SampleDocument.class); - final String accession = sampleDocument.getAccession(); - String message = ""; - - if (accession != null && !accession.isEmpty()) { - message = accession; - } else { - message = "New sample"; - } - - sampleDocument.setDocument(data); - EVENTS.info(String.format("%s identification successful", message)); - - return sampleDocument; - } catch (final IOException e) { - final String uuid = UUID.randomUUID().toString(); - EVENTS.info(String.format("%s identification failed for sample, assigned UUID", uuid)); - return new SampleDocument(uuid, data); - } - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Interrogator.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Interrogator.java deleted file mode 100644 index e0419c217d..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Interrogator.java +++ /dev/null @@ -1,69 +0,0 @@ -/* -* 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.service.certification; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import org.everit.json.schema.ValidationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.Checklist; -import uk.ac.ebi.biosamples.model.certification.InterrogationResult; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@Service -public class Interrogator { - private static final Logger LOG = LoggerFactory.getLogger(Interrogator.class); - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - - private final ConfigLoader configLoader; - private final ValidatorI validator; - - public Interrogator( - final ConfigLoader configLoader, @Qualifier("javaValidator") final ValidatorI validator) { - this.validator = validator; - this.configLoader = configLoader; - } - - public InterrogationResult interrogate(final SampleDocument sampleDocument) { - if (sampleDocument == null) { - final String message = "cannot interrogate a null sampleDocument"; - LOG.warn(message); - throw new IllegalArgumentException(message); - } - - final List checklists = new ArrayList<>(); - - for (final Checklist checklist : configLoader.config.getChecklists()) { - try { - validator.validate(checklist.getFileName(), sampleDocument.getDocument()); - EVENTS.info( - String.format( - "%s interrogation successful against %s", - sampleDocument.getAccession(), checklist.getID())); - checklists.add(checklist); - } catch (final IOException ioe) { - LOG.error(String.format("cannot open schema at %s", checklist.getFileName()), ioe); - } catch (final ValidationException ve) { - EVENTS.info( - String.format( - "%s interrogation failed against %s", - sampleDocument.getAccession(), checklist.getID())); - } - } - - return new InterrogationResult(sampleDocument, checklists); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/NullRecorder.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/NullRecorder.java deleted file mode 100644 index b43c8717d8..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/NullRecorder.java +++ /dev/null @@ -1,63 +0,0 @@ -/* -* 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.service.certification; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.model.certification.BioSamplesCertificationComplainceResult; -import uk.ac.ebi.biosamples.model.certification.Certificate; -import uk.ac.ebi.biosamples.model.certification.CertificationResult; -import uk.ac.ebi.biosamples.model.certification.Recommendation; - -@Service -public class NullRecorder implements Recorder { - private static final Logger LOG = LoggerFactory.getLogger(NullRecorder.class); - private static final Logger EVENTS = LoggerFactory.getLogger("events"); - - @Override - public BioSamplesCertificationComplainceResult record( - final Set certificationResults, - final List recommendations) { - final BioSamplesCertificationComplainceResult bioSamplesCertificationComplainceResult = - new BioSamplesCertificationComplainceResult(); - if (certificationResults == null) { - throw new IllegalArgumentException("cannot record a null certification result"); - } - - for (final CertificationResult certificationResult : certificationResults) { - for (final Certificate certificate : certificationResult.getCertificates()) { - if (!bioSamplesCertificationComplainceResult.getCertificates().stream() - .map(cert -> cert.getChecklist().getID()) - .collect(Collectors.toList()) - .contains(certificate.getChecklist().getID())) { - bioSamplesCertificationComplainceResult.add(certificate); - EVENTS.info( - String.format( - "%s recorded %s certificate", - certificate.getSampleDocument().getAccession(), - certificate.getChecklist().getID())); - } - } - } - - if (recommendations != null) { - for (final Recommendation recommendation : recommendations) { - bioSamplesCertificationComplainceResult.add(recommendation); - } - } - - return bioSamplesCertificationComplainceResult; - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Recorder.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Recorder.java deleted file mode 100644 index 959d72d2c0..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Recorder.java +++ /dev/null @@ -1,22 +0,0 @@ -/* -* 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.service.certification; - -import java.util.List; -import java.util.Set; -import uk.ac.ebi.biosamples.model.certification.BioSamplesCertificationComplainceResult; -import uk.ac.ebi.biosamples.model.certification.CertificationResult; -import uk.ac.ebi.biosamples.model.certification.Recommendation; - -public interface Recorder { - BioSamplesCertificationComplainceResult record( - Set certificationResult, List recommendations); -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Validator.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Validator.java deleted file mode 100644 index a128d15fa1..0000000000 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/certification/Validator.java +++ /dev/null @@ -1,92 +0,0 @@ -/* -* 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.service.certification; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.everit.json.schema.Schema; -import org.everit.json.schema.ValidationException; -import org.everit.json.schema.loader.SchemaLoader; -import org.json.JSONObject; -import org.json.JSONTokener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import uk.ac.ebi.biosamples.exception.GlobalExceptions; -import uk.ac.ebi.biosamples.model.certification.Checklist; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@Service -@Qualifier("javaValidator") -public class Validator implements ValidatorI { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final ConfigLoader configLoader; - private Map checklists; - - public Validator(final ConfigLoader configLoader) { - this.configLoader = configLoader; - } - - private void init() { - final List checklistList = configLoader.config.getChecklists(); - checklists = checklistList.stream().collect(Collectors.toMap(Checklist::getID, c -> c)); - - // to validate schemas without the version - for (final Checklist c : checklistList) { - if (checklists.containsKey(c.getName())) { - if (checklists.get(c.getName()).getVersion().compareTo(c.getVersion()) < 0) { - checklists.put(c.getName(), c); - } - } else { - checklists.put(c.getName(), c); - } - } - } - - @Override - public void validate(final String schemaPath, final String document) - throws IOException, ValidationException { - try (final InputStream inputStream = - getClass().getClassLoader().getResourceAsStream(schemaPath)) { - final JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)); - final Schema schema = SchemaLoader.load(rawSchema); - schema.validate(new JSONObject(document)); - } - } - - @Override - public String validateById(final String schemaId, final String document) - throws IOException, GlobalExceptions.SchemaValidationException { - final Checklist checklist = getChecklist(schemaId); - try (final InputStream inputStream = - getClass().getClassLoader().getResourceAsStream(checklist.getFileName())) { - final JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)); - final Schema schema = SchemaLoader.load(rawSchema); - schema.validate(new JSONObject(document)); - } catch (final ValidationException e) { - throw new GlobalExceptions.SchemaValidationException(e.getMessage()); - } - - return checklist.getID(); - } - - private Checklist getChecklist(final String checklistId) { - if (checklists == null) { - init(); - } - return checklists.get(checklistId); - } -} diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/FileUploadService.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/FileUploadService.java index 06cc947dd4..160c37d3b3 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/FileUploadService.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/FileUploadService.java @@ -25,15 +25,15 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Relationship; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.model.MongoFileUpload; import uk.ac.ebi.biosamples.mongo.repository.MongoFileUploadRepository; import uk.ac.ebi.biosamples.mongo.util.BioSamplesFileUploadSubmissionStatus; import uk.ac.ebi.biosamples.mongo.util.SampleNameAccessionPair; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; import uk.ac.ebi.biosamples.utils.upload.FileUploadUtils; import uk.ac.ebi.biosamples.utils.upload.ValidationResult; diff --git a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/JsonSchemaStoreSchemaRetrievalService.java b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/JsonSchemaStoreSchemaRetrievalService.java index c6de58ba38..1486fbaefd 100644 --- a/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/JsonSchemaStoreSchemaRetrievalService.java +++ b/webapps/core/src/main/java/uk/ac/ebi/biosamples/service/upload/JsonSchemaStoreSchemaRetrievalService.java @@ -22,7 +22,7 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; @Service public class JsonSchemaStoreSchemaRetrievalService { diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/EtagTests.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/EtagTests.java index 957adf86ca..8825c22d32 100644 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/EtagTests.java +++ b/webapps/core/src/test/java/uk/ac/ebi/biosamples/EtagTests.java @@ -30,13 +30,13 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Attribute; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.security.model.AuthToken; import uk.ac.ebi.biosamples.security.model.AuthorizationProvider; import uk.ac.ebi.biosamples.security.service.AccessControlService; -import uk.ac.ebi.biosamples.service.SampleService; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; @RunWith(SpringRunner.class) @SpringBootTest(properties = {"spring.cloud.gcp.project-id=no_project"}) diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/StructuredDataTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/StructuredDataTest.java index 89f3c91da0..581e5d7dda 100644 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/StructuredDataTest.java +++ b/webapps/core/src/test/java/uk/ac/ebi/biosamples/StructuredDataTest.java @@ -29,7 +29,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.util.StreamUtils; import uk.ac.ebi.biosamples.core.model.Sample; -import uk.ac.ebi.biosamples.service.SampleService; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; @RunWith(SpringRunner.class) diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/ConfigLoaderTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/ConfigLoaderTest.java deleted file mode 100644 index f453af6cbb..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/ConfigLoaderTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* -* 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.certification; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import uk.ac.ebi.biosamples.model.certification.Config; -import uk.ac.ebi.biosamples.service.certification.ConfigLoader; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = ConfigLoader.class, - properties = {"job.autorun.enabled=false"}) -public class ConfigLoaderTest { - @Autowired private ConfigLoader configLoader; - - @Test - public void return_a_valid_config() { - final Config config = configLoader.config; - assertNotNull(config); - assertFalse(config.getChecklists().isEmpty()); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/model/SampleTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/model/SampleTest.java deleted file mode 100644 index ab43605ebc..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/model/SampleTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* -* 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.certification.model; - -import static org.junit.Assert.assertEquals; - -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; - -public class SampleTest { - @Test - public void ensure_sample_has_a_hash() throws Exception { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263-curated.json"), - "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - assertEquals(32, sampleDocument.getHash().length()); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ApplicatorTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ApplicatorTest.java deleted file mode 100644 index b58a75c6b9..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ApplicatorTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* -* 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.certification.service; - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.util.Collections; -import org.apache.commons.io.IOUtils; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import uk.ac.ebi.biosamples.model.certification.*; -import uk.ac.ebi.biosamples.service.certification.Applicator; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = Applicator.class, - properties = {"job.autorun.enabled=false"}) -public class ApplicatorTest { - @Autowired private Applicator applicator; - - @Test - @Ignore - public void given_valid_plan_result_apply_curations() throws Exception { - applyCuration("json/ncbi-SAMN03894263.json", "json/ncbi-SAMN03894263-curated.json"); - } - - private void applyCuration(final String source, final String expectedResult) throws IOException { - final String data = - IOUtils.toString(getClass().getClassLoader().getResourceAsStream(source), "UTF8"); - final String curatedData = - IOUtils.toString(getClass().getClassLoader().getResourceAsStream(expectedResult), "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test", data); - final SampleDocument curatedSampleDocument = new SampleDocument("test", curatedData); - final Curation curation = new Curation("INSDC status", "public"); - final Plan plan = - new Plan("ncbi-0.0.1", "biosamples-0.0.1", Collections.singletonList(curation)); - final PlanResult planResult = new PlanResult(sampleDocument, plan); - planResult.addCurationResult( - new CurationResult(curation.getCharacteristic(), "live", curation.getValue())); - assertEquals( - curatedSampleDocument.getDocument().trim(), - applicator.apply(planResult).getDocument().trim()); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_planResult_throw_exception() { - applicator.apply(null); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifierTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifierTest.java deleted file mode 100644 index 40d255ed76..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifierTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* -* 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.certification.service; - -import static junit.framework.TestCase.assertNotNull; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.Collections; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.*; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Certifier.class, - ConfigLoader.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class, - CertifyService.class, - Curator.class, - Identifier.class, - Interrogator.class, - NullRecorder.class - }, - properties = {"job.autorun.enabled=false"}) -public class CertifierTest { - @Autowired private Certifier certifier; - @Autowired private CertifyService certifyService; - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_valid_plan_result_issue_certificate() throws Exception { - Mockito.doNothing().when(validator).validate(Mockito.anyString(), Mockito.anyString()); - - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263-curated.json"), - "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - final Plan plan = new Plan("ncbi-0.0.1", "biosamples-0.0.1", Collections.EMPTY_LIST); - final PlanResult planResult = new PlanResult(sampleDocument, plan); - final CertificationResult certificationResult = certifier.certify(planResult, true); - assertNotNull(certificationResult); - } - - @Test - public void given_valid_plan_result_issue_certificate_curator_test() throws Exception { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263-curated.json"), - "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - final ObjectMapper jsonMapper = new ObjectMapper(); - - final BioSamplesCertificationComplainceResult result = - certifyService.recordResult(sampleDocument, true); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_planResult_throw_exception() throws IOException { - certifier.certify((SampleDocument) null, true); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifyServiceTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifyServiceTest.java deleted file mode 100644 index f2bcd5072e..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CertifyServiceTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* -* 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.certification.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.io.IOUtils; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.BioSamplesCertificationComplainceResult; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Certifier.class, - ConfigLoader.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class, - CertifyService.class, - Curator.class, - Identifier.class, - Interrogator.class, - NullRecorder.class - }, - properties = {"job.autorun.enabled=false"}) -public class CertifyServiceTest { - @Autowired private CertifyService certifyService; - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_valid_plan_result_issue_certificate_curator_test() throws Exception { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263-curated.json"), - "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - - final BioSamplesCertificationComplainceResult result = - certifyService.recordResult(sampleDocument, true); - - Assert.assertTrue(result.getCertificates().size() == 2); - Assert.assertTrue(result.getRecommendations().size() == 0); - } - - @Test - public void given_valid_plan_result_issue_certificate_curator_test_more() throws Exception { - final String data = - IOUtils.toString( - getClass() - .getClassLoader() - .getResourceAsStream("json/ncbi-SAMN03894263-uncurated.json"), - "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - - final BioSamplesCertificationComplainceResult result = - certifyService.recordResult(sampleDocument, true); - - Assert.assertTrue(result.getCertificates().size() == 2); - Assert.assertTrue(result.getRecommendations().size() == 0); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CuratorTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CuratorTest.java deleted file mode 100644 index 461f023009..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/CuratorTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* -* 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.certification.service; - -import static junit.framework.TestCase.assertNotNull; -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.*; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Curator.class, - Certifier.class, - ConfigLoader.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class - }, - properties = {"job.autorun.enabled=false"}) -public class CuratorTest { - @Autowired private Curator curator; - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_ChecklistMatches_run_curation_plans() throws Exception { - List checklistList = new ArrayList<>(); - checklistList = - Collections.singletonList( - new Checklist( - "ncbi-candidate-schema", - "0.0.1", - "schemas/certification/ncbi-candidate-schema.json", - false)); - final InterrogationResult interrogationResult = - new InterrogationResult(testSample(), checklistList); - final List planResults = curator.runCurationPlans(interrogationResult); - for (final PlanResult planResult : planResults) { - assertNotNull(planResult.getSampleDocument()); - assertFalse(planResult.getCurationResults().isEmpty()); - assertEquals("live", planResult.getCurationResults().get(0).getBefore()); - assertEquals("public", planResult.getCurationResults().get(0).getAfter()); - } - } - - @Test - public void given_ChecklistNotMatches_run_Recommendation() throws Exception { - final List checklistList; - checklistList = - Collections.singletonList( - new Checklist( - "biosamples-minimal", - "0.0.1", - "schemas/certification/biosamples-minimal.json", - false)); - final InterrogationResult interrogationResult = - new InterrogationResult(testSample(), checklistList); - final List recommendations = curator.runRecommendations(interrogationResult); - - recommendations.forEach( - recommendation -> { - assertTrue(recommendation.getSuggestions() != null); - }); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_checklistMatches_throw_exception() throws IOException { - curator.runCurationPlans(null); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_sample_checklistMatches_throw_exception() throws IOException { - final InterrogationResult interrogationResult = - new InterrogationResult(null, Collections.EMPTY_LIST); - curator.runCurationPlans(interrogationResult); - } - - @Test - public void given_sample_and_no_checklists_checklistMatches_return_empty_plan_results() - throws IOException { - final InterrogationResult interrogationResult = - new InterrogationResult(testSample(), Collections.EMPTY_LIST); - assertTrue(curator.runCurationPlans(interrogationResult).isEmpty()); - } - - private SampleDocument testSample() throws IOException { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test", data); - return sampleDocument; - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/FileRecorderTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/FileRecorderTest.java deleted file mode 100644 index f31a66db50..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/FileRecorderTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* -* 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.certification.service; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.Collections; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -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.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.*; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - FileRecorder.class, - Curator.class, - Certifier.class, - ConfigLoader.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class, - NullRecorder.class - }, - properties = {"job.autorun.enabled=false"}) -public class FileRecorderTest { - @Qualifier("nullRecorder") - @Autowired - private Recorder recorder; - - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_certificate_save_to_file() throws IOException { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - final Checklist checklist = - new Checklist("ncbi", "0.0.1", "schemas/certification/ncbi-candidate-schema.json", false); - final Certificate certificate = - new Certificate(sampleDocument, Collections.emptyList(), checklist); - final CertificationResult certificationResult = - new CertificationResult(sampleDocument.getAccession()); - certificationResult.add(certificate); - final BioSamplesCertificationComplainceResult bioSamplesCertificationComplainceResult = - recorder.record(Collections.singleton(certificationResult), null); - assertNotNull(bioSamplesCertificationComplainceResult); - assertEquals(certificate, bioSamplesCertificationComplainceResult.getCertificates().get(0)); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_certificate_throw_exception() throws IOException { - recorder.record(null, null); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/IdentifierTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/IdentifierTest.java deleted file mode 100644 index 6adeabe8f7..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/IdentifierTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* -* 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.certification.service; - -import static junit.framework.TestCase.assertTrue; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Identifier.class, - Curator.class, - Certifier.class, - ConfigLoader.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class - }, - properties = {"job.autorun.enabled=false"}) -public class IdentifierTest { - @Autowired private Identifier identifier; - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_ncbi_sample_return_sample() throws IOException { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - final SampleDocument sampleDocument = identifier.identify(data); - assertTrue(sampleDocument.getAccession().matches("SAM[END][AG]?[0-9]+")); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_sample_throw_exception() throws IOException { - identifier.identify(null); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/InterrogatorTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/InterrogatorTest.java deleted file mode 100644 index cce1db37f5..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/InterrogatorTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* -* 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.certification.service; - -import static org.junit.Assert.assertEquals; - -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.IOException; -import java.util.Collections; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.model.certification.InterrogationResult; -import uk.ac.ebi.biosamples.model.certification.SampleDocument; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Interrogator.class, - ConfigLoader.class, - Curator.class, - Certifier.class, - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Applicator.class - }, - properties = {"job.autorun.enabled=false"}) -public class InterrogatorTest { - @Autowired private Interrogator interrogator; - @Autowired private ConfigLoader configLoader; - @MockBean ElixirSchemaValidator validator; - - @Test - public void given_ncbi_sample_return_ncbi_checklist_as_a_match() throws IOException { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - final SampleDocument sampleDocument = new SampleDocument("test-uuid", data); - final InterrogationResult interrogationResult = interrogator.interrogate(sampleDocument); - // assertTrue(interrogationResult.getChecklists().size()==2); - // assertEquals("ncbi-0.0.1", interrogationResult.getChecklists().get(1).getID()); - } - - @Test - public void given_empty_sample_return_empty_matches() { - final SampleDocument sampleDocument = new SampleDocument("test-uuid", "{}"); - final InterrogationResult interrogationResult = interrogator.interrogate(sampleDocument); - assertEquals(Collections.EMPTY_LIST, interrogationResult.getChecklists()); - } - - @Test(expected = IllegalArgumentException.class) - public void given_null_sample_throw_exception() throws IOException { - interrogator.interrogate(null); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/PipelineTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/PipelineTest.java deleted file mode 100644 index 272508a786..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/PipelineTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* -* 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.certification.service; - -/*@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - CertifyService.class, - Interrogator.class, - FileRecorder.class, - Curator.class, - Certifier.class, - ConfigLoader.class, - Validator.class, - Applicator.class, - Identifier.class, - NullRecorder.class, - CurationPersistService.class, - MongoCurationLinkRepository.class - }, - properties = {"job.autorun.enabled=false"})*/ -public class PipelineTest { - /*@Autowired - private CertifyService pipeline; - - @Test - public void given_ncbi_sample_run_pipeline_for_SAMN03894263() throws IOException { - String data = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - BioSamplesCertificationComplainceResult rr = pipeline.run(data); - assertEquals(3, rr.getAllCertificates().size()); - } - - @Test - public void given_ncbi_sample_run_pipeline_for_SAMN03894261() throws IOException { - String data = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894261.json"), "UTF8"); - BioSamplesCertificationComplainceResult rr = pipeline.run(data); - assertEquals(3, rr.getAllCertificates().size()); - } - - @Test - public void given_ncbi_sample_run_pipeline_for_SAMD00141632() throws IOException { - String data = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMD00141632.json"), "UTF8"); - BioSamplesCertificationComplainceResult rr = pipeline.run(data); - assertEquals(3, rr.getAllCertificates().size()); - } - - @Test - public void given_ncbi_sample_run_pipeline_for_SAMD00000001() throws IOException { - String data = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMD00000001.json"), "UTF8"); - BioSamplesCertificationComplainceResult rr = pipeline.run(data); - assertEquals(3, rr.getAllCertificates().size()); - assertNotEquals(rr.getAllCertificates().get(0).getChecklist(), rr.getAllCertificates().get(1).getChecklist()); - } - - @Test - public void given_ncbi_sample_run_pipeline_for_SAMD00000001_non_pretty() throws IOException { - String data = IOUtils.toString(getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMD00000001-non-pretty.json"), "UTF8"); - BioSamplesCertificationComplainceResult rr = pipeline.run(data); - assertEquals(3, rr.getAllCertificates().size()); - assertNotEquals(rr.getAllCertificates().get(0).getChecklist(), rr.getAllCertificates().get(1).getChecklist()); - }*/ -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ValidatorTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ValidatorTest.java deleted file mode 100644 index ba7b8fb86c..0000000000 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/certification/service/ValidatorTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* -* 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.certification.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.io.IOUtils; -import org.everit.json.schema.ValidationException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; -import uk.ac.ebi.biosamples.BioSamplesProperties; -import uk.ac.ebi.biosamples.service.certification.*; -import uk.ac.ebi.biosamples.service.validation.ElixirSchemaValidator; -import uk.ac.ebi.biosamples.service.validation.ValidatorI; - -@RunWith(SpringRunner.class) -@SpringBootTest( - classes = { - Validator.class, - ValidatorI.class, - ElixirSchemaValidator.class, - RestTemplate.class, - BioSamplesProperties.class, - ObjectMapper.class, - Curator.class, - Certifier.class, - ConfigLoader.class, - Validator.class, - Applicator.class - }, - properties = {"job.autorun.enabled=false"}) -public class ValidatorTest { - @Autowired - @Qualifier("javaValidator") - private ValidatorI validator; - - @Test - public void given_valid_data_dont_throw_exception() throws Exception { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/ncbi-SAMN03894263.json"), "UTF8"); - validator.validate("schemas/certification/ncbi-candidate-schema.json", data); - } - - @Test(expected = ValidationException.class) - public void given_invalid_data_throw_exception() throws Exception { - final String data = - IOUtils.toString( - getClass().getClassLoader().getResourceAsStream("json/SAMEA3774859.json"), "UTF8"); - validator.validate("schemas/certification/ncbi-candidate-schema.json", data); - } -} diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/controller/SamplesRestControllerTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/controller/SamplesRestControllerTest.java index 03f7e69b74..5eb46d9215 100644 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/controller/SamplesRestControllerTest.java +++ b/webapps/core/src/test/java/uk/ac/ebi/biosamples/controller/SamplesRestControllerTest.java @@ -33,14 +33,15 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import uk.ac.ebi.biosamples.BioSamplesProperties; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Sample; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.docs.DocumentationHelper; import uk.ac.ebi.biosamples.mongo.service.CurationReadService; import uk.ac.ebi.biosamples.mongo.service.SampleReadService; +import uk.ac.ebi.biosamples.properties.BioSamplesProperties; import uk.ac.ebi.biosamples.security.TestSecurityConfig; import uk.ac.ebi.biosamples.service.*; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.service.taxonomy.TaxonomyClientService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; import uk.ac.ebi.biosamples.solr.repo.CursorArrayList; diff --git a/webapps/core/src/test/java/uk/ac/ebi/biosamples/docs/ApiDocumentationTest.java b/webapps/core/src/test/java/uk/ac/ebi/biosamples/docs/ApiDocumentationTest.java index 96941dd6c3..1871d14420 100644 --- a/webapps/core/src/test/java/uk/ac/ebi/biosamples/docs/ApiDocumentationTest.java +++ b/webapps/core/src/test/java/uk/ac/ebi/biosamples/docs/ApiDocumentationTest.java @@ -49,11 +49,13 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import uk.ac.ebi.biosamples.authentication.WebinAuthenticationService; import uk.ac.ebi.biosamples.core.model.Curation; import uk.ac.ebi.biosamples.core.model.CurationLink; import uk.ac.ebi.biosamples.core.model.Sample; import uk.ac.ebi.biosamples.core.model.SampleStatus; import uk.ac.ebi.biosamples.core.model.structured.StructuredData; +import uk.ac.ebi.biosamples.core.service.SampleService; import uk.ac.ebi.biosamples.exception.GlobalExceptions; import uk.ac.ebi.biosamples.mongo.service.CurationReadService; import uk.ac.ebi.biosamples.security.TestSecurityConfig; @@ -61,7 +63,6 @@ import uk.ac.ebi.biosamples.security.model.AuthorizationProvider; import uk.ac.ebi.biosamples.security.service.AccessControlService; import uk.ac.ebi.biosamples.service.*; -import uk.ac.ebi.biosamples.service.WebinAuthenticationService; import uk.ac.ebi.biosamples.service.taxonomy.TaxonomyClientService; import uk.ac.ebi.biosamples.service.validation.SchemaValidationService; import uk.ac.ebi.biosamples.solr.repo.CursorArrayList;