Merge branch 'release/4.7.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateLabelProvider.java
index 1b47155dba9396fce2fbdfb417b72105c024208c..7ca576b65ad48511ee33eb4914f9e63e38375f94 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2013 EDIT
 * European Distributed Institute of Taxonomy
@@ -9,7 +8,13 @@
 */
 package eu.etaxonomy.taxeditor.view.derivateSearch;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 
@@ -20,19 +25,26 @@ import org.hibernate.LazyInitializationException;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.format.CdmFormatterFactory;
+import eu.etaxonomy.cdm.format.ICdmFormatter.FormatKey;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.DefinedTerm;
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.Identifier;
 import eu.etaxonomy.cdm.model.molecular.DnaSample;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.cdm.strategy.cache.common.IdentifiableEntityDefaultCacheStrategy;
 import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -49,7 +61,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
 
     private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]";
 
-    private Set<SingleRead> multiLinkSingleReads;
+    private static Set<SingleRead> multiLinkSingleReads;
+
+    private static Map<DerivedUnit, Collection<SpecimenTypeDesignation>> typeDesignations;
 
     private ConversationHolder conversation;
 
@@ -120,7 +134,77 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
     /** {@inheritDoc} */
     @Override
     public String getText(Object element) {
-        return getDerivateText(element);
+        if(element instanceof TreeNode){
+            element = ((TreeNode) element).getValue();
+        }
+        String text = null;
+
+        //check if collection code does not exist -> use collection name then
+        FormatKey collectionKey = FormatKey.COLLECTION_CODE;
+        text = CdmFormatterFactory.format(element,new FormatKey[]{FormatKey.COLLECTION_CODE});
+        if(CdmUtils.isBlank(text)){
+            collectionKey = FormatKey.COLLECTION_NAME;
+        }
+
+        //Use titlecache for FieldUnits
+        if(element instanceof FieldUnit){
+            return ((FieldUnit) element).getTitleCache();
+        }
+
+        else if(element instanceof MediaSpecimen){
+            text = CdmFormatterFactory.format(element,
+                    new FormatKey[]{
+                            FormatKey.MEDIA_TITLE_CACHE, FormatKey.SPACE,
+                            collectionKey, FormatKey.SPACE,
+                            FormatKey.MOST_SIGNIFICANT_IDENTIFIER, FormatKey.SPACE,
+                            FormatKey.MEDIA_TITLE, FormatKey.SPACE,
+                            FormatKey.MEDIA_ARTIST, FormatKey.SPACE,
+                            });
+        }
+        else if (element instanceof DnaSample) {
+            text = CdmFormatterFactory.format(element,
+                    new FormatKey[] {
+                            collectionKey, FormatKey.SPACE,
+                            FormatKey.MOST_SIGNIFICANT_IDENTIFIER, FormatKey.SPACE,
+                            FormatKey.SAMPLE_DESIGNATION, FormatKey.SPACE
+                            });
+        }
+        else if (element instanceof DerivedUnit) {
+            text = CdmFormatterFactory.format(element,
+                    new FormatKey[] {
+                            collectionKey, FormatKey.SPACE,
+                            FormatKey.MOST_SIGNIFICANT_IDENTIFIER, FormatKey.SPACE
+                            });
+        }
+        else if (element instanceof Sequence) {
+            text = CdmFormatterFactory.format(element,
+                    new FormatKey[] {
+                            FormatKey.SEQUENCE_DNA_MARKER, FormatKey.SPACE
+                            });
+        }
+        else if (element instanceof SingleRead) {
+            text = CdmFormatterFactory.format(element,
+                    new FormatKey[] {
+                            FormatKey.SINGLE_READ_PHEROGRAM_TITLE_CACHE, FormatKey.SPACE,
+                            FormatKey.AMPLIFICATION_LABEL, FormatKey.SPACE,
+            });
+        }
+        else if(element instanceof IdentifiableEntity){
+
+               IdentifiableEntity identifiableEntity = (IdentifiableEntity) element;
+               if(identifiableEntity.isProtectedTitleCache()){
+                       text = identifiableEntity.getTitleCache();
+               }
+        }
+        if(CdmUtils.isBlank(text) || text.equals(IdentifiableEntityDefaultCacheStrategy.TITLE_CACHE_GENERATION_NOT_IMPLEMENTED)){
+            if(element instanceof CdmBase){
+                text = ((CdmBase) element).getUuid().toString();
+            }
+            else{
+                text = element.toString();
+            }
+        }
+               return text;
     }
 
     /** {@inheritDoc} */
