diff --git a/project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermRepositorySpec.groovy b/project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermV1RepositorySpec.groovy similarity index 95% rename from project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermRepositorySpec.groovy rename to project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermV1RepositorySpec.groovy index 8d2ab0e96a..d8cae93944 100644 --- a/project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermRepositorySpec.groovy +++ b/project-management-infrastructure/src/test/groovy/life/qbic/projectmanagement/infrastructure/ontology/OntologyTermV1RepositorySpec.groovy @@ -7,7 +7,7 @@ import spock.lang.Specification * * @since 1.0.0 */ -class OntologyTermRepositorySpec extends Specification{ +class OntologyTermV1RepositorySpec extends Specification { def "Given a one-word search, the correct ontology searchterm is created"() { given: diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/VirtualThreadScheduler.java b/project-management/src/main/java/life/qbic/application/commons/VirtualThreadScheduler.java similarity index 93% rename from project-management/src/main/java/life/qbic/projectmanagement/application/VirtualThreadScheduler.java rename to project-management/src/main/java/life/qbic/application/commons/VirtualThreadScheduler.java index 5e5b5056d8..7c8e893a60 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/VirtualThreadScheduler.java +++ b/project-management/src/main/java/life/qbic/application/commons/VirtualThreadScheduler.java @@ -1,4 +1,4 @@ -package life.qbic.projectmanagement.application; +package life.qbic.application.commons; import java.util.concurrent.Executor; import java.util.concurrent.Executors; diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/AddExperimentToProjectService.java b/project-management/src/main/java/life/qbic/projectmanagement/application/AddExperimentToProjectService.java index ea658610a6..3d185dcadb 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/AddExperimentToProjectService.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/AddExperimentToProjectService.java @@ -13,7 +13,7 @@ import life.qbic.domain.concepts.DomainEventDispatcher; import life.qbic.domain.concepts.LocalDomainEventDispatcher; import life.qbic.projectmanagement.application.experiment.ExperimentInformationService.ExperimentCreatedDomainEventSubscriber; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.project.Project; @@ -54,11 +54,9 @@ public AddExperimentToProjectService( @PreAuthorize("hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE')") public Result addExperimentToProject(ProjectId projectId, String experimentName, - List species, - List specimens, - List analytes, - String speciesIconLabel, - String specimenIconLabel) { + List species, + List specimens, + List analytes) { requireNonNull(projectId, "project id must not be null during experiment creation"); if (experimentName.isBlank()) { experimentName = "Unnamed Experiment"; @@ -91,7 +89,6 @@ public Result addExperimentToProject(ProjectId p .onValue(exp -> exp.addAnalytes(analytes)) .onValue(exp -> exp.addSpecies(species)) .onValue(exp -> exp.addSpecimens(specimens)) - .onValue(exp -> exp.setIconNames(speciesIconLabel, specimenIconLabel, "default")) .onValue(experiment -> { project.addExperiment(experiment); projectRepository.update(project); diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java b/project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java index fe954353b8..0b085c704f 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java @@ -18,11 +18,12 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; import life.qbic.application.commons.SortOrder; +import life.qbic.application.commons.VirtualThreadScheduler; import life.qbic.logging.api.Logger; import life.qbic.logging.service.LoggerFactory; +import life.qbic.projectmanagement.application.AddExperimentToProjectService; import life.qbic.projectmanagement.application.ProjectInformationService; import life.qbic.projectmanagement.application.ValidationResult; -import life.qbic.projectmanagement.application.VirtualThreadScheduler; import life.qbic.projectmanagement.application.api.fair.ContactPoint; import life.qbic.projectmanagement.application.api.fair.DigitalObject; import life.qbic.projectmanagement.application.api.fair.DigitalObjectFactory; @@ -37,6 +38,7 @@ import life.qbic.projectmanagement.application.sample.SampleInformationService; import life.qbic.projectmanagement.application.sample.SamplePreview; import life.qbic.projectmanagement.application.sample.SampleValidationService; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.project.Contact; @@ -47,7 +49,6 @@ import life.qbic.projectmanagement.domain.repository.ProjectRepository.ProjectNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -82,6 +83,7 @@ public class AsyncProjectServiceImpl implements AsyncProjectService { private final ExperimentInformationService experimentInformationService; private final TerminologyService terminologyService; private final SpeciesLookupService taxaService; + private final AddExperimentToProjectService addExperimentToProjectService; public AsyncProjectServiceImpl( @Autowired ProjectInformationService projectService, @@ -93,7 +95,8 @@ public AsyncProjectServiceImpl( @Autowired MeasurementValidationService measurementValidationService, @Autowired ExperimentInformationService experimentInformationService, @Autowired TerminologyService termService, - @Autowired SpeciesLookupService taxaService) { + @Autowired SpeciesLookupService taxaService, + AddExperimentToProjectService addExperimentToProjectService) { this.projectService = Objects.requireNonNull(projectService); this.sampleInfoService = Objects.requireNonNull(sampleInfoService); this.scheduler = Objects.requireNonNull(scheduler); @@ -104,6 +107,7 @@ public AsyncProjectServiceImpl( this.experimentInformationService = Objects.requireNonNull(experimentInformationService); this.terminologyService = Objects.requireNonNull(termService); this.taxaService = Objects.requireNonNull(taxaService); + this.addExperimentToProjectService = Objects.requireNonNull(addExperimentToProjectService); } private static Retry defaultRetryStrategy() { @@ -112,12 +116,12 @@ private static Retry defaultRetryStrategy() { } private static Set convertToApi( - Collection terms) { + Collection terms) { return terms.stream().map(AsyncProjectServiceImpl::convertToApi).collect(Collectors.toSet()); } private static OntologyTerm convertToApi( - life.qbic.projectmanagement.domain.model.OntologyTerm term) { + OntologyTermV1 term) { return new OntologyTerm(term.getLabel(), term.getDescription(), Curie.parse(term.oboId().toString()), URI.create(term.getClassIri()), term.getOntologyAbbreviation()); @@ -131,12 +135,37 @@ private static OntologyTerm convertToApi(OntologyClass term) { @Override public Mono create(ExperimentCreationRequest request) { - throw new RuntimeException("Not implemented"); + var securityContext = SecurityContextHolder.getContext(); + var call = Mono.fromSupplier(() -> { + Objects.requireNonNull(request.experimentDescription()); + var species = request.experimentDescription().species().stream().map( + it -> new OntologyTermV1(it.label(), null, null, + null, null, null, null)).toList(); //todo replace with v2 + var specimen = request.experimentDescription().specimen().stream().map( + it -> new OntologyTermV1(it.label(), null, null, + null, null, null, null)).toList(); //todo replace with v2 + var analytes = request.experimentDescription().analytes().stream().map( + it -> new OntologyTermV1(it.label(), null, null, + null, null, null, null)).toList(); //todo replace with v2 + ProjectId parse = ProjectId.parse(request.projectId()); + String experimentName = request.experimentDescription().experimentName(); + + ExperimentId res = addExperimentToProjectService.addExperimentToProject(parse, experimentName, + species, specimen, analytes) + .valueOrElseThrow(e -> new RuntimeException(e)); + return new ExperimentCreationResponse(request.projectId(), res.value(), + request.experimentDescription(), request.requestId()); + }); + return applySecurityContext(call) + .contextWrite(reactiveSecurity(securityContext)) + .subscribeOn(VirtualThreadScheduler.getScheduler()) + .retryWhen(defaultRetryStrategy()); } @Override public Mono create(ExperimentalGroupCreationRequest request) { - throw new RuntimeException("not implemented"); +//TODO implement + throw new RuntimeException("Not implemented"); } @Override diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/batch/SampleUpdateRequest.java b/project-management/src/main/java/life/qbic/projectmanagement/application/batch/SampleUpdateRequest.java index 71bf02e085..57b1576024 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/batch/SampleUpdateRequest.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/batch/SampleUpdateRequest.java @@ -1,6 +1,6 @@ package life.qbic.projectmanagement.application.batch; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.ExperimentalGroup; import life.qbic.projectmanagement.domain.model.sample.AnalysisMethod; import life.qbic.projectmanagement.domain.model.sample.SampleId; @@ -29,8 +29,8 @@ public record SampleUpdateRequest(SampleId sampleId, SampleInformation sampleInf */ public record SampleInformation(String sampleName, String biologicalReplicate, AnalysisMethod analysisMethod, - ExperimentalGroup experimentalGroup, OntologyTerm species, - OntologyTerm specimen, OntologyTerm analyte, + ExperimentalGroup experimentalGroup, OntologyTermV1 species, + OntologyTermV1 specimen, OntologyTermV1 analyte, String comment) { } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/experiment/ExperimentInformationService.java b/project-management/src/main/java/life/qbic/projectmanagement/application/experiment/ExperimentInformationService.java index f5e16c52d1..08179aee56 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/experiment/ExperimentInformationService.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/experiment/ExperimentInformationService.java @@ -23,7 +23,7 @@ import life.qbic.logging.service.LoggerFactory; import life.qbic.projectmanagement.application.DeletionService; import life.qbic.projectmanagement.application.sample.SampleInformationService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.experiment.ExperimentalDesign.AddExperimentalGroupResponse.ResponseCode; @@ -245,7 +245,7 @@ public List findAllForProject(ProjectId projectId) { @PreAuthorize( "hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE') ") public void addSpeciesToExperiment(String projectId, ExperimentId experimentId, - OntologyTerm... species) { + OntologyTermV1... species) { Arrays.stream(species).forEach(Objects::requireNonNull); if (species.length < 1) { return; @@ -274,7 +274,7 @@ public void addSpeciesToExperiment(String projectId, ExperimentId experimentId, @PreAuthorize( "hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE') ") public void addSpecimenToExperiment(String projectId, ExperimentId experimentId, - OntologyTerm... specimens) { + OntologyTermV1... specimens) { Arrays.stream(specimens).forEach(Objects::requireNonNull); if (specimens.length < 1) { return; @@ -303,7 +303,7 @@ public void addSpecimenToExperiment(String projectId, ExperimentId experimentId, @PreAuthorize( "hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE') ") public void addAnalyteToExperiment(String projectId, ExperimentId experimentId, - OntologyTerm... analytes) { + OntologyTermV1... analytes) { Arrays.stream(analytes).forEach(Objects::requireNonNull); if (analytes.length < 1) { return; @@ -452,7 +452,7 @@ public List addVariablesToExperiment(String pro * @param experimentId the Id of the experiment for which the analytes should be retrieved * @return a collection of analytes in the active experiment. */ - public Collection getAnalytesOfExperiment(ExperimentId experimentId) { + public Collection getAnalytesOfExperiment(ExperimentId experimentId) { Experiment experiment = loadExperimentById(experimentId); return experiment.getAnalytes(); } @@ -463,7 +463,7 @@ public Collection getAnalytesOfExperiment(ExperimentId experimentI * @param experimentId the Id of the experiment for which the species should be retrieved * @return a collection of species in the active experiment. */ - public Collection getSpeciesOfExperiment(ExperimentId experimentId) { + public Collection getSpeciesOfExperiment(ExperimentId experimentId) { Experiment experiment = loadExperimentById(experimentId); return experiment.getSpecies(); } @@ -474,7 +474,7 @@ public Collection getSpeciesOfExperiment(ExperimentId experimentId * @param experimentId the Id of the experiment for which the specimen should be retrieved * @return a collection of specimen in the active experiment. */ - public Collection getSpecimensOfExperiment(ExperimentId experimentId) { + public Collection getSpecimensOfExperiment(ExperimentId experimentId) { Experiment experiment = loadExperimentById(experimentId); return experiment.getSpecimens(); } @@ -532,10 +532,9 @@ public void deleteExperimentalGroupsWithIds(String projectId, ExperimentId id, L handleLocalEventCache(domainEventsCache); } - @Transactional /** * Updates experimental groups in a given experiment. - * + *

* Compares the provided list of experimental groups of an experiment with the persistent state. * Removes groups from the experiment that are not in the new list, adds groups that are not in * the experiment yet and updates the other groups of the experiment. @@ -545,6 +544,7 @@ public void deleteExperimentalGroupsWithIds(String projectId, ExperimentId id, L * @param experimentalGroupDTOS the new list of experimental groups including all updates * @since 1.0.0 */ + @Transactional @PreAuthorize( "hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE') ") public void updateExperimentalGroupsOfExperiment(String projectId, ExperimentId experimentId, @@ -600,8 +600,7 @@ private List getGroupIdsToDelete(List existingGroups, "hasPermission(#projectId, 'life.qbic.projectmanagement.domain.model.project.Project', 'WRITE') ") public void editExperimentInformation(String projectId, ExperimentId experimentId, String experimentName, - List species, List specimens, List analytes, - String speciesIconName, String specimenIconName) { + List species, List specimens, List analytes) { List domainEventsCache = new ArrayList<>(); var localDomainEventDispatcher = LocalDomainEventDispatcher.instance(); @@ -614,7 +613,6 @@ public void editExperimentInformation(String projectId, ExperimentId experimentI experiment.setSpecies(species); experiment.setSpecimens(specimens); experiment.setAnalytes(analytes); - experiment.setIconNames(speciesIconName, specimenIconName, "default"); experimentRepository.update(experiment); handleLocalEventCache(domainEventsCache); diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/measurement/MeasurementService.java b/project-management/src/main/java/life/qbic/projectmanagement/application/measurement/MeasurementService.java index 2ff69df605..5a65d546f9 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/measurement/MeasurementService.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/measurement/MeasurementService.java @@ -25,7 +25,7 @@ import life.qbic.projectmanagement.application.ontology.TerminologyService; import life.qbic.projectmanagement.application.sample.SampleIdCodeEntry; import life.qbic.projectmanagement.application.sample.SampleInformationService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.measurement.MeasurementCode; import life.qbic.projectmanagement.domain.model.measurement.MeasurementId; @@ -778,7 +778,7 @@ private boolean allMeasurementCodesExist(List measurementCode) { .allMatch(measurementRepository::existsMeasurement); } - private Optional resolveOntologyCURI(String ontologyCURI) { + private Optional resolveOntologyCURI(String ontologyCURI) { return terminologyService.findByCurie(ontologyCURI); } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologySelect.java b/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologySelect.java index 0224492da2..f7fc3808ea 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologySelect.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologySelect.java @@ -2,7 +2,7 @@ import java.util.List; import java.util.Optional; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * API for ontology term selection or lookup for autocomplete use cases @@ -18,7 +18,7 @@ public interface TerminologySelect { *

* NOTE! *

- * The resulting {@link OntologyTerm} objects are not guaranteed to contain values for properties + * The resulting {@link OntologyTermV1} objects are not guaranteed to contain values for properties * like "description". This depends highly on the implementation, use the * {@link TerminologySelect#search(String, int, int)} method for a rich search. * @@ -44,7 +44,7 @@ public interface TerminologySelect { Optional searchByCurie(String curie) throws LookupException; /** - * Searches for possible matching ontology terms. This search returns rich {@link OntologyTerm} + * Searches for possible matching ontology terms. This search returns rich {@link OntologyTermV1} * objects, and should be used when information for properties like "description" needs to be * used. * diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologyService.java b/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologyService.java index 194f99e9b7..49da7b259d 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologyService.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/ontology/TerminologyService.java @@ -6,7 +6,7 @@ import life.qbic.application.commons.ApplicationException; import life.qbic.application.commons.ApplicationException.ErrorCode; import life.qbic.application.commons.ApplicationException.ErrorParameters; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -34,7 +34,7 @@ public TerminologyService(TerminologySelect terminologySelect) { *

* NOTE! *

- * The resulting {@link OntologyTerm} objects are not guaranteed to contain values for properties + * The resulting {@link OntologyTermV1} objects are not guaranteed to contain values for properties * like "description". This depends highly on the implementation, use the * {@link TerminologySelect#search(String, int, int)} method for a rich search. * @@ -46,10 +46,10 @@ public TerminologyService(TerminologySelect terminologySelect) { * @return a list of matching terms given the provided search term * @since 1.4.0 */ - public List query(String searchTerm, int offset, int limit) + public List query(String searchTerm, int offset, int limit) throws ApplicationException { try { - return terminologySelect.query(searchTerm, offset, limit).stream().map(OntologyTerm::from) + return terminologySelect.query(searchTerm, offset, limit).stream().map(OntologyTermV1::from) .toList(); } catch (LookupException e) { throw new ApplicationException("Lookup for term '%s' failed.".formatted(searchTerm), e, ErrorCode.SERVICE_FAILED, ErrorParameters.empty()); @@ -64,16 +64,16 @@ public List query(String searchTerm, int offset, int limit) * @return a list of matching terms given the provided CURIE * @since 1.4.0 */ - public Optional findByCurie(String curie) throws ApplicationException { + public Optional findByCurie(String curie) throws ApplicationException { try { - return terminologySelect.searchByCurie(curie).map(OntologyTerm::from); + return terminologySelect.searchByCurie(curie).map(OntologyTermV1::from); } catch (LookupException e) { throw new ApplicationException("Lookup for CURIE '%s' failed.".formatted(curie), e, ErrorCode.SERVICE_FAILED, ErrorParameters.empty()); } } /** - * Searches for possible matching ontology terms. This search returns rich {@link OntologyTerm} + * Searches for possible matching ontology terms. This search returns rich {@link OntologyTermV1} * objects, and should be used when information for properties like "description" needs to be * used. * @@ -85,10 +85,10 @@ public Optional findByCurie(String curie) throws ApplicationExcept * @return a list of matching terms given the provided search term. * @since 1.4.0 */ - public List search(String searchTerm, int offset, int limit) + public List search(String searchTerm, int offset, int limit) throws ApplicationException { try { - return terminologySelect.search(searchTerm, offset, limit).stream().map(OntologyTerm::from) + return terminologySelect.search(searchTerm, offset, limit).stream().map(OntologyTermV1::from) .toList(); } catch (LookupException e) { throw new ApplicationException("Searching for term '%s' failed.".formatted(searchTerm), e, ErrorCode.SERVICE_FAILED, ErrorParameters.empty()); diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/PropertyConversion.java b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/PropertyConversion.java index 6b8ac44b08..fb3a158e9f 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/PropertyConversion.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/PropertyConversion.java @@ -6,7 +6,7 @@ import java.util.Optional; import java.util.regex.MatchResult; import java.util.regex.Pattern; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Condition; import life.qbic.projectmanagement.domain.model.experiment.VariableLevel; @@ -82,7 +82,7 @@ public static String toString(VariableLevel variableLevel) { } /** - * Transforms an {@link OntologyTerm} to its String representation. + * Transforms an {@link OntologyTermV1} to its String representation. *

* The String representation currently contains the term label and the OBO ID. *

@@ -92,17 +92,17 @@ public static String toString(VariableLevel variableLevel) { *

* So e.g. 'Homo sapiens [NCBITaxon:9606]' * - * @param ontologyTerm the ontology term to transform + * @param ontologyTermV1 the ontology term to transform * @return the String representation of the ontology term * @since 1.5.0 */ - public static String toString(OntologyTerm ontologyTerm) { - Objects.requireNonNull(ontologyTerm); - return ONTOLOGY_TERM.formatted(ontologyTerm.getLabel(), ontologyTerm.getOboId()); + public static String toString(OntologyTermV1 ontologyTermV1) { + Objects.requireNonNull(ontologyTermV1); + return ONTOLOGY_TERM.formatted(ontologyTermV1.getLabel(), ontologyTermV1.getOboId()); } /** - * Expects a String that has been created with {@link #toString(OntologyTerm)} and tries to + * Expects a String that has been created with {@link #toString(OntologyTermV1)} and tries to * extract the CURIE of the ontology term. *

* The CURIE is expected to be surrounded with [...] squared brackets. diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleMetadata.java b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleMetadata.java index da32b1dfa2..babe975cbf 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleMetadata.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleMetadata.java @@ -3,7 +3,7 @@ import java.util.Map; import java.util.Optional; import life.qbic.projectmanagement.application.confounding.ConfoundingVariableService.ConfoundingVariableInformation; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.sample.AnalysisMethod; import life.qbic.projectmanagement.domain.model.sample.SampleId; @@ -21,9 +21,9 @@ public record SampleMetadata( AnalysisMethod analysisToBePerformed, String biologicalReplicate, long experimentalGroupId, - OntologyTerm species, - OntologyTerm specimen, - OntologyTerm analyte, + OntologyTermV1 species, + OntologyTermV1 specimen, + OntologyTermV1 analyte, String comment, Map confoundingVariables, String experimentId @@ -33,9 +33,9 @@ public static SampleMetadata createNew(String sampleName, AnalysisMethod analysisToBePerformed, String biologicalReplicate, long experimentalGroupId, - OntologyTerm species, - OntologyTerm specimen, - OntologyTerm analyte, + OntologyTermV1 species, + OntologyTermV1 specimen, + OntologyTermV1 analyte, String comment, Map confoundingVariables, String experimentId) { @@ -50,9 +50,9 @@ public static SampleMetadata createUpdate(SampleId sampleId, AnalysisMethod analysisToBePerformed, String biologicalReplicate, long experimentalGroupId, - OntologyTerm species, - OntologyTerm specimen, - OntologyTerm analyte, + OntologyTermV1 species, + OntologyTermV1 specimen, + OntologyTermV1 analyte, String comment, Map confoundingVariables, String experimentId) { diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SamplePreview.java b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SamplePreview.java index 9d98b5fae8..2ba92bc6f9 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SamplePreview.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SamplePreview.java @@ -10,7 +10,7 @@ import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import java.util.Objects; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.batch.Batch; import life.qbic.projectmanagement.domain.model.experiment.Experiment; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; @@ -51,9 +51,9 @@ public class SamplePreview { @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "experimentalGroupId") private ExperimentalGroup experimentalGroup; - private OntologyTerm species; - private OntologyTerm specimen; - private OntologyTerm analyte; + private OntologyTermV1 species; + private OntologyTermV1 specimen; + private OntologyTermV1 analyte; protected SamplePreview() { //needed by JPA @@ -61,8 +61,9 @@ protected SamplePreview() { private SamplePreview(ExperimentId experimentId, SampleId sampleId, String sampleCode, String batchLabel, String sampleName, String biologicalReplicate, - ExperimentalGroup experimentalGroup, OntologyTerm species, - OntologyTerm specimen, OntologyTerm analyte, AnalysisMethod analysisMethod, String comment) { + ExperimentalGroup experimentalGroup, OntologyTermV1 species, + OntologyTermV1 specimen, OntologyTermV1 analyte, AnalysisMethod analysisMethod, + String comment) { Objects.requireNonNull(experimentId); Objects.requireNonNull(sampleId); Objects.requireNonNull(sampleCode); @@ -101,11 +102,11 @@ private SamplePreview(ExperimentId experimentId, SampleId sampleId, String sampl * was taken of. Used to group biological replicates * @param experimentalGroup the {@link ExperimentalGroup} for the {@link Sample} associated with * this preview - * @param species the {@link OntologyTerm} for the species of this {@link Sample} + * @param species the {@link OntologyTermV1} for the species of this {@link Sample} * associated with this preview - * @param specimen the {@link OntologyTerm} for the specimen of this {@link Sample} + * @param specimen the {@link OntologyTermV1} for the specimen of this {@link Sample} * associated with this preview - * @param analyte the {@link OntologyTerm} for the analyte of this {@link Sample} + * @param analyte the {@link OntologyTermV1} for the analyte of this {@link Sample} * associated with this preview * @param analysisMethod the analysis method to be performed for this {@link Sample} * @param comment an optional comment pertaining to the associated {@link Sample} @@ -115,7 +116,7 @@ public static SamplePreview create(ExperimentId experimentId, SampleId sampleId, String sampleCode, String batchLabel, String sampleName, String biologicalReplicate, ExperimentalGroup experimentalGroup, - OntologyTerm species, OntologyTerm specimen, OntologyTerm analyte, + OntologyTermV1 species, OntologyTermV1 specimen, OntologyTermV1 analyte, AnalysisMethod analysisMethod, String comment) { return new SamplePreview(experimentId, sampleId, sampleCode, batchLabel, sampleName, biologicalReplicate, experimentalGroup, species, specimen, analyte, analysisMethod, @@ -142,15 +143,15 @@ public String sampleName() { return sampleName; } - public OntologyTerm species() { + public OntologyTermV1 species() { return species; } - public OntologyTerm specimen() { + public OntologyTermV1 specimen() { return specimen; } - public OntologyTerm analyte() { + public OntologyTermV1 analyte() { return analyte; } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleValidation.java b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleValidation.java index b80936b28f..6d4e5b0716 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleValidation.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleValidation.java @@ -20,7 +20,7 @@ import life.qbic.projectmanagement.application.experiment.ExperimentInformationService; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Condition; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.experiment.ExperimentalGroup; @@ -218,7 +218,7 @@ private ValidationResultWithPayload validateAnalysisMethod( null)); } - private ValidationResultWithPayload validateSpecies(String species) { + private ValidationResultWithPayload validateSpecies(String species) { if (isNull(species) || species.isBlank()) { return new ValidationResultWithPayload<>( ValidationResult.withFailures(List.of("Missing species")), @@ -232,14 +232,14 @@ private ValidationResultWithPayload validateSpecies(String species } var speciesLookup = speciesLookupService.findByCURI(extractedTerm.get()); return speciesLookup - .map(OntologyTerm::from) + .map(OntologyTermV1::from) .map(it -> new ValidationResultWithPayload<>(ValidationResult.successful(), it)) .orElse(new ValidationResultWithPayload<>( ValidationResult.withFailures(List.of("Unknown species: '" + species + "'")), null)); } - private ValidationResultWithPayload validateSpecimen(String specimen) { + private ValidationResultWithPayload validateSpecimen(String specimen) { if (isNull(specimen) || specimen.isBlank()) { return new ValidationResultWithPayload<>( ValidationResult.withFailures(List.of("Missing specimen")), @@ -259,7 +259,7 @@ private ValidationResultWithPayload validateSpecimen(String specim ValidationResult.withFailures(List.of("Unknown specimen: '" + specimen + "'")), null)); } - private ValidationResultWithPayload validateAnalyte(String analyte) { + private ValidationResultWithPayload validateAnalyte(String analyte) { if (isNull(analyte) || analyte.isBlank()) { return new ValidationResultWithPayload<>( ValidationResult.withFailures(List.of("Missing analyte")), diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTerm.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV1.java similarity index 85% rename from project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTerm.java rename to project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV1.java index 99f77047fb..be37d2cc34 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTerm.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV1.java @@ -15,7 +15,7 @@ * are stored persistently with experiments and samples. Storage is facilitated by * {@link OntologyClassAttributeConverter}. */ -public class OntologyTerm implements Serializable { +public class OntologyTermV1 implements Serializable { @Serial private static final long serialVersionUID = 1459801951948902353L; @@ -37,7 +37,7 @@ public class OntologyTerm implements Serializable { @JsonProperty("oboId") private OboId realOboId; - public OntologyTerm() { + public OntologyTermV1() { } /** @@ -50,7 +50,7 @@ public OntologyTerm() { * @param description - an optional description of the term * @param classIri - the iri where this specific class is found/described */ - public OntologyTerm(String ontologyAbbreviation, String ontologyVersion, String ontologyIri, + public OntologyTermV1(String ontologyAbbreviation, String ontologyVersion, String ontologyIri, String classLabel, String oboId, String description, String classIri) { this.ontologyAbbreviation = ontologyAbbreviation; this.ontologyVersion = ontologyVersion; @@ -61,8 +61,8 @@ public OntologyTerm(String ontologyAbbreviation, String ontologyVersion, String this.classIri = classIri; } - public static OntologyTerm from(OntologyClass lookupEntity) { - return new OntologyTerm(lookupEntity.getOntologyAbbreviation(), + public static OntologyTermV1 from(OntologyClass lookupEntity) { + return new OntologyTermV1(lookupEntity.getOntologyAbbreviation(), lookupEntity.getOntologyVersion(), lookupEntity.getOntologyIri(), lookupEntity.getClassLabel(), lookupEntity.getCurie(), lookupEntity.getDescription(), lookupEntity.getClassIri()); @@ -72,26 +72,6 @@ public String getOntologyAbbreviation() { return ontologyAbbreviation; } - public void setOntologyAbbreviation(String ontologyAbbreviation) { - this.ontologyAbbreviation = ontologyAbbreviation; - } - - public String getOntologyVersion() { - return ontologyVersion; - } - - public void setOntologyVersion(String ontologyVersion) { - this.ontologyVersion = ontologyVersion; - } - - public String getOntologyIri() { - return ontologyIri; - } - - public void setOntologyIri(String ontologyIri) { - this.ontologyIri = ontologyIri; - } - public String getLabel() { return classLabel; } @@ -149,6 +129,15 @@ public String formatted() { Ontology.findOntologyByAbbreviation(ontologyAbbreviation).getName()); } + /** + * The abbreviated ontology term + * + * @return + */ + public String ontologyIdentifyingName() { + return Ontology.findOntologyByAbbreviation(ontologyAbbreviation).getAbbreviation(); + } + @Override public boolean equals(Object other) { if (this == other) { @@ -157,7 +146,7 @@ public boolean equals(Object other) { if (other == null || getClass() != other.getClass()) { return false; } - OntologyTerm that = (OntologyTerm) other; + OntologyTermV1 that = (OntologyTermV1) other; return Objects.equals(classIri, that.classIri); } @@ -168,11 +157,16 @@ public int hashCode() { @Override public String toString() { - return new StringJoiner(", ", OntologyTerm.class.getSimpleName() + "[", "]") + return new StringJoiner(", ", OntologyTermV1.class.getSimpleName() + "[", "]") .add("ontologyAbbreviation='" + ontologyAbbreviation + "'") + .add("ontologyVersion='" + ontologyVersion + "'") + .add("ontologyIri='" + ontologyIri + "'") .add("classLabel='" + classLabel + "'") .add("oboId='" + oboId + "'") + .add("description='" + description + "'") .add("classIri='" + classIri + "'") + .add("realOboId=" + realOboId) + .add("ontologyIdentifyingName='" + ontologyIdentifyingName() + "'") .toString(); } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV2.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV2.java new file mode 100644 index 0000000000..a9dd07446d --- /dev/null +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/OntologyTermV2.java @@ -0,0 +1,74 @@ +package life.qbic.projectmanagement.domain.model; + +import static java.util.Objects.requireNonNull; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import java.io.IOException; +import java.io.Serializable; +import java.net.URI; + +public record OntologyTermV2( + @JsonProperty("label") String label, + @JsonProperty("description") String description, + @JsonSerialize(using = CurieSerializer.class) @JsonDeserialize(using = CurieDeserializer.class) @JsonProperty("oboId") Curie oboId, + @JsonProperty("iri") URI id, + @JsonProperty("ontology_name") String ontologyName) implements Serializable { + + + record Curie(@JsonProperty("prefix") String prefix, + @JsonProperty("local_identifier") String localId) implements Serializable { + + public static Curie parse(String value) { + requireNonNull(value); + if (value.contains(":")) { + var parts = value.split(":"); + String prefix = parts[0]; + String localId = parts[1]; + return new Curie(prefix, localId); + } + throw new IllegalArgumentException("Invalid Curie: " + value); + } + + @Override + public String toString() { + return prefix + ":" + localId; + } + } + + public OntologyTermV2 fromOntologyTermV1(OntologyTermV1 oldTerm) { + return new OntologyTermV2( + oldTerm.getLabel(), + oldTerm.getDescription(), + new Curie(oldTerm.oboId().idSpace(), oldTerm.oboId().localId()), + URI.create(oldTerm.getClassIri()), + oldTerm.ontologyIdentifyingName() + ); + } + + static class CurieSerializer extends JsonSerializer { + + @Override + public void serialize(Curie value, JsonGenerator gen, SerializerProvider serializers) + throws IOException { + gen.writeObject(value.toString()); + } + } + + static class CurieDeserializer extends JsonDeserializer { + + @Override + public Curie deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException { + return Curie.parse(p.getValueAsString()); + } + } + +} diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/Experiment.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/Experiment.java index e10e25183e..ba893583bd 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/Experiment.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/Experiment.java @@ -17,7 +17,7 @@ import life.qbic.application.commons.ApplicationException.ErrorParameters; import life.qbic.application.commons.Result; import life.qbic.domain.concepts.LocalDomainEventDispatcher; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.ExperimentalDesign.AddExperimentalGroupResponse.ResponseCode; import life.qbic.projectmanagement.domain.model.experiment.event.ExperimentCreatedEvent; import life.qbic.projectmanagement.domain.model.experiment.event.ExperimentUpdatedEvent; @@ -50,16 +50,16 @@ public class Experiment { private String specimenIconName; @Column(name = "analyteIconName", nullable = false, columnDefinition = "varchar(31) default 'default'") private String analyteIconName; - - @ElementCollection(targetClass = OntologyTerm.class) + + @ElementCollection(targetClass = OntologyTermV1.class) @Column(name = "analytes", columnDefinition = "longtext CHECK (json_valid(`analytes`))") - private List analytes = new ArrayList<>(); - @ElementCollection(targetClass = OntologyTerm.class) + private List analytes = new ArrayList<>(); + @ElementCollection(targetClass = OntologyTermV1.class) @Column(name = "species", columnDefinition = "longtext CHECK (json_valid(`species`))") - private List species = new ArrayList<>(); - @ElementCollection(targetClass = OntologyTerm.class) + private List species = new ArrayList<>(); + @ElementCollection(targetClass = OntologyTermV1.class) @Column(name = "specimens", columnDefinition = "longtext CHECK (json_valid(`specimens`))") - private List specimens = new ArrayList<>(); + private List specimens = new ArrayList<>(); private static final String DEFAULT_ICON_NAME = "default"; /** @@ -154,21 +154,21 @@ public ExperimentId experimentId() { /** * @return the collection of species in this experiment */ - public Collection getSpecies() { + public Collection getSpecies() { return species.stream().toList(); } /** * @return the collection of specimens in this experiment */ - public Collection getSpecimens() { + public Collection getSpecimens() { return specimens.stream().toList(); } /** * @return the collection of analytes in this experiment */ - public Collection getAnalytes() { + public Collection getAnalytes() { return analytes.stream().toList(); } @@ -177,11 +177,11 @@ public Collection getAnalytes() { * * @param specimens The specimens to add to the experiment */ - public void addSpecimens(Collection specimens) { + public void addSpecimens(Collection specimens) { if (specimens.isEmpty()) { return; } - List missingSpecimens = specimens.stream() + List missingSpecimens = specimens.stream() .filter(specimen -> !this.specimens.contains(specimen)) .distinct() .toList(); @@ -258,13 +258,13 @@ public void removeAllExperimentalGroups() { * * @param analytes The analytes to add to the experiment */ - public void addAnalytes(Collection analytes) { + public void addAnalytes(Collection analytes) { if (analytes.isEmpty()) { return; } // only add analytes that are not present already - List missingAnalytes = analytes.stream() + List missingAnalytes = analytes.stream() .filter(analyte -> !this.analytes.contains(analyte)) .distinct() .toList(); @@ -277,12 +277,12 @@ public void addAnalytes(Collection analytes) { * * @param species The species to add to the experiment */ - public void addSpecies(Collection species) { + public void addSpecies(Collection species) { if (species.isEmpty()) { return; } // only add species that are not present already - List missingSpecies = species.stream() + List missingSpecies = species.stream() .filter(speci -> !this.species.contains(speci)) .distinct() .toList(); @@ -380,7 +380,7 @@ public void setName(String name) { * Sets the list of species for an experiment. */ public void setSpecies( - List species) { + List species) { if (species == null || species.isEmpty()) { throw new ApplicationException(ErrorCode.NO_SPECIES_DEFINED, ErrorParameters.of(species)); @@ -393,7 +393,7 @@ public void setSpecies( * Sets the list of specimen for an experiment. */ public void setSpecimens( - List specimens) { + List specimens) { if (specimens == null || specimens.isEmpty()) { throw new ApplicationException(ErrorCode.NO_SPECIMEN_DEFINED, ErrorParameters.of(specimens)); @@ -406,7 +406,7 @@ public void setSpecimens( * Sets the list of analytes for an experiment. */ public void setAnalytes( - List analytes) { + List analytes) { if (analytes == null || analytes.isEmpty()) { throw new ApplicationException(ErrorCode.NO_ANALYTE_DEFINED, ErrorParameters.of(analytes)); diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/repository/jpa/OntologyClassAttributeConverter.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/repository/jpa/OntologyClassAttributeConverter.java index cd8f50692b..fa020cd0e8 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/repository/jpa/OntologyClassAttributeConverter.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/experiment/repository/jpa/OntologyClassAttributeConverter.java @@ -5,18 +5,18 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; @Converter(autoApply = true) public class OntologyClassAttributeConverter implements - AttributeConverter { + AttributeConverter { private static final ObjectMapper objectMapper = new ObjectMapper().configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); @Override - public String convertToDatabaseColumn(OntologyTerm attribute) { + public String convertToDatabaseColumn(OntologyTermV1 attribute) { try { return objectMapper.writeValueAsString(attribute); } catch (JsonProcessingException e) { @@ -25,9 +25,9 @@ public String convertToDatabaseColumn(OntologyTerm attribute) { } @Override - public OntologyTerm convertToEntityAttribute(String dbData) { + public OntologyTermV1 convertToEntityAttribute(String dbData) { try { - return objectMapper.readValue(dbData, OntologyTerm.class); + return objectMapper.readValue(dbData, OntologyTermV1.class); } catch (JsonProcessingException e) { throw new RuntimeException(e); } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMeasurement.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMeasurement.java index 93e40ab5cd..028203897b 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMeasurement.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMeasurement.java @@ -21,7 +21,7 @@ import java.util.Set; import life.qbic.domain.concepts.LocalDomainEventDispatcher; import life.qbic.projectmanagement.domain.Organisation; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.measurement.event.MeasurementCreatedEvent; import life.qbic.projectmanagement.domain.model.measurement.event.MeasurementUpdatedEvent; import life.qbic.projectmanagement.domain.model.project.ProjectId; @@ -60,7 +60,7 @@ public class NGSMeasurement { @Column(nullable = false) private ProjectId projectId; @Column(name = "instrument", columnDefinition = "longtext CHECK (json_valid(`instrument`))") - private OntologyTerm instrument; + private OntologyTermV1 instrument; @Column(name = "samplePool") private String samplePool = ""; @Convert(converter = MeasurementCode.MeasurementCodeConverter.class) @@ -225,7 +225,7 @@ public ProjectId projectId() { return projectId; } - public OntologyTerm instrument() { + public OntologyTermV1 instrument() { return instrument; } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMethodMetadata.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMethodMetadata.java index 83a563a46e..92c1ef480c 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMethodMetadata.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/NGSMethodMetadata.java @@ -1,6 +1,6 @@ package life.qbic.projectmanagement.domain.model.measurement; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * NGS Method Metadata @@ -9,7 +9,8 @@ * * @since 1.0.0 */ -public record NGSMethodMetadata(OntologyTerm instrument, String facility, String sequencingReadType, +public record NGSMethodMetadata(OntologyTermV1 instrument, String facility, + String sequencingReadType, String libraryKit, String flowCell, String sequencingRunProtocol) { diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMeasurement.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMeasurement.java index 9a0e465ea1..93abd8a6c1 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMeasurement.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMeasurement.java @@ -21,7 +21,7 @@ import life.qbic.domain.concepts.LocalDomainEventDispatcher; import life.qbic.projectmanagement.application.measurement.MeasurementMetadata; import life.qbic.projectmanagement.domain.Organisation; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.measurement.MeasurementCode.MeasurementCodeConverter; import life.qbic.projectmanagement.domain.model.measurement.event.MeasurementCreatedEvent; import life.qbic.projectmanagement.domain.model.measurement.event.MeasurementUpdatedEvent; @@ -57,7 +57,7 @@ public class ProteomicsMeasurement { private MeasurementId measurementId; @Column(name = "instrument", columnDefinition = "longtext CHECK (json_valid(`instrument`))") - private OntologyTerm msDevice; + private OntologyTermV1 msDevice; @Column(name = "technicalReplicateName") private String technicalReplicateName; @@ -219,7 +219,7 @@ public Collection measuredSamples() { .toList(); } - public OntologyTerm msDevice() { + public OntologyTermV1 msDevice() { return msDevice; } diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMethodMetadata.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMethodMetadata.java index c8ecef142c..00a6c59341 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMethodMetadata.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/measurement/ProteomicsMethodMetadata.java @@ -1,6 +1,6 @@ package life.qbic.projectmanagement.domain.model.measurement; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * Proteomics Method Metadata @@ -10,7 +10,7 @@ * @since 1.0.0 */ public record ProteomicsMethodMetadata( - OntologyTerm msDevice, + OntologyTermV1 msDevice, String technicalReplicate, String facility, String digestionMethod, diff --git a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/SampleOrigin.java b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/SampleOrigin.java index 8054da4661..90e2bb740e 100644 --- a/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/SampleOrigin.java +++ b/project-management/src/main/java/life/qbic/projectmanagement/domain/model/sample/SampleOrigin.java @@ -3,13 +3,13 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import java.util.Objects; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; /** * Sample Origin *

- * The sample origin contains the species, specimen and analyte as {@link OntologyTerm} that + * The sample origin contains the species, specimen and analyte as {@link OntologyTermV1} that * are associated with the {@link Sample}. They are a subset of the classes that have been selected * for the respective {@link Experiment}. *

@@ -20,37 +20,37 @@ public class SampleOrigin { @Column(name = "species", columnDefinition = "TEXT") - private OntologyTerm species; + private OntologyTermV1 species; @Column(name = "specimen", columnDefinition = "TEXT") - private OntologyTerm specimen; + private OntologyTermV1 specimen; @Column(name = "analyte", columnDefinition = "TEXT") - private OntologyTerm analyte; + private OntologyTermV1 analyte; protected SampleOrigin() { //needed for JPA } - private SampleOrigin(OntologyTerm species, OntologyTerm specimen, - OntologyTerm analyte) { + private SampleOrigin(OntologyTermV1 species, OntologyTermV1 specimen, + OntologyTermV1 analyte) { this.species = Objects.requireNonNull(species); this.specimen = Objects.requireNonNull(specimen); this.analyte = Objects.requireNonNull(analyte); } - public static SampleOrigin create(OntologyTerm species, OntologyTerm specimen, - OntologyTerm analytes) { + public static SampleOrigin create(OntologyTermV1 species, OntologyTermV1 specimen, + OntologyTermV1 analytes) { return new SampleOrigin(species, specimen, analytes); } - public OntologyTerm getSpecies() { + public OntologyTermV1 getSpecies() { return species; } - public OntologyTerm getSpecimen() { + public OntologyTermV1 getSpecimen() { return specimen; } - public OntologyTerm getAnalyte() { + public OntologyTermV1 getAnalyte() { return analyte; } diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/application/AddExperimentToProjectServiceSpec.groovy b/project-management/src/test/groovy/life/qbic/projectmanagement/application/AddExperimentToProjectServiceSpec.groovy index 45e46ed2b2..439d9f7058 100644 --- a/project-management/src/test/groovy/life/qbic/projectmanagement/application/AddExperimentToProjectServiceSpec.groovy +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/application/AddExperimentToProjectServiceSpec.groovy @@ -1,6 +1,7 @@ package life.qbic.projectmanagement.application -import life.qbic.projectmanagement.domain.model.OntologyTerm + +import life.qbic.projectmanagement.domain.model.OntologyTermV1 import life.qbic.projectmanagement.domain.model.experiment.ExperimentId import life.qbic.projectmanagement.domain.model.project.* import life.qbic.projectmanagement.domain.repository.ProjectRepository @@ -23,11 +24,9 @@ class AddExperimentToProjectServiceSpec extends Specification { when: "an experiment is added to a project" def result = service.addExperimentToProject(project.id, "Pilot", - [new OntologyTerm()], - [new OntologyTerm()], - [new OntologyTerm()], - "default", - "default") + [new OntologyTermV1()], + [new OntologyTermV1()], + [new OntologyTermV1()]) ExperimentId experimentId = result.getValue() then: "the project holds a reference to the created experiment" diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/application/ExperimentInformationServiceSpec.groovy b/project-management/src/test/groovy/life/qbic/projectmanagement/application/ExperimentInformationServiceSpec.groovy index d88cde581d..1dc3b5c919 100644 --- a/project-management/src/test/groovy/life/qbic/projectmanagement/application/ExperimentInformationServiceSpec.groovy +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/application/ExperimentInformationServiceSpec.groovy @@ -4,7 +4,7 @@ import life.qbic.application.commons.Result import life.qbic.projectmanagement.application.experiment.ExperimentInformationService import life.qbic.projectmanagement.application.experiment.ExperimentInformationService.ExperimentalGroupDTO import life.qbic.projectmanagement.application.sample.SampleInformationService -import life.qbic.projectmanagement.domain.model.OntologyTerm +import life.qbic.projectmanagement.domain.model.OntologyTermV1 import life.qbic.projectmanagement.domain.model.experiment.Experiment import life.qbic.projectmanagement.domain.model.experiment.ExperimentId import life.qbic.projectmanagement.domain.model.experiment.ExperimentalValue @@ -31,8 +31,8 @@ class ExperimentInformationServiceSpec extends Specification { experimentRepository.find((ExperimentId) _) >> Optional.empty() when: "specimens are added to an experiment" - OntologyTerm specimen1 = new OntologyTerm(); - OntologyTerm specimen2 = new OntologyTerm("ontology", "ontologyVersion", "ontologyIri", + OntologyTermV1 specimen1 = new OntologyTermV1(); + OntologyTermV1 specimen2 = new OntologyTermV1("ontology", "ontologyVersion", "ontologyIri", "classLabel", "name", "description", "classIri"); experimentInformationService.addSpecimenToExperiment("", experiment.experimentId(), specimen1, specimen2) @@ -50,8 +50,8 @@ class ExperimentInformationServiceSpec extends Specification { experimentRepository.find((ExperimentId) _) >> Optional.empty() when: "analytes are added to an experiment" - OntologyTerm analyte2 = new OntologyTerm(); - OntologyTerm analyte1 = new OntologyTerm("ontology", "ontologyVersion", "ontologyIri", + OntologyTermV1 analyte2 = new OntologyTermV1(); + OntologyTermV1 analyte1 = new OntologyTermV1("ontology", "ontologyVersion", "ontologyIri", "classLabel", "name", "description", "classIri"); experimentInformationService.addAnalyteToExperiment("", experiment.experimentId(), analyte1, analyte2) @@ -69,10 +69,10 @@ class ExperimentInformationServiceSpec extends Specification { experimentRepository.find((ExperimentId) _) >> Optional.empty() when: "species are added to an experiment" - OntologyTerm species1 = new OntologyTerm(); - OntologyTerm species2 = new OntologyTerm("ontology", "ontologyVersion", "ontologyIri", + OntologyTermV1 species1 = new OntologyTermV1(); + OntologyTermV1 species2 = new OntologyTermV1("ontology", "ontologyVersion", "ontologyIri", "classLabel", "name", "description", "classIri"); - OntologyTerm species3 = new OntologyTerm(); + OntologyTermV1 species3 = new OntologyTermV1(); experimentInformationService.addSpeciesToExperiment("", experiment.experimentId(), species1, species2, species3) diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/application/SampleRegistrationServiceSpec.groovy b/project-management/src/test/groovy/life/qbic/projectmanagement/application/SampleRegistrationServiceSpec.groovy index 4b3e35c318..d4b53d5e03 100644 --- a/project-management/src/test/groovy/life/qbic/projectmanagement/application/SampleRegistrationServiceSpec.groovy +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/application/SampleRegistrationServiceSpec.groovy @@ -4,7 +4,7 @@ import life.qbic.application.commons.Result import life.qbic.projectmanagement.application.api.SampleCodeService import life.qbic.projectmanagement.application.communication.EmailService import life.qbic.projectmanagement.application.sample.SampleRegistrationService -import life.qbic.projectmanagement.domain.model.OntologyTerm +import life.qbic.projectmanagement.domain.model.OntologyTermV1 import life.qbic.projectmanagement.domain.model.batch.BatchId import life.qbic.projectmanagement.domain.model.experiment.ExperimentId import life.qbic.projectmanagement.domain.model.project.* @@ -38,7 +38,7 @@ class SampleRegistrationServiceSpec extends Specification { def "Invalid SampleRegistrationRequests returns a Result containing a SAMPLE_REGISTRATION_FAILED response code"() { given: - SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTerm(), new OntologyTerm(), new OntologyTerm()) + SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTermV1(), new OntologyTermV1(), new OntologyTermV1()) SampleRegistrationRequest sampleRegistrationRequest = new SampleRegistrationRequest("my_label", "my patient", BatchId.create(), ExperimentId.create(), 5, sampleOrigin, AnalysisMethod.ATAC_SEQ, "no comment") SampleCode sampleCode = SampleCode.create("QABCDE") sampleCodeService.generateFor(projectId) >> Result.fromValue(sampleCode) @@ -59,7 +59,7 @@ class SampleRegistrationServiceSpec extends Specification { def "Valid SampleRegistrationRequests returns a Result with the list of registered Samples"() { given: - SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTerm(), new OntologyTerm(), new OntologyTerm()) + SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTermV1(), new OntologyTermV1(), new OntologyTermV1()) SampleRegistrationRequest sampleRegistrationRequest = new SampleRegistrationRequest("my_label", "my patient", BatchId.create(), ExperimentId.create(), 4, sampleOrigin, AnalysisMethod.ATAC_SEQ, "a comment") SampleCode sampleCode = SampleCode.create("QABCDE") Sample sample = Sample.create(sampleCode, sampleRegistrationRequest) @@ -82,7 +82,7 @@ class SampleRegistrationServiceSpec extends Specification { def "If project cannot be found, valid SampleRegistrationRequests returns a Result containing a SAMPLE_REGISTRATION_FAILED response code"() { given: - SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTerm(), new OntologyTerm(), new OntologyTerm()) + SampleOrigin sampleOrigin = SampleOrigin.create(new OntologyTermV1(), new OntologyTermV1(), new OntologyTermV1()) SampleRegistrationRequest sampleRegistrationRequest = new SampleRegistrationRequest("my_label", "my patient", BatchId.create(), ExperimentId.create(), 4, sampleOrigin, AnalysisMethod.ATAC_SEQ, "a comment") SampleCode sampleCode = SampleCode.create("QABCDE") Sample sample = Sample.create(sampleCode, sampleRegistrationRequest) diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/application/api/AsyncProjectServiceImplTest.java b/project-management/src/test/groovy/life/qbic/projectmanagement/application/api/AsyncProjectServiceImplTest.java index 2ba1a2dfb5..cd97e7c297 100644 --- a/project-management/src/test/groovy/life/qbic/projectmanagement/application/api/AsyncProjectServiceImplTest.java +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/application/api/AsyncProjectServiceImplTest.java @@ -8,6 +8,8 @@ import java.time.temporal.ChronoUnit; import java.util.Random; import java.util.UUID; +import java.util.function.Predicate; +import life.qbic.projectmanagement.application.AddExperimentToProjectService; import life.qbic.projectmanagement.application.ProjectInformationService; import life.qbic.projectmanagement.application.api.AsyncProjectService.ProjectDesign; import life.qbic.projectmanagement.application.api.AsyncProjectService.ProjectUpdateRequest; @@ -41,6 +43,8 @@ class AsyncProjectServiceImplTest { ExperimentInformationService.class); TerminologyService terminologyService = mock(TerminologyService.class); SpeciesLookupService taxaService = mock(SpeciesLookupService.class); + AddExperimentToProjectService addExperimentToProjectService = mock( + AddExperimentToProjectService.class); @BeforeEach void setUp() { @@ -67,7 +71,8 @@ void updateProjectDesignCompletes() { measurementValidationService, experimentInformationServiceMock, terminologyService, - taxaService + taxaService, + addExperimentToProjectService ); String projectId = UUID.randomUUID().toString(); @@ -107,7 +112,8 @@ void updateProjectDesignRepeats() { measurementValidationService, experimentInformationServiceMock, terminologyService, - taxaService + taxaService, + addExperimentToProjectService ); String projectId = UUID.randomUUID().toString(); diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/domain/model/OntologyTermV2Spec.groovy b/project-management/src/test/groovy/life/qbic/projectmanagement/domain/model/OntologyTermV2Spec.groovy new file mode 100644 index 0000000000..5592a75bce --- /dev/null +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/domain/model/OntologyTermV2Spec.groovy @@ -0,0 +1,33 @@ +package life.qbic.projectmanagement.domain.model + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature +import spock.lang.Specification + +class OntologyTermV2Spec extends Specification { + private final OntologyTermV2 exampleOntologyTerm = new OntologyTermV2("colorectal adenocarcinoma cell", "Adenocarcinoma cell related to the colon and/or rectum.", OntologyTermV2.Curie.parse("BTO:0000035"), URI.create("http://purl.obolibrary.org/obo/BTO_0000035"), "bto") + private final String exampleSerializedOntologyTerm = """\ + { + "label" : "colorectal adenocarcinoma cell", + "description" : "Adenocarcinoma cell related to the colon and/or rectum.", + "oboId" : "BTO:0000035", + "iri" : "http://purl.obolibrary.org/obo/BTO_0000035", + "ontology_name" : "bto" + }\ + """.stripIndent() + private static final ObjectMapper objectMapper = new ObjectMapper() + + void setup() { + objectMapper.enable(SerializationFeature.INDENT_OUTPUT) + } + + def "serialization produces expected string"() { + expect: + objectMapper.writeValueAsString(exampleOntologyTerm) == exampleSerializedOntologyTerm + } + + def "deserialization works as expected"() { + expect: + new ObjectMapper().readValue(exampleSerializedOntologyTerm, OntologyTermV2.class) == exampleOntologyTerm + } +} diff --git a/project-management/src/test/groovy/life/qbic/projectmanagement/domain/service/SampleDomainServiceSpec.groovy b/project-management/src/test/groovy/life/qbic/projectmanagement/domain/service/SampleDomainServiceSpec.groovy index caff1e3088..f5ac52482f 100644 --- a/project-management/src/test/groovy/life/qbic/projectmanagement/domain/service/SampleDomainServiceSpec.groovy +++ b/project-management/src/test/groovy/life/qbic/projectmanagement/domain/service/SampleDomainServiceSpec.groovy @@ -4,7 +4,7 @@ package life.qbic.projectmanagement.domain.service import life.qbic.domain.concepts.DomainEvent import life.qbic.domain.concepts.DomainEventDispatcher import life.qbic.domain.concepts.DomainEventSubscriber -import life.qbic.projectmanagement.domain.model.OntologyTerm +import life.qbic.projectmanagement.domain.model.OntologyTermV1 import life.qbic.projectmanagement.domain.model.batch.BatchId import life.qbic.projectmanagement.domain.model.experiment.ExperimentId import life.qbic.projectmanagement.domain.model.project.* @@ -24,11 +24,11 @@ class SampleDomainServiceSpec extends Specification { def "When a sample has been successfully registered, a sample registered event is dispatched"() { given: - Sample testSample = Sample.create(SampleCode.create("test"), new SampleRegistrationRequest("test sample", "patient 1", BatchId.create(), ExperimentId.create(), 1L, new SampleOrigin(new OntologyTerm(), new OntologyTerm(), new OntologyTerm()), AnalysisMethod.WES, "")) + Sample testSample = Sample.create(SampleCode.create("test"), new SampleRegistrationRequest("test sample", "patient 1", BatchId.create(), ExperimentId.create(), 1L, new SampleOrigin(new OntologyTermV1(), new OntologyTermV1(), new OntologyTermV1()), AnalysisMethod.WES, "")) Contact who = new Contact() Project project = Project.create(new ProjectIntent(new ProjectTitle("a title"), new ProjectObjective("an objective")), new ProjectCode("QABCD"), who, who, who) Map sampleCodesToRegistrationRequests = new HashMap<>() - SampleRegistrationRequest sampleRegistrationRequest = new SampleRegistrationRequest("test sample", "patient 1", BatchId.create(), ExperimentId.create(), 1L, new SampleOrigin(new OntologyTerm(), new OntologyTerm(), new OntologyTerm()), AnalysisMethod.WES, "") + SampleRegistrationRequest sampleRegistrationRequest = new SampleRegistrationRequest("test sample", "patient 1", BatchId.create(), ExperimentId.create(), 1L, new SampleOrigin(new OntologyTermV1(), new OntologyTermV1(), new OntologyTermV1()), AnalysisMethod.WES, "") sampleCodesToRegistrationRequests.put(SampleCode.create("test"), sampleRegistrationRequest) and: diff --git a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java index 0bdd634ec3..64b7f0a72e 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java +++ b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java @@ -1,5 +1,6 @@ package life.qbic.datamanager; +import life.qbic.application.commons.VirtualThreadScheduler; import life.qbic.broadcasting.Exchange; import life.qbic.broadcasting.MessageBusSubmission; import life.qbic.domain.concepts.SimpleEventStore; @@ -28,7 +29,6 @@ import life.qbic.projectmanagement.application.AppContextProvider; import life.qbic.projectmanagement.application.OrganisationRepository; import life.qbic.projectmanagement.application.ProjectInformationService; -import life.qbic.projectmanagement.application.VirtualThreadScheduler; import life.qbic.projectmanagement.application.api.SampleCodeService; import life.qbic.projectmanagement.application.authorization.acl.ProjectAccessService; import life.qbic.projectmanagement.application.authorization.authorities.AuthorityService; diff --git a/user-interface/src/main/java/life/qbic/datamanager/announcements/AnnouncementServiceImpl.java b/user-interface/src/main/java/life/qbic/datamanager/announcements/AnnouncementServiceImpl.java index 3e26fce4ab..2810d4a6aa 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/announcements/AnnouncementServiceImpl.java +++ b/user-interface/src/main/java/life/qbic/datamanager/announcements/AnnouncementServiceImpl.java @@ -2,7 +2,7 @@ import java.time.Instant; import java.util.Objects; -import life.qbic.datamanager.VirtualThreadScheduler; +import life.qbic.application.commons.VirtualThreadScheduler; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/general/OboIdFormatter.java b/user-interface/src/main/java/life/qbic/datamanager/views/general/OboIdFormatter.java index e2a1f38201..305e6a7104 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/general/OboIdFormatter.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/general/OboIdFormatter.java @@ -1,6 +1,6 @@ package life.qbic.datamanager.views.general; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * Enforce harmonised CURIE formatting @@ -11,7 +11,7 @@ */ public class OboIdFormatter { - public static String render(OntologyTerm term) { + public static String render(OntologyTermV1 term) { return enforceColonSeparator(term.getOboId()); } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/general/OntologyComponent.java b/user-interface/src/main/java/life/qbic/datamanager/views/general/OntologyComponent.java index 21699c6603..3397028249 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/general/OntologyComponent.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/general/OntologyComponent.java @@ -4,11 +4,12 @@ import com.vaadin.flow.component.HasComponents; import com.vaadin.flow.component.Tag; import com.vaadin.flow.component.html.Span; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; @Tag(Tag.DIV) public class OntologyComponent extends Component implements HasComponents { - public OntologyComponent(OntologyTerm contentDTO) { + + public OntologyComponent(OntologyTermV1 contentDTO) { Span ontologyLabel = new Span(contentDTO.getLabel()); ontologyLabel.addClassName("bold"); /* Ontology terms are delimited by a column, the underscore is only used in the web environment*/ diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/navigation/ProjectSideNavigationComponent.java b/user-interface/src/main/java/life/qbic/datamanager/views/navigation/ProjectSideNavigationComponent.java index bec34496c9..fca98352d5 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/navigation/ProjectSideNavigationComponent.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/navigation/ProjectSideNavigationComponent.java @@ -366,9 +366,7 @@ private ExperimentId createExperiment(ProjectId projectId, experimentDraft.getExperimentName(), experimentDraft.getSpecies(), experimentDraft.getSpecimens(), - experimentDraft.getAnalytes(), - experimentDraft.getSpeciesIcon().getLabel(), - experimentDraft.getSpecimenIcon().getLabel()); + experimentDraft.getAnalytes()); if (result.isValue()) { return result.getValue(); diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/ExperimentalInformationLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/ExperimentalInformationLayout.java index fad8cecfde..f9850f94c3 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/ExperimentalInformationLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/ExperimentalInformationLayout.java @@ -22,7 +22,7 @@ import life.qbic.datamanager.views.projects.project.experiments.experiment.ExperimentDetailsComponent.SampleSourceType; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; /** @@ -45,11 +45,11 @@ public ExperimentalInformationLayout( ontologyTermInformationService, terminologyService); final BioIconComboboxFactory bioIconComboboxFactory = new BioIconComboboxFactory(); - MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); + MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); speciesBox.addClassName("box-flexgrow"); - MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); + MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); specimenBox.addClassName("box-flexgrow"); - MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); + MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); TextField nameField = nameField(); experimentalInformationBinder = new Binder<>(ExperimentalInformation.class); @@ -140,9 +140,9 @@ public static class ExperimentalInformation implements Serializable { @Serial private static final long serialVersionUID = -2712521934990738542L; private String experimentName; - private final List species; - private final List specimen; - private final List analytes; + private final List species; + private final List specimen; + private final List analytes; private String speciesIconName; private String specimenIconName; @@ -160,29 +160,29 @@ public void setExperimentName(String experimentName) { this.experimentName = experimentName; } - public List getSpecies() { + public List getSpecies() { return new ArrayList<>(species); } - public void setSpecies(Collection species) { + public void setSpecies(Collection species) { this.species.clear(); this.species.addAll(species); } - public List getSpecimens() { + public List getSpecimens() { return new ArrayList<>(specimen); } - public void setSpecimens(Collection specimen) { + public void setSpecimens(Collection specimen) { this.specimen.clear(); this.specimen.addAll(specimen); } - public List getAnalytes() { + public List getAnalytes() { return new ArrayList<>(analytes); } - public void setAnalytes(Collection analytes) { + public void setAnalytes(Collection analytes) { this.analytes.clear(); this.analytes.addAll(analytes); } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/OntologyComboboxFactory.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/OntologyComboboxFactory.java index cbc8431c58..10e5a53b8d 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/OntologyComboboxFactory.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/create/OntologyComboboxFactory.java @@ -5,14 +5,12 @@ import com.vaadin.flow.component.combobox.MultiSelectComboBox; import com.vaadin.flow.data.provider.CallbackDataProvider.FetchCallback; import com.vaadin.flow.data.renderer.ComponentRenderer; -import java.util.List; import java.util.Objects; import life.qbic.datamanager.views.general.OntologyComponent; import life.qbic.datamanager.views.projects.project.experiments.OntologyFilterConnector; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.Ontology; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * Factory class for creating MultiSelectComboBox instances for different ontology types. It @@ -30,8 +28,8 @@ public OntologyComboboxFactory(SpeciesLookupService speciesLookupService, Termin this.terminologyService = Objects.requireNonNull(terminologyService); } - public MultiSelectComboBox analyteBox() { - MultiSelectComboBox box = newBox(); + public MultiSelectComboBox analyteBox() { + MultiSelectComboBox box = newBox(); box.setItems(ontologyTermFetchCallback()); box.setPlaceholder("Search and select one or more analytes for your samples"); @@ -40,18 +38,18 @@ public MultiSelectComboBox analyteBox() { return box; } - private FetchCallback speciesFetchCallback() { + private FetchCallback speciesFetchCallback() { return query -> OntologyFilterConnector.loadOntologyTerms(query, speciesLookupService); } - private FetchCallback ontologyTermFetchCallback() { + private FetchCallback ontologyTermFetchCallback() { return query -> OntologyFilterConnector.loadOntologyTerms(query, terminologyService); } - public MultiSelectComboBox speciesBox() { + public MultiSelectComboBox speciesBox() { - MultiSelectComboBox box = newBox(); + MultiSelectComboBox box = newBox(); box.setItems(speciesFetchCallback()); box.setPlaceholder("Search and select one or more species for your samples"); @@ -59,9 +57,9 @@ public MultiSelectComboBox speciesBox() { return box; } - public MultiSelectComboBox specimenBox() { + public MultiSelectComboBox specimenBox() { - MultiSelectComboBox box = newBox(); + MultiSelectComboBox box = newBox(); box.setItems(ontologyTermFetchCallback()); box.setPlaceholder("Search and select one or more specimen for your samples"); @@ -69,8 +67,8 @@ public MultiSelectComboBox specimenBox() { return box; } - private static MultiSelectComboBox newBox() { - MultiSelectComboBox box = new MultiSelectComboBox<>(); + private static MultiSelectComboBox newBox() { + MultiSelectComboBox box = new MultiSelectComboBox<>(); box.setRequired(true); box.setHelperText("Please provide at least two letters to search for entries."); box.setRenderer(new ComponentRenderer<>(OntologyComponent::new)); @@ -80,10 +78,9 @@ private static MultiSelectComboBox newBox() { return box; } - private static String ontologyItemFormatted(OntologyTerm ontologyTerm) { - String ontologyLinkName = ontologyTerm.getOboId().replace("_", ":"); - return String.format("%s (%s)", ontologyTerm.getLabel(), ontologyLinkName); + private static String ontologyItemFormatted(OntologyTermV1 ontologyTermV1) { + String ontologyLinkName = ontologyTermV1.getOboId().replace("_", ":"); + return String.format("%s (%s)", ontologyTermV1.getLabel(), ontologyLinkName); } } - diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/overview/ProjectOverviewMain.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/overview/ProjectOverviewMain.java index d1a4af339c..e3b5435dfc 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/overview/ProjectOverviewMain.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/overview/ProjectOverviewMain.java @@ -199,9 +199,7 @@ private void createProject(ConfirmEvent confirmEvent) { experimentalInformation.getExperimentName(), experimentalInformation.getSpecies(), experimentalInformation.getSpecimens(), - experimentalInformation.getAnalytes(), - experimentalInformation.getSpeciesIcon().getLabel(), - experimentalInformation.getSpecimenIcon().getLabel()); + experimentalInformation.getAnalytes()); handleResultExperiment(experiment, confirmEvent); projectCollectionComponent.refresh(); projectCollectionComponent.resetSearch(); diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/OntologyFilterConnector.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/OntologyFilterConnector.java index 9d24f23820..95cfa19cb5 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/OntologyFilterConnector.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/OntologyFilterConnector.java @@ -8,8 +8,7 @@ import life.qbic.projectmanagement.application.ontology.OntologyClass; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.Ontology; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * Connects the OntologyTermInformationService to a Combobox of variable type, setting up a user- @@ -21,14 +20,14 @@ private OntologyFilterConnector() { } - public static Stream loadOntologyTerms(Query query, + public static Stream loadOntologyTerms(Query query, TerminologyService terminologyService) { return terminologyService.query(query.getFilter().orElse(""), query.getOffset(), query.getLimit()).stream().distinct(); } - public static Stream loadOntologyTerms( - Query query, + public static Stream loadOntologyTerms( + Query query, SpeciesLookupService ontologyTermInformationService) { List sortOrders = query.getSortOrders().stream() .map(querySortOrder -> new SortOrder(querySortOrder.getSorted(), @@ -39,7 +38,7 @@ public static Stream loadOntologyTerms( query.getOffset(), query.getLimit(), sortOrders); - return ontologyClassEntities.stream().map(OntologyTerm::from).distinct(); + return ontologyClassEntities.stream().map(OntologyTermV1::from).distinct(); } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/ExperimentDetailsComponent.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/ExperimentDetailsComponent.java index 2f1e79a07c..ff5cafed38 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/ExperimentDetailsComponent.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/ExperimentDetailsComponent.java @@ -81,7 +81,7 @@ import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; import life.qbic.projectmanagement.application.sample.SampleInformationService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.Experiment; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.experiment.ExperimentalDesign; @@ -170,7 +170,7 @@ public ExperimentDetailsComponent( } - private static ComponentRenderer createOntologyRenderer() { + private static ComponentRenderer createOntologyRenderer() { return new ComponentRenderer<>(ontologyClassDTO -> { Span ontology = new Span(); Span ontologyLabel = new Span(ontologyClassDTO.getLabel()); @@ -258,7 +258,7 @@ private void onEditButtonClicked() { "Experiment information could not be retrieved from service"); } - Map> usedTerms = getOntologyTermsUsedInSamples( + Map> usedTerms = getOntologyTermsUsedInSamples( experimentId); optionalExperiment.ifPresent(experiment -> { @@ -294,23 +294,23 @@ private void showCancelConfirmationDialog(EditExperimentDialog editExperimentDia .open(); } - private Map> getOntologyTermsUsedInSamples( + private Map> getOntologyTermsUsedInSamples( ExperimentId experimentId) { - Map> result = new EnumMap<>(SampleOriginType.class); + Map> result = new EnumMap<>(SampleOriginType.class); Collection samples = sampleInformationService.retrieveSamplesForExperiment(experimentId) .valueOrElse(new ArrayList<>()); - Set speciesSet = samples.stream() + Set speciesSet = samples.stream() .map(sample -> sample.sampleOrigin().getSpecies()) .collect(Collectors.toSet()); result.put(SPECIES, speciesSet); - Set specimenSet = samples.stream() + Set specimenSet = samples.stream() .map(sample -> sample.sampleOrigin().getSpecimen()) .collect(Collectors.toSet()); result.put(SPECIMEN, specimenSet); - Set analyteSet = samples.stream() + Set analyteSet = samples.stream() .map(sample -> sample.sampleOrigin().getAnalyte()) .collect(Collectors.toSet()); result.put(ANALYTE, analyteSet); @@ -328,9 +328,7 @@ private void onExperimentUpdateEvent(ExperimentUpdateEvent event) { experimentDraft.getExperimentName(), experimentDraft.getSpecies(), experimentDraft.getSpecimens(), - experimentDraft.getAnalytes(), - experimentDraft.getSpeciesIcon().getLabel(), - experimentDraft.getSpecimenIcon().getLabel()); + experimentDraft.getAnalytes()); reloadExperimentInfo(projectId, experimentId); event.getSource().close(); } @@ -658,7 +656,7 @@ private void addSampleSourceInformationComponent() { } private Div createSampleSourceList(String titleText, AbstractIcon icon, - List ontologyClasses) { + List ontologyClasses) { icon.addClassName("primary"); Div sampleSource = new Div(); sampleSource.addClassName("sample-source"); @@ -675,9 +673,9 @@ private Div createSampleSourceList(String titleText, AbstractIcon icon, private void loadSampleSources(Experiment experiment) { sampleSourceComponent.removeAll(); - List speciesTags = new ArrayList<>(experiment.getSpecies()); - List specimenTags = new ArrayList<>(experiment.getSpecimens()); - List analyteTags = new ArrayList<>(experiment.getAnalytes()); + List speciesTags = new ArrayList<>(experiment.getSpecies()); + List specimenTags = new ArrayList<>(experiment.getSpecimens()); + List analyteTags = new ArrayList<>(experiment.getAnalytes()); BioIcon speciesIcon = BioIcon.getOptionsForType(SampleSourceType.SPECIES).stream() .filter(icon -> icon.label.equals(experiment.getSpeciesIconName())).findFirst() diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/create/AddExperimentDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/create/AddExperimentDialog.java index d56bd66a02..fdbc878f41 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/create/AddExperimentDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/create/AddExperimentDialog.java @@ -27,7 +27,7 @@ import life.qbic.datamanager.views.projects.project.experiments.experiment.ExperimentDetailsComponent.SampleSourceType; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * AddExperimentDialog @@ -65,21 +65,21 @@ public AddExperimentDialog( "Please specify the sample origin information of the samples. Multiple " + "values are allowed!"); - MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); + MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); speciesBox.addClassName("box-flexgrow"); binder.forField(speciesBox) .asRequired("Please select at least one species") .bind(experimentDraft -> new HashSet<>(experimentDraft.getSpecies()), ExperimentDraft::setSpecies); - MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); + MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); specimenBox.addClassName("box-flexgrow"); binder.forField(specimenBox) .asRequired("Please select at least one specimen") .bind(experimentDraft -> new HashSet<>(experimentDraft.getSpecimens()), ExperimentDraft::setSpecimens); - MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); + MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); binder.forField(analyteBox) .asRequired("Please select at least one analyte") .bind(experimentDraft -> new HashSet<>(experimentDraft.getAnalytes()), @@ -189,9 +189,9 @@ public static class ExperimentDraft implements Serializable { private static final long serialVersionUID = -2259332255266132217L; private String experimentName; - private final List species; - private final List specimen; - private final List analytes; + private final List species; + private final List specimen; + private final List analytes; private String speciesIconName; private String specimenIconName; @@ -209,29 +209,29 @@ public void setExperimentName(String experimentName) { this.experimentName = experimentName; } - public List getSpecies() { + public List getSpecies() { return new ArrayList<>(species); } - public void setSpecies(Collection species) { + public void setSpecies(Collection species) { this.species.clear(); this.species.addAll(species); } - public List getSpecimens() { + public List getSpecimens() { return new ArrayList<>(specimen); } - public void setSpecimens(Collection specimen) { + public void setSpecimens(Collection specimen) { this.specimen.clear(); this.specimen.addAll(specimen); } - public List getAnalytes() { + public List getAnalytes() { return new ArrayList<>(analytes); } - public void setAnalytes(Collection analytes) { + public void setAnalytes(Collection analytes) { this.analytes.clear(); this.analytes.addAll(analytes); } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/update/EditExperimentDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/update/EditExperimentDialog.java index e922344d9e..81306b3f0e 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/update/EditExperimentDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/experiments/experiment/update/EditExperimentDialog.java @@ -36,7 +36,7 @@ import life.qbic.datamanager.views.projects.project.experiments.experiment.components.ExistingSamplesPreventSampleOriginEdit; import life.qbic.projectmanagement.application.ontology.SpeciesLookupService; import life.qbic.projectmanagement.application.ontology.TerminologyService; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; /** * EditExperimentDialog @@ -52,7 +52,7 @@ public class EditExperimentDialog extends DialogWindow { @Serial private static final long serialVersionUID = 2142928219461555700L; private final Binder binder = new Binder<>(); - private Map> usedSampleOrigins; + private Map> usedSampleOrigins; public EditExperimentDialog(SpeciesLookupService ontologyTermInformationService, TerminologyService terminologyService) { @@ -73,7 +73,7 @@ public EditExperimentDialog(SpeciesLookupService ontologyTermInformationService, "Please specify the sample origin information of the samples. Multiple " + "values are allowed!"); - MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); + MultiSelectComboBox speciesBox = ontologyComboboxFactory.speciesBox(); speciesBox.addClassName("box-flexgrow"); binder.forField(speciesBox) .asRequired("Please select at least one species") @@ -87,7 +87,7 @@ public EditExperimentDialog(SpeciesLookupService ontologyTermInformationService, .bind(ExperimentDraft::getSpeciesIcon, ExperimentDraft::setSpeciesIcon); - MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); + MultiSelectComboBox specimenBox = ontologyComboboxFactory.specimenBox(); specimenBox.addClassName("box-flexgrow"); binder.forField(specimenBox) .asRequired("Please select at least one specimen") @@ -101,7 +101,7 @@ public EditExperimentDialog(SpeciesLookupService ontologyTermInformationService, .bind(ExperimentDraft::getSpecimenIcon, ExperimentDraft::setSpecimenIcon); - MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); + MultiSelectComboBox analyteBox = ontologyComboboxFactory.analyteBox(); binder.forField(analyteBox) .asRequired("Please select at least one analyte") .bind(experimentDraft -> new HashSet<>(experimentDraft.getAnalytes()), @@ -131,11 +131,11 @@ public EditExperimentDialog(SpeciesLookupService ontologyTermInformationService, } private void initOriginEditListener( - MultiSelectComboBox originBox, SampleOriginType originType) { - ValueChangeListener, - Set>> valueChangeListener = valueChangeEvent -> { - Set missing = new HashSet<>(); - for (OntologyTerm term : usedSampleOrigins.get(originType)) { + MultiSelectComboBox originBox, SampleOriginType originType) { + ValueChangeListener, + Set>> valueChangeListener = valueChangeEvent -> { + Set missing = new HashSet<>(); + for (OntologyTermV1 term : usedSampleOrigins.get(originType)) { if (!valueChangeEvent.getValue().contains(term) && valueChangeEvent.isFromClient()) { missing.add(term); @@ -150,7 +150,7 @@ private void initOriginEditListener( originBox.addValueChangeListener(valueChangeListener); } - private void showSamplesPreventOriginEdit(OntologyTerm species) { + private void showSamplesPreventOriginEdit(OntologyTermV1 species) { ExistingSamplesPreventSampleOriginEdit samplesPreventSampleOriginEdit = new ExistingSamplesPreventSampleOriginEdit( species.getLabel()); samplesPreventSampleOriginEdit.addConfirmListener( @@ -185,7 +185,7 @@ public void close() { } public void setExperiment(ExperimentDraft experiment, - Map> usedTerms) { + Map> usedTerms) { this.usedSampleOrigins = usedTerms; binder.setBean(experiment); } @@ -245,9 +245,9 @@ public static class ExperimentDraft implements Serializable { @Serial private static final long serialVersionUID = 5584396740927480418L; - private final List species; - private final List specimen; - private final List analytes; + private final List species; + private final List specimen; + private final List analytes; private String experimentName; private String speciesIconName; private String specimenIconName; @@ -266,29 +266,29 @@ public void setExperimentName(String experimentName) { this.experimentName = experimentName; } - public List getSpecies() { + public List getSpecies() { return new ArrayList<>(species); } - public void setSpecies(Collection species) { + public void setSpecies(Collection species) { this.species.clear(); this.species.addAll(species); } - public List getSpecimens() { + public List getSpecimens() { return new ArrayList<>(specimen); } - public void setSpecimens(Collection specimen) { + public void setSpecimens(Collection specimen) { this.specimen.clear(); this.specimen.addAll(specimen); } - public List getAnalytes() { + public List getAnalytes() { return new ArrayList<>(analytes); } - public void setAnalytes(Collection analytes) { + public void setAnalytes(Collection analytes) { this.analytes.clear(); this.analytes.addAll(analytes); } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/info/ProjectInformationMain.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/info/ProjectInformationMain.java index fda37218aa..2c4f9510e4 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/info/ProjectInformationMain.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/info/ProjectInformationMain.java @@ -371,9 +371,7 @@ private ExperimentId createExperiment(ProjectId projectId, experimentDraft.getExperimentName(), experimentDraft.getSpecies(), experimentDraft.getSpecimens(), - experimentDraft.getAnalytes(), - experimentDraft.getSpeciesIcon().getLabel(), - experimentDraft.getSpecimenIcon().getLabel()); + experimentDraft.getAnalytes()); if (result.isValue()) { return result.getValue(); } else { diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementDetailsComponent.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementDetailsComponent.java index 9b3e51a8a5..160acfcaf0 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementDetailsComponent.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementDetailsComponent.java @@ -52,7 +52,7 @@ import life.qbic.projectmanagement.application.measurement.MeasurementService; import life.qbic.projectmanagement.application.sample.SampleInformationService; import life.qbic.projectmanagement.domain.Organisation; -import life.qbic.projectmanagement.domain.model.OntologyTerm; +import life.qbic.projectmanagement.domain.model.OntologyTermV1; import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; import life.qbic.projectmanagement.domain.model.measurement.NGSIndex; import life.qbic.projectmanagement.domain.model.measurement.NGSMeasurement; @@ -465,7 +465,7 @@ private Anchor renderOrganisation(Organisation organisation) { return organisationAnchor; } - private ComponentRenderer renderInstrument() { + private ComponentRenderer renderInstrument() { return new ComponentRenderer<>(instrument -> { Span instrumentLabel = new Span(instrument.getLabel()); Span instrumentOntologyLink = new Span(instrument.getOboId().replace("_", ":"));