Merge branch 'release/5.14.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / e4 / AbstractCdmEditorPartE4.java
index 4ec7a19db49925bcf8f56565cccaef670f434b88..60e424ad278503be116562b53a6d76db3a4aeb61 100644 (file)
@@ -8,6 +8,7 @@
 */
 package eu.etaxonomy.taxeditor.view.e4;
 
+import java.util.Collection;
 import java.util.Set;
 
 import javax.annotation.PreDestroy;
@@ -28,6 +29,7 @@ import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWTException;
+import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
@@ -36,6 +38,7 @@ import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.persistence.dto.TermDto;
 import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
@@ -45,6 +48,7 @@ import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.security.RequiredPermissions;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4;
 import eu.etaxonomy.taxeditor.view.e4.details.DetailsViewerE4;
@@ -65,7 +69,7 @@ public abstract class AbstractCdmEditorPartE4
      * If it is <code>true</code> then it is currently delaying a selection.
      */
     private boolean isInDelay;
-    private boolean isEnabled;
+    private boolean isEnabled = true;
     private static final Logger logger = Logger.getLogger(AbstractCdmEditorPartE4.class);
 
     /**
@@ -151,7 +155,7 @@ public abstract class AbstractCdmEditorPartE4
         }
         if (viewer != null && viewer.getControl()!= null && viewer.getInput() != null && !viewer.getControl().isDisposed()){
            try{
-               viewer.getControl().setEnabled(true);
+               viewer.getControl().setEnabled(isEnabled);
            }catch(SWTException e){
               logger.debug("Something went wrong for viewer.getControl().setEnabled(true) in " + this.getClass().getSimpleName(), e);
            }
@@ -193,18 +197,59 @@ public abstract class AbstractCdmEditorPartE4
         return viewer;
     }
 
+    public boolean isEnabled() {
+        return isEnabled;
+    }
+
+    public void setEnabled(boolean isEnabled) {
+        this.isEnabled = isEnabled;
+    }
+
     protected void showViewer(IStructuredSelection selection, MPart activePart, Viewer viewer){
+        if(CdmStore.getCurrentSessionManager().getActiveSession()==null){
+            return;
+        }
         if(viewer!=null && viewer.getControl()!=null && !viewer.getControl().isDisposed()){
             Object element = selection.getFirstElement();
             Object part = createPartObject(activePart);
+            if (viewer.getControl().isDisposed()){
+                return;
+            }
             viewer.getControl().setEnabled(true);
             if(selection.getFirstElement()!=null){
                 if (element instanceof Taxon){
+
                     Taxon taxon = HibernateProxyHelper.deproxy(element, Taxon.class);
+                    if (part instanceof ITaxonEditor){
+                        TaxonNode node = ((ITaxonEditor) part).getTaxonNode();
+                        if (node != null){
+                            boolean doEnable = CdmStore.currentAuthentiationHasPermission(node,
+                                    RequiredPermissions.TAXON_EDIT);
+                             if (!doEnable){
+                                 //check whether there are explicit TaxonNode rights
+                                 boolean taxonnodePermissionExists = false;
+                                 Collection<? extends GrantedAuthority> authorities = CdmStore.getCurrentAuthentiation().getAuthorities();
+                                 for (GrantedAuthority grantedAuthority: authorities){
+                                     if (grantedAuthority.getAuthority().startsWith("TAXONNODE")){
+                                         taxonnodePermissionExists = true;
+                                     }
+                                 }
+                                 if (!taxonnodePermissionExists){
+                                     doEnable = true;
+                                 }
+                             }
+
+                            //TODO: differ between the views
+                            this.isEnabled = doEnable;
+                        }
+
+
+                    }
                     if (taxon.isMisapplication() || taxon.isProparteSynonym() || taxon.isInvalidDesignation()){
 
                         if(part instanceof ITaxonEditor){
                             Taxon accepted = ((ITaxonEditor) part).getTaxon();
+
                             Set<TaxonRelationship> rels =  taxon.getTaxonRelations(accepted);
 
                             if (rels != null && rels.iterator().hasNext() && !taxon.equals(accepted)){
@@ -229,22 +274,27 @@ public abstract class AbstractCdmEditorPartE4
                 }
 
                 selectionProvidingPart = activePart;
-
                 if (viewer instanceof DetailsViewerE4){
-                    ((DetailsViewerE4)viewer).setInput(element, part);
-                    if (!selectionProvidingPart.getElementId().equals("eu.etaxonomy.taxeditor.editor.view.checklist.e4.DistributionEditorPart")){
-                        ((DetailsViewerE4)viewer).setDetailsEnabled(true);
+
+                    if (selectionProvidingPart.getElementId().equals("eu.etaxonomy.taxeditor.editor.view.checklist.e4.DistributionEditorPart")){
+                        ((DetailsViewerE4)viewer).setDetailsEnabled(false);
+                    }else{
+                        ((DetailsViewerE4)viewer).setDetailsEnabled(isEnabled);
                     }
+                    ((DetailsViewerE4)viewer).setInput(element, part);
 
                 }
 
                 else{
-                    if (activePart.getObject() instanceof DetailsPartE4 && element instanceof TaxonName ){
+                    if (activePart.getObject() instanceof DetailsPartE4 && element instanceof TaxonName){
                         selectionProvidingPart = ((DetailsPartE4)activePart.getObject()).getSelectionProvidingPart();
                     }
+
                     viewer.setInput(element);
-                }
+                    viewer.getControl().setEnabled(isEnabled);
 
+
+                }
             }
         }
     }