- implemented drag'n'drop support for SpecimenOrObservationBase in Derivate View
authorPatric Plitzner <p.plitzner@bgbm.org>
Tue, 25 Mar 2014 13:30:25 +0000 (13:30 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Tue, 25 Mar 2014 13:30:25 +0000 (13:30 +0000)
.gitattributes
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/AmplificationTransfer.java [deleted file]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadTransfer.java [deleted file]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SpecimenOrObservationTransfer.java [deleted file]

index 148f1e99ceaa04aeacd9dc2357bb6a54c3f5c0a7..ed0cde2a2d585bf6c8f0655dbf96031ceaa466a5 100644 (file)
@@ -488,15 +488,12 @@ eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/d
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientReferenceService.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTermService.java -text
-eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/AmplificationTransfer.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/CreateDerivateContextMenu.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java -text
-eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadTransfer.java -text
-eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SpecimenOrObservationTransfer.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java -text
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/AmplificationTransfer.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/AmplificationTransfer.java
deleted file mode 100644 (file)
index 9f6ca82..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// $Id$
-/**
-* Copyright (C) 2014 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.taxeditor.editor.view.derivate;
-
-import java.util.UUID;
-
-import eu.etaxonomy.cdm.api.service.IService;
-import eu.etaxonomy.cdm.model.molecular.Amplification;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-
-/**
- * @author pplitzner
- * @date 18.03.2014
- *
- */
-public class AmplificationTransfer extends CdmObjectTransfer<Amplification> {
-
-    private static AmplificationTransfer instance = new AmplificationTransfer();
-    private static final String TYPE_NAME = "amplification-transfer-format";
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    public static synchronized AmplificationTransfer getInstance(){
-        return instance;
-    }
-
-    private AmplificationTransfer(){}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
-     */
-    @Override
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
-     */
-    @Override
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
-     */
-    @Override
-    public Amplification loadElement(UUID uuid) {
-        return (Amplification) CdmStore.getService(IService.class).load(uuid);
-    }
-}
index 43b7c9a2de91f143fc0bd431897af8d45be26aa2..1099c62bc5860c88e07c9fbeb42ac6d4c92fddab 100644 (file)
@@ -9,9 +9,7 @@
  */
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
@@ -42,19 +40,8 @@ public class DerivateDragListener extends DragSourceAdapter{
      */
     @Override
     public void dragSetData(DragSourceEvent event) {
-        if (SpecimenOrObservationTransfer.getInstance().isSupportedType(event.dataType)) {
-
-            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-            List<TreeNode> selectedNodes = new ArrayList<TreeNode>();
-
-            for (Object object : selection.toList()){
-                if(object instanceof TreeNode){// && ((TreeNode) object).getValue() instanceof SpecimenOrObservationBase<?>) {
-//                    Object value = ((TreeNode) object).getValue();
-//                    specimens.add((SpecimenOrObservationBase<?>) value);
-                    selectedNodes.add((TreeNode) object);
-                }
-            }
-            event.data = selectedNodes.toArray(new TreeNode[selectedNodes.size()]);
+        if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
+            LocalSelectionTransfer.getTransfer().setSelection(viewer.getSelection());
         }
     }
 
index 3d3fe47d28969038091e52946866483220f447dd..824c5ac5dbede71e1d65562e21a31f1df295116f 100644 (file)
@@ -9,14 +9,13 @@
 */
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.TransferData;
 
 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
@@ -28,80 +27,29 @@ import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
  */
 public class DerivateDropListener extends ViewerDropAdapter {
 
-//    private final Map<Class<? extends ICdmBase>, List<Class<? extends ICdmBase>>> dragTargetClassMap;
-//    private final Map<SpecimenOrObservationType, List<SpecimenOrObservationType>> dragTargetSpecimenTypeMap;
+    private final DerivateView derivateView;
 
     /**
-     * @param viewer
+     * @param derivateView
      */
-    protected DerivateDropListener(Viewer viewer) {
-        super(viewer);
-//        dragTargetClassMap = new HashMap<Class<? extends ICdmBase>, List<Class<? extends ICdmBase>>>();
-//        dragTargetSpecimenTypeMap = new HashMap<SpecimenOrObservationType, List<SpecimenOrObservationType>>();
-//
-//        // possible targets for FieldUnit
-//        addToTargetClasses(FieldUnit.class, new Class[]{DerivedUnit.class, Sequence.class, Amplification.class, SingleRead.class});
-//        addToTargetTypes(SpecimenOrObservationType.FieldUnit, new SpecimenOrObservationType[]{SpecimenOrObservationType.DerivedUnit});
-//
-//        //possible Targets for specimen
-//        addToTargetClasses(DerivedUnit.class, new Class[]{DerivedUnit.class, Sequence.class, Amplification.class, SingleRead.class});
-//        addToTargetTypes(SpecimenOrObservationType.PreservedSpecimen, new SpecimenOrObservationType[]{SpecimenOrObservationType.DnaSample, SpecimenOrObservationType.StillImage});
+    protected DerivateDropListener(DerivateView derivateView) {
+        super(derivateView.viewer);
+        this.derivateView = derivateView;
     }
 
-//    private void addToTargetClasses(Class<? extends ICdmBase> sourceClass, Class<? extends ICdmBase>[] targetClasses){
-//        List<Class<? extends ICdmBase>> targetClassList = new ArrayList<Class<? extends ICdmBase>>();
-//        for(Class<? extends ICdmBase> targetClass:targetClasses){
-//            targetClassList.add(targetClass);
-//        }
-//        dragTargetClassMap.put(sourceClass, targetClassList);
-//    }
-//
-//    private void addToTargetTypes(SpecimenOrObservationType sourceType, SpecimenOrObservationType[] targetTypes){
-//        List<SpecimenOrObservationType> targetTypesList = new ArrayList<SpecimenOrObservationType>();
-//                for(SpecimenOrObservationType targetType:targetTypes){
-//                    targetTypesList.add(targetType);
-//                }
-//        dragTargetSpecimenTypeMap.put(sourceType, targetTypesList);
-//    }
-
     /* (non-Javadoc)
      * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
      */
     @Override
     public boolean performDrop(Object data) {
-
-//        TermBase target = (TermBase) getCurrentTarget();//can be vocab
-//        //DefinedTermBase[] droppedElements = (DefinedTermBase[]) data;
-//        Object[] droppedTerms = (Object[]) data;
-//        Collection<DefinedTermBase> sourceTerms = new ArrayList<DefinedTermBase>(); //Arrays.asList(droppedElements)
-//
-//        for (Object droppedTerm : droppedTerms) {
-//
-//            DefinedTermBase term = (DefinedTermBase) droppedTerm;
-//            sourceTerms.add(term);
-//
-//        }
-//
-//        AbstractPostOperation operation = new MoveDefinedTermOperation("Move Descriptions", StoreUtil.getUndoContext(), target, sourceTerms, editor);
-//                //TODO: implement execute
-//                AbstractUtility.executeOperation(operation);
         Object target = getCurrentTarget();
-        if(target instanceof TreeNode){
-            Object targetDerivate = ((TreeNode) target).getValue();
-            if(data instanceof Object[]){
-                Object[] draggedElements = (Object[])data;
-                for (Object draggedElement:draggedElements) {
-                    if(checkDropTarget(draggedElement, targetDerivate)){
-                        //performDrop(draggedElement, targetDerivate);
-                        SpecimenOrObservationBase<?> originSpecimen = (SpecimenOrObservationBase<?>)targetDerivate;
-                        DerivedUnit derivedSpecimen = (DerivedUnit)draggedElement;
-                        originSpecimen.addDerivationEvent(DerivationEvent.NewSimpleInstance(originSpecimen, derivedSpecimen, DerivationEventType.GATHERING_IN_SITU()));
-                        System.out.println("Add Derivate: " + draggedElement.getClass().getSimpleName() + " to " + targetDerivate.getClass().getSimpleName());
-                    }
-                    System.out.println("Drop: " + draggedElement.getClass().getSimpleName() + " to " + targetDerivate.getClass().getSimpleName());
-                }
+        if(target instanceof TreeNode && data instanceof IStructuredSelection && ((IStructuredSelection) data).size()==1 && ((IStructuredSelection) data).getFirstElement() instanceof TreeNode){
+            TreeNode targetNode = (TreeNode) target;
+            TreeNode draggednode = (TreeNode) ((IStructuredSelection) data).getFirstElement();
+            if(moveDropTarget(draggednode, targetNode)){
+                derivateView.changed(null);
+                return true;
             }
-            return true;
         }
         return false;
     }
@@ -111,51 +59,42 @@ public class DerivateDropListener extends ViewerDropAdapter {
      */
     @Override
     public boolean validateDrop(Object target, int operation, TransferData transferType) {
-        return SpecimenOrObservationTransfer.getInstance().isSupportedType(transferType) && target instanceof TreeNode;
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-     */
-    @Override
-    public void dragOver(DropTargetEvent event) {
-//        Object draggedDerivate = getCurrentTarget();
-//        Object targetItem = event.item;
-//        if(targetItem instanceof TreeItem
-//                && ((TreeItem) targetItem).getData() instanceof TreeNode
-//                && draggedDerivate instanceof TreeNode){
-//
-//            TreeItem node = (TreeItem)targetItem;
-//            Object target = ((TreeNode) node.getData()).getValue();
-//            Object draggedObject = ((TreeNode) draggedDerivate).getValue();
-//            System.out.println(draggedObject + " -> " + target);
-//            if(!checkDropTarget(draggedObject, target)){
-//                event.detail = DND.DROP_NONE;
-//            }
-////            System.out.println("Drag over: " + draggedObject.getClass().getSimpleName() + " to " + target.getClass().getSimpleName());
-//        }
-//        else{
-//            event.detail = DND.DROP_NONE;
-//        }
-        super.dragOver(event);
+        return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof TreeNode;
     }
 
-
-
     /**
      * @param value
      * @return
      */
-    private boolean checkDropTarget(Object draggedObject, Object target) {
-        if(draggedObject instanceof SpecimenOrObservationBase<?> && target instanceof SpecimenOrObservationBase<?>){
-            SpecimenOrObservationType dragType = ((SpecimenOrObservationBase<?>) draggedObject).getRecordBasis();
-            SpecimenOrObservationType targetType = ((SpecimenOrObservationBase<?>) target).getRecordBasis();
-//            System.out.println("drag: " + dragType + " drop: " + targetType);
-            if(targetType.isKindOf(dragType) && !(targetType != dragType)){
+    private boolean moveDropTarget(TreeNode draggedObject, TreeNode target) {
+        if(draggedObject.getValue() instanceof DerivedUnit && target.getValue() instanceof SpecimenOrObservationBase<?>){
+            DerivedUnit draggedSpecimen = (DerivedUnit) draggedObject.getValue();
+            SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) target.getValue();
+            SpecimenOrObservationType dragType = draggedSpecimen.getRecordBasis();
+            SpecimenOrObservationType targetType = targetSpecimen.getRecordBasis();
+            //check if type is a sub derivate type
+            TreeNode parentNode = draggedObject.getParent();
+            if(parentNode!=null && !parentNode.equals(target) //don't drag on direct parent node
+                    && (targetType==SpecimenOrObservationType.FieldUnit //dragging on FieldUnit always works (except when direct parent)
+                    || (dragType.isKindOf(targetType) && targetType!=dragType))){ //dragging only on parent derivate type
+                //remove derivation event from parent specimen of dragged object
+                DerivationEvent eventToRemove = null;
+                if(parentNode.getValue() instanceof SpecimenOrObservationBase<?>){
+                    SpecimenOrObservationBase<?> parentDragSpecimen = (SpecimenOrObservationBase<?>) parentNode.getValue();
+                    for(DerivationEvent event:parentDragSpecimen.getDerivationEvents()){
+                        if(event.getDerivatives().contains(draggedSpecimen)){
+                            eventToRemove = event;
+                            break;
+                        }
+                    }
+                    parentDragSpecimen.removeDerivationEvent(eventToRemove);
+                }
+                //add new derivation event to target
+                targetSpecimen.addDerivationEvent(DerivationEvent.NewSimpleInstance(targetSpecimen, draggedSpecimen, eventToRemove==null?null:eventToRemove.getType()));
                 return true;
             }
         }
         return false;
     }
+
 }
index 75a8f7ad2336d556545cfda2901e4ce47417c697..19798fcfefdd8a083899dd0e56a50958d791b2e7 100644 (file)
@@ -2,6 +2,7 @@ package eu.etaxonomy.taxeditor.editor.view.derivate;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
@@ -79,12 +80,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
 
         //add drag'n'drop support
         Transfer[] transfers = new Transfer[] {
-                SpecimenOrObservationTransfer.getInstance(),
-//                SingleReadTransfer.getInstance(),
-//                AmplificationTransfer.getInstance()
+                LocalSelectionTransfer.getTransfer(),
                 };
         viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(viewer));
-        viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(viewer));
+        viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
     }
 
     /* (non-Javadoc)
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadTransfer.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadTransfer.java
deleted file mode 100644 (file)
index 72be32d..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-// $Id$
-/**
-* Copyright (C) 2014 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.taxeditor.editor.view.derivate;
-
-import java.util.UUID;
-
-import eu.etaxonomy.cdm.api.service.IAnnotatableService;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-
-/**
- * @author pplitzner
- * @date 18.03.2014
- *
- */
-public class SingleReadTransfer extends CdmObjectTransfer<SingleRead> {
-
-    private static SingleReadTransfer instance = new SingleReadTransfer();
-    private static final String TYPE_NAME = "singleRead-transfer-format";
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    public static synchronized SingleReadTransfer getInstance(){
-        return instance;
-    }
-
-    private SingleReadTransfer(){}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
-     */
-    @Override
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
-     */
-    @Override
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
-     */
-    @Override
-    public SingleRead loadElement(UUID uuid) {
-        IAnnotatableService service = CdmStore.getService(IAnnotatableService.class);
-        System.out.println(service);
-        return (SingleRead) service.load(uuid);
-    }
-}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SpecimenOrObservationTransfer.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SpecimenOrObservationTransfer.java
deleted file mode 100644 (file)
index aa09238..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-// $Id$
-/**
-* Copyright (C) 2014 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.taxeditor.editor.view.derivate;
-
-import java.util.UUID;
-
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-
-/**
- * @author pplitzner
- * @date 18.03.2014
- *
- */
-public class SpecimenOrObservationTransfer extends CdmObjectTransfer<SpecimenOrObservationBase<?>> {
-
-    private static SpecimenOrObservationTransfer instance = new SpecimenOrObservationTransfer();
-    private static final String TYPE_NAME = "derivate-transfer-format";
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    public static synchronized SpecimenOrObservationTransfer getInstance(){
-        return instance;
-    }
-
-    private SpecimenOrObservationTransfer(){}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
-     */
-    @Override
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
-     */
-    @Override
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
-     */
-    @Override
-    public SpecimenOrObservationBase<?> loadElement(UUID uuid) {
-        return CdmStore.getService(IOccurrenceService.class).load(uuid);
-    }
-}