ref #8784: fix deleteHandler for factual data
authorKatja Luther <k.luther@bgbm.org>
Thu, 19 Dec 2019 13:21:54 +0000 (14:21 +0100)
committerKatja Luther <k.luther@bgbm.org>
Thu, 19 Dec 2019 13:21:54 +0000 (14:21 +0100)
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/descriptive/e4/handler/DeleteHandlerE4.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/DeleteSpecimenDescriptionOperation.java

index 2e086fa0d11bc89e65f5a2fd670f16847b318806..80a7026833bab63f8608b25e030c37c6662fd970 100644 (file)
@@ -16,7 +16,13 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.IOperationHistory;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.di.annotations.Optional;
@@ -45,13 +51,13 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.ui.IMemento;
+import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
@@ -64,6 +70,7 @@ import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
 import eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter.DerivateSearchCompositeController;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.IContextListener;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
@@ -71,10 +78,12 @@ import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
 import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 import eu.etaxonomy.taxeditor.view.search.derivative.DerivateContentProvider;
 import eu.etaxonomy.taxeditor.view.search.derivative.DerivateLabelProvider;
 import eu.etaxonomy.taxeditor.workbench.part.ICollapsableExpandable;
@@ -155,6 +164,8 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
 
     private ISelectionChangedListener selectionChangedListener;
 
+    private Set<AbstractPostOperation> operations = new HashSet<>();
+
     @Inject
     private MPart thisPart;
 
@@ -358,6 +369,34 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
         // commit the conversation and start a new transaction immediately
         conversation.commit(true);
 
+        for(AbstractPostOperation entry:operations){
+            IStatus status = Status.CANCEL_STATUS;
+            final IAdaptable uiInfoAdapter = WorkspaceUndoUtil
+                    .getUIInfoAdapter(AbstractUtility.getShell());
+            String operationlabel = entry.getLabel();
+            try {
+                entry.addContext(IOperationHistory.GLOBAL_UNDO_CONTEXT);
+                status = entry.execute(new NullProgressMonitor(), uiInfoAdapter);
+            } catch (ExecutionException e) {
+
+                MessagingUtils.operationDialog(AbstractUtility.class, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null);
+
+            }
+
+            String statusString = status.equals(Status.OK_STATUS) ? "completed"
+                    : "cancelled";
+
+            IPostOperationEnabled postOperationEnabled = entry
+                    .getPostOperationEnabled();
+            if (postOperationEnabled != null) {
+                postOperationEnabled.onComplete();
+            }
+
+
+            //AbstractUtility.executeOperation(entry,sync);
+        }
+
+        operations.clear();
         CdmStore.getService(IOccurrenceService.class).merge(new ArrayList<>(rootElements), true);
 
         monitor.worked(1);
@@ -376,6 +415,14 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
         dirty.setDirty(isDirty);
     }
 
+    public Set<AbstractPostOperation> getOperations() {
+        return operations;
+    }
+
+    public void addOperation(AbstractPostOperation operation) {
+        this.operations.add(operation);
+    }
+
     @Focus
     public void setFocus() {
         //make sure to bind again if maybe in another view the conversation was unbound
@@ -648,6 +695,7 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn
     }
 
 
+    @Override
     public boolean isDirty() {
         return dirty.isDirty();
     }
index 2078de4c003743bc48fd323014da0e18491d351a..f137491b961af88d99896720032663425778a424 100644 (file)
@@ -28,23 +28,28 @@ import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Shell;
 
+import eu.etaxonomy.cdm.api.service.DeleteResult;
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.api.service.UpdateResult.Status;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.SpecimenDescription;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
 import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
+import eu.etaxonomy.taxeditor.bulkeditor.e4.BulkEditorE4;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
-import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.e4.FactualDataPartE4;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.DeleteDescriptionElementOperation;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.DeleteSpecimenDescriptionOperation;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.DeleteTaxonDescriptionOperation;
 import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.DeleteTaxonNameDescriptionOperation;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
  *
@@ -73,61 +78,87 @@ public class DeleteHandlerE4 {
         IUndoContext undoContext = EditorUtil.getUndoContext();
 
         List<AbstractPostOperation> operations = new ArrayList();
-
+        AbstractPostOperation operation = null;
         for(Iterator iter = selection.iterator();iter.hasNext();){
             Object object = iter.next();
-
-            // TaxonDescription
-            if(object instanceof TaxonDescription ){
-                DeleteTaxonDescriptionOperation operation = new DeleteTaxonDescriptionOperation(label, undoContext, (TaxonDescription) object, factualDataPart, cdmEntitySessionEnabled);
-
-                operations.add(operation);
-                ((TaxonDescription) object).getTaxon().removeDescription((TaxonDescription) object);
-                operation.getPostOperationEnabled().postOperation(object);
+            if (object == null){
+                continue;
             }
-            if(object instanceof TaxonNameDescription ){
-                DeleteTaxonNameDescriptionOperation operation = new DeleteTaxonNameDescriptionOperation(label, undoContext, (TaxonNameDescription) object, factualDataPart, cdmEntitySessionEnabled);
-                operations.add(operation);
-                ((TaxonNameDescription) object).getTaxonName().removeDescription((TaxonNameDescription) object);
-                operation.getPostOperationEnabled().postOperation(object);
+            DescriptionBase description = null;
+            DeleteResult result = new DeleteResult();
+            if (object instanceof DescriptionBase){
+                result = CdmStore.getService(IDescriptionService.class).isDeletable(((DescriptionBase) object).getUuid());
+                description = (DescriptionBase) object;
+            } else if (object instanceof DescriptionElementBase){
+                description = ((DescriptionElementBase)object).getInDescription();
             }
-            else if(object instanceof SpecimenDescription){
-                DeleteSpecimenDescriptionOperation operation = new DeleteSpecimenDescriptionOperation(label, undoContext, (SpecimenDescription) object, factualDataPart, cdmEntitySessionEnabled);
-                operations.add(operation) ;
-                ((SpecimenDescription) object).getDescribedSpecimenOrObservation().removeDescription((SpecimenDescription) object);
+            if (result.getStatus().equals(Status.OK)){
+                // TaxonDescription
+                if(object instanceof TaxonDescription ){
 
-            }
-            // DescriptionElementBase
-            else if(object instanceof DescriptionElementBase){
-                DeleteDescriptionElementOperation operation = new DeleteDescriptionElementOperation(label, undoContext, (DescriptionElementBase) object, factualDataPart, cdmEntitySessionEnabled);
-                AbstractUtility.executeOperation(operation, sync);
-            }
-            else if(object instanceof FeatureNodeContainer){
-                List<DescriptionElementBase> descriptions = ((FeatureNodeContainer) object).getDescriptionElementsForEntireBranch();
+                        operation = new DeleteTaxonDescriptionOperation(label, undoContext, (TaxonDescription) object, factualDataPart, cdmEntitySessionEnabled);
+
+                        ((TaxonDescription) object).getTaxon().removeDescription((TaxonDescription) object);
+
+                } else if(object instanceof TaxonNameDescription ){
+                    operation = new DeleteTaxonNameDescriptionOperation(label, undoContext, (TaxonNameDescription) object, factualDataPart, cdmEntitySessionEnabled);
+
+                    ((TaxonNameDescription) object).getTaxonName().removeDescription((TaxonNameDescription) object);
+
+                } else if(object instanceof SpecimenDescription){
+                    operation = new DeleteSpecimenDescriptionOperation(label, undoContext, (SpecimenDescription) object, factualDataPart, cdmEntitySessionEnabled);
+
+                    ((SpecimenDescription) object).getDescribedSpecimenOrObservation().removeDescription((SpecimenDescription) object);
 
-                for(DescriptionElementBase description : descriptions){
-                    DeleteDescriptionElementOperation operation = new DeleteDescriptionElementOperation(label, undoContext, description, factualDataPart, cdmEntitySessionEnabled);
+                } else if(object instanceof DescriptionElementBase){
+                    // DescriptionElementBase
+                    operation = new DeleteDescriptionElementOperation(label, undoContext, (DescriptionElementBase) object, factualDataPart, cdmEntitySessionEnabled);
+                    ((DescriptionElementBase) object).getInDescription().removeElement((DescriptionElementBase) object);
+                } else if(object instanceof FeatureNodeContainer){
+                    List<DescriptionElementBase> descriptions = ((FeatureNodeContainer) object).getDescriptionElementsForEntireBranch();
 
-                    AbstractUtility.executeOperation(operation, sync);
+                    for(DescriptionElementBase descriptionElement : descriptions){
+                        operation = new DeleteDescriptionElementOperation(label, undoContext, descriptionElement, factualDataPart, cdmEntitySessionEnabled);
+
+                    }
+                }
+//                if (operation != null){
+//                    operation.getPostOperationEnabled().postOperation(object);
+//                }
+                if (factualDataPart.getSelectionProvidingPart().getObject() instanceof TaxonNameEditorE4){
+                    ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).getEditorInput().addOperation(operation);
+                    ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).setDirty();
+                    ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).redraw();
+                }
+                if (factualDataPart.getSelectionProvidingPart().getObject() instanceof DerivateView){
+                    ((DerivateView)factualDataPart.getSelectionProvidingPart().getObject()).addOperation(operation);
+                    ((DerivateView)factualDataPart.getSelectionProvidingPart().getObject()).setDirty(true);
+                    if (object instanceof DescriptionBase){
+                        ((DerivateView)factualDataPart.getSelectionProvidingPart().getObject()).changed(((SpecimenDescription)object).getDescribedSpecimenOrObservation());
+                    } else if (object instanceof DescriptionElementBase){
+                        if (description != null){
+                            factualDataPart.changed(description);
+                        }
+                    }
+                }
+                if (factualDataPart.getSelectionProvidingPart().getObject() instanceof BulkEditorE4){
+                    ((BulkEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).addOperation(operation);
+                    ((BulkEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).setDirty(true);
+                    ((BulkEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).changed(((SpecimenDescription)object).getDescribedSpecimenOrObservation());
                 }
             }
-
             else{
-                MessagingUtils.error(getClass(), Messages.DeleteHandler_INVALID_SELECTION, null);
-            }
-        }
+                Exception e = result.getExceptions() != null && !result.getExceptions().isEmpty()? result.getExceptions().iterator().next() : null;
+
+                MessagingUtils.informationDialog("Delete not possible", e.getMessage());
+                break;
 
-        // execute all cumulated operations
-        for(AbstractPostOperation operation : operations){
-            if (factualDataPart.getSelectionProvidingPart().getObject() instanceof TaxonNameEditorE4){
-                ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).getEditorInput().addOperation(operation);
-                ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).setDirty();
-                ((TaxonNameEditorE4)factualDataPart.getSelectionProvidingPart().getObject()).redraw();
             }
 
-           // AbstractUtility.executeOperation(operation, sync);
         }
 
+
+
        }
 
 
index 94e0c4d4e8ee5604abd277c520e31054dd16e3b9..b7cdab8299de056030b023f51bc375eff1cb83e1 100644 (file)
@@ -51,7 +51,7 @@ public class DeleteSpecimenDescriptionOperation extends AbstractPostOperation<Sp
                        throws ExecutionException {
 
                monitor.worked(40);
-               CdmStore.getService(IDescriptionService.class).deleteDescription(description);
+               CdmStore.getService(IDescriptionService.class).deleteDescription(description.getUuid());
 
                return postExecute(description);
        }