diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/MeasurementMetadataConverter.java b/user-interface/src/main/java/life/qbic/datamanager/parser/MeasurementMetadataConverter.java index d7db6ef4d..5356b50ef 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/MeasurementMetadataConverter.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/MeasurementMetadataConverter.java @@ -25,17 +25,18 @@ public interface MeasurementMetadataConverter { * * * @param parsingResult the parsing result to take as input for the conversion. - * @param ignoreMeasurementId weather to ignore the measurement identifier or not * @return a list of converted implementations of {@link MeasurementMetadata}. * @throws UnknownMetadataTypeException if no matching implementation of * {@link MeasurementMetadata} can be associated from the * provided {@link ParsingResult#columnMap()}. * @since 1.4.0 */ - List convert(ParsingResult parsingResult, - boolean ignoreMeasurementId) + List convertRegister(ParsingResult parsingResult) throws UnknownMetadataTypeException; + List convertEdit(ParsingResult parsingResult) + throws UnknownMetadataTypeException, MissingSampleIdException; + class UnknownMetadataTypeException extends RuntimeException { public UnknownMetadataTypeException(String message) { diff --git a/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java b/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java index abe31e597..3b4993402 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java +++ b/user-interface/src/main/java/life/qbic/datamanager/parser/MetadataConverter.java @@ -84,14 +84,30 @@ private static Map countHits(Collection target, Set convert(ParsingResult parsingResult, boolean ignoreMeasurementId) + public List convertRegister(ParsingResult parsingResult) throws UnknownMetadataTypeException, MissingSampleIdException { Objects.requireNonNull(parsingResult); var properties = parsingResult.columnMap().keySet(); - if (looksLikeNgsMeasurement(properties, ignoreMeasurementId)) { - return tryConversion(this::convertNGSMeasurement, parsingResult); - } else if (looksLikeProteomicsMeasurement(properties, ignoreMeasurementId)) { - return tryConversion(this::convertProteomicsMeasurement, parsingResult); + if (looksLikeNgsMeasurement(properties, false)) { + return tryConversion(this::convertExistingNGSMeasurement, parsingResult); + } else if (looksLikeProteomicsMeasurement(properties, false)) { + return tryConversion(this::convertNewProteomicsMeasurement, parsingResult); + } else { + throw new UnknownMetadataTypeException( + "Unknown metadata type: cannot match properties to any known metadata type. Provided [%s]".formatted( + String.join(", ", properties))); + } + } + + @Override + public List convertEdit(ParsingResult parsingResult) + throws UnknownMetadataTypeException, MissingSampleIdException { + Objects.requireNonNull(parsingResult); + var properties = parsingResult.columnMap().keySet(); + if (looksLikeNgsMeasurement(properties, true)) { + return tryConversion(this::convertExistingNGSMeasurement, parsingResult); + } else if (looksLikeProteomicsMeasurement(properties, true)) { + return tryConversion(this::convertExistingProteomicsMeasurement, parsingResult); } else { throw new UnknownMetadataTypeException( "Unknown metadata type: cannot match properties to any known metadata type. Provided [%s]".formatted( @@ -108,7 +124,65 @@ private List tryConversion( } } - private List convertProteomicsMeasurement(ParsingResult parsingResult) { + private List convertNewProteomicsMeasurement(ParsingResult parsingResult) { + var result = new ArrayList(); + for (int i = 0; i < parsingResult.rows().size(); i++) { + var sampleCode = SampleCode.create(parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.SAMPLE_ID.headerName(), "")); + var technicalReplicateName = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.TECHNICAL_REPLICATE_NAME.headerName(), ""); + var organisationId = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.ORGANISATION_ID.headerName(), ""); + var msDevice = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.MS_DEVICE.headerName(), ""); + var samplePoolGroup = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.POOL_GROUP.headerName(), ""); + var facility = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.FACILITY.headerName(), ""); + var fractionName = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.CYCLE_FRACTION_NAME.headerName(), ""); + var digestionEnzyme = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.DIGESTION_ENZYME.headerName(), ""); + var digestionMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.DIGESTION_METHOD.headerName(), ""); + var enrichmentMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.ENRICHMENT_METHOD.headerName(), ""); + var injectionVolume = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.INJECTION_VOLUME.headerName(), ""); + var lcColumn = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LC_COLUMN.headerName(), ""); + var lcmsMethod = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LCMS_METHOD.headerName(), ""); + var labelingType = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LABELING_TYPE.headerName(), ""); + var label = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.LABEL.headerName(), ""); + var comment = parsingResult.getValueOrDefault(i, + ProteomicsMeasurementRegisterColumn.COMMENT.headerName(), ""); + var pxpMetaDaturm = new ProteomicsMeasurementMetadata( + "", + sampleCode, + technicalReplicateName, + organisationId, + msDevice, + samplePoolGroup, + facility, + fractionName, + digestionEnzyme, + digestionMethod, + enrichmentMethod, + injectionVolume, + lcColumn, + lcmsMethod, + new Labeling(labelingType, label), + comment); + result.add(pxpMetaDaturm); + } + return result; + } + + private List convertExistingProteomicsMeasurement( + ParsingResult parsingResult) { var result = new ArrayList(); for (int i = 0; i < parsingResult.rows().size(); i++) { var measurementId = parsingResult.getValueOrDefault(i, @@ -166,7 +240,7 @@ private List convertProteomicsMeasurement(ParsingResult par return result; } - private List convertNGSMeasurement(ParsingResult parsingResult) { + private List convertExistingNGSMeasurement(ParsingResult parsingResult) { var result = new ArrayList(); for (int i = 0; i < parsingResult.rows().size(); i++) { @@ -184,7 +258,7 @@ private List convertNGSMeasurement(ParsingResult parsingRes var facility = parsingResult.getValueOrDefault(i, NGSMeasurementEditColumn.FACILITY.headerName(), ""); var sequencingReadType = parsingResult.getValueOrDefault(i, - NGSMeasurementEditColumn.SEQUENCING_RUN_PROTOCOL.headerName(), ""); + NGSMeasurementEditColumn.SEQUENCING_READ_TYPE.headerName(), ""); var libraryKit = parsingResult.getValueOrDefault(i, NGSMeasurementEditColumn.LIBRARY_KIT.headerName(), ""); var flowCell = parsingResult.getValueOrDefault(i, @@ -219,6 +293,58 @@ private List convertNGSMeasurement(ParsingResult parsingRes return result; } + private List convertNewNGSMeasurement(ParsingResult parsingResult) { + var result = new ArrayList(); + + for (int i = 0; i < parsingResult.rows().size(); i++) { + var sampleCodes = List.of( + SampleCode.create( + parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SAMPLE_ID.headerName(), + "")) + ); + var organisationId = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.ORGANISATION_ID.headerName(), ""); + var instrument = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INSTRUMENT.headerName(), ""); + var facility = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.FACILITY.headerName(), ""); + var sequencingReadType = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SEQUENCING_READ_TYPE.headerName(), ""); + var libraryKit = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.LIBRARY_KIT.headerName(), ""); + var flowCell = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.FLOW_CELL.headerName(), ""); + var runProtocol = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.SEQUENCING_RUN_PROTOCOL.headerName(), ""); + var poolGroup = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.POOL_GROUP.headerName(), ""); + var indexI7 = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INDEX_I7.headerName(), ""); + var indexI5 = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.INDEX_I5.headerName(), ""); + var comment = parsingResult.getValueOrDefault(i, + NGSMeasurementRegisterColumn.COMMENT.headerName(), ""); + var metadatum = new NGSMeasurementMetadata( + "", + sampleCodes, + organisationId, + instrument, + facility, + sequencingReadType, + libraryKit, + flowCell, + runProtocol, + poolGroup, + indexI7, + indexI5, + comment + ); + result.add(metadatum); + } + return result; + } + private boolean looksLikeNgsMeasurement(Collection properties, boolean ignoreID) { var formattedProperties = properties.stream().map(String::toLowerCase) .collect(Collectors.toList()); diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java index f301c4605..6a17c423b 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/projects/project/measurements/MeasurementMetadataUploadDialog.java @@ -9,6 +9,7 @@ import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.ListItem; import com.vaadin.flow.component.html.OrderedList; +import com.vaadin.flow.component.html.OrderedList.NumberingType; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; @@ -210,8 +211,12 @@ private void onUploadSucceeded(SucceededEvent succeededEvent) { }; List result; try { - result = MetadataConverter.measurementConverter() - .convert(parsingResult, mode.equals(MODE.ADD)); + result = switch (mode) { + case ADD -> MetadataConverter.measurementConverter() + .convertRegister(parsingResult); + case EDIT -> MetadataConverter.measurementConverter() + .convertEdit(parsingResult); + }; } catch ( UnknownMetadataTypeException e) { // we want to display this in the dialog, not via the notification system displayError(succeededEvent.getFileName(), @@ -477,7 +482,7 @@ private Div createInvalidDisplayBox(Collection invalidMeasurements) { OrderedList invalidMeasurementsList = new OrderedList( invalidMeasurements.stream().map(ListItem::new).toArray(ListItem[]::new)); invalidMeasurementsList.addClassName("invalid-measurement-list"); - invalidMeasurementsList.setType(OrderedList.NumberingType.NUMBER); + invalidMeasurementsList.setType(NumberingType.NUMBER); validationDetails.add(invalidMeasurementsList); box.add(header, validationDetails, instruction); return box;