import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.swt.graphics.Image;
+import org.hibernate.LazyInitializationException;
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+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.occurrence.Collection;
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
import eu.etaxonomy.taxeditor.store.CdmStore;
/**
- * Label provider for the views to show {@link SpecimenOrObservationBase}s.
+ * Label provider for the views to show {@link SpecimenOrObservationBase}s.<br>
+ * <br>
+ * <b>Note:</b> If you use this label provider you need to assure that you
+ * created a {@link ConversationHolder} resp. have an open session because
+ * the labels are generated from various fields of the derivate hierarchy which
+ * are lazy loaded and could therefore throw a {@link LazyInitializationException}.<br>
+ * Use <b>{@link #setConversation(ConversationHolder)}</b> to assign the session to this provider.
*/
public class DerivateLabelProvider extends ColumnLabelProvider {
+ private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]";
+
private Set<SingleRead> multiLinkSingleReads;
+ private ConversationHolder conversation;
+
private static DefinedTerm photoTerm = null;
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) {
- if(definedTerm.getUuid().equals(UUID.fromString("04673952-dab1-42ff-b47a-5e847c350eaf"))){//photo
+ if(definedTerm.getUuid().equals(UUID.fromString("c5c59c42-f254-471e-96c6-09f459f7c903"))){
photoTerm = definedTerm;
}
- else if(definedTerm.getUuid().equals(UUID.fromString("76204a15-098f-4afe-9e8f-fa344ee3fdbb"))){//drawing
+ else if(definedTerm.getUuid().equals(UUID.fromString("669b0409-4aa4-4695-aae4-a95ed27bad4c"))){
drawingTerm = definedTerm;
}
- else if(definedTerm.getUuid().equals(UUID.fromString("c0b127d6-c849-48f9-bbc3-29e3337c1d03"))){//cover TODO temporary until new term is created
+ else if(definedTerm.getUuid().equals(UUID.fromString("acda15be-c0e2-4ea8-8783-b9b0c4ad7f03"))){
specimenScanTerm = definedTerm;
}
+ 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;
+ }
}
}
return specimenScanTerm;
}
+ public static DefinedTerm getDetailImageTerm(){
+ if(detailImageTerm==null){
+ initializeTerms();
+ }
+ return detailImageTerm;
+ }
+
+ public static DefinedTerm getSampleDesignationTerm(){
+ if(sampleDesignationTerm==null){
+ initializeTerms();
+ }
+ return sampleDesignationTerm;
+ }
+
/** {@inheritDoc} */
@Override
}
/**
- *
- * @param element
- * @return
+ * @param conversation the conversation to set
*/
- public static String getDerivateText(Object element){
+ public void setConversation(ConversationHolder conversation) {
+ this.conversation = conversation;
+ }
+
+ 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();
}
- String label = "";
- if(element instanceof FieldUnit){
- FieldUnit fieldUnit = (FieldUnit)element;
- GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
- if(gatheringEvent!=null){
- 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()+", ":"";
+ conversation.bind();
+
+ final String emptyString = "";
+ final String separator = " ";
+
+ String label = emptyString;
+
+ //Field Unit
+ if(derivate instanceof FieldUnit){
+ FieldUnit fieldUnit = (FieldUnit)derivate;
+ if(fieldUnit.getGatheringEvent()!=null){
+ GatheringEvent gatheringEvent = fieldUnit.getGatheringEvent();
+ if(CdmStore.getService(IOccurrenceService.class).exists(fieldUnit.getUuid())){
+ 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;
+ label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
+ }
+ label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():emptyString;
+ }
+ //MediaSpecimen
+ else if(derivate instanceof MediaSpecimen){
+ MediaSpecimen mediaSpecimen = (MediaSpecimen)derivate;
+ if(mediaSpecimen.getMediaSpecimen()!=null){
+ 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()+" ":emptyString;
+ label += collection.getCode()!=null?"("+collection.getCode()+")"+separator:emptyString;
+ }
+ label += mediaSpecimen.getAccessionNumber()!=null?mediaSpecimen.getAccessionNumber()+separator:emptyString;
+ label += mediaSpecimen.getBarcode()!=null?mediaSpecimen.getBarcode()+separator:emptyString;
+ }
+ //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;
+ }
}
- label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber():"";
+
}
- 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){
- if(parentNode!=null && parentNode.getValue() instanceof FieldUnit){
- FieldUnit fieldUnit = (FieldUnit) parentNode.getValue();
+ 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()+", ":"";
+ label += gatheringEvent.getCollector()!=null?gatheringEvent.getCollector()+separator:emptyString;
}
- label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+", ":"";
+ label += fieldUnit.getFieldNumber()!=null?fieldUnit.getFieldNumber()+separator:emptyString;
}
- Collection collection = derivedUnit.getCollection();
+ 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 = CdmStore.getService(IOccurrenceService.class).getMostSignificantIdentifier(derivedUnit);
+ label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString;
}
else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
-
+ //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 MediaSpecimen){
- MediaSpecimen mediaSpecimen = (MediaSpecimen)element;
- //TODO implement
- label += element.toString();
- }
- else if(element instanceof DnaSample
- || (element instanceof DerivedUnit
- && ((SpecimenOrObservationBase<?>) element).getRecordBasis()==SpecimenOrObservationType.DnaSample)){
- //TODO implement
- label += element.toString();
-
- }
- else if(element instanceof Sequence){
- Sequence sequence = (Sequence)element;
- label += "SampleDesignation?"+", ";
- 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 += singleRead.getPrimer()!=null?singleRead.getPrimer().getLabel()+", ":"";
- label += "Marker?";
+ //SingleRead
+ else if(derivate instanceof SingleRead){
+ SingleRead singleRead = (SingleRead)derivate;
+ if(parentNode!=null && parentNode.getValue() instanceof Sequence){
+ Sequence sequence = (Sequence) parentNode.getValue();
+ 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();
}
- else if(label.endsWith(", ")){
- label = label.substring(0, label.length()-2);
+ //remove last comma
+ else if(label.endsWith(separator)){
+ label = label.substring(0, label.length()-separator.length());
}
return label;
}
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);
+ if(element instanceof CdmBase){
+ CdmBase cdmBase = (CdmBase)element;
+ boolean hasCharacterData = false;
+ if(cdmBase.isInstanceOf(SpecimenOrObservationBase.class)){
+ SpecimenOrObservationBase<?> specimen = HibernateProxyHelper.deproxy(cdmBase, SpecimenOrObservationBase.class);
+ if(!CdmStore.getService(IOccurrenceService.class).getCharacterDataForSpecimen(specimen.getUuid()).isEmpty()){
+ hasCharacterData = true;
+ }
}
- else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
- return ImageResources.getImage(ImageResources.DNA_SAMPLE_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.TissueSample){
- return ImageResources.getImage(ImageResources.TISSUE_SAMPLE_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){
+ 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(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
- return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
+ else if(cdmBase.isInstanceOf(Sequence.class)){
+ return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
}
- else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.StillImage){
- 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(SingleRead.class)){
+ if(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;
}
/**