ref #4611 Refactor string constants
[taxeditor.git] / eu.etaxonomy.taxeditor.bulkeditor / src / main / java / eu / etaxonomy / taxeditor / bulkeditor / handler / DeleteHandler.java
index 1350207e8f864b2b8050fce839ab1c4e9a1d2a7c..cc9ff859de55f7fe9db5099f851832f11178df0c 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
 * European Distributed Institute of Taxonomy
 
 package eu.etaxonomy.taxeditor.bulkeditor.handler;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.TextSelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 
+import eu.etaxonomy.cdm.api.application.ICdmRepository;
+import eu.etaxonomy.cdm.api.service.DeleteResult;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.IReferenceService;
+import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
+import eu.etaxonomy.cdm.api.service.config.MediaDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.NameDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.SynonymDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.Group;
+import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.cdm.model.media.Media;
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
+import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.taxeditor.annotatedlineeditor.IEntityPersistenceService;
 import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotation;
 import eu.etaxonomy.taxeditor.annotatedlineeditor.LineAnnotationModel;
 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
 import eu.etaxonomy.taxeditor.bulkeditor.internal.TaxeditorBulkeditorPlugin;
+import eu.etaxonomy.taxeditor.model.DeleteResultMessagingUtils;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.dialog.configurator.deleteConfigurator.DeleteConfiguratorDialog;
 
 
 /**
@@ -36,14 +64,20 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  */
 public class DeleteHandler extends AbstractHandler {
 
-       /* (non-Javadoc)
+
+
+    private static final String SKIP = "Skip";
+    private static final String DELETE = "Delete";
+    private static final String CONFIRM_DELETION = "Confirm Deletion";
+
+    /* (non-Javadoc)
         * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
         */
        @Override
        public Object execute(ExecutionEvent event) throws ExecutionException {
 
-               ISelection selection = HandlerUtil.getCurrentSelection(event);
 
+               TextSelection selection = (TextSelection) HandlerUtil.getCurrentSelection(event);
                IEditorPart editor = HandlerUtil.getActiveEditor(event);
 
                IEditorInput input = editor.getEditorInput();
@@ -57,88 +91,154 @@ public class DeleteHandler extends AbstractHandler {
 
 
                        IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-
+                       DeleteConfiguratorBase config = null;
                        IEntityPersistenceService persistenceService = (IEntityPersistenceService) input;
-
-
+                       DeleteResult result = new DeleteResult();
+                       String errorMessage= "The object ";
                        for(Object object : structuredSelection.toList()){
-
-                               LineAnnotation annotation = (LineAnnotation) model.getAnnotation(object);
-                               DeleteResult result = new DeleteResult();
-                               //result.setError();
-                               try {
-                                       ICdmApplicationConfiguration controller;
-                                       controller = CdmStore.getCurrentApplicationConfiguration();
-
-                                       if (object instanceof SpecimenOrObservationBase){
-                                               IOccurrenceService service = controller.getOccurrenceService();
-                                               if (object != null){
-                                                       result = service.delete(((SpecimenOrObservationBase) object).getUuid());
-                                               }
-                                       } else if (object instanceof Reference){
-                                               IReferenceService service = controller.getReferenceService();
-                                               if (object != null){
-                                                       result = service.delete(((Reference) object).getUuid());
-                                               }
-
-                                       } else if (object instanceof Group){
-                                               IGroupService service = controller.getGroupService();
-                                               if (object != null){
-                                                       result = service.delete(((Group) object).getUuid());
-                                               }
-                                       }else if (object instanceof User){
-                                               IUserService service = controller.getUserService();
-                                               if (object != null){
-                                                       result = service.delete(((User) object).getUuid());
-                                               }
-                                       } else if (object instanceof TaxonNameBase){
-                                               INameService service = controller.getNameService();
-                                               if (object != null){
-                                                       NameDeletionConfigurator config = new NameDeletionConfigurator();
-                                                       result = service.delete(((TaxonNameBase) object).getUuid(), config);
-                                               }
-                                       } else if (object instanceof TaxonBase){
-                                               ITaxonService service = controller.getTaxonService();
-                                               if (object != null){
-                                                       if (object instanceof Taxon){
-                                                               result = service.deleteTaxon(((TaxonBase) object).getUuid(), null, null);
-                                                       }else{
-                                                               result = service.deleteSynonym(((Synonym)object).getUuid(), null);
-                                                       }
-                                               }
-                                       } else if (object instanceof TeamOrPersonBase){
-                                               IAgentService service = controller.getAgentService();
-                                               //TeamOrPersonBase teamOrPerson = (TeamOrPersonBase)service.load(((TeamOrPersonBase) object).getUuid());
-                                               result = service.delete(((TeamOrPersonBase)object).getUuid());
-                                       }
-                               } catch (Exception e){
-                                       MessagingUtils.errorDialog("Exception occured. Delete not possible", getClass(), e.getMessage(), TaxeditorBulkeditorPlugin.PLUGIN_ID, null, true);
-                               }
-                               if (result.isError() || result.isAbort()){
-                                       if (!result.getExceptions().isEmpty()) {
-                                               String message = null;
-                                               int i = result.getExceptions().size();
-                                               for (Exception e:result.getExceptions()){
-                                                       i--;
-                                                       message+= e.getMessage();
-                                                       if (i>0){
-                                                               message+= ", ";
-                                                       }
-                                               }
-
-
-                                               MessagingUtils.messageDialog("Delete not possible", getClass(), result.getExceptions().toString(), null);
-                                       }else{
-                                               MessagingUtils.messageDialog("Delete not possible", getClass(), "The object could not be deleted. An exception occured.", null);
-                                       }
-                               }
-                               if (result.isOk() ){
-                                       ((BulkEditor) editor).removeAnnotatedLine(annotation);
-                                       if(result.getUpdatedObjects().size() != 0 || !result.getExceptions().isEmpty()){
-                                               MessagingUtils.informationDialog("Delete successfull", "The object is deleted but there are updated objects: " + result.toString());
-                                       }
-
-                               }
+                           if (object instanceof CdmBase){
+                               CdmBase base = (CdmBase)object;
+                               LineAnnotation annotation = (LineAnnotation) model.getAnnotation(object);
+                               if (base.getId() != 0){
+
+
+                                       try {
+                                           ICdmRepository controller;
+                                           controller = CdmStore.getCurrentApplicationConfiguration();
+                                           if (object instanceof SpecimenOrObservationBase){
+                                               IOccurrenceService service = controller.getOccurrenceService();
+                                                       if (object != null){
+                                                               result = service.isDeletable(((SpecimenOrObservationBase) object).getUuid(), null);
+                                                               errorMessage = "The specimen or observation ";
+
+                                                       }
+                                           } else if (object instanceof Reference){
+                                                       IReferenceService service = controller.getReferenceService();
+                                                       if (object != null){
+                                                               result = service.isDeletable(((Reference)object).getUuid(), null);
+                                                               errorMessage = "The reference ";
+                                                       }
+
+                                           } else if (object instanceof Group){
+                                               errorMessage = "The group ";
+                                           }else if (object instanceof User){
+                                               errorMessage = "The user ";
+                                           } else if (object instanceof TaxonNameBase){
+                                               TaxonNameBase name = HibernateProxyHelper.deproxy(object, TaxonNameBase.class);
+                                               if (object != null){
+                                                   config = new NameDeletionConfigurator();
+
+                                                   DeleteConfiguratorDialog dialog = new DeleteConfiguratorDialog(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION,  null,  "Do you really want to delete the name?\nThis operation is irreversible!", MessageDialog.WARNING, new String[] { DELETE, SKIP }, 0, true);
+                                                   int result_dialog= dialog.open();
+                                                   if (result_dialog != Status.OK){
+                                                       return null;
+                                                   }
+                                                   result = controller.getNameService().isDeletable(name.getUuid(), config);
+                                                   errorMessage = "The name ";
+
+                                               }
+                                           } else if (object instanceof TaxonBase){
+
+                                                       // synonym
+                                                       if(object instanceof Synonym){
+                                                               Synonym synonym = HibernateProxyHelper.deproxy(object, Synonym.class);
+                                                               config = new SynonymDeletionConfigurator();
+                                                               errorMessage = "The synonym ";
+                                                               DeleteConfiguratorDialog dialog = new DeleteConfiguratorDialog(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION,  null,  "Do you really want to delete the synonym?", MessageDialog.WARNING, new String[] { DELETE, SKIP }, 0, true);
+                                    int result_dialog= dialog.open();
+                                    if (result_dialog != Status.OK){
+                                         return null;
+                                    }
+                                    result = controller.getTaxonService().isDeletable(synonym.getUuid(), config);
+
+                                                       }
+                                                       else if(object instanceof Taxon ){
+                                                               Taxon  taxon = HibernateProxyHelper.deproxy(object, Taxon.class);
+                                                               if (((Taxon)object).getTaxonNodes().isEmpty()){
+                                            errorMessage = "The taxon ";
+                                                               } else{
+                                                                   MessagingUtils.messageDialog("Delete not possible", getClass(), "The taxon can not be deleted in bulk editor. It is used in a classification.", null);
+                                                                   return null;
+                                                               }
+                                                               config = new TaxonDeletionConfigurator();
+                                                               ((TaxonDeletionConfigurator) config).setDeleteInAllClassifications(true);
+                                                               DeleteConfiguratorDialog dialog;
+                                                           dialog = new DeleteConfiguratorDialog(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION,  null,  "Do you really want to delete the taxon?", MessageDialog.WARNING, new String[] { DELETE, SKIP }, 0, true);
+                                                               int result_dialog= dialog.open();
+                                    if (result_dialog != Status.OK){
+                                         return null;
+                                    }
+                                    result = controller.getTaxonService().isDeletable(taxon.getUuid(), config);
+
+                                                       }
+                                           } else if (object instanceof TeamOrPersonBase){
+                                               result = controller.getAgentService().isDeletable(((CdmBase) object).getUuid(), null);
+                                                 errorMessage = "The team or person ";
+                                          } else if (object instanceof Media){
+                                              config = new MediaDeletionConfigurator();
+                                              Media media = HibernateProxyHelper.deproxy(object, Media.class);
+                                              DeleteConfiguratorDialog dialog;
+                                                  dialog = new DeleteConfiguratorDialog(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION,  null,  "Do you really want to delete the media?", MessageDialog.WARNING, new String[] { DELETE, SKIP }, 0, true);
+                                                  int result_dialog= dialog.open();
+                               if (result_dialog != Status.OK){
+                                   return null;
+                               }
+
+                               result = controller.getMediaService().isDeletable(media.getUuid(), config);
+                               errorMessage = "The media ";
+
+                           }
+
+
+                               } catch (Exception e){
+                                       MessagingUtils.errorDialog("Exception occured. Delete not possible", getClass(), e.getMessage(), TaxeditorBulkeditorPlugin.PLUGIN_ID, null, true);
+                               }
+                               if (result.isError() || result.isAbort()){
+                                       if (!result.getExceptions().isEmpty()) {
+                                               List<String> messages = new ArrayList<String>();
+                                               int i = result.getExceptions().size();
+                                               for (Exception e:result.getExceptions()){
+                                                       messages.add(e.getMessage());
+                                               }
+                                               errorMessage += "could not be deleted.";
+                                               //MessagingUtils.errorDialog("test", getClass(), "message", TaxeditorBulkeditorPlugin.PLUGIN_ID, result.getExceptions().iterator().next(),true);
+                                               DeleteResultMessagingUtils.messageDialogWithDetails(result,errorMessage, TaxeditorBulkeditorPlugin.PLUGIN_ID);
+                                       }else{
+                                               MessagingUtils.messageDialog("Delete not possible", getClass(), "The object could not be deleted. An exception occured.", null);
+                                       }
+                               }else if (model != null) {
+                        Iterator iter = model.getAnnotationIterator(selection.getOffset(), selection.getLength(), true, true);
+                        while (iter.hasNext()) {
+                            Object next = iter.next();
+                            if (next instanceof LineAnnotation) {
+                                if (result.isOk()){
+                                    ((LineAnnotation)next).markAsDeleted(config);
+
+                                }
+
+                            }
+                        }
+                    }
+
+                           }
+                       if (result.isOk() ){
+
+                    ((BulkEditor) editor).removeAnnotatedLine(annotation);
+
+                    if(result.getUpdatedObjects().size() != 0 || !result.getExceptions().isEmpty()){
+                        List<String> messages = new ArrayList<String>();
+                        int i = result.getExceptions().size();
+                        for (Exception e:result.getExceptions()){
+                            messages.add(e.getMessage());
+                        }
+                        errorMessage += "can be deleted but related object(s) could not be deleted. ";
+                        //MessagingUtils.errorDialog("test", getClass(), "message", TaxeditorBulkeditorPlugin.PLUGIN_ID, result.getExceptions().iterator().next(),true);
+                        DeleteResultMessagingUtils.messageDialogWithDetails(result, errorMessage, TaxeditorBulkeditorPlugin.PLUGIN_ID);
+                    }
+
+                }
+
+                           }
 
                        }
                }
@@ -147,4 +247,5 @@ public class DeleteHandler extends AbstractHandler {
                return null;
        }
 
+
 }