Skip to content

Commit f6b97a0

Browse files
MARS receipt with exception handling for isajson-biosamples
1 parent 225f4dc commit f6b97a0

File tree

3 files changed

+71
-46
lines changed

3 files changed

+71
-46
lines changed

repository-services/isajson-biosamples/src/main/java/com/elixir/biohackaton/ISAToSRA/biosamples/controller/BioSampleSubmissionController.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String performSubmissionToBioSamplesAndEna(
6565
return marsReceiptService.convertMarsReceiptToJson();
6666
} catch (final MarsReceiptException e) {
6767
log.error("Mars receipt excption", e);
68-
marsReceiptService.setMarsReceiptErrors(e.getReceiptErrorMessage());
68+
marsReceiptService.setMarsReceiptErrors(e.getError());
6969
return marsReceiptService.convertMarsReceiptToJson();
7070
} catch (final Exception e) {
7171
log.error("Internal server error", e);
@@ -78,7 +78,7 @@ public List<Study> getStudies(final IsaJson isaJson) {
7878
try {
7979
return isaJson.getInvestigation().getStudies();
8080
} catch (final Exception e) {
81-
throw new MarsReceiptException("Failed to parse ISA JSON and get studies", e);
81+
throw new MarsReceiptException(e, "Failed to parse ISA JSON and get studies");
8282
}
8383
}
8484
}

repository-services/isajson-biosamples/src/main/java/com/elixir/biohackaton/ISAToSRA/biosamples/service/BioSamplesSubmitter.java

+62-40
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
/** Elixir BioHackathon 2022 */
22
package com.elixir.biohackaton.ISAToSRA.biosamples.service;
33

4-
import com.elixir.biohackaton.ISAToSRA.biosamples.model.Attribute;
5-
import com.elixir.biohackaton.ISAToSRA.biosamples.model.BiosampleAccessionsMap;
6-
import com.elixir.biohackaton.ISAToSRA.biosamples.model.Relationship;
7-
import com.elixir.biohackaton.ISAToSRA.biosamples.model.BioSample;
8-
import com.elixir.biohackaton.ISAToSRA.receipt.MarsReceiptException;
9-
import com.elixir.biohackaton.ISAToSRA.receipt.ReceiptAccessionsMap;
10-
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.*;
11-
124
import java.time.Instant;
13-
import java.util.*;
5+
import java.util.ArrayList;
6+
import java.util.Collections;
7+
import java.util.List;
8+
import java.util.Map;
149
import java.util.concurrent.atomic.AtomicReference;
15-
import lombok.extern.slf4j.Slf4j;
10+
11+
import org.springframework.beans.factory.annotation.Autowired;
1612
import org.springframework.core.ParameterizedTypeReference;
1713
import org.springframework.hateoas.EntityModel;
1814
import org.springframework.http.HttpEntity;
@@ -22,10 +18,28 @@
2218
import org.springframework.stereotype.Service;
2319
import org.springframework.web.client.RestTemplate;
2420

