Merge branch 'hotfix/3.12.4' into develop
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateLabelProvider.java
index e7e014a1be012519800d0b078e1e6536a1c22e09..14265f1d5f179233886d219201d6128b78435e42 100644 (file)
@@ -9,7 +9,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,10 +26,17 @@ 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.format.CdmFormatter;
+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.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;
@@ -44,7 +57,11 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  */
 public class DerivateLabelProvider extends ColumnLabelProvider {
 
-    private Set<SingleRead> multiLinkSingleReads;
+    private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]";
+
+    private static Set<SingleRead> multiLinkSingleReads;
+
+    private static Map<DerivedUnit, Collection<SpecimenTypeDesignation>> typeDesignations;
 
     private ConversationHolder conversation;
 
@@ -52,7 +69,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
     private static DefinedTerm drawingTerm = null;
     private static DefinedTerm specimenScanTerm = null;
     private static DefinedTerm detailImageTerm = null;
+    private static DefinedTerm sampleDesignationTerm = null;
 
+    //FIXME: move static term getters to new singleton utility class
     private static void initializeTerms() {
         List<DefinedTerm> preferredTerms = CdmStore.getTermManager().getPreferredTerms(DefinedTerm.class);
         for (DefinedTerm definedTerm : preferredTerms) {
@@ -68,6 +87,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
             else if(definedTerm.getUuid().equals(UUID.fromString("31eb8d02-bf5d-437c-bcc6-87a626445f34"))){
                 detailImageTerm = definedTerm;
             }
+            else if(definedTerm.getUuid().equals(UUID.fromString("fadeba12-1be3-4bc7-9ff5-361b088d86fc"))){
+                sampleDesignationTerm = definedTerm;
+            }
         }
     }
 
@@ -99,11 +121,37 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         return detailImageTerm;
     }
 
+    public static DefinedTerm getSampleDesignationTerm(){
+        if(sampleDesignationTerm==null){
+            initializeTerms();
+        }
+        return sampleDesignationTerm;
+    }
+
 
     /** {@inheritDoc} */
     @Override
     public String getText(Object element) {
-        return getDerivateText(element);
+        if(element instanceof TreeNode){
+            element = ((TreeNode) element).getValue();
+        }
+        CdmFormatter formatter = new CdmFormatter(
+                FormatKey.GATHERING_COUNTRY, FormatKey.SPACE,
+                FormatKey.GATHERING_LOCALITY_TEXT, FormatKey.SPACE,
+                FormatKey.GATHERING_DATE, FormatKey.SPACE,
+                FormatKey.GATHERING_COLLECTOR, FormatKey.SPACE,
+                FormatKey.FIELD_NUMBER, FormatKey.SPACE,
+                FormatKey.COLLECTION_CODE, FormatKey.SPACE,
+                FormatKey.MOST_SIGNIFICANT_IDENTIFIER, FormatKey.SPACE,
+                FormatKey.KIND_OF_UNIT, FormatKey.SPACE,
+                FormatKey.SAMPLE_DESIGNATION, FormatKey.SPACE,
+                FormatKey.SINGLE_READ_PRIMER, FormatKey.SPACE,
+                FormatKey.SEQUENCE_DNA_MARKER, FormatKey.SPACE,
+                FormatKey.AMPLIFICATION_LABEL, FormatKey.SPACE,
+                FormatKey.MEDIA_TITLE, FormatKey.SPACE,
+                FormatKey.MEDIA_ARTIST, FormatKey.SPACE
+                );
+        return formatter.format(element);
     }
 
     /** {@inheritDoc} */
@@ -119,173 +167,289 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         this.conversation = conversation;
     }
 
