Merge branch 'release/5.19.0'
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / dto / DerivationTreeSummaryDTO.java
1 /**
2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9 package eu.etaxonomy.cdm.api.service.dto;
10
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;
17
18 import org.apache.log4j.Logger;
19
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;
34
35 /**
36 * Provides summary information on media, DNA, molecular data and scans
37 * found in the derivation tree including the current {@link SpecimenOrObservationBase}
38 * instance.
39 *
40 * @author pplitzner
41 * @since Mar 26, 2015
42 */
43 public class DerivationTreeSummaryDTO implements Serializable {
44
45 private static final long serialVersionUID = 8329871164348514709L;
46
47 private static final Logger logger = Logger.getLogger(DerivationTreeSummaryDTO.class);
48
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<>();
54
55 /**
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}
58 *
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)}
64 * @return
65 * The new instance.
66 */
67 public static DerivationTreeSummaryDTO fromEntity(SpecimenOrObservationBase<?> specimenOrObservation, String specimenIdentifier) {
68
69 DerivationTreeSummaryDTO derivateDataDTO = new DerivationTreeSummaryDTO();
70
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
78 }
79 if (childDerivate.getRecordBasis() == SpecimenOrObservationType.DnaSample) {
80 DnaSample dna = HibernateProxyHelper.deproxy(childDerivate, DnaSample.class);
81 for (Sequence sequence : dna.getSequences()) {
82 URI boldUri = null;
83 try {
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);
88 }
89 final DefinedTerm dnaMarker = sequence.getDnaMarker();
90 Link providerLink = null;
91 if(boldUri!=null && dnaMarker!=null){
92 providerLink = new DerivationTreeSummaryDTO.Link(boldUri, dnaMarker.getLabel());
93 }
94 MolecularData molecularData = derivateDataDTO.addProviderLink(providerLink);
95
96 //contig file
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"));
102 }
103 }
104 else{
105 contigFile = molecularData.addContigFile(null);
106 }
107 // primer files
108 if (sequence.getSingleReads() != null) {
109 int readCount = 1;
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++);
114 }
115 }
116 }
117 }
118 }
119 }
120 // assemble media data
121 else if (childDerivate.isInstanceOf(MediaSpecimen.class)) {
122 MediaSpecimen media = HibernateProxyHelper.deproxy(childDerivate, MediaSpecimen.class);
123
124 URI mediaUri = getMediaUri(media);
125 if (media.getKindOfUnit() != null) {
126 // specimen scan
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);
132 }
133 // detail image
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();
140 }
141 }
142 derivateDataDTO.addDetailImage(mediaUri, motif);
143 }
144 }
145 }
146 }
147 return derivateDataDTO;
148 }
149
150 @Deprecated
151 private static URI getMediaUri(MediaSpecimen mediaSpecimen) {
152 URI mediaUri = null;
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();
160 }
161 }
162 }
163 return mediaUri;
164 }
165
166 /**
167 * @return the molecularData
168 */
169 public List<MolecularData> getMolecularDataList() {
170 return molecularDataList;
171 }
172
173 public MolecularData addProviderLink(Link providerLink) {
174 MolecularData molecularData = new MolecularData(providerLink);
175 this.molecularDataList.add(molecularData);
176 return molecularData;
177 }
178
179 /**
180 * @return the specimenScans
181 */
182 public List<Link> getSpecimenScans() {
183 return specimenScans;
184 }
185
186 public void addSpecimenScan(URI uri, String linkText){
187 specimenScans.add(new Link(uri, linkText));
188 }
189
190 /**
191 * @return the detailImages
192 */
193 public List<Link> getDetailImages() {
194 return detailImages;
195 }
196
197 public void addDetailImage(URI uri, String motif){
198 detailImages.add(new Link(uri, motif));
199 }
200
201 /**
202 * @return the specimenScanUuids
203 */
204 public List<UUID> getSpecimenScanUuids() {
205 return specimenScanUuids;
206 }
207
208 public void addSpecimenScanUuid(UUID uuid){
209 specimenScanUuids.add(uuid);
210 }
211
212 /**
213 * @return the detailImageUuids
214 */
215 public List<UUID> getDetailImageUuids() {
216 return detailImageUuids;
217 }
218
219 public void addDetailImageUuid(UUID uuid){
220 detailImageUuids.add(uuid);
221 }
222
223 public class MolecularData implements Serializable{
224
225 private static final long serialVersionUID = -3509828381796659200L;
226
227 private final Link providerLink;
228 private List<ContigFile> contigFiles;
229
230 public MolecularData(Link providerLink) {
231 super();
232 this.providerLink = providerLink;
233 }
234
235 public ContigFile addContigFile(Link contigLink){
236 if(contigFiles==null){
237 contigFiles = new ArrayList<ContigFile>();
238 }
239 ContigFile contigFile = new ContigFile(contigLink);
240 contigFiles.add(contigFile);
241 return contigFile;
242 }
243
244 public synchronized Link getProviderLink() {
245 return providerLink;
246 }
247
248 public List<ContigFile> getContigFiles() {
249 return contigFiles;
250 }
251
252 }
253
254 public class ContigFile implements Serializable{
255
256 private final Link contigLink;
257 private List<Link> primerLinks;
258
259 public ContigFile(Link contigLink) {
260 this.contigLink = contigLink;
261 }
262
263 public void addPrimerLink(URI uri, String linkText){
264 if(primerLinks==null){
265 primerLinks = new ArrayList<Link>();
266 }
267 primerLinks.add(new Link(uri, linkText));
268 }
269
270 public Link getContigLink() {
271 return contigLink;
272 }
273
274 public List<Link> getPrimerLinks() {
275 return primerLinks;
276 }
277
278 }
279
280 public static class Link implements Serializable{
281
282 private static final long serialVersionUID = 6635385359662624579L;
283
284 private String linkText;
285 private URI uri;
286
287 public Link(URI uri, String linkText) {
288 super();
289 this.linkText = linkText;
290 this.uri = uri;
291 }
292 /**
293 * @return the linkText
294 */
295 public synchronized String getLinkText() {
296 return linkText;
297 }
298 /**
299 * @param linkText the linkText to set
300 */
301 public synchronized void setLinkText(String linkText) {
302 this.linkText = linkText;
303 }
304 /**
305 * @return the uri
306 */
307 public synchronized URI getUri() {
308 return uri;
309 }
310 /**
311 * @param uri the uri to set
312 */
313 public synchronized void setUri(URI uri) {
314 this.uri = uri;
315 }
316
317 @Override
318 public int hashCode() {
319 final int prime = 31;
320 int result = 1;
321 result = prime * result + ((linkText == null) ? 0 : linkText.hashCode());
322 result = prime * result + ((uri == null) ? 0 : uri.hashCode());
323 return result;
324 }
325
326 @Override
327 public boolean equals(Object obj) {
328 if (this == obj) {
329 return true;
330 }
331 if (obj == null) {
332 return false;
333 }
334 if (getClass() != obj.getClass()) {
335 return false;
336 }
337 Link other = (Link) obj;
338 if (linkText == null) {
339 if (other.linkText != null) {
340 return false;
341 }
342 } else if (!linkText.equals(other.linkText)) {
343 return false;
344 }
345 if (uri == null) {
346 if (other.uri != null) {
347 return false;
348 }
349 } else if (!uri.equals(other.uri)) {
350 return false;
351 }
352 return true;
353 }
354 }
355
356
357 }