ref #6566 Fix potential StackOverflow when linking with taxon selection
authorPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 23 May 2017 16:40:34 +0000 (18:40 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 23 May 2017 16:40:34 +0000 (18:40 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java

index c79c608c0d5b1a5ea78f291e2ba00f6967b4fbc0..7a56897861311a7304bbe50372310b7c6f51f84a 100644 (file)
@@ -29,6 +29,7 @@ import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -149,6 +150,8 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
     @Inject
     private EPartService partService;
 
+    private ISelectionChangedListener selectionChangedListener;
+
     /**
      * Default constructor
      */
@@ -211,11 +214,14 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
         viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
         viewer.getTree().setEnabled(CdmStore.isActive());
 
-        // Propagate selection from viewer
-        viewer.addSelectionChangedListener((SelectionChangedEvent event) -> {
-            IStructuredSelection isel = (IStructuredSelection) event.getSelection();
-            selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
-        });
+        selectionChangedListener = new ISelectionChangedListener() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent event) {
+                IStructuredSelection isel = (IStructuredSelection) event.getSelection();
+                selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
+            }
+        };
+        viewer.addSelectionChangedListener(selectionChangedListener);
 
         //create context menu
         menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.specimeneditor");
@@ -262,47 +268,52 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
 
 
     public void updateRootEntities(List<SpecimenOrObservationBase> derivates) {
-            if(derivates!=null){
-                this.derivateToRootEntityMap = new HashMap<SpecimenOrObservationBase<?>, SpecimenOrObservationBase<?>>();
-                this.rootElements = new HashSet<SpecimenOrObservationBase<?>>();
-                for (SpecimenOrObservationBase derivate : derivates) {
+        if(derivates!=null){
+            this.derivateToRootEntityMap = new HashMap<SpecimenOrObservationBase<?>, SpecimenOrObservationBase<?>>();
+            this.rootElements = new HashSet<SpecimenOrObservationBase<?>>();
+            for (SpecimenOrObservationBase derivate : derivates) {
 
-                    if(derivate instanceof FieldUnit){
-                        derivateToRootEntityMap.put(derivate, derivate);
+                if(derivate instanceof FieldUnit){
+                    derivateToRootEntityMap.put(derivate, derivate);
+                }
+                else {
+                    SpecimenOrObservationBase<?> topMostDerivate = EditorUtil.getTopMostDerivate(derivate);
+                    if(topMostDerivate!=null){
+                        derivateToRootEntityMap.put(derivate, topMostDerivate);
                     }
-                    else {
-                        SpecimenOrObservationBase<?> topMostDerivate = EditorUtil.getTopMostDerivate(derivate);
-                        if(topMostDerivate!=null){
-                            derivateToRootEntityMap.put(derivate, topMostDerivate);
-                        }
-                        else{
-                            derivateToRootEntityMap.put(derivate, derivate);
-                        }
+                    else{
+                        derivateToRootEntityMap.put(derivate, derivate);
                     }
                 }
-                for (SpecimenOrObservationBase<?> specimen : derivateToRootEntityMap.values()) {
-                    rootElements.add(specimen);
-                }
             }
-            labelProvider.updateLabelCache(rootElements);
-            viewer.setInput(rootElements);
-
-            //TODO e4
-//            getEditorSite().getActionBars().getStatusLineManager().setMessage(String.format(Messages.DerivateView_CNT_DERIVATIVES_FOUND, rootElements.size()));
-
-            //set selection to derivatives if the filter criteria
-            //taxon assignment or derivative type are set
-            if(derivates!=null && !derivateSearchCompositeController.isDefaultSearch()){
-                List<TreeNode> nodesToSelect = new ArrayList<TreeNode>();
-                for (SpecimenOrObservationBase specimenOrObservationBase : derivates) {
-                    nodesToSelect.add(new TreeNode(specimenOrObservationBase));
-                }
-                viewer.setSelection(new StructuredSelection(nodesToSelect));
+            for (SpecimenOrObservationBase<?> specimen : derivateToRootEntityMap.values()) {
+                rootElements.add(specimen);
             }
-            else{
-                viewer.setSelection(null);
+        }
+        labelProvider.updateLabelCache(rootElements);
+        viewer.setInput(rootElements);
+
+        //TODO e4
+        //            getEditorSite().getActionBars().getStatusLineManager().setMessage(String.format(Messages.DerivateView_CNT_DERIVATIVES_FOUND, rootElements.size()));
+
+        //set selection to derivatives if the filter criteria
+        //taxon assignment or derivative type are set
+        if(derivates!=null && !derivateSearchCompositeController.isDefaultSearch()){
+            List<TreeNode> nodesToSelect = new ArrayList<TreeNode>();
+            for (SpecimenOrObservationBase specimenOrObservationBase : derivates) {
+                nodesToSelect.add(new TreeNode(specimenOrObservationBase));
             }
+            setSelection(new StructuredSelection(nodesToSelect));
+        }
+        else{
+            setSelection(null);
+        }
+    }
 
+    private void setSelection(StructuredSelection selection){
+        viewer.removeSelectionChangedListener(selectionChangedListener);
+        viewer.setSelection(selection);
+        viewer.addSelectionChangedListener(selectionChangedListener);
     }
 
     public void updateLabelCache(){