Avoid persisting data when hitting cancel in EditFromSelectionWizard
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / selection / EditFromSelectionWizard.java
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;
+    }
 }