cleanup
[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.logging.log4j.LogManager;
19 import org.apache.logging.log4j.Logger;
20
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;
35
36 /**
37 * Provides summary information on media, DNA, molecular data and scans
38 * found in the derivation tree including the current {@link SpecimenOrObservationBase}
39 * instance.
40 *
41 * @author pplitzner
42 * @since Mar 26, 2015
43 */
44 public class DerivationTreeSummaryDTO implements Serializable {
45
46 private static final long serialVersionUID = 8329871164348514709L;
47
48 private static final Logger logger = LogManager.getLogger();
49
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<>();
55
56 /**
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}
59 *
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)}
65 * @return
66 * The new instance.
67 */
68 public static DerivationTreeSummaryDTO fromEntity(SpecimenOrObservationBase<?> specimenOrObservation, String specimenIdentifier) {
69
70 DerivationTreeSummaryDTO derivateDataDTO = new DerivationTreeSummaryDTO();
71
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
79 }
80 if (childDerivate.getRecordBasis() == SpecimenOrObservationType.DnaSample) {
81 DnaSample dna = HibernateProxyHelper.deproxy(childDerivate, DnaSample.class);
82 for (Sequence sequence : dna.getSequences()) {
83 URI boldUri = null;
84 try {
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);
89 }
90 final DefinedTerm dnaMarker = sequence.getDnaMarker();
91 Link providerLink = null;
92 if(boldUri!=null && dnaMarker!=null){
93 providerLink = new DerivationTreeSummaryDTO.Link(boldUri, dnaMarker.getLabel());
94 }
95 MolecularData molecularData = derivateDataDTO.addProviderLink(providerLink);
96
97 //contig file
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"));
103 }
104 }
105 else{
106 contigFile = molecularData.addContigFile(null);
107 }
108 // primer files
109 if (sequence.getSingleReads() != null) {
110 int readCount = 1;
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++);
115 }
116 }
117 }
118 }
119 }
120 }
121 // assemble media data
122 else if (childDerivate.isInstanceOf(MediaSpecimen.class)) {
123 MediaSpecimen mediaSpecimen = HibernateProxyHelper.deproxy(childDerivate, MediaSpecimen.class);
124
125 URI mediaUri = getMediaUri(mediaSpecimen);
126 if (mediaSpecimen.getKindOfUnit() != null) {
127 // specimen scan
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();
133 }
134 if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
135 imageLinkText += " (" + mediaSpecimen.getMediaSpecimen().getTitleCache() + ")";
136 }
137 derivateDataDTO.addSpecimenScan(mediaUri, imageLinkText.trim());
138 }
139 // detail image
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();
146 }
147 }
148 derivateDataDTO.addDetailImage(mediaUri, motif);
149 }
150 }
151 }
152 }
153 return derivateDataDTO;
154 }
155
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);
161 // }
162 // }
163 //
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
170 // }
171 // if (childDerivate.getRecordBase() == SpecimenOrObservationType.DnaSample) {
172 //
173 // for (SequenceDTO sequence : dna.getSequences()) {
174 // URI boldUri = null;
175 // try {
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);
180 // }
181 // final String dnaMarker = sequence.getDnaMarker();
182 // Link providerLink = null;
183 // if(boldUri!=null && dnaMarker!=null){
184 // providerLink = new DerivationTreeSummaryDTO.Link(boldUri, dnaMarker);
185 // }
186 // MolecularData molecularData = this.addProviderLink(providerLink);
187 //
188 // //contig file
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"));
194 // }
195 // }
196 // else{
197 // contigFile = molecularData.addContigFile(null);
198 // }
199 // // primer files
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++);
206 // }
207 // }
208 // }
209 // }
210 // }
211 // }
212 // // assemble media data
213 // else if (childDerivate.hasDetailImage) {
214 //
215 //
216 // // specimen scan
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();
222 // }
223 // if(CdmUtils.isNotBlank(mediaSpecimen.getMediaSpecimen().getTitleCache())) {
224 // imageLinkText += " (" + mediaSpecimen.getMediaSpecimen().getTitleCache() + ")";
225 // }
226 // this.addSpecimenScan(mediaUri, imageLinkText.trim());
227 // }
228 // // detail image
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();
235 // }
236 // }
237 // derivateDataDTO.addDetailImage(mediaUri, motif);
238 // }
239 // }
240 // }
241 // }
242 // }
243
244 @Deprecated
245 private static URI getMediaUri(MediaSpecimen mediaSpecimen) {
246 URI mediaUri = null;
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();
254 }
255 }
256 }
257 return mediaUri;
258 }
259
260 /**
261 * @return the molecularData
262 */
263 public List<MolecularData> getMolecularDataList() {
264 return molecularDataList;
265 }
266
267 public MolecularData addProviderLink(Link providerLink) {
268 MolecularData molecularData = new MolecularData(providerLink);
269 this.molecularDataList.add(molecularData);
270 return molecularData;
271 }
272
273 /**
274 * @return the specimenScans
275 */
276 public List<Link> getSpecimenScans() {
277 return specimenScans;
278 }
279
280 public void addSpecimenScan(URI uri, String linkText){
281 specimenScans.add(new Link(uri, linkText));
282 }
283
284 /**
285 * @return the detailImages
286 */
287 public List<Link> getDetailImages() {
288 return detailImages;
289 }
290
291 public void addDetailImage(URI uri, String motif){
292 detailImages.add(new Link(uri, motif));
293 }
294
295 /**
296 * @return the specimenScanUuids
297 */
298 public List<UUID> getSpecimenScanUuids() {
299 return specimenScanUuids;
300 }
301
302 public void addSpecimenScanUuid(UUID uuid){
303 specimenScanUuids.add(uuid);
304 }
305
306 /**
307 * @return the detailImageUuids
308 */
309 public List<UUID> getDetailImageUuids() {
310 return detailImageUuids;
311 }
312
313 public void addDetailImageUuid(UUID uuid){
314 detailImageUuids.add(uuid);
315 }
316
317 public class MolecularData implements Serializable{
318
319 private static final long serialVersionUID = -3509828381796659200L;
320
321 private final Link providerLink;
322 private List<ContigFile> contigFiles;
323
324 public MolecularData(Link providerLink) {
325 super();
326 this.providerLink = providerLink;
327 }
328
329 public ContigFile addContigFile(Link contigLink){
330 if(contigFiles==null){
331 contigFiles = new ArrayList<ContigFile>();
332 }
333 ContigFile contigFile = new ContigFile(contigLink);
334 contigFiles.add(contigFile);
335 return contigFile;
336 }
337
338 public synchronized Link getProviderLink() {
339 return providerLink;
340 }
341
342 public List<ContigFile> getContigFiles() {
343 return contigFiles;
344 }
345
346 }
347
348 public class ContigFile implements Serializable{
349
350 private final Link contigLink;
351 private List<Link> primerLinks;
352
353 public ContigFile(Link contigLink) {
354 this.contigLink = contigLink;
355 }
356
357 public void addPrimerLink(URI uri, String linkText){
358 if(primerLinks==null){
359 primerLinks = new ArrayList<Link>();
360 }
361 primerLinks.add(new Link(uri, linkText));
362 }
363
364 public Link getContigLink() {
365 return contigLink;
366 }
367
368 public List<Link> getPrimerLinks() {
369 return primerLinks;
370 }
371
372 }
373
374 public static class Link implements Serializable{
375
376 private static final long serialVersionUID = 6635385359662624579L;
377
378 private String linkText;
379 private URI uri;
380
381 public Link(URI uri, String linkText) {
382 super();
383 this.linkText = linkText;
384 this.uri = uri;
385 }
386 /**
387 * @return the linkText
388 */
389 public synchronized String getLinkText() {
390 return linkText;
391 }
392 /**
393 * @param linkText the linkText to set
394 */
395 public synchronized void setLinkText(String linkText) {
396 this.linkText = linkText;
397 }
398 /**
399 * @return the uri
400 */
401 public synchronized URI getUri() {
402 return uri;
403 }
404 /**
405 * @param uri the uri to set
406 */
407 public synchronized void setUri(URI uri) {
408 this.uri = uri;
409 }
410
411 @Override
412 public int hashCode() {
413 final int prime = 31;
414 int result = 1;
415 result = prime * result + ((linkText == null) ? 0 : linkText.hashCode());
416 result = prime * result + ((uri == null) ? 0 : uri.hashCode());
417 return result;
418 }
419
420 @Override
421 public boolean equals(Object obj) {
422 if (this == obj) {
423 return true;
424 }
425 if (obj == null) {
426 return false;
427 }
428 if (getClass() != obj.getClass()) {
429 return false;
430 }
431 Link other = (Link) obj;
432 if (linkText == null) {
433 if (other.linkText != null) {
434 return false;
435 }
436 } else if (!linkText.equals(other.linkText)) {
437 return false;
438 }
439 if (uri == null) {
440 if (other.uri != null) {
441 return false;
442 }
443 } else if (!uri.equals(other.uri)) {
444 return false;
445 }
446 return true;
447 }
448 }
449
450
451 }