-    /**
-     *
-     * @param element
-     * @return
-     */
     public String getDerivateText(Object element){
+        return getDerivateText(element, conversation);
+    }
+
+    public static String getDerivateText(Object element, ConversationHolder conversation){
+        //TODO: use list of strings to assemble labels to avoid adding the separator every time and to allow null values
         TreeNode parentNode = null;
+        TreeNode node = null;
+        Object derivate = element;
         if(element instanceof TreeNode){
-            parentNode = ((TreeNode) element).getParent();
+            node = (TreeNode) element;
+            parentNode = node.getParent();
             //unwrap specimen from TreeNode
-            element = ((TreeNode) element).getValue();
+            derivate = node.getValue();
+        }
+
+        if(conversation!=null){
+            conversation.bind();
         }
 
-        conversation.bind();
+        final String emptyString = "";
+        final String separator = " ";
+
+        String label = emptyString;
 
-        String label = "";
-        if(element instanceof FieldUnit){
-            FieldUnit fieldUnit = (FieldUnit)element;
+        //Field Unit
+        if(derivate instanceof FieldUnit){
+            FieldUnit fieldUnit = (FieldUnit)derivate;
             if(fieldUnit.getGatheringEvent()!=null){
                 GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
-                if(!conversation.getSession().contains(gatheringEvent)){
-                    fieldUnit = (FieldUnit) CdmStore.getService(IOccurrenceService.class).load(fieldUnit.getUuid());
-                    gatheringEvent = fieldUnit.getGatheringEvent();
-                }
-                label += gatheringEvent.getCountry()!=null?gatheringEvent.getCountry().getLabel()+", ":"";
-                label += gatheringEvent.getLocality()!=null?gatheringEvent.getLocality().getText()+", ":"";
-                label += gatheringEvent.getGatheringDate()!=null?gatheringEvent.getGatheringDate()+", ":"";
-                label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+", ":"";
+                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;
+                label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
             }
-            label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():"";
+            label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():emptyString;
         }
-        else if(element instanceof MediaSpecimen){
-            MediaSpecimen mediaSpecimen = (MediaSpecimen)element;
+        //MediaSpecimen
+        else if(derivate instanceof MediaSpecimen){
+            MediaSpecimen mediaSpecimen = (MediaSpecimen)derivate;
             if(mediaSpecimen.getMediaSpecimen()!=null){
-                label += mediaSpecimen.getMediaSpecimen().getTitle()!=null?mediaSpecimen.getMediaSpecimen().getTitle().getText()+", ":"[no motif]";
-                label += mediaSpecimen.getMediaSpecimen().getArtist()!=null?mediaSpecimen.getMediaSpecimen().getArtist()+", ":"";
+                label += mediaSpecimen.getMediaSpecimen().getTitle()!=null?mediaSpecimen.getMediaSpecimen().getTitle().getText()+separator:"[no motif]";
+                label += mediaSpecimen.getMediaSpecimen().getArtist()!=null?mediaSpecimen.getMediaSpecimen().getArtist()+separator:emptyString;
             }
             eu.etaxonomy.cdm.model.occurrence.Collection collection = mediaSpecimen.getCollection();
             if(collection!=null){
-                label += collection.getName()!=null?collection.getName()+" ":"";
-                label += collection.getCode()!=null?"("+collection.getCode()+"), ":"";
+                label += collection.getName()!=null?collection.getName()+" ":emptyString;
+                label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
             }
-            label += mediaSpecimen.getAccessionNumber()!=null?mediaSpecimen.getAccessionNumber()+", ":"";
+            label += mediaSpecimen.getAccessionNumber()!=null?mediaSpecimen.getAccessionNumber()+separator:emptyString;
+            label += mediaSpecimen.getBarcode()!=null?mediaSpecimen.getBarcode()+separator:emptyString;
         }
-        else if(element instanceof DnaSample
-                || (element instanceof DerivedUnit
-                        && ((SpecimenOrObservationBase<?>) element).getRecordBasis()==SpecimenOrObservationType.DnaSample)){
-            label += "[no sample designation]";
+        //TissueSample + DnaSample
+        else if(derivate instanceof DnaSample){
+            DnaSample dnaSample = (DnaSample)derivate;
+            if(((DnaSample) derivate).getRecordBasis()==SpecimenOrObservationType.DnaSample){
+                Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(dnaSample);
+                if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
+                    label += currentSampleDesignation.getIdentifier()+separator;
+                }
+                else{
+                    label += NO_SAMPLE_DESIGNATION+separator;
+                }
+            }
+            else if(((DnaSample) derivate).getRecordBasis()==SpecimenOrObservationType.TissueSample){
+                if(dnaSample.getKindOfUnit()!=null){
+                    label += dnaSample.getKindOfUnit()+separator;
+                }
+                Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(dnaSample);
+                if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
+                    label += currentSampleDesignation.getIdentifier()+separator;
+                }
+                else{
+                    label += NO_SAMPLE_DESIGNATION+separator;
+                }
+            }
 
         }
-        else if(element instanceof DerivedUnit){
-            DerivedUnit derivedUnit = (DerivedUnit)element;
+        //DerivedUnit + TissueSample
+        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()+", ":"";
+                //check for type designation
+                if(typeDesignations.get(derivedUnit)==null){
+                    for (SpecimenTypeDesignation specimenTypeDesignation : CdmStore.getService(IOccurrenceService.class).listTypeDesignations(derivedUnit, null, null, null, null)) {
+                        addTypeDesignation(derivedUnit, specimenTypeDesignation);
+                    }
+                }
+                //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;
                     }
-                    label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+", ":"";
                 }
+
                 eu.etaxonomy.cdm.model.occurrence.Collection collection = derivedUnit.getCollection();
                 if(collection!=null){
-                    label += collection.getName()!=null?collection.getName()+" ":"";
-                    label += collection.getCode()!=null?"("+collection.getCode()+"), ":"";
+                    label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
                 }
-                label += derivedUnit.getAccessionNumber()!=null?derivedUnit.getAccessionNumber()+", ":"";
-                label += derivedUnit.getBarcode()!=null?derivedUnit.getBarcode():"";
+                String mostSignificantIdentifier = derivedUnit.getMostSignificantIdentifier();
+                label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString;
             }
             else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
