4596057aaeb45dccea3852e667f03a7e27dccc47
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateLabelProvider.java
1 // $Id$
2 /**
3 * Copyright (C) 2013 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.view.derivateSearch;
11
12 import java.util.List;
13 import java.util.Set;
14 import java.util.UUID;
15
16 import org.eclipse.jface.viewers.ColumnLabelProvider;
17 import org.eclipse.jface.viewers.TreeNode;
18 import org.eclipse.swt.graphics.Image;
19 import org.hibernate.LazyInitializationException;
20
21 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
22 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
23 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
24 import eu.etaxonomy.cdm.model.common.CdmBase;
25 import eu.etaxonomy.cdm.model.common.DefinedTerm;
26 import eu.etaxonomy.cdm.model.common.Identifier;
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.FieldUnit;
32 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
33 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
34 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
35 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
36 import eu.etaxonomy.taxeditor.model.ImageResources;
37 import eu.etaxonomy.taxeditor.store.CdmStore;
38
39 /**
40 * Label provider for the views to show {@link SpecimenOrObservationBase}s.<br>
41 * <br>
42 * <b>Note:</b> If you use this label provider you need to assure that you
43 * created a {@link ConversationHolder} resp. have an open session because
44 * the labels are generated from various fields of the derivate hierarchy which
45 * are lazy loaded and could therefore throw a {@link LazyInitializationException}.<br>
46 * Use <b>{@link #setConversation(ConversationHolder)}</b> to assign the session to this provider.
47 */
48 public class DerivateLabelProvider extends ColumnLabelProvider {
49
50 private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]";
51
52 private Set<SingleRead> multiLinkSingleReads;
53
54 private ConversationHolder conversation;
55
56 private static DefinedTerm photoTerm = null;
57 private static DefinedTerm drawingTerm = null;
58 private static DefinedTerm specimenScanTerm = null;
59 private static DefinedTerm detailImageTerm = null;
60 private static DefinedTerm sampleDesignationTerm = null;
61
62 //FIXME: move static term getters to new singleton utility class
63 private static void initializeTerms() {
64 List<DefinedTerm> preferredTerms = CdmStore.getTermManager().getPreferredTerms(DefinedTerm.class);
65 for (DefinedTerm definedTerm : preferredTerms) {
66 if(definedTerm.getUuid().equals(UUID.fromString("c5c59c42-f254-471e-96c6-09f459f7c903"))){
67 photoTerm = definedTerm;
68 }
69 else if(definedTerm.getUuid().equals(UUID.fromString("669b0409-4aa4-4695-aae4-a95ed27bad4c"))){
70 drawingTerm = definedTerm;
71 }
72 else if(definedTerm.getUuid().equals(UUID.fromString("acda15be-c0e2-4ea8-8783-b9b0c4ad7f03"))){
73 specimenScanTerm = definedTerm;
74 }
75 else if(definedTerm.getUuid().equals(UUID.fromString("31eb8d02-bf5d-437c-bcc6-87a626445f34"))){
76 detailImageTerm = definedTerm;
77 }
78 else if(definedTerm.getUuid().equals(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"))){
79 sampleDesignationTerm = definedTerm;
80 }
81 }
82 }
83
84 public static DefinedTerm getLivingPlantPhotoTerm(){
85 if(photoTerm==null){
86 initializeTerms();
87 }
88 return photoTerm;
89 }
90
91 public static DefinedTerm getArtworkTerm(){
92 if(drawingTerm==null){
93 initializeTerms();
94 }
95 return drawingTerm;
96 }
97
98 public static DefinedTerm getSpecimenScanTerm(){
99 if(specimenScanTerm==null){
100 initializeTerms();
101 }
102 return specimenScanTerm;
103 }
104
105 public static DefinedTerm getDetailImageTerm(){
106 if(detailImageTerm==null){
107 initializeTerms();
108 }
109 return detailImageTerm;
110 }
111
112 public static DefinedTerm getSampleDesignationTerm(){
113 if(sampleDesignationTerm==null){
114 initializeTerms();
115 }
116 return sampleDesignationTerm;
117 }
118
119
120 /** {@inheritDoc} */
121 @Override
122 public String getText(Object element) {
123 return getDerivateText(element);
124 }
125
126 /** {@inheritDoc} */
127 @Override
128 public String getToolTipText(Object element) {
129 return getDerivateText(element);
130 }
131
132 /**
133 * @param conversation the conversation to set
134 */
135 public void setConversation(ConversationHolder conversation) {
136 this.conversation = conversation;
137 }
138
139 public String getDerivateText(Object element){
140 return getDerivateText(element, conversation);
141 }
142
143 public static String getDerivateText(Object element, ConversationHolder conversation){
144 //TODO: use list of strings to assemble labels to avoid adding the separator every time and to allow null values
145 TreeNode parentNode = null;
146 TreeNode node = null;
147 Object derivate = element;
148 if(element instanceof TreeNode){
149 node = (TreeNode) element;
150 parentNode = node.getParent();
151 //unwrap specimen from TreeNode
152 derivate = node.getValue();
153 }
154
155 conversation.bind();
156
157 final String emptyString = "";
158 final String separator = " ";
159
160 String label = emptyString;
161
162 //Field Unit
163 if(derivate instanceof FieldUnit){
164 FieldUnit fieldUnit = (FieldUnit)derivate;
165 if(fieldUnit.getGatheringEvent()!=null){
166 GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
167 if(CdmStore.getService(IOccurrenceService.class).exists(fieldUnit.getUuid())){
168 fieldUnit = (FieldUnit) CdmStore.getService(IOccurrenceService.class).load(fieldUnit.getUuid());
169 gatheringEvent = fieldUnit.getGatheringEvent();
170 }
171 label += gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getLabel()+separator:emptyString;
172 label += gatheringEvent.getLocality()!=null?gatheringEvent.getLocality().getText()+separator:emptyString;
173 label += gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate()+separator:emptyString;
174 label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
175 }
176 label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():emptyString;
177 }
178 //MediaSpecimen
179 else if(derivate instanceof MediaSpecimen){
180 MediaSpecimen mediaSpecimen = (MediaSpecimen)derivate;
181 if(mediaSpecimen.getMediaSpecimen()!=null){
182 label += mediaSpecimen.getMediaSpecimen().getTitle()!=null?mediaSpecimen.getMediaSpecimen().getTitle().getText()+separator:"[no motif]";
183 label += mediaSpecimen.getMediaSpecimen().getArtist()!=null?mediaSpecimen.getMediaSpecimen().getArtist()+separator:emptyString;
184 }
185 eu.etaxonomy.cdm.model.occurrence.Collection collection = mediaSpecimen.getCollection();
186 if(collection!=null){
187 label += collection.getName()!=null?collection.getName()+" ":emptyString;
188 label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
189 }
190 label += mediaSpecimen.getAccessionNumber()!=null?mediaSpecimen.getAccessionNumber()+separator:emptyString;
191 label += mediaSpecimen.getBarcode()!=null?mediaSpecimen.getBarcode()+separator:emptyString;
192 }
193 //TissueSample + DnaSample
194 else if(derivate instanceof DnaSample){
195 DnaSample dnaSample = (DnaSample)derivate;
196 if(((DnaSample) derivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
197 Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(dnaSample);
198 if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
199 label += currentSampleDesignation.getIdentifier()+separator;
200 }
201 else{
202 label += NO_SAMPLE_DESIGNATION+separator;
203 }
204 }
205 else if(((DnaSample) derivate).getRecordBasis()==SpecimenOrObservationType.TissueSample){
206 if(dnaSample.getKindOfUnit()!=null){
207 label += dnaSample.getKindOfUnit()+separator;
208 }
209 Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(dnaSample);
210 if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
211 label += currentSampleDesignation.getIdentifier()+separator;
212 }
213 else{
214 label += NO_SAMPLE_DESIGNATION+separator;
215 }
216 }
217
218 }
219 //DerivedUnit + TissueSample
220 else if(derivate instanceof DerivedUnit){
221 DerivedUnit derivedUnit = (DerivedUnit)derivate;
222 if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
223 java.util.Collection<FieldUnit> fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid());
224 if(fieldUnits!=null && !fieldUnits.isEmpty()){
225 FieldUnit fieldUnit = fieldUnits.iterator().next();
226 GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
227 // gatheringEvent = HibernateProxyHelper.deproxy(gatheringEvent, GatheringEvent.class);
228 if(gatheringEvent!=null){
229 label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
230 }
231 label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString;
232 }
233 eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection();
234 if(collection!=null){
235 label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
236 }
237 String mostSignificantIdentifier = CdmStore.getService(IOccurrenceService.class).getMostSignificantIdentifier(derivedUnit);
238 label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString;
239 }
240 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
241 //TissueSample should only be created by using it's own class
242 //in future using only one class with different SpecimenOrObservationTypes is desired
243 // label += derivedUnit.getKindOfUnit() + NO_SAMPLE_DESIGNATION;
244 }
245 }
246 //Sequence
247 else if(derivate instanceof Sequence){
248 Sequence sequence = (Sequence)derivate;
249 Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(sequence);
250 if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
251 label += currentSampleDesignation.getIdentifier()+separator;
252 }
253 else{
254 label += NO_SAMPLE_DESIGNATION+separator;
255 }
256 label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():emptyString;
257 }
258 //SingleRead
259 else if(derivate instanceof SingleRead){
260 SingleRead singleRead = (SingleRead)derivate;
261 if(parentNode!=null && parentNode.getValue() instanceof Sequence){
262 Sequence sequence = (Sequence) parentNode.getValue();
263 Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(sequence);
264 if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
265 label = currentSampleDesignation.getIdentifier()+separator;
266 }
267 else{
268 label += NO_SAMPLE_DESIGNATION+separator;
269 }
270 label += singleRead.getPrimer()!=null?singleRead.getPrimer().getLabel()+separator:emptyString;
271 if(sequence!=null && sequence.getDnaMarker()!=null){
272 label += sequence.getDnaMarker()+separator;
273 }
274 if(singleRead.getAmplificationResult()!=null && singleRead.getAmplificationResult().getAmplification()!=null){
275 label += singleRead.getAmplificationResult().getAmplification().getLabelCache()+separator;
276 }
277 }
278 }
279 //SOOB
280 else if(derivate instanceof SpecimenOrObservationBase){
281 SpecimenOrObservationBase<?> specimen = (SpecimenOrObservationBase<?>) derivate;
282 SpecimenOrObservationType type = specimen.getRecordBasis();
283 return specimen.getTitleCache() + (type!=null?" ["+type.toString()+"]":emptyString);
284 }
285 if(label.isEmpty()){
286 label = derivate.toString();
287 }
288 //remove last comma
289 else if(label.endsWith(separator)){
290 label = label.substring(0, label.length()-separator.length());
291 }
292 return label;
293 }
294
295 /* (non-Javadoc)
296 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
297 */
298 @Override
299 public Image getImage(Object element) {
300 if(element instanceof TreeNode){
301 element = ((TreeNode) element).getValue();
302 }
303 if(element instanceof CdmBase){
304 CdmBase cdmBase = (CdmBase)element;
305 boolean hasCharacterData = false;
306 if(cdmBase.isInstanceOf(SpecimenOrObservationBase.class)){
307 SpecimenOrObservationBase<?> specimen = HibernateProxyHelper.deproxy(cdmBase, SpecimenOrObservationBase.class);
308 if(!CdmStore.getService(IOccurrenceService.class).getCharacterDataForSpecimen(specimen.getUuid()).isEmpty()){
309 hasCharacterData = true;
310 }
311 }
312 if(cdmBase.isInstanceOf(FieldUnit.class)){
313 return hasCharacterData?ImageResources.getImage(ImageResources.FIELD_UNIT_CHARACTER_DATA):ImageResources.getImage(ImageResources.FIELD_UNIT);
314 }
315 else if(cdmBase.isInstanceOf(DerivedUnit.class)){
316 DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(element, DerivedUnit.class);
317 if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.FieldUnit){
318 return hasCharacterData?ImageResources.getImage(ImageResources.FIELD_UNIT_CHARACTER_DATA):ImageResources.getImage(ImageResources.FIELD_UNIT);
319 }
320 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
321 return hasCharacterData?ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE);
322 }
323 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
324 return hasCharacterData?ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE);
325 }
326 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
327 return hasCharacterData?ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
328 }
329 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.Media){
330 if(derivedUnit.getKindOfUnit()!=null){
331 if(derivedUnit.getKindOfUnit().equals(getArtworkTerm())){
332 return hasCharacterData?ImageResources.getImage(ImageResources.ARTWORK_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
333 }
334 else if(derivedUnit.getKindOfUnit().equals(getLivingPlantPhotoTerm())){
335 return hasCharacterData?ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE);
336 }
337 else if(derivedUnit.getKindOfUnit().equals(getSpecimenScanTerm())){
338 return hasCharacterData?ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE);
339 }
340 else if(derivedUnit.getKindOfUnit().equals(getDetailImageTerm())){
341 return hasCharacterData?ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE);
342 }
343 }
344 }
345 }
346 else if(cdmBase.isInstanceOf(Sequence.class)){
347 return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
348 }
349
350 else if(cdmBase.isInstanceOf(SingleRead.class)){
351 if(multiLinkSingleReads.contains(element)){
352 return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
353 }
354 else{
355 return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
356 }
357 }
358 }
359 return super.getImage(element);
360 }
361
362 public static Identifier<DnaSample> getCurrentSampleDesignation(CdmBase entity) {
363 if(entity.isInstanceOf(DnaSample.class)){
364 DnaSample dnaSample = HibernateProxyHelper.deproxy(entity, DnaSample.class);
365 for (Identifier<DnaSample> identifier : dnaSample.getIdentifiers()) {
366 if(identifier.getType()!=null && identifier.getType().equals(DerivateLabelProvider.getSampleDesignationTerm())){
367 //first sample designation is the current
368 return identifier;
369 }
370 }
371 }
372 else if(entity.isInstanceOf(Sequence.class)){
373 Sequence sequence = HibernateProxyHelper.deproxy(entity, Sequence.class);
374 if(sequence.getDnaSample()!=null){
375 return getCurrentSampleDesignation(sequence.getDnaSample());
376 }
377 }
378 return null;
379 }
380
381 /**
382 * @param multiLinkSingleReads2
383 */
384 public void setMultiLinkSingleReads(Set<SingleRead> multiLinkSingleReads) {
385 this.multiLinkSingleReads = multiLinkSingleReads;
386 }
387
388 }