2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.api
.service
.dto
;
11 import java
.io
.Serializable
;
12 import java
.net
.URISyntaxException
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Collection
;
15 import java
.util
.List
;
16 import java
.util
.UUID
;
18 import org
.apache
.logging
.log4j
.LogManager
;
19 import org
.apache
.logging
.log4j
.Logger
;
21 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
22 import eu
.etaxonomy
.cdm
.common
.URI
;
23 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
24 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
25 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
26 import eu
.etaxonomy
.cdm
.model
.media
.MediaUtils
;
27 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
28 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
29 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
31 import eu
.etaxonomy
.cdm
.model
.occurrence
.MediaSpecimen
;
32 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
33 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
34 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTerm
;
37 * Provides summary information on media, DNA, molecular data and scans
38 * found in the derivation tree including the current {@link SpecimenOrObservationBase}
44 public class DerivationTreeSummaryDTO
implements Serializable
{
46 private static final long serialVersionUID
= 8329871164348514709L;
48 private static final Logger logger
= LogManager
.getLogger();
50 private List
<Link
> specimenScans
= new ArrayList
<>();
51 private List
<MolecularData
> molecularDataList
= new ArrayList
<>();
52 private List
<Link
> detailImages
= new ArrayList
<>();
53 private List
<UUID
> specimenScanUuids
= new ArrayList
<>();
54 private List
<UUID
> detailImageUuids
= new ArrayList
<>();
57 * Factory method to create the summary information on media, DNA, molecular data and scans
58 * found in the derivation tree including the passed {@link SpecimenOrObservationBase specimenOrObservation}
60 * @param specimenOrObservation
61 * The {@link SpecimenOrObservationBase} to create the summary for.
62 * @param specimenIdentifier
63 * In case of a {@link DerivedUnit} being passed to this factory method, the <code>specimenIdentifier</code> should
64 * be set to the result of {@link DerivedUnitDTO#composeSpecimenShortTitle(DerivedUnit)}
68 public static DerivationTreeSummaryDTO
fromEntity(SpecimenOrObservationBase
<?
> specimenOrObservation
, String specimenIdentifier
) {
70 DerivationTreeSummaryDTO derivateDataDTO
= new DerivationTreeSummaryDTO();
72 Collection
<DerivedUnit
> childDerivates
= specimenOrObservation
.collectDerivedUnits(0);
73 for (DerivedUnit childDerivate
: childDerivates
) {
74 // assemble molecular data
75 //pattern: DNAMarker [contig1, primer1_1, primer1_2, ...][contig2, primer2_1, ...]...
76 if (childDerivate
.isInstanceOf(DnaSample
.class)) {
77 if (childDerivate
.getRecordBasis() == SpecimenOrObservationType
.TissueSample
) {
78 // TODO implement TissueSample assembly for web service
80 if (childDerivate
.getRecordBasis() == SpecimenOrObservationType
.DnaSample
) {
81 DnaSample dna
= HibernateProxyHelper
.deproxy(childDerivate
, DnaSample
.class);
82 for (Sequence sequence
: dna
.getSequences()) {
85 boldUri
= sequence
.getBoldUri();
86 } catch (URISyntaxException e1
) {
87 // TODO consider better reporting of this incident
88 logger
.error("Could not create BOLD URI", e1
);
90 final DefinedTerm dnaMarker
= sequence
.getDnaMarker();
91 Link providerLink
= null;
92 if(boldUri
!=null && dnaMarker
!=null){
93 providerLink
= new DerivationTreeSummaryDTO
.Link(boldUri
, dnaMarker
.getLabel());
95 MolecularData molecularData
= derivateDataDTO
.addProviderLink(providerLink
);
98 ContigFile contigFile
= null;
99 if (sequence
.getContigFile() != null) {
100 MediaRepresentationPart contigMediaRepresentationPart
= MediaUtils
.getFirstMediaRepresentationPart(sequence
.getContigFile());
101 if (contigMediaRepresentationPart
!= null) {
102 contigFile
= molecularData
.addContigFile(new Link(contigMediaRepresentationPart
.getUri(), "contig"));
106 contigFile
= molecularData
.addContigFile(null);
109 if (sequence
.getSingleReads() != null) {
111 for (SingleRead singleRead
: sequence
.getSingleReads()) {
112 MediaRepresentationPart pherogramMediaRepresentationPart
= MediaUtils
.getFirstMediaRepresentationPart(singleRead
.getPherogram());
113 if (pherogramMediaRepresentationPart
!= null && contigFile
!= null) {
114 contigFile
.addPrimerLink(pherogramMediaRepresentationPart
.getUri(), "read"+readCount
++);
121 // assemble media data
122 else if (childDerivate
.isInstanceOf(MediaSpecimen
.class)) {
123 MediaSpecimen mediaSpecimen
= HibernateProxyHelper
.deproxy(childDerivate
, MediaSpecimen
.class);
125 URI mediaUri
= getMediaUri(mediaSpecimen
);
126 if (mediaSpecimen
.getKindOfUnit() != null) {
128 if (mediaSpecimen
.getKindOfUnit().getUuid().equals(DefinedTerm
.uuidSpecimenScan
)) {
129 derivateDataDTO
.addSpecimenScanUuid(mediaSpecimen
.getMediaSpecimen().getUuid());
130 String imageLinkText
= "scan of " + specimenIdentifier
;
131 if(CdmUtils
.isNotBlank(mediaSpecimen
.getMostSignificantIdentifier())) {
132 imageLinkText
= mediaSpecimen
.getMostSignificantIdentifier();
134 if(CdmUtils
.isNotBlank(mediaSpecimen
.getMediaSpecimen().getTitleCache())) {
135 imageLinkText
+= " (" + mediaSpecimen
.getMediaSpecimen().getTitleCache() + ")";
137 derivateDataDTO
.addSpecimenScan(mediaUri
, imageLinkText
.trim());
140 else if (mediaSpecimen
.getKindOfUnit().getUuid().equals(DefinedTerm
.uuidDetailImage
)) {
141 derivateDataDTO
.addDetailImageUuid(mediaSpecimen
.getMediaSpecimen().getUuid());
142 String motif
= "detail image";
143 if (mediaSpecimen
.getMediaSpecimen()!=null){
144 if(CdmUtils
.isNotBlank(mediaSpecimen
.getMediaSpecimen().getTitleCache())) {
145 motif
= mediaSpecimen
.getMediaSpecimen().getTitleCache();
148 derivateDataDTO
.addDetailImage(mediaUri
, motif
);
153 return derivateDataDTO
;
156 // private void updateDerivateTree(Set<DerivedUnitDTO> derivatives) {
157 // for (DerivedUnitDTO childDerivate : derivatives) {
158 // DerivationTreeSummaryDTO childTree = childDerivate.getDerivationTreeSummary();
159 // for (Link link:childTree.detailImages) {
160 // this.addDetailImage(null, null);
164 // // assemble molecular data
165 // //pattern: DNAMarker [contig1, primer1_1, primer1_2, ...][contig2, primer2_1, ...]...
166 // if (childDerivate instanceof DNASampleDTO) {
167 // DNASampleDTO dna = (DNASampleDTO)childDerivate;
168 // if (childDerivate.getRecordBase() == SpecimenOrObservationType.TissueSample) {
169 // // TODO implement TissueSample assembly for web service
171 // if (childDerivate.getRecordBase() == SpecimenOrObservationType.DnaSample) {
173 // for (SequenceDTO sequence : dna.getSequences()) {
174 // URI boldUri = null;
176 // boldUri = sequence.getBoldUri();
177 // } catch (URISyntaxException e1) {
178 // // TODO consider better reporting of this incident
179 // logger.error("Could not create BOLD URI", e1);
181 // final String dnaMarker = sequence.getDnaMarker();
182 // Link providerLink = null;
183 // if(boldUri!=null && dnaMarker!=null){
184 // providerLink = new DerivationTreeSummaryDTO.Link(boldUri, dnaMarker);
186 // MolecularData molecularData = this.addProviderLink(providerLink);
189 // ContigFile contigFile = null;
190 // if (sequence.getContigFile() != null) {
191 // MediaRepresentationPart contigMediaRepresentationPart = MediaUtils.getFirstMediaRepresentationPart(sequence.getContigFile());
192 // if (contigMediaRepresentationPart != null) {
193 // contigFile = molecularData.addContigFile(new Link(contigMediaRepresentationPart.getUri(), "contig"));
197 // contigFile = molecularData.addContigFile(null);
200 // if (sequence.getSingleReadAlignments() != null) {
201 // int readCount = 1;
202 // for (SingleReadAlignment singleRead : sequence.getSingleReadAlignments()) {
203 // MediaRepresentationPart pherogramMediaRepresentationPart = MediaUtils.getFirstMediaRepresentationPart(singleRead.getSingleRead().getPherogram());
204 // if (pherogramMediaRepresentationPart != null && contigFile != null) {
205 // contigFile.addPrimerLink(pherogramMediaRepresentationPart.getUri(), "read"+readCount++);
212 // // assemble media data
213 // else if (childDerivate.hasDetailImage) {
217 // if (childDerivate.getKindOfUnit().getUuid().equals(DefinedTerm.uuidSpecimenScan)) {
218 // this.addSpecimenScanUuid(childDerivate.get);
219 // String imageLinkText = "scan of " + specimenIdentifier;
220 // if(CdmUtils.isNotBlank(mediaSpecimen.getMostSignificantIdentifier())) {
221 // imageLinkText = mediaSpecimen.getMostSignificantIdentifier();
223 // if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
224 // imageLinkText += " (" + mediaSpecimen.getMediaSpecimen().getTitleCache() + ")";
226 // this.addSpecimenScan(mediaUri, imageLinkText.trim());
229 // else if (mediaSpecimen.getKindOfUnit().getUuid().equals(DefinedTerm.uuidDetailImage)) {
230 // derivateDataDTO.addDetailImageUuid(mediaSpecimen.getMediaSpecimen().getUuid());
231 // String motif = "detail image";
232 // if (mediaSpecimen.getMediaSpecimen()!=null){
233 // if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
234 // motif = mediaSpecimen.getMediaSpecimen().getTitleCache();
237 // derivateDataDTO.addDetailImage(mediaUri, motif);
245 private static URI
getMediaUri(MediaSpecimen mediaSpecimen
) {
247 Collection
<MediaRepresentation
> mediaRepresentations
= mediaSpecimen
.getMediaSpecimen().getRepresentations();
248 if (mediaRepresentations
!= null && !mediaRepresentations
.isEmpty()) {
249 Collection
<MediaRepresentationPart
> mediaRepresentationParts
= mediaRepresentations
.iterator().next().getParts();
250 if (mediaRepresentationParts
!= null && !mediaRepresentationParts
.isEmpty()) {
251 MediaRepresentationPart part
= mediaRepresentationParts
.iterator().next();
252 if (part
.getUri() != null) {
253 mediaUri
= part
.getUri();
261 * @return the molecularData
263 public List
<MolecularData
> getMolecularDataList() {
264 return molecularDataList
;
267 public MolecularData
addProviderLink(Link providerLink
) {
268 MolecularData molecularData
= new MolecularData(providerLink
);
269 this.molecularDataList
.add(molecularData
);
270 return molecularData
;
274 * @return the specimenScans
276 public List
<Link
> getSpecimenScans() {
277 return specimenScans
;
280 public void addSpecimenScan(URI uri
, String linkText
){
281 specimenScans
.add(new Link(uri
, linkText
));
285 * @return the detailImages
287 public List
<Link
> getDetailImages() {
291 public void addDetailImage(URI uri
, String motif
){
292 detailImages
.add(new Link(uri
, motif
));
296 * @return the specimenScanUuids
298 public List
<UUID
> getSpecimenScanUuids() {
299 return specimenScanUuids
;
302 public void addSpecimenScanUuid(UUID uuid
){
303 specimenScanUuids
.add(uuid
);
307 * @return the detailImageUuids
309 public List
<UUID
> getDetailImageUuids() {
310 return detailImageUuids
;
313 public void addDetailImageUuid(UUID uuid
){
314 detailImageUuids
.add(uuid
);
317 public class MolecularData
implements Serializable
{
319 private static final long serialVersionUID
= -3509828381796659200L;
321 private final Link providerLink
;
322 private List
<ContigFile
> contigFiles
;
324 public MolecularData(Link providerLink
) {
326 this.providerLink
= providerLink
;
329 public ContigFile
addContigFile(Link contigLink
){
330 if(contigFiles
==null){
331 contigFiles
= new ArrayList
<ContigFile
>();
333 ContigFile contigFile
= new ContigFile(contigLink
);
334 contigFiles
.add(contigFile
);
338 public synchronized Link
getProviderLink() {
342 public List
<ContigFile
> getContigFiles() {
348 public class ContigFile
implements Serializable
{
350 private final Link contigLink
;
351 private List
<Link
> primerLinks
;
353 public ContigFile(Link contigLink
) {
354 this.contigLink
= contigLink
;
357 public void addPrimerLink(URI uri
, String linkText
){
358 if(primerLinks
==null){
359 primerLinks
= new ArrayList
<Link
>();
361 primerLinks
.add(new Link(uri
, linkText
));
364 public Link
getContigLink() {
368 public List
<Link
> getPrimerLinks() {
374 public static class Link
implements Serializable
{
376 private static final long serialVersionUID
= 6635385359662624579L;
378 private String linkText
;
381 public Link(URI uri
, String linkText
) {
383 this.linkText
= linkText
;
387 * @return the linkText
389 public synchronized String
getLinkText() {
393 * @param linkText the linkText to set
395 public synchronized void setLinkText(String linkText
) {
396 this.linkText
= linkText
;
401 public synchronized URI
getUri() {
405 * @param uri the uri to set
407 public synchronized void setUri(URI uri
) {
412 public int hashCode() {
413 final int prime
= 31;
415 result
= prime
* result
+ ((linkText
== null) ?
0 : linkText
.hashCode());
416 result
= prime
* result
+ ((uri
== null) ?
0 : uri
.hashCode());
421 public boolean equals(Object obj
) {
428 if (getClass() != obj
.getClass()) {
431 Link other
= (Link
) obj
;
432 if (linkText
== null) {
433 if (other
.linkText
!= null) {
436 } else if (!linkText
.equals(other
.linkText
)) {
440 if (other
.uri
!= null) {
443 } else if (!uri
.equals(other
.uri
)) {