@@ -152,7 +236,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             derivate = node.getValue();
         }
 
-        conversation.bind();
+        if(conversation!=null){
+            conversation.bind();
+        }
 
         final String emptyString = "";
         final String separator = " ";
@@ -164,10 +250,6 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             FieldUnit fieldUnit = (FieldUnit)derivate;
             if(fieldUnit.getGatheringEvent()!=null){
                 GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
-                if(CdmStore.getService(IOccurrenceService.class).exists(fieldUnit.getUuid()) && !conversation.getSession().contains(gatheringEvent)){
-                    fieldUnit = (FieldUnit) CdmStore.getService(IOccurrenceService.class).load(fieldUnit.getUuid());
-                    gatheringEvent = fieldUnit.getGatheringEvent();
-                }
                 label += gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getLabel()+separator:emptyString;
                 label += gatheringEvent.getLocality()!=null?gatheringEvent.getLocality().getText()+separator:emptyString;
                 label += gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate()+separator:emptyString;
@@ -220,21 +302,32 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         else if(derivate instanceof DerivedUnit){
             DerivedUnit derivedUnit = (DerivedUnit)derivate;
             if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
-                java.util.Collection<FieldUnit> fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid());
-                if(fieldUnits!=null && !fieldUnits.isEmpty()){
-                    FieldUnit fieldUnit = fieldUnits.iterator().next();
-                    GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
-//                  gatheringEvent = HibernateProxyHelper.deproxy(gatheringEvent, GatheringEvent.class);
-                    if(gatheringEvent!=null){
-                        label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
+                //check for type designation
+                if(typeDesignations.get(derivedUnit)==null){
+                    for (SpecimenTypeDesignation specimenTypeDesignation : derivedUnit.getSpecimenTypeDesignations()) {
+                        addTypeDesignation(derivedUnit, specimenTypeDesignation);
                     }
-                    label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString;
                 }
+                //java.util.Collection<FieldUnit> fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid());
+                //TODO : This is not generic anymore for performance reasons
+                Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();
+                if(originals!=null && originals.size() ==1) {
+                    SpecimenOrObservationBase specimen = originals.iterator().next();
+                    if(specimen instanceof FieldUnit) {
+                        FieldUnit fieldUnit = (FieldUnit)specimen;
+                        GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
+                        if(gatheringEvent!=null){
+                            label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
+                        }
+                        label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString;
+                    }
+                }
+
                 eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection();
                 if(collection!=null){
                     label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
                 }
-                String mostSignificantIdentifier = CdmStore.getService(IOccurrenceService.class).getMostSignificantIdentifier(derivedUnit);
+                String mostSignificantIdentifier = derivedUnit.getMostSignificantIdentifier();
                 label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString;
             }
             else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
@@ -292,9 +385,6 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         return label;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
-     */
     @Override
     public Image getImage(Object element) {
         if(element instanceof TreeNode){
@@ -305,7 +395,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             boolean hasCharacterData = false;
             if(cdmBase.isInstanceOf(SpecimenOrObservationBase.class)){
                 SpecimenOrObservationBase<?> specimen = HibernateProxyHelper.deproxy(cdmBase, SpecimenOrObservationBase.class);
-                if(!CdmStore.getService(IOccurrenceService.class).getCharacterDataForSpecimen(specimen).isEmpty()){
+                if(specimen.hasCharacterData()){
                     hasCharacterData = true;
                 }
             }
@@ -314,6 +404,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             }
             else if(cdmBase.isInstanceOf(DerivedUnit.class)){
                 DerivedUnit derivedUnit = HibernateProxyHelper.deproxy(element, DerivedUnit.class);
+
                 if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.FieldUnit){
                     return hasCharacterData?ImageResources.getImage(ImageResources.FIELD_UNIT_CHARACTER_DATA):ImageResources.getImage(ImageResources.FIELD_UNIT);
                 }
@@ -324,9 +415,13 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
                     return hasCharacterData?ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE);
                 }
                 else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
+                    if(typeDesignations.get(derivedUnit)!=null && !typeDesignations.get(derivedUnit).isEmpty()){
+                        return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE_TYPE);
+                    }
                     return hasCharacterData?ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
                 }
-                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.Media){
+                else if(derivedUnit.getRecordBasis().isMedia()
+                        || derivedUnit.getRecordBasis().isKindOf(SpecimenOrObservationType.Media)){
                     if(derivedUnit.getKindOfUnit()!=null){
                         if(derivedUnit.getKindOfUnit().equals(getArtworkTerm())){
                             return hasCharacterData?ImageResources.getImage(ImageResources.ARTWORK_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
@@ -348,7 +443,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             }
 
             else if(cdmBase.isInstanceOf(SingleRead.class)){
-                if(multiLinkSingleReads.contains(element)){
+                if(multiLinkSingleReads!=null && multiLinkSingleReads.contains(element)){
                     return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
                 }
                 else{
@@ -356,7 +451,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
                 }
             }
         }
-        return super.getImage(element);
+        return ImageResources.getImage(ImageResources.DEFAULT_DERIVATIVE);
     }
 
     public static Identifier<DnaSample> getCurrentSampleDesignation(CdmBase entity) {
@@ -378,11 +473,47 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         return null;
     }
 
-    /**
-     * @param multiLinkSingleReads2
-     */
-    public void setMultiLinkSingleReads(Set<SingleRead> multiLinkSingleReads) {
-        this.multiLinkSingleReads = multiLinkSingleReads;
+    private static void addTypeDesignation(DerivedUnit derivedUnit, SpecimenTypeDesignation typeDesignation){
+        Collection<SpecimenTypeDesignation> list = typeDesignations.get(derivedUnit);
+        if(list==null){
+            list = new ArrayList<SpecimenTypeDesignation>();
+        }
+        list.add(typeDesignation);
+        typeDesignations.put(derivedUnit, list);
+    }
+
+    public static Set<SingleRead> getMultiLinkSingleReads() {
+        return multiLinkSingleReads;
+    }
+
+    public void updateLabelCache(Collection<SpecimenOrObservationBase<?>> rootElements) {
+        multiLinkSingleReads = new HashSet<SingleRead>();
+        typeDesignations = new HashMap<DerivedUnit, Collection<SpecimenTypeDesignation>>();
+        for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
+            if(entry.getValue().size()>1){
+                multiLinkSingleReads.add(entry.getKey());
+            }
+        }
+        if(rootElements!=null){
+            Collection<DerivedUnit> derivedUnits = new ArrayList<DerivedUnit>();
+            for (SpecimenOrObservationBase specimenOrObservationBase : rootElements) {
+                List<DerivedUnit> childUnits = CdmStore.getService(IOccurrenceService.class).getAllChildDerivatives(specimenOrObservationBase.getUuid());
+                if (childUnits != null){
+                    derivedUnits.addAll(childUnits);
+                }
+                if(specimenOrObservationBase.isInstanceOf(DerivedUnit.class)){
+                    specimenOrObservationBase = CdmStore.getService(IOccurrenceService.class).load(specimenOrObservationBase.getUuid());
+                    if (specimenOrObservationBase != null){
+                        derivedUnits.add(HibernateProxyHelper.deproxy(specimenOrObservationBase, DerivedUnit.class));
+                    }
+                }
+            }
+            for (DerivedUnit derivedUnit : derivedUnits) {
+                if(!derivedUnit.getSpecimenTypeDesignations().isEmpty()){
+                    typeDesignations.put(derivedUnit, derivedUnit.getSpecimenTypeDesignations());
+                }
+            }
+        }
     }
 
 }