-                //TODO: implement
-                label += "kindofTissue? + [no sample designation]";
+                //TissueSample should only be created by using it's own class
+                //in future using only one class with different SpecimenOrObservationTypes is desired
+//                label += derivedUnit.getKindOfUnit() + NO_SAMPLE_DESIGNATION;
             }
         }
-        else if(element instanceof Sequence){
-            Sequence sequence = (Sequence)element;
-            label += "[no sample designation]"+", ";
-            label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():"";
+        //Sequence
+        else if(derivate instanceof Sequence){
+            Sequence sequence = (Sequence)derivate;
+            Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(sequence);
+            if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
+                label += currentSampleDesignation.getIdentifier()+separator;
+            }
+            else{
+                label += NO_SAMPLE_DESIGNATION+separator;
+            }
+            label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():emptyString;
         }
-        else if(element instanceof SingleRead){
-            SingleRead singleRead = (SingleRead)element;
-            label += "[no sample designation]"+", ";
-            label += singleRead.getPrimer()!=null?singleRead.getPrimer().getLabel()+", ":"";
+        //SingleRead
+        else if(derivate instanceof SingleRead){
+            SingleRead singleRead = (SingleRead)derivate;
             if(parentNode!=null && parentNode.getValue() instanceof Sequence){
                 Sequence sequence = (Sequence) parentNode.getValue();
-                label += sequence.getDnaMarker()!=null?sequence.getDnaMarker():"";
+                Identifier<DnaSample> currentSampleDesignation = getCurrentSampleDesignation(sequence);
+                if(currentSampleDesignation!=null && currentSampleDesignation.getIdentifier()!=null){
+                    label = currentSampleDesignation.getIdentifier()+separator;
+                }
+                else{
+                    label += NO_SAMPLE_DESIGNATION+separator;
+                }
+                label += singleRead.getPrimer()!=null?singleRead.getPrimer().getLabel()+separator:emptyString;
+                if(sequence!=null && sequence.getDnaMarker()!=null){
+                    label += sequence.getDnaMarker()+separator;
+                }
+                if(singleRead.getAmplificationResult()!=null && singleRead.getAmplificationResult().getAmplification()!=null){
+                    label += singleRead.getAmplificationResult().getAmplification().getLabelCache()+separator;
+                }
             }
         }
-        else if(element instanceof SpecimenOrObservationBase){
-            SpecimenOrObservationBase<?> derivate = (SpecimenOrObservationBase<?>) element;
-            SpecimenOrObservationType type = derivate.getRecordBasis();
-            return derivate.getTitleCache() + (type!=null?" ["+type.toString()+"]":"");
+        //SOOB
+        else if(derivate instanceof SpecimenOrObservationBase){
+            SpecimenOrObservationBase<?> specimen = (SpecimenOrObservationBase<?>) derivate;
+            SpecimenOrObservationType type = specimen.getRecordBasis();
+            return specimen.getTitleCache() + (type!=null?" ["+type.toString()+"]":emptyString);
         }
         if(label.isEmpty()){
-            label = element.toString();
+            label = derivate.toString();
         }
         //remove last comma
-        else if(label.endsWith(", ")){
-            label = label.substring(0, label.length()-2);
+        else if(label.endsWith(separator)){
+            label = label.substring(0, label.length()-separator.length());
         }
         return label;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
-     */
     @Override
     public Image getImage(Object element) {
         if(element instanceof TreeNode){
             element = ((TreeNode) element).getValue();
         }
-        if(element instanceof FieldUnit){
-            return ImageResources.getImage(ImageResources.FIELD_UNIT);
-        }
-        else if(element instanceof DerivedUnit){
-            DerivedUnit derivedUnit = (DerivedUnit)element;
-            if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.FieldUnit){
-                return ImageResources.getImage(ImageResources.FIELD_UNIT);
-            }
-            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
-                return ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE);
-            }
-            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
-                return ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE);
+        if(element instanceof CdmBase){
+            CdmBase cdmBase = (CdmBase)element;
+            boolean hasCharacterData = false;
+            if(cdmBase.isInstanceOf(SpecimenOrObservationBase.class)){
+                SpecimenOrObservationBase<?> specimen = HibernateProxyHelper.deproxy(cdmBase, SpecimenOrObservationBase.class);
+                if(specimen.hasCharacterData()){
+                    hasCharacterData = true;
+                }
             }
-            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
-                return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
+            if(cdmBase.isInstanceOf(FieldUnit.class)){
+                return hasCharacterData?ImageResources.getImage(ImageResources.FIELD_UNIT_CHARACTER_DATA):ImageResources.getImage(ImageResources.FIELD_UNIT);
             }
-            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.Media){
-                if(derivedUnit.getKindOfUnit()!=null){
-                    if(derivedUnit.getKindOfUnit().equals(getArtworkTerm())){
-                        return ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
-                    }
-                    else if(derivedUnit.getKindOfUnit().equals(getLivingPlantPhotoTerm())){
-                        return ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE);
-                    }
-                    else if(derivedUnit.getKindOfUnit().equals(getSpecimenScanTerm())){
-                        return ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE);
+            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);
+                }
+                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
+                    return hasCharacterData?ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE);
+                }
+                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
+                    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);
                     }
