Skip to content

Commit

Permalink
Checkin Progress
Browse files Browse the repository at this point in the history
  • Loading branch information
sven1103 committed Sep 6, 2024
1 parent 1c6fbb6 commit cb6560b
Show file tree
Hide file tree
Showing 17 changed files with 211 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package life.qbic.projectmanagement.application.measurement.validation;
package life.qbic.projectmanagement.application;

public class ValidationException extends RuntimeException {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package life.qbic.projectmanagement.application.measurement.validation;
package life.qbic.projectmanagement.application;

import java.util.ArrayList;
import java.util.Collection;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import java.util.regex.Pattern;
import life.qbic.logging.api.Logger;
import life.qbic.projectmanagement.application.ProjectInformationService;
import life.qbic.projectmanagement.application.ValidationException;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.application.measurement.MeasurementService;
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
import life.qbic.projectmanagement.application.ontology.TerminologyService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import java.util.regex.Pattern;
import life.qbic.logging.api.Logger;
import life.qbic.projectmanagement.application.ProjectInformationService;
import life.qbic.projectmanagement.application.ValidationException;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.application.measurement.MeasurementService;
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
import life.qbic.projectmanagement.application.ontology.TerminologyService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.Collection;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
import life.qbic.projectmanagement.domain.model.project.ProjectId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package life.qbic.projectmanagement.application.measurement.validation;

import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;
import life.qbic.projectmanagement.domain.model.project.ProjectId;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package life.qbic.datamanager.parser;
package life.qbic.projectmanagement.application.sample;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -15,7 +15,7 @@
*
* @since 1.5.0
*/
public class PropertyToString {
public class PropertyConversion {

private static final String CONDITION_VARIABLE_LEVEL_UNIT_TEMPLATE = "%s: %s %s"; // <variable name>: <value> [unit]

Expand All @@ -28,7 +28,7 @@ public class PropertyToString {
* <p>
* In its current implementation, the String representation results into a
* <code>;</code>-separated concatenation of {@link VariableLevel}. See
* {@link PropertyToString#variableLevel(VariableLevel)} for more details.
* {@link PropertyConversion#toString(VariableLevel)} for more details.
* <p>
* Example: a condition with the two variable levels <code>size: 20 cm</code> and <code>hue:
* blue</code> will result in:
Expand All @@ -43,11 +43,11 @@ public class PropertyToString {
* @return the String representation
* @since 1.5.0
*/
public static String condition(Condition condition) {
public static String toString(Condition condition) {
Objects.requireNonNull(condition);
List<String> stringValues = new ArrayList<>();
condition.getVariableLevels()
.forEach(variableLevel -> stringValues.add(variableLevel(variableLevel)));
.forEach(variableLevel -> stringValues.add(toString(variableLevel)));
return String.join("; ", stringValues);
}

Expand All @@ -62,7 +62,7 @@ public static String condition(Condition condition) {
* @return the String representation of the variable level
* @since 1.5.0
*/
public static String variableLevel(VariableLevel variableLevel) {
public static String toString(VariableLevel variableLevel) {
Objects.requireNonNull(variableLevel);
if (variableLevel.experimentalValue().unit().isPresent()) {
return CONDITION_VARIABLE_LEVEL_UNIT_TEMPLATE.formatted(variableLevel.variableName().value(),
Expand All @@ -89,8 +89,19 @@ public static String variableLevel(VariableLevel variableLevel) {
* @return the String representation of the ontology term
* @since 1.5.0
*/
public static String ontologyTerm(OntologyTerm ontologyTerm) {
public static String toString(OntologyTerm ontologyTerm) {
Objects.requireNonNull(ontologyTerm);
return ONTOLOGY_TERM.formatted(ontologyTerm.getLabel(), ontologyTerm.getOboId());
}

public static OntologyTerm fromString(String string) throws ParserException {

}

public static class ParserException extends RuntimeException {
public ParserException(String message) {
super(message);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package life.qbic.projectmanagement.application.sample;

import java.util.Optional;

/**
* <b>Sample Metadata</b>
*
* <p>A simple sample metadata DTO to pass them within the application</p>
*
* @since 1.0.0
*/
public record SampleMetadata(String sampleId, String analysisToBePerformed, String sampleName,
String biologicalReplicate, String condition, String specimen,
String analyte, String comment) {

public static SampleMetadata createNew(String analysisToBePerformed, String sampleName,
String biologicalReplicate, String condition, String specimen,
String analyte, String comment) {
return new SampleMetadata("", analysisToBePerformed, sampleName, biologicalReplicate, condition,
specimen, analyte, comment);
}

public static SampleMetadata createUpdate(String sampleId, String analysisToBePerformed,
String sampleName,
String biologicalReplicate, String condition, String specimen,
String analyte, String comment) {
return new SampleMetadata(sampleId, analysisToBePerformed, sampleName, biologicalReplicate,
condition, specimen, analyte, comment);
}

public Optional<String> getSampleId() {
return Optional.ofNullable(sampleId.isBlank() ? null : sampleId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package life.qbic.projectmanagement.application.sample;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import life.qbic.projectmanagement.application.ValidationResult;
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.experiment.Condition;
import life.qbic.projectmanagement.domain.model.experiment.Experiment;
import life.qbic.projectmanagement.domain.model.experiment.ExperimentId;
import life.qbic.projectmanagement.domain.model.experiment.ExperimentalGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* <b><class short description - 1 Line!></b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
*
* @since <version tag>
*/
@Component
public class SampleValidation {

private final SampleInformationService sampleInformationService;

private final ExperimentInformationService experimentInformationService;

private final TerminologyService terminologyService;

private final SpeciesLookupService speciesLookupService;

@Autowired
public SampleValidation(SampleInformationService sampleInformationService,
ExperimentInformationService experimentInformationService,
TerminologyService terminologyService, SpeciesLookupService speciesLookupService) {
this.sampleInformationService = Objects.requireNonNull(sampleInformationService);
this.experimentInformationService = Objects.requireNonNull(experimentInformationService);
this.terminologyService = Objects.requireNonNull(terminologyService);
this.speciesLookupService = Objects.requireNonNull(speciesLookupService);
}

/**
* Creates a lookup table for conditions having their String representation as key.
* <p>
* The String representation is done with the {@link PropertyConversion#toString(Condition)}
* method.
*
* @param conditions the conditions to take for the lookup table build
* @return the lookup table
* @since 1.5.0
*/
private static Map<String, Condition> conditionLookup(List<Condition> conditions) {
return conditions.stream()
.collect(Collectors.toMap(PropertyConversion::toString, Function.identity()));
}

/**
* Validates metadata for a not yet registered sample. The validation does not look for any sample
* id and no sample information lookups are done in this case.
* <p>
* If the client wants to validate the sample id as well, please refer to
* {@link SampleValidation#validateExistingSample(SampleMetadata, String, String)}
*
* @param sampleMetadata the sample metadata to validate
* @param experimentId the experiment id of the experiment the sample belongs to
* @param projectId the project id of project the experiment belongs to
* @return the report of the validation
* @since 1.5.0
*/
public ValidationResult validateNewSample(SampleMetadata sampleMetadata, String experimentId,
String projectId) {
var experimentQuery = experimentInformationService.find(projectId,
ExperimentId.parse(experimentId));
if (experimentQuery.isPresent()) {
return validateWithExperiment(sampleMetadata, experimentQuery.get(), projectId);
} else {
return ValidationResult.withFailures(1, List.of("Unknown experiment."));
}
}

private ValidationResult validateWithExperiment(SampleMetadata sampleMetadata,
Experiment experiment, String projectId) {
var conditionsLookupTable = conditionLookup(experiment.getExperimentalGroups().stream().map(
ExperimentalGroup::condition).toList());

throw new RuntimeException("Not implemented yet");
}

public ValidationResult validateExistingSample(SampleMetadata sampleMetadata, String experimentId,
String projectId) {
throw new RuntimeException("Not yet implemented");
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package life.qbic.projectmanagement.application.sample;

import java.util.Objects;
import life.qbic.projectmanagement.application.ValidationResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* <b><class short description - 1 Line!></b>
*
* <p><More detailed description - When to use, what it solves, etc.></p>
*
* @since <version tag>
*/
@Service
public class SampleValidationService {

private final SampleValidation sampleValidation;

@Autowired
public SampleValidationService(SampleValidation sampleValidation) {
this.sampleValidation = Objects.requireNonNull(sampleValidation);
}

public ValidationResult validateNewSample(SampleMetadata sampleMetadata, String experimentId,
String projectId) {
return sampleValidation.validateNewSample(sampleMetadata, experimentId, projectId);
}


}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package life.qbic.datamanager.templates;

import java.util.List;
import life.qbic.datamanager.parser.PropertyToString;
import life.qbic.projectmanagement.application.sample.PropertyConversion;
import life.qbic.projectmanagement.domain.model.experiment.ExperimentalGroup;
import life.qbic.projectmanagement.domain.model.sample.Sample;
import org.apache.poi.ss.usermodel.DataValidation;
Expand Down Expand Up @@ -254,13 +254,13 @@ private static void fillRowWithSampleMetadata(XSSFRow row, Sample sample,
row.createCell(COLUMN_INDEX_SAMPLE_NAME).setCellValue(sample.label());
row.createCell(COLUMN_INDEX_BIOLOGICAL_REPLICATE).setCellValue(sample.biologicalReplicate());
row.createCell(COLUMN_INDEX_CONDITION)
.setCellValue(PropertyToString.condition(experimentalGroup.condition()));
.setCellValue(PropertyConversion.toString(experimentalGroup.condition()));
row.createCell(COLUMN_INDEX_SPECIES)
.setCellValue(PropertyToString.ontologyTerm(sample.sampleOrigin().getSpecies()));
.setCellValue(PropertyConversion.toString(sample.sampleOrigin().getSpecies()));
row.createCell(COLUMN_INDEX_SPECIMEN)
.setCellValue(PropertyToString.ontologyTerm(sample.sampleOrigin().getSpecimen()));
.setCellValue(PropertyConversion.toString(sample.sampleOrigin().getSpecimen()));
row.createCell(COLUMN_INDEX_ANALYTES)
.setCellValue(PropertyToString.ontologyTerm(sample.sampleOrigin().getAnalyte()));
.setCellValue(PropertyConversion.toString(sample.sampleOrigin().getAnalyte()));
row.createCell(COLUMN_INDEX_COMMENT).setCellValue(sample.comment().orElse(""));
row.createCell(COLUMN_INDEX_SAMPLE_ID).setCellValue(sample.sampleCode().code());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import life.qbic.datamanager.parser.PropertyToString;
import life.qbic.projectmanagement.application.sample.PropertyConversion;
import life.qbic.projectmanagement.application.experiment.ExperimentInformationService;
import life.qbic.projectmanagement.application.sample.SampleInformationService;
import life.qbic.projectmanagement.domain.model.experiment.Experiment;
Expand Down Expand Up @@ -92,11 +92,11 @@ private XSSFWorkbook createPrefilledWorkbookFromExperiment(Experiment experiment
List<Sample> samples) {
var conditions = experiment.getExperimentalGroups().stream().map(ExperimentalGroup::condition)
.map(
PropertyToString::condition).toList();
PropertyConversion::toString).toList();
var experimentalGroups = experiment.getExperimentalGroups();
var species = experiment.getSpecies().stream().map(PropertyToString::ontologyTerm).toList();
var specimen = experiment.getSpecimens().stream().map(PropertyToString::ontologyTerm).toList();
var analytes = experiment.getAnalytes().stream().map(PropertyToString::ontologyTerm).toList();
var species = experiment.getSpecies().stream().map(PropertyConversion::toString).toList();
var specimen = experiment.getSpecimens().stream().map(PropertyConversion::toString).toList();
var analytes = experiment.getAnalytes().stream().map(PropertyConversion::toString).toList();
var analysisMethods = Arrays.stream(AnalysisMethod.values()).map(AnalysisMethod::abbreviation)
.toList();
return SampleBatchTemplate.createUpdateTemplate(samples,
Expand All @@ -108,10 +108,10 @@ private XSSFWorkbook createPrefilledWorkbookFromExperiment(Experiment experiment
private XSSFWorkbook createWorkbookFromExperiment(Experiment experiment) {
var conditions = experiment.getExperimentalGroups().stream().map(ExperimentalGroup::condition)
.map(
PropertyToString::condition).toList();
var species = experiment.getSpecies().stream().map(PropertyToString::ontologyTerm).toList();
var specimen = experiment.getSpecimens().stream().map(PropertyToString::ontologyTerm).toList();
var analytes = experiment.getAnalytes().stream().map(PropertyToString::ontologyTerm).toList();
PropertyConversion::toString).toList();
var species = experiment.getSpecies().stream().map(PropertyConversion::toString).toList();
var specimen = experiment.getSpecimens().stream().map(PropertyConversion::toString).toList();
var analytes = experiment.getAnalytes().stream().map(PropertyConversion::toString).toList();
var analysisMethods = Arrays.stream(AnalysisMethod.values()).map(AnalysisMethod::abbreviation)
.toList();
return SampleBatchTemplate.createRegistrationTemplate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public class ProjectSideNavigationComponent extends Div implements
BeforeEnterObserver {

public static final String PROJECT_ID_ROUTE_PARAMETER = "projectId";
public static final StringEXPERIMENT_ID_ROUTE_PARAMETER = "experimentId";
public static final String EXPERIMENT_ID_ROUTE_PARAMETER = "experimentId";
private static final Logger log = LoggerFactory.logger(ProjectSideNavigationComponent.class);
private final Div content;
private final transient ProjectInformationService projectInformationService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.validation.MeasurementValidationService;
import life.qbic.projectmanagement.application.measurement.validation.ValidationResult;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.domain.model.experiment.Experiment;
import life.qbic.projectmanagement.domain.model.project.ProjectId;
import org.springframework.util.StringUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.concurrent.CompletableFuture;
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.validation.MeasurementValidationService;
import life.qbic.projectmanagement.application.measurement.validation.ValidationResult;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.domain.model.project.ProjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
import java.util.concurrent.CompletableFuture;
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.validation.MeasurementValidationService;
import life.qbic.projectmanagement.application.measurement.validation.ValidationResult;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.domain.model.project.ProjectId;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.concurrent.CompletableFuture;
import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;
import life.qbic.projectmanagement.application.measurement.validation.MeasurementValidationService;
import life.qbic.projectmanagement.application.measurement.validation.ValidationResult;
import life.qbic.projectmanagement.application.ValidationResult;
import life.qbic.projectmanagement.domain.model.project.ProjectId;

/**
Expand Down

0 comments on commit cb6560b

Please sign in to comment.