21+
import com.elixir.biohackaton.ISAToSRA.biosamples.model.Attribute;
22+
import com.elixir.biohackaton.ISAToSRA.biosamples.model.BioSample;
23+
import com.elixir.biohackaton.ISAToSRA.biosamples.model.BiosampleAccessionsMap;
24+
import com.elixir.biohackaton.ISAToSRA.biosamples.model.Relationship;
25+
import com.elixir.biohackaton.ISAToSRA.receipt.MarsReceiptException;
26+
import com.elixir.biohackaton.ISAToSRA.receipt.ReceiptAccessionsMap;
27+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Category;
28+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Characteristic;
29+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Sample;
30+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Source;
31+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Study;
32+
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.Value;
33+
34+
import lombok.extern.slf4j.Slf4j;
35+
2536
@Service
2637
@Slf4j
2738
public class BioSamplesSubmitter {
2839

40+
@Autowired
41+
private MarsReceiptService marsReceiptService;
42+
2943
public BiosampleAccessionsMap createBioSamples(final List<Study> studies, final String webinToken) {
3044
final BiosampleAccessionsMap typeToBioSamplesAccessionMap = new BiosampleAccessionsMap();
3145

@@ -39,7 +53,7 @@ public BiosampleAccessionsMap createBioSamples(final List<Study> studies, final
3953
}
4054
}
4155

42-
typeToBioSamplesAccessionMap.sourceAccessionsMap.keyName = Source.Fields.name;
56+
typeToBioSamplesAccessionMap.sourceAccessionsMap.isaItemName = Source.Fields.name;
4357
typeToBioSamplesAccessionMap.sourceAccessionsMap.accessionMap.put(
4458
sourceBioSample.getName(),
4559
sourceBioSample.getAccession());
@@ -52,36 +66,44 @@ public BiosampleAccessionsMap createBioSamples(final List<Study> studies, final
5266
typeToBioSamplesAccessionMap.studyAccessionsMap = new ReceiptAccessionsMap(
5367
Study.Fields.title,
5468
study.getTitle());
55-
5669
study
5770
.getMaterials()
5871
.getSamples()
5972
.forEach(
6073
sample -> {
61-
final BioSample persistedChildSample = this.createAndUpdateChildSampleWithRelationship(
62-
sample,
63-
sourceBioSample.getAccession(),
64-
finalSourceBioSampleOrganismAttribute.getValue(),
65-
webinToken);
66-
67-
if (persistedChildSample != null) {
68-
final Characteristic biosampleAccessionCharacteristic = getBioSampleAccessionCharacteristic(
69-
new AtomicReference<>(persistedChildSample));
70-
final ArrayList<Characteristic> sampleCharacteristics = sample.getCharacteristics() != null
71-
? sample.getCharacteristics()
72-
: new ArrayList<>();
73-
sampleCharacteristics.add(biosampleAccessionCharacteristic);
74-
75-
typeToBioSamplesAccessionMap.sampleAccessionsMap.keyName = Sample.Fields.name;
76-
typeToBioSamplesAccessionMap.sampleAccessionsMap.accessionMap.put(
77-
persistedChildSample.getName(),
78-
persistedChildSample.getAccession());
74+
try {
75+
final BioSample persistedChildSample = this.createAndUpdateChildSampleWithRelationship(
76+
sample,
77+
sourceBioSample.getAccession(),
78+
finalSourceBioSampleOrganismAttribute.getValue(),
79+
webinToken);
80+
81+
if (persistedChildSample != null) {
82+
final Characteristic biosampleAccessionCharacteristic = getBioSampleAccessionCharacteristic(
83+
new AtomicReference<>(persistedChildSample));
84+
final ArrayList<Characteristic> sampleCharacteristics = sample
85+
.getCharacteristics() != null
86+
? sample.getCharacteristics()
87+
: new ArrayList<>();
88+
sampleCharacteristics.add(biosampleAccessionCharacteristic);
89+
90+
typeToBioSamplesAccessionMap.sampleAccessionsMap.isaItemName = Sample.Fields.name;
91+
typeToBioSamplesAccessionMap.sampleAccessionsMap.accessionMap.put(
92+
persistedChildSample.getName(),
93+
persistedChildSample.getAccession());
94+
}
95+
} catch (Exception e) {
96+
throw new MarsReceiptException(e,
97+
"Failed to parse ISA Json and create samples in BioSamples (SAMPLE)",
98+
marsReceiptService.getSampleMarsPath(
99+
Map.entry(Study.Fields.title, study.title),
100+
Map.entry(Sample.Fields.id, sample.id)));
79101
}
80102
});
81103
});
82104
}
83105
} catch (final Exception e) {
84-
throw new MarsReceiptException("Failed to parse ISA Json and create samples in BioSamples", e);
106+
throw new MarsReceiptException(e, "Failed to parse ISA Json and create samples in BioSamples");
85107
}
86108

