Avoid persisting data when hitting cancel in EditFromSelectionWizard
authorPatrick Plitzner <p.plitzner@bgbm.org>
Mon, 7 Dec 2015 13:30:50 +0000 (14:30 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Mon, 7 Dec 2015 13:30:50 +0000 (14:30 +0100)
#2645
 - create new entitySession for every wizard
 - merge for OK, dispose for Cancel

eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EditFromSelectionWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElementWithAbbreviatedTitle.java

index f4c50280380f55a993ee86f56a449465172302bd..8972e222ab36c560bd679d28ab9eef1199fde5d5 100644 (file)
@@ -2637,7 +2637,7 @@ public class CdmFormFactory extends FormToolkit {
      *            a {@link ConversationHolder} object.
      * @return a {@link EntitySelectionElement} object.
      */
-    public <T extends ICdmBase> EntitySelectionElement<T> createSelectionElement(Class<T> clazz,
+    public <T extends CdmBase> EntitySelectionElement<T> createSelectionElement(Class<T> clazz,
             ConversationHolder conversation, ICdmFormElement parentElement, String labelString, T selection, int mode,
             int style) {
         EntitySelectionElement<T> element = new EntitySelectionElement<T>(this, conversation, parentElement, clazz,
@@ -2679,7 +2679,7 @@ public class CdmFormFactory extends FormToolkit {
      *            a {@link ConversationHolder} object.
      * @return a {@link EntitySelectionElement} object.
      */
-    public <T extends ICdmBase> EntitySelectionElementWithAbbreviatedTitle<T> createSelectionElementWithAbbreviatedTitle(
+    public <T extends CdmBase> EntitySelectionElementWithAbbreviatedTitle<T> createSelectionElementWithAbbreviatedTitle(
             Class<T> clazz, ConversationHolder conversation, ICdmFormElement parentElement, String labelString,
             T selection, int mode, int style) {
         EntitySelectionElementWithAbbreviatedTitle<T> element = new EntitySelectionElementWithAbbreviatedTitle<T>(this, conversation, parentElement, clazz,
index 22d5dd7a3972bc36b728f15cf3111bc1a50218bb..04771ac13cac530b668ff6ef7cdc698895d1946a 100644 (file)
 
 package eu.etaxonomy.taxeditor.ui.selection;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.ui.IEditorPart;
 
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
+import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.agent.Institution;
 import eu.etaxonomy.cdm.model.agent.Person;
 import eu.etaxonomy.cdm.model.agent.Team;
-import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.molecular.Amplification;
 import eu.etaxonomy.cdm.model.molecular.Primer;
@@ -34,13 +38,14 @@ import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
 import eu.etaxonomy.cdm.model.reference.Reference;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
-import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.model.TextHelper;
 import eu.etaxonomy.taxeditor.newWizard.AmplificationGeneralWizardPage;
 import eu.etaxonomy.taxeditor.newWizard.PrimerWizardPage;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.section.agent.InstitutionWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.agent.PersonWizardPage;
@@ -55,30 +60,24 @@ import eu.etaxonomy.taxeditor.ui.section.reference.ReferenceWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.user.UserDetailWizardPage;
 
 /**
- * <p>
- * EditFromSelectionWizard class.
- * </p>
- *
  * @author n.hoffmann
  * @created Jun 1, 2010
  * @version 1.0
  */
 public class EditFromSelectionWizard extends Wizard implements
-               SelectionListener {
+               SelectionListener, ICdmEntitySessionEnabled {
 
+    private ICdmEntitySession cdmEntitySession;
+    private ICdmEntitySession previousCdmEntitySession;
        private final EntitySelectionElement selectionElement;
+       private CdmBase rootElement;
 
-       /**
-        * <p>
-        * Constructor for EditFromSelectionWizard.
-        * </p>
-        *
-        * @param selectionElement
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement}
-        *            object.
-        */
        public EditFromSelectionWizard(EntitySelectionElement selectionElement) {
+        if (CdmStore.isActive() && CdmStore.getCurrentSessionManager().isRemoting()) {
+            previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
+            cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
+            cdmEntitySession.bind();
+        }
                this.selectionElement = selectionElement;
                this.setWindowTitle(String.format("Edit %s", TextHelper.deproxyClassName(selectionElement.getEntity().getClass())));
        }
@@ -88,35 +87,36 @@ public class EditFromSelectionWizard extends Wizard implements
        public void addPages() {
 
                CdmFormFactory formFactory = selectionElement.getFormFactory();
-               ICdmBase entity = (ICdmBase) HibernateProxyHelper
+               CdmBase entity = (CdmBase) HibernateProxyHelper
                                .deproxy(selectionElement.getEntity());
-
-               if (entity instanceof Reference) {
+               IService<CdmBase> service = EntitySelectionElement.getService(entity);
+               rootElement = service.load(entity.getUuid());
+               if (rootElement.isInstanceOf(Reference.class)) {
                        addPage(new ReferenceWizardPage(formFactory,
                                        selectionElement.getConversationHolder(),
-                                       (Reference) entity));
-               } else if (entity instanceof Team) {
+                                       (HibernateProxyHelper.deproxy(rootElement, Reference.class))));
+               } else if (rootElement.isInstanceOf(Team.class)) {
                        addPage(new TeamWizardPage(formFactory,
-                                       selectionElement.getConversationHolder(), (Team) entity));
-               } else if (entity instanceof Person) {
+                                       selectionElement.getConversationHolder(), HibernateProxyHelper.deproxy(rootElement, Team.class)));
+               } else if (rootElement.isInstanceOf(Person.class)) {
                        addPage(new PersonWizardPage(formFactory,
-                                       selectionElement.getConversationHolder(), (Person) entity));
-               } else if (entity instanceof NonViralName) {
+                                       selectionElement.getConversationHolder(), HibernateProxyHelper.deproxy(rootElement, Person.class)));
+               } else if (rootElement.isInstanceOf(NonViralName.class)) {
                        addPage(new NonViralNameWizardPage(formFactory,
                                        selectionElement.getConversationHolder(),
-                                       (NonViralName) entity));
-               } else if (entity instanceof SpecimenOrObservationBase) {
+                                       HibernateProxyHelper.deproxy(rootElement, NonViralName.class)));
+               } else if (rootElement.isInstanceOf(SpecimenOrObservationBase.class)) {
 
                        DerivedUnitFacade facade;
                        try {
-                           if(((SpecimenOrObservationBase) entity).isInstanceOf(DerivedUnit.class)){
+                           if(rootElement.isInstanceOf(DerivedUnit.class)){
                                facade = DerivedUnitFacade.NewInstance(
-                                       HibernateProxyHelper.deproxy(entity, DerivedUnit.class),
+                                       HibernateProxyHelper.deproxy(rootElement, DerivedUnit.class),
                                        PreferencesUtil.getDerivedUnitConfigurator());
                            }
                            else {
                     facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit,
-                            HibernateProxyHelper.deproxy(entity, FieldUnit.class),
+                            HibernateProxyHelper.deproxy(rootElement, FieldUnit.class),
                             PreferencesUtil.getDerivedUnitConfigurator());
                            }
 
@@ -135,26 +135,26 @@ public class EditFromSelectionWizard extends Wizard implements
                            addPage(new DerivedUnitBaseWizardPage(formFactory,
                                    selectionElement.getConversationHolder(), facade));
                        }
-               } else if (entity instanceof Collection) {
+               } else if (rootElement.isInstanceOf(Collection.class)) {
                        addPage(new CollectionWizardPage(formFactory,
                                        selectionElement.getConversationHolder(),
-                                       (Collection) entity));
-               } else if (entity instanceof Institution) {
+                                       HibernateProxyHelper.deproxy(rootElement, Collection.class)));
+               } else if (rootElement instanceof Institution) {
                        addPage(new InstitutionWizardPage(formFactory,
                                        selectionElement.getConversationHolder(),
-                                       (Institution) entity));
-               } else if (entity instanceof User) {
+                                       HibernateProxyHelper.deproxy(rootElement, Institution.class)));
+               } else if (rootElement instanceof User) {
                        addPage(new UserDetailWizardPage(formFactory,
                                        selectionElement.getConversationHolder(),
-                                       (User) entity));
-               } else if (entity instanceof Primer) {
+                                       HibernateProxyHelper.deproxy(rootElement, User.class)));
+               } else if (rootElement instanceof Primer) {
             addPage(new PrimerWizardPage(formFactory,
                     selectionElement.getConversationHolder(),
-                    (Primer) entity));
-        } else if (entity instanceof Amplification) {
+                    HibernateProxyHelper.deproxy(rootElement, Primer.class)));
+        } else if (rootElement instanceof Amplification) {
             addPage(new AmplificationGeneralWizardPage(formFactory,
                     selectionElement.getConversationHolder(),
-                    (Amplification) entity));
+                    HibernateProxyHelper.deproxy(rootElement, Amplification.class)));
         } else {
                        MessagingUtils.warningDialog("Missing interface", this,
                                        "No detail element for current selection");
@@ -162,26 +162,12 @@ public class EditFromSelectionWizard extends Wizard implements
 
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see org.eclipse.jface.wizard.Wizard#performFinish()
-        */
        /** {@inheritDoc} */
        @Override
        public boolean performFinish() {
-           IEditorPart activeEditor = AbstractUtility.getActiveEditor();
-        /*
-         * forceDirty() for cases when one or more EditFromSelectionWizards are
-         * opened cascadingly to trigger the save button. Otherwise the dirty
-         * state would not be set and the user will have no feedback that he/she
-         * actually still has ounsaved changes. This is necessary because
-         * editing in these wizards is done on clones of the CDM entities which
-         * are merged back with the original when pressing "Finish"
-         */
-        if (activeEditor instanceof IDirtyMarkable){
-               ((IDirtyMarkable) activeEditor).forceDirty();
-           }
+           IService<CdmBase> service = EntitySelectionElement.getService(rootElement);
+           service.merge(rootElement, true);
+           previousCdmEntitySession.load(rootElement, true);
                return true;
        }
 
@@ -199,4 +185,30 @@ public class EditFromSelectionWizard extends Wizard implements
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
        }