-                    else if(derivedUnit.getKindOfUnit().equals(getDetailImageTerm())){
-                        return ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE);
+                    return hasCharacterData?ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
+                }
+                else if(derivedUnit.getRecordBasis()==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);
+                        }
+                        else if(derivedUnit.getKindOfUnit().equals(getLivingPlantPhotoTerm())){
+                            return hasCharacterData?ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.LIVING_PLANT_PHOTO_DERIVATE);
+                        }
+                        else if(derivedUnit.getKindOfUnit().equals(getSpecimenScanTerm())){
+                            return hasCharacterData?ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.SPECIMEN_SCAN_DERIVATE);
+                        }
+                        else if(derivedUnit.getKindOfUnit().equals(getDetailImageTerm())){
+                            return hasCharacterData?ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE_CHARACTER_DATA):ImageResources.getImage(ImageResources.DETAIL_IMAGE_DERIVATE);
+                        }
                     }
                 }
             }
+            else if(cdmBase.isInstanceOf(Sequence.class)){
+                return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
+            }
+
+            else if(cdmBase.isInstanceOf(SingleRead.class)){
+                if(multiLinkSingleReads!=null && multiLinkSingleReads.contains(element)){
+                    return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
+                }
+                else{
+                    return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
+                }
+            }
         }
-        else if(element instanceof Sequence){
-            return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
-        }
+        return super.getImage(element);
+    }
 
-        else if(element instanceof SingleRead){
-            if(multiLinkSingleReads.contains(element)){
-                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
+    public static Identifier<DnaSample> getCurrentSampleDesignation(CdmBase entity) {
+        if(entity.isInstanceOf(DnaSample.class)){
+            DnaSample dnaSample = HibernateProxyHelper.deproxy(entity, DnaSample.class);
+            for (Identifier<DnaSample> identifier : dnaSample.getIdentifiers()) {
+                if(identifier.getType()!=null && identifier.getType().equals(DerivateLabelProvider.getSampleDesignationTerm())){
+                    //first sample designation is the current
+                    return identifier;
+                }
             }
-            else{
-                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
+        }
+        else if(entity.isInstanceOf(Sequence.class)){
+            Sequence sequence = HibernateProxyHelper.deproxy(entity, Sequence.class);
+            if(sequence.getDnaSample()!=null){
+                return getCurrentSampleDesignation(sequence.getDnaSample());
             }
         }
-        return super.getImage(element);
+        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) {
+        DerivateLabelProvider.multiLinkSingleReads = new HashSet<SingleRead>();
+        DerivateLabelProvider.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) {
+                derivedUnits.addAll(CdmStore.getService(IOccurrenceService.class).getAllChildDerivatives(specimenOrObservationBase.getUuid()));
+                if(specimenOrObservationBase.isInstanceOf(DerivedUnit.class)){
+                    derivedUnits.add(HibernateProxyHelper.deproxy(specimenOrObservationBase, DerivedUnit.class));
+                }
+            }
+            typeDesignations = CdmStore.getService(IOccurrenceService.class).listTypeDesignations(derivedUnits, null, null, null, null);
+        }
     }
 
 }