87109
return typeToBioSamplesAccessionMap;
@@ -96,8 +118,8 @@ private BioSample createAndUpdateChildSampleWithRelationship(
96118
.withRelease(Instant.now())
97119
.withAttributes(
98120
List.of(Attribute.build("organism", parentSampleOrganism),
99-
Attribute.build("collection date", "not provided"),
100-
Attribute.build("geographic location (country and/or sea)", "not provided")))
121+
Attribute.build("collection date", "not provided"),
122+
Attribute.build("geographic location (country and/or sea)", "not provided")))
101123
.build();
102124
try {
103125
final EntityModel<BioSample> persistedSampleEntity = this.createSampleInBioSamples(bioSample, webinToken);
@@ -123,7 +145,7 @@ private BioSample createAndUpdateChildSampleWithRelationship(
123145
return null;
124146
}
125147
} catch (final Exception e) {
126-
throw new MarsReceiptException("Failed to handle child samples", e);
148+
throw new MarsReceiptException(e, "Failed to handle child samples");
127149
}
128150
}
129151

@@ -151,8 +173,8 @@ private BioSample createSourceBioSample(final List<Study> studies, final String
151173
final BioSample sourceSample = new BioSample.Builder(source.getName())
152174
.withRelease(Instant.now())
153175
.withAttributes(List.of(organismAttribute.get(),
154-
Attribute.build("collection date", "not provided"),
155-
Attribute.build("geographic location (country and/or sea)", "not provided")))
176+
Attribute.build("collection date", "not provided"),
177+
Attribute.build("geographic location (country and/or sea)", "not provided")))
156178
.build();
157179
final EntityModel<BioSample> persistedParentSampleEntity = this.createSampleInBioSamples(sourceSample,
158180
webinToken);
@@ -205,8 +227,8 @@ private BioSample updateSampleWithRelationshipsToBioSamples(
205227
new ParameterizedTypeReference<>() {
206228
});
207229
return biosamplesResponse.getBody().getContent();
208-
} catch (final Exception ex) {
209-
throw new MarsReceiptException("Failed to add relationships to child samples", ex);
230+
} catch (final Exception e) {
231+
throw new MarsReceiptException(e, "Failed to add relationships to child samples");
210232
}
211233
}
212234

@@ -227,8 +249,8 @@ private EntityModel<BioSample> createSampleInBioSamples(
227249
});
228250

229251
return biosamplesResponse.getBody();
230-
} catch (final Exception ex) {
231-
throw new MarsReceiptException("Failed to create samples in BioSamples", ex);
252+
} catch (final Exception e) {
253+
throw new MarsReceiptException(e, "Failed to create samples in BioSamples");
232254
}
233255
}
234256

repository-services/isajson-biosamples/src/main/java/com/elixir/biohackaton/ISAToSRA/biosamples/service/MarsReceiptService.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.elixir.biohackaton.ISAToSRA.biosamples.model.BiosampleAccessionsMap;
1111
import com.elixir.biohackaton.ISAToSRA.receipt.MarsReceiptProvider;
1212
import com.elixir.biohackaton.ISAToSRA.receipt.isamodel.IsaJson;
13+
import com.elixir.biohackaton.ISAToSRA.receipt.marsmodel.MarsError;
1314
import com.elixir.biohackaton.ISAToSRA.receipt.marsmodel.MarsErrorType;
1415
import com.fasterxml.jackson.annotation.JsonInclude;
1516
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -51,13 +52,15 @@ public void setMarsReceiptErrors(String... errors) {
5152
super.setMarsReceiptErrors(MarsErrorType.INVALID_METADATA, errors);
5253
}
5354

55+
public void setMarsReceiptErrors(MarsError... errors) {
56+
super.setMarsReceiptErrors(MarsErrorType.INVALID_METADATA, errors);
57+
}
58+
5459
/**
5560
* Converting BioSample receipt to Mars data format
5661
*
57-
* @see
58-
* https://github.com/elixir-europe/MARS/blob/refactor/repository-services/repository-api.md#response
59-
* @param biosampleAccessionsMap {@link BiosampleAccessionsMap} Receipt from
60-
* Biosample
62+
* @see <a href='https://github.com/elixir-europe/MARS/blob/main/repository-services/repository-api.md#response'>Repository API Specification</a>
63+
* @param biosampleAccessionsMap {@link BiosampleAccessionsMap} Receipt from Biosample
6164
* @param isaJson {@link IsaJson} Requested ISA-Json
6265
*/
6366
public void convertReceiptToMars(final BiosampleAccessionsMap biosampleAccessionsMap, final IsaJson isaJson) {

0 commit comments

Comments
 (0)