diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/admin/AdminController.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/admin/AdminController.java index 78e5ecf..10f7f91 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/admin/AdminController.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/admin/AdminController.java @@ -22,7 +22,6 @@ import uk.ac.ebi.eva.evaseqcol.service.SeqColService; import java.io.IOException; -import java.util.List; @RequestMapping("/admin") @RestController diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/MetadataController.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/MetadataController.java new file mode 100644 index 0000000..8df38e4 --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/MetadataController.java @@ -0,0 +1,37 @@ +package uk.ac.ebi.eva.evaseqcol.controller.seqcol; + +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import uk.ac.ebi.eva.evaseqcol.dto.SeqColMetadataDTO; +import uk.ac.ebi.eva.evaseqcol.service.MetadataService; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/metadata/") +@Tag(name = "Seqcol metadata") +public class MetadataController { + + private final MetadataService metadataService; + + public MetadataController(MetadataService metadataService) { + this.metadataService = metadataService; + } + + @GetMapping(value = "/{digest}") + public ResponseEntity> getSeqColMetadataByDigest(@PathVariable String digest) { + List metadataList = metadataService.getMetadataBySeqColDigest(digest).stream() + .map(SeqColMetadataDTO::toMetadataDTO) + .collect(Collectors.toList()); + if (metadataList.isEmpty()) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok(metadataList); + } +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/dto/SeqColMetadataDTO.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/dto/SeqColMetadataDTO.java new file mode 100644 index 0000000..97b74fe --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/dto/SeqColMetadataDTO.java @@ -0,0 +1,30 @@ +package uk.ac.ebi.eva.evaseqcol.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import uk.ac.ebi.eva.evaseqcol.entities.SeqColEntity; +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; + +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SeqColMetadataDTO { + + private String sourceId; + private String sourceUrl; + private SeqColEntity.NamingConvention namingConvention; + private Date timestamp; + + public static SeqColMetadataDTO toMetadataDTO(SeqColMetadataEntity metadataEntity) { + return new SeqColMetadataDTO( + metadataEntity.getSourceIdentifier(), + metadataEntity.getSourceUrl(), + metadataEntity.getNamingConvention(), + metadataEntity.getTimestamp() + ); + } +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java index 05da0ca..585198a 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java @@ -17,8 +17,6 @@ public abstract class SeqColEntity { protected String digest; // The level 0 digest - protected NamingConvention namingConvention; - public enum NamingConvention { ENA, GENBANK, UCSC, TEST diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java index dd47949..12e85e1 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java @@ -1,26 +1,24 @@ package uk.ac.ebi.eva.evaseqcol.entities; import lombok.Data; -import lombok.NoArgsConstructor; import org.hibernate.annotations.Type; import uk.ac.ebi.eva.evaseqcol.utils.JSONLevelOne; import javax.persistence.Basic; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.Id; -import javax.persistence.IdClass; +import javax.persistence.OneToMany; import javax.persistence.Table; +import java.util.ArrayList; +import java.util.List; @Entity -@NoArgsConstructor @Data @Table(name = "sequence_collections_L1") -@IdClass(SeqColId.class) public class SeqColLevelOneEntity extends SeqColEntity{ @Id @@ -32,15 +30,25 @@ public class SeqColLevelOneEntity extends SeqColEntity{ @Basic(fetch = FetchType.LAZY) private JSONLevelOne seqColLevel1Object; - @Id - @Column(nullable = false) - @Enumerated(EnumType.STRING) - protected NamingConvention namingConvention; + @OneToMany(mappedBy = "seqColLevelOne", cascade = CascadeType.ALL) + private List metadata; + + public SeqColLevelOneEntity() { + this.metadata = new ArrayList<>(); + } - public SeqColLevelOneEntity(String digest, NamingConvention namingConvention, JSONLevelOne jsonLevelOne){ - super(digest, namingConvention); + public SeqColLevelOneEntity(String digest, JSONLevelOne jsonLevelOne, List metadata){ + super(digest); this.seqColLevel1Object = jsonLevelOne; - this.namingConvention = namingConvention; + this.metadata = metadata; + } + + public void addMetadata(SeqColMetadataEntity metadata){ + this.metadata.add(metadata); + } + + public void addAllMetadata(List metadata){ + this.metadata.addAll(metadata); } @Override diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java index e707ae7..a7bea68 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java @@ -24,9 +24,4 @@ public SeqColLevelTwoEntity setDigest(String digest) { this.digest = digest; return this; } - - public SeqColLevelTwoEntity setNamingConvention(NamingConvention convention) { - this.namingConvention = convention; - return this; - } } diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java new file mode 100644 index 0000000..24dfdb3 --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java @@ -0,0 +1,86 @@ +package uk.ac.ebi.eva.evaseqcol.entities; + +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.sql.Timestamp; +import java.util.Date; +import java.util.Objects; + +@Entity +@Table(name = "seqcol_md") +@Data +public class SeqColMetadataEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "md_id") + private Long mdId; + + @Column(name = "source_id") + private String sourceIdentifier; // Eg: INSDC Acession + + private String sourceUrl; + + @Enumerated(EnumType.STRING) + private SeqColEntity.NamingConvention namingConvention; + + @Column(updatable = false) + @Temporal(TemporalType.TIMESTAMP) + @CreationTimestamp + private Date timestamp; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "seqcol_digest") + @OnDelete(action = OnDeleteAction.CASCADE) + private SeqColLevelOneEntity seqColLevelOne; + + public SeqColMetadataEntity setTimestamp(Timestamp timestamp) { + this.timestamp = timestamp; + return this; + } + + public SeqColMetadataEntity setSourceIdentifier(String sourceIdentifier) { + this.sourceIdentifier = sourceIdentifier; + return this; + } + + public SeqColMetadataEntity setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + return this; + } + + public SeqColMetadataEntity setNamingConvention(SeqColEntity.NamingConvention namingConvention) { + this.namingConvention = namingConvention; + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SeqColMetadataEntity)) return false; + SeqColMetadataEntity that = (SeqColMetadataEntity) o; + return Objects.equals(sourceIdentifier, that.sourceIdentifier) && Objects.equals(sourceUrl, that.sourceUrl) + && namingConvention == that.namingConvention && Objects.equals(seqColLevelOne, that.seqColLevelOne); + } + + @Override + public int hashCode() { + return Objects.hash(sourceIdentifier, sourceUrl, namingConvention, seqColLevelOne); + } +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/MetadataRepository.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/MetadataRepository.java new file mode 100644 index 0000000..2002e9e --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/MetadataRepository.java @@ -0,0 +1,17 @@ +package uk.ac.ebi.eva.evaseqcol.repo; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; + +import java.util.List; + +@Repository +public interface MetadataRepository extends JpaRepository { + + @Query(value = "select source_id from seqcol_md",nativeQuery = true) + List findAllSourceIds(); + +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java index 27ff575..dc363bf 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java @@ -5,13 +5,15 @@ import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; +import java.util.Optional; + @Repository public interface SeqColLevelOneRepository extends JpaRepository { - SeqColLevelOneEntity findSeqColLevelOneEntityByDigest(String digest); - + Optional findSeqColLevelOneEntityByDigest(String digest); long countSeqColLevelOneEntitiesByDigest(String digest); void removeSeqColLevelOneEntityByDigest(String digest); void deleteAll(); + } diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/MetadataService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/MetadataService.java new file mode 100644 index 0000000..db670ef --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/MetadataService.java @@ -0,0 +1,34 @@ +package uk.ac.ebi.eva.evaseqcol.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; +import uk.ac.ebi.eva.evaseqcol.repo.MetadataRepository; + +import java.util.List; +import java.util.stream.Collectors; + + +@Service +public class MetadataService { + + private final MetadataRepository metadataRepository; + + @Autowired + public MetadataService(MetadataRepository metadataRepository) { + this.metadataRepository = metadataRepository; + } + + public List getMetadataBySeqColDigest(String seqColDigest) { + return metadataRepository.findAll().stream() + .filter(metadataEntity -> metadataEntity.getSeqColLevelOne().getDigest().equals(seqColDigest)) + .collect(Collectors.toList()); + } + /** + * Return the list of all saved source identifiers. Eg: ["GCA_000146045.2", ...] + * */ + public List getAllSourceIds() { + return metadataRepository.findAllSourceIds(); + } +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java index 2810409..cf19923 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java @@ -2,12 +2,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import uk.ac.ebi.eva.evaseqcol.entities.SeqColEntity; import uk.ac.ebi.eva.evaseqcol.entities.SeqColExtendedDataEntity; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; import uk.ac.ebi.eva.evaseqcol.digests.DigestCalculator; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelTwoEntity; +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; import uk.ac.ebi.eva.evaseqcol.repo.SeqColLevelOneRepository; import uk.ac.ebi.eva.evaseqcol.utils.JSONExtData; import uk.ac.ebi.eva.evaseqcol.utils.JSONIntegerListExtData; @@ -23,26 +25,30 @@ @Service public class SeqColLevelOneService { - @Autowired - private SeqColLevelOneRepository repository; + private final SeqColLevelOneRepository repository; private DigestCalculator digestCalculator = new DigestCalculator(); + @Autowired + public SeqColLevelOneService(SeqColLevelOneRepository repository) { + this.repository = repository; + } + /** * Add a new Level 1 sequence collection object and save it to the * database*/ + @Transactional public Optional addSequenceCollectionL1(SeqColLevelOneEntity seqColLevelOne){ - SeqColLevelOneEntity seqCol = repository.save(seqColLevelOne); - return Optional.of(seqCol); + if (repository.existsById(seqColLevelOne.getDigest())) { + return Optional.empty(); + } + return Optional.of( + repository.save(seqColLevelOne) + ); } public Optional getSeqColLevelOneByDigest(String digest){ - SeqColLevelOneEntity seqColL11 = repository.findSeqColLevelOneEntityByDigest(digest); - if (seqColL11 != null) { - return Optional.of(seqColL11); - } else { - return Optional.empty(); - } + return repository.findSeqColLevelOneEntityByDigest(digest); } public void removeSeqColLevelOneByDigest(String digest) { @@ -62,12 +68,15 @@ public List getAllSeqColLevelOneObjects(){ /** * Construct a seqCol level 1 entity out of three seqCol level 2 entities that - * hold names, lengths and sequences objects*/ + * hold names, lengths and sequences objects + * TODO: Change the signature of this method and make it accept metadata object instead of namingconvention*/ public SeqColLevelOneEntity constructSeqColLevelOne(List>> stringListExtendedDataEntities, List>> integerListExtendedDataEntities, - SeqColEntity.NamingConvention convention) throws IOException { + SeqColEntity.NamingConvention convention, String sourceId) throws IOException { SeqColLevelOneEntity levelOneEntity = new SeqColLevelOneEntity(); JSONLevelOne jsonLevelOne = new JSONLevelOne(); + SeqColMetadataEntity metadata = new SeqColMetadataEntity().setNamingConvention(convention) + .setSourceIdentifier(sourceId); // TODO: this (metadata object) should be passed in the method parameter // Looping over List types for (SeqColExtendedDataEntity> dataEntity: stringListExtendedDataEntities) { @@ -99,14 +108,14 @@ public SeqColLevelOneEntity constructSeqColLevelOne(List> sequencesExtData = new JSONStringListExtData(levelTwoEntity.getSequences()); JSONExtData> lengthsExtData = new JSONIntegerListExtData(levelTwoEntity.getLengths()); @@ -151,7 +160,7 @@ public SeqColLevelOneEntity constructSeqColLevelOne( lengthsExtEntity ); - return constructSeqColLevelOne(stringListExtendedDataEntities,integerListExtendedDataEntities, convention); + return constructSeqColLevelOne(stringListExtendedDataEntities,integerListExtendedDataEntities, convention, sourceId); } /** diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java index b3b8f44..6b60b44 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java @@ -50,16 +50,19 @@ public class SeqColService { private final SeqColLevelOneService levelOneService; private final SeqColLevelTwoService levelTwoService; private final SeqColExtendedDataService extendedDataService; + private final MetadataService metadataService; private final DigestCalculator digestCalculator = new DigestCalculator(); private final Logger logger = LoggerFactory.getLogger(SeqColService.class); @Autowired public SeqColService(NCBISeqColDataSource ncbiSeqColDataSource, SeqColLevelOneService levelOneService, - SeqColLevelTwoService levelTwoService, SeqColExtendedDataService extendedDataService) { + SeqColLevelTwoService levelTwoService, SeqColExtendedDataService extendedDataService, + MetadataService metadataService) { this.ncbiSeqColDataSource = ncbiSeqColDataSource; this.levelOneService = levelOneService; this.levelTwoService = levelTwoService; this.extendedDataService = extendedDataService; + this.metadataService = metadataService; } @Transactional @@ -75,7 +78,8 @@ public Optional addFullSequenceCollection( if (numSeqCols > 0) { logger.warn("SeqCol with digest " + levelOneEntity.getDigest() + " already exists !"); throw new DuplicateSeqColException(levelOneEntity.getDigest()); - } else { + }else { + levelOneEntity.getMetadata().forEach(md -> md.setSeqColLevelOne(levelOneEntity)); SeqColLevelOneEntity levelOneEntity1 = levelOneService.addSequenceCollectionL1(levelOneEntity).get(); extendedDataService.addAll(seqColStringListExtDataEntities); extendedDataService.addAll(seqColIntegerListExtDataEntities); @@ -165,6 +169,13 @@ public IngestionResultEntity fetchAndInsertAllSeqColInFastaFile(String accession * assembly report. * Return the list of level 0 digests of the inserted seqcol objects*/ public IngestionResultEntity fetchAndInsertAllSeqColByAssemblyAccession(String assemblyAccession) throws IOException { + // Check for existing same source id + boolean sourceIdExists = metadataService.getAllSourceIds().stream() + .anyMatch(sourceId -> sourceId.equals(assemblyAccession)); + if (sourceIdExists) { + logger.warn("Seqcol objects for assembly" + assemblyAccession + " have been already ingested. Nothing to ingest !"); + throw new AssemblyAlreadyIngestedException(assemblyAccession); + } Optional> seqColDataMap = ncbiSeqColDataSource.getAllPossibleSeqColExtendedData(assemblyAccession); return createSeqColObjectsAndInsert(seqColDataMap, assemblyAccession); } @@ -206,9 +217,8 @@ public IngestionResultEntity createSeqColObjectsAndInsert(Optional seqColDigest = insertSeqColL1AndL2( // TODO: Check for possible self invocation problem levelOneEntity, seqColStringListExtDataEntities, seqColIntegerListExtDataEntities); @@ -227,7 +237,7 @@ public IngestionResultEntity createSeqColObjectsAndInsert(Optional>>) ucscExtendedDataMap.get("integerListExtDataList"); levelOneEntityUcsc = levelOneService.constructSeqColLevelOne( - extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc, SeqColEntity.NamingConvention.UCSC); + extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc, + SeqColEntity.NamingConvention.UCSC, GCA_ACCESSION); Optional resultDigestUcsc = seqColService.addFullSequenceCollection( levelOneEntityUcsc, extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc); if (resultDigestUcsc.isPresent()) { @@ -163,7 +164,8 @@ public void create() throws IOException { extendedIntegerListDataEntitiesGenbank = (List>>) genbankExtendedDataMap.get("integerListExtDataList"); levelOneEntityGenbank = levelOneService.constructSeqColLevelOne( - extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank, SeqColEntity.NamingConvention.GENBANK); + extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank, + SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); Optional resultDigestGenbank = seqColService.addFullSequenceCollection( levelOneEntityGenbank, extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank); if (resultDigestGenbank.isPresent()) { diff --git a/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java b/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java index 8d0bd66..3d06afa 100644 --- a/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java +++ b/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java @@ -33,6 +33,8 @@ @Testcontainers class SeqColLevelOneServiceTest { + private final String GCA_ACCESSION = "GCA_000146045.2"; + @Autowired private AssemblyDataGenerator assemblyDataGenerator; @@ -82,10 +84,10 @@ void constructSeqColL1Test() throws IOException { List>> integerListExtDataList = (List>>) extendedDataMapGenbank.get("integerListExtDataList"); SeqColLevelOneEntity levelOneEntity = levelOneService.constructSeqColLevelOne( - stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK); + stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); SeqColLevelTwoEntity levelTwoEntity = levelTwoService. constructSeqColL2(levelOneEntity.getDigest(), stringListExtDataList, integerListExtDataList); - SeqColLevelOneEntity constructedEntity = levelOneService.constructSeqColLevelOne(levelTwoEntity, SeqColEntity.NamingConvention.GENBANK); + SeqColLevelOneEntity constructedEntity = levelOneService.constructSeqColLevelOne(levelTwoEntity, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); assertNotNull(constructedEntity); assertNotNull(constructedEntity.getSeqColLevel1Object().getSequences()); } @@ -100,7 +102,8 @@ void addSequenceCollectionL1() throws IOException { List>> integerListExtDataList = (List>>) extendedDataMapGenbank.get("integerListExtDataList"); SeqColLevelOneEntity levelOneEntity = levelOneService.constructSeqColLevelOne( - stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK); + stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); + levelOneEntity.getMetadata().forEach(md -> md.setSeqColLevelOne(levelOneEntity)); Optional savedEntity = levelOneService.addSequenceCollectionL1(levelOneEntity); assertTrue(savedEntity.isPresent()); System.out.println(savedEntity.get());