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
.log4j
.Logger
;
20 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
21 import eu
.etaxonomy
.cdm
.common
.URI
;
22 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
23 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
24 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
25 import eu
.etaxonomy
.cdm
.model
.media
.MediaUtils
;
26 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
27 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
28 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
29 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.MediaSpecimen
;
31 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
32 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
33 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTerm
;
36 * Provides summary information on media, DNA, molecular data and scans
37 * found in the derivation tree including the current {@link SpecimenOrObservationBase}
43 public class DerivationTreeSummaryDTO
implements Serializable
{
45 private static final long serialVersionUID
= 8329871164348514709L;
47 private static final Logger logger
= Logger
.getLogger(DerivationTreeSummaryDTO
.class);
49 private List
<Link
> specimenScans
= new ArrayList
<>();
50 private List
<MolecularData
> molecularDataList
= new ArrayList
<>();
51 private List
<Link
> detailImages
= new ArrayList
<>();
52 private List
<UUID
> specimenScanUuids
= new ArrayList
<>();
53 private List
<UUID
> detailImageUuids
= new ArrayList
<>();
56 * Factory method to create the summary information on media, DNA, molecular data and scans
57 * found in the derivation tree including the passed {@link SpecimenOrObservationBase specimenOrObservation}
59 * @param specimenOrObservation
60 * The {@link SpecimenOrObservationBase} to create the summary for.
61 * @param specimenIdentifier
62 * In case of a {@link DerivedUnit} being passed to this factory method, the <code>specimenIdentifier</code> should
63 * be set to the result of {@link DerivedUnitDTO#composeSpecimenIdentifier(DerivedUnit)}
67 public static DerivationTreeSummaryDTO
fromEntity(SpecimenOrObservationBase
<?
> specimenOrObservation
, String specimenIdentifier
) {
69 DerivationTreeSummaryDTO derivateDataDTO
= new DerivationTreeSummaryDTO();
71 Collection
<DerivedUnit
> childDerivates
= specimenOrObservation
.collectDerivedUnits();
72 for (DerivedUnit childDerivate
: childDerivates
) {
73 // assemble molecular data
74 //pattern: DNAMarker [contig1, primer1_1, primer1_2, ...][contig2, primer2_1, ...]...
75 if (childDerivate
.isInstanceOf(DnaSample
.class)) {
76 if (childDerivate
.getRecordBasis() == SpecimenOrObservationType
.TissueSample
) {
77 // TODO implement TissueSample assembly for web service
79 if (childDerivate
.getRecordBasis() == SpecimenOrObservationType
.DnaSample
) {
80 DnaSample dna
= HibernateProxyHelper
.deproxy(childDerivate
, DnaSample
.class);
81 for (Sequence sequence
: dna
.getSequences()) {
84 boldUri
= sequence
.getBoldUri();
85 } catch (URISyntaxException e1
) {
86 // TODO consider better reporting of this incident
87 logger
.error("Could not create BOLD URI", e1
);
89 final DefinedTerm dnaMarker
= sequence
.getDnaMarker();
90 Link providerLink
= null;
91 if(boldUri
!=null && dnaMarker
!=null){
92 providerLink
= new DerivationTreeSummaryDTO
.Link(boldUri
, dnaMarker
.getLabel());
94 MolecularData molecularData
= derivateDataDTO
.addProviderLink(providerLink
);
97 ContigFile contigFile
= null;
98 if (sequence
.getContigFile() != null) {
99 MediaRepresentationPart contigMediaRepresentationPart
= MediaUtils
.getFirstMediaRepresentationPart(sequence
.getContigFile());
100 if (contigMediaRepresentationPart
!= null) {
101 contigFile
= molecularData
.addContigFile(new Link(contigMediaRepresentationPart
.getUri(), "contig"));
105 contigFile
= molecularData
.addContigFile(null);
108 if (sequence
.getSingleReads() != null) {
110 for (SingleRead singleRead
: sequence
.getSingleReads()) {
111 MediaRepresentationPart pherogramMediaRepresentationPart
= MediaUtils
.getFirstMediaRepresentationPart(singleRead
.getPherogram());
112 if (pherogramMediaRepresentationPart
!= null && contigFile
!= null) {
113 contigFile
.addPrimerLink(pherogramMediaRepresentationPart
.getUri(), "read"+readCount
++);
120 // assemble media data
121 else if (childDerivate
.isInstanceOf(MediaSpecimen
.class)) {
122 MediaSpecimen media
= HibernateProxyHelper
.deproxy(childDerivate
, MediaSpecimen
.class);
124 URI mediaUri
= getMediaUri(media
);
125 if (media
.getKindOfUnit() != null) {
127 if (media
.getKindOfUnit().getUuid().equals(DefinedTerm
.uuidSpecimenScan
)) {
128 derivateDataDTO
.addSpecimenScanUuid(media
.getMediaSpecimen().getUuid());
129 String imageLinkText
= "scan";
130 imageLinkText
= specimenIdentifier
;
131 derivateDataDTO
.addSpecimenScan(mediaUri
, imageLinkText
);
134 else if (media
.getKindOfUnit().getUuid().equals(DefinedTerm
.uuidDetailImage
)) {
135 derivateDataDTO
.addDetailImageUuid(media
.getMediaSpecimen().getUuid());
136 String motif
= "detail image";
137 if (media
.getMediaSpecimen()!=null){
138 if(CdmUtils
.isNotBlank(media
.getMediaSpecimen().getTitleCache())) {
139 motif
= media
.getMediaSpecimen().getTitleCache();
142 derivateDataDTO
.addDetailImage(mediaUri
, motif
);
147 return derivateDataDTO
;
151 private static URI
getMediaUri(MediaSpecimen mediaSpecimen
) {
153 Collection
<MediaRepresentation
> mediaRepresentations
= mediaSpecimen
.getMediaSpecimen().getRepresentations();
154 if (mediaRepresentations
!= null && !mediaRepresentations
.isEmpty()) {
155 Collection
<MediaRepresentationPart
> mediaRepresentationParts
= mediaRepresentations
.iterator().next().getParts();
156 if (mediaRepresentationParts
!= null && !mediaRepresentationParts
.isEmpty()) {
157 MediaRepresentationPart part
= mediaRepresentationParts
.iterator().next();
158 if (part
.getUri() != null) {
159 mediaUri
= part
.getUri();
167 * @return the molecularData
169 public List
<MolecularData
> getMolecularDataList() {
170 return molecularDataList
;
173 public MolecularData
addProviderLink(Link providerLink
) {
174 MolecularData molecularData
= new MolecularData(providerLink
);
175 this.molecularDataList
.add(molecularData
);
176 return molecularData
;
180 * @return the specimenScans
182 public List
<Link
> getSpecimenScans() {
183 return specimenScans
;
186 public void addSpecimenScan(URI uri
, String linkText
){
187 specimenScans
.add(new Link(uri
, linkText
));
191 * @return the detailImages
193 public List
<Link
> getDetailImages() {
197 public void addDetailImage(URI uri
, String motif
){
198 detailImages
.add(new Link(uri
, motif
));
202 * @return the specimenScanUuids
204 public List
<UUID
> getSpecimenScanUuids() {
205 return specimenScanUuids
;
208 public void addSpecimenScanUuid(UUID uuid
){
209 specimenScanUuids
.add(uuid
);
213 * @return the detailImageUuids
215 public List
<UUID
> getDetailImageUuids() {
216 return detailImageUuids
;
219 public void addDetailImageUuid(UUID uuid
){
220 detailImageUuids
.add(uuid
);
223 public class MolecularData
implements Serializable
{
225 private static final long serialVersionUID
= -3509828381796659200L;
227 private final Link providerLink
;
228 private List
<ContigFile
> contigFiles
;
230 public MolecularData(Link providerLink
) {
232 this.providerLink
= providerLink
;
235 public ContigFile
addContigFile(Link contigLink
){
236 if(contigFiles
==null){
237 contigFiles
= new ArrayList
<ContigFile
>();
239 ContigFile contigFile
= new ContigFile(contigLink
);
240 contigFiles
.add(contigFile
);
244 public synchronized Link
getProviderLink() {
248 public List
<ContigFile
> getContigFiles() {
254 public class ContigFile
implements Serializable
{
256 private final Link contigLink
;
257 private List
<Link
> primerLinks
;
259 public ContigFile(Link contigLink
) {
260 this.contigLink
= contigLink
;
263 public void addPrimerLink(URI uri
, String linkText
){
264 if(primerLinks
==null){
265 primerLinks
= new ArrayList
<Link
>();
267 primerLinks
.add(new Link(uri
, linkText
));
270 public Link
getContigLink() {
274 public List
<Link
> getPrimerLinks() {
280 public static class Link
implements Serializable
{
282 private static final long serialVersionUID
= 6635385359662624579L;
284 private String linkText
;
287 public Link(URI uri
, String linkText
) {
289 this.linkText
= linkText
;
293 * @return the linkText
295 public synchronized String
getLinkText() {
299 * @param linkText the linkText to set
301 public synchronized void setLinkText(String linkText
) {
302 this.linkText
= linkText
;
307 public synchronized URI
getUri() {
311 * @param uri the uri to set
313 public synchronized void setUri(URI uri
) {
318 public int hashCode() {
319 final int prime
= 31;
321 result
= prime
* result
+ ((linkText
== null) ?
0 : linkText
.hashCode());
322 result
= prime
* result
+ ((uri
== null) ?
0 : uri
.hashCode());
327 public boolean equals(Object obj
) {
334 if (getClass() != obj
.getClass()) {
337 Link other
= (Link
) obj
;
338 if (linkText
== null) {
339 if (other
.linkText
!= null) {
342 } else if (!linkText
.equals(other
.linkText
)) {
346 if (other
.uri
!= null) {
349 } else if (!uri
.equals(other
.uri
)) {