+
+    @Override
+    public void dispose() {
+        super.dispose();
+        if(cdmEntitySession != null) {
+            cdmEntitySession.dispose();
+        }
+        if(previousCdmEntitySession!=null){
+            previousCdmEntitySession.bind();
+        }
+    }
+
+    @Override
+    public ICdmEntitySession getCdmEntitySession() {
+        return cdmEntitySession;
+    }
+
+    @Override
+    public java.util.Collection<CdmBase> getRootEntities() {
+        return Collections.singleton(rootElement);
+    }
+
+    @Override
+    public Map<Object, List<String>> getPropertyPathsMap() {
+        return null;
+    }
 }
index 75821c515e679e354cffc711fce82bb6bea22957..cd600411f8f3150ecd9649482af3ce281f7afc7a 100644 (file)
@@ -23,14 +23,27 @@ import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
+import eu.etaxonomy.cdm.api.service.IAgentService;
+import eu.etaxonomy.cdm.api.service.ICollectionService;
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.IReferenceService;
+import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.api.service.IUserService;
+import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
+import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
 import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.model.agent.AgentBase;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.Group;
-import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.molecular.Amplification;
 import eu.etaxonomy.cdm.model.molecular.Primer;
+import eu.etaxonomy.cdm.model.name.NonViralName;
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.taxeditor.model.ImageResources;
@@ -61,7 +74,7 @@ import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityLabelT
  * @version 1.0
  * @param <T>
  */
-public class EntitySelectionElement<T extends ICdmBase> extends
+public class EntitySelectionElement<T extends CdmBase> extends
                AbstractCdmFormElement implements  SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, IConversationEnabled, Observer {
 
        private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
@@ -223,6 +236,38 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                setSelectionInternal(selection);
        }
 
+       public static <T extends CdmBase> IService<T> getService(T cdmBase){
+           IService<T> service = null;
+           if(cdmBase!=null){
+            //get corresponding service
+            if(cdmBase.isInstanceOf(Reference.class)){
+                service = (IService<T>) CdmStore.getService(IReferenceService.class);
+            }
+            else if (cdmBase.isInstanceOf(AgentBase.class)){
+                service = (IService<T>) CdmStore.getService(IAgentService.class);
+            }
+            else if (cdmBase instanceof NonViralName) {
+                service = (IService<T>) CdmStore.getService(INameService.class);
+            }
+            else if (cdmBase instanceof SpecimenOrObservationBase) {
+                service = (IService<T>) CdmStore.getService(IOccurrenceService.class);
+            }
+            else if (cdmBase instanceof Collection) {
+                service = (IService<T>) CdmStore.getService(ICollectionService.class);
+            }
+            else if (cdmBase instanceof User) {
+                service = (IService<T>) CdmStore.getService(IUserService.class);
+            }
+            else if (cdmBase instanceof Primer) {
+                service = (IService<T>) CdmStore.getService(IPrimerService.class);
+            }
+            else if (cdmBase instanceof Amplification) {
+                service = (IService<T>) CdmStore.getService(IAmplificationService.class);
+            }
+           }
+           return service;
+       }
+
        /**
         * Return the selected object
         *
@@ -313,9 +358,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
         */
        protected String getTitle() {
                if (entity != null){
-                       if(entity instanceof IIdentifiableEntity) {
-                               return ((IIdentifiableEntity) entity).getTitleCache();
-                       } else if(entity instanceof Group){
+                       if(entity instanceof Group){
                                return ((Group) entity).getName();
                        } else if(entity instanceof GrantedAuthority){
                                return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity));
@@ -326,6 +369,9 @@ public class EntitySelectionElement<T extends ICdmBase> extends
             } else if (entity instanceof Amplification){
                 return ((Amplification) entity).getLabelCache();
             }
+            else if(entity instanceof IIdentifiableEntity) {
+                return ((IIdentifiableEntity) entity).getTitleCache();
+            }
 
                }
                return "";
@@ -422,6 +468,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                        WizardDialog dialog = new WizardDialog(selectionElement.getShell(),
                                        new EditFromSelectionWizard(selectionElement));
                        if (dialog.open() == IStatus.OK) {
+
                                selectionElement.updateFromWizard();
                        }
                }
@@ -501,7 +548,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        private void updateButtonStates() {
            if(button_edit != null && !button_selection.isDisposed()){
-               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission((CdmBase) getEntity(), UPDATE));
+               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission(getEntity(), UPDATE));
            }
        }
 }
index 5c2a267c1553d06e3287ff7efaa7bffefb9a2a66..ac926a72535dec61c3f82aa393819cde6bbd3c80 100644 (file)
@@ -5,12 +5,12 @@ package eu.etaxonomy.taxeditor.ui.selection;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
-import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 
-public class EntitySelectionElementWithAbbreviatedTitle<T extends ICdmBase> extends EntitySelectionElement<T> {
+public class EntitySelectionElementWithAbbreviatedTitle<T extends CdmBase> extends EntitySelectionElement<T> {
 
        /**
      * @param formFactory