Merge branch 'release/4.1.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / selection / EditFromSelectionWizard.java
index c0f2985638ba084484f02f4bebbc4bfe4f89f221..5e76e56c6c80f7441b4e98e71e1a5341a838ebfd 100644 (file)
@@ -1,15 +1,19 @@
 // $Id$
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * European Distributed Institute of Taxonomy
  * http://www.e-taxonomy.eu
- * 
+ *
  * The contents of this file are subject to the Mozilla Public License Version 1.1
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
 
 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;
@@ -18,58 +22,66 @@ import org.eclipse.swt.events.SelectionListener;
 
 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.description.PolytomousKey;
+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.DerivedUnitBase;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+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.MessagingUtils;
+import eu.etaxonomy.taxeditor.model.TextHelper;
+import eu.etaxonomy.taxeditor.newWizard.AmplificationGeneralWizardPage;
+import eu.etaxonomy.taxeditor.newWizard.PolytomousKeyWizardPage;
+import eu.etaxonomy.taxeditor.newWizard.PrimerWizardPage;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
-import eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory;
+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;
 import eu.etaxonomy.taxeditor.ui.section.agent.TeamWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.name.NonViralNameWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.CollectionWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseWizardPage;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldObservationWizardPage;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralWizardPage;
+import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitWizardPage;
 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventWizardPage;
-import eu.etaxonomy.taxeditor.ui.section.occurrence.GeneralWizardPage;
 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 {
-
-       private final AbstractSelectionElement selectionElement;
-
-       /**
-        * <p>
-        * Constructor for EditFromSelectionWizard.
-        * </p>
-        * 
-        * @param selectionElement
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.selection.AbstractSelectionElement}
-        *            object.
-        */
-       public EditFromSelectionWizard(AbstractSelectionElement selectionElement) {
+               SelectionListener, ICdmEntitySessionEnabled {
+
+    private ICdmEntitySession cdmEntitySession;
+    private ICdmEntitySession previousCdmEntitySession;
+       private final EntitySelectionElement selectionElement;
+       private CdmBase rootElement;
+
+       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("Edit Entity");
+               this.setWindowTitle(String.format("Edit %s", TextHelper.deproxyClassName(selectionElement.getEntity().getClass())));
        }
 
        /** {@inheritDoc} */
@@ -77,70 +89,101 @@ public class EditFromSelectionWizard extends Wizard implements
        public void addPages() {
 
                CdmFormFactory formFactory = selectionElement.getFormFactory();
-               ICdmBase entity = (ICdmBase) HibernateProxyHelper
+               CdmBase entity = HibernateProxyHelper
                                .deproxy(selectionElement.getEntity());
-
-               if (entity instanceof Reference) {
+               //check if entity has already been persisted
+               if(entity.getId()==0){
+                       rootElement = entity;
+               }
+               else{
+                       IService<CdmBase> service = CdmStore.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 DerivedUnitBase) {
+                                       HibernateProxyHelper.deproxy(rootElement, NonViralName.class)));
+               } else if (rootElement.isInstanceOf(SpecimenOrObservationBase.class)) {
 
                        DerivedUnitFacade facade;
                        try {
-                               facade = DerivedUnitFacade.NewInstance(
-                                               (DerivedUnitBase) entity,
-                                               PreferencesUtil.getDerivedUnitConfigurator());
+                           if(rootElement.isInstanceOf(DerivedUnit.class)){
+                               facade = DerivedUnitFacade.NewInstance(
+                                       HibernateProxyHelper.deproxy(rootElement, DerivedUnit.class),
+                                       PreferencesUtil.getDerivedUnitConfigurator());
+                           }
+                           else {
+                    facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit,
+                            HibernateProxyHelper.deproxy(rootElement, FieldUnit.class),
+                            PreferencesUtil.getDerivedUnitConfigurator());
+                           }
+
                        } catch (DerivedUnitFacadeNotSupportedException e) {
                                // we should never get here
                                throw new IllegalStateException();
                        }
 
-                       addPage(new GeneralWizardPage(formFactory,
+                       addPage(new DerivedUnitGeneralWizardPage(formFactory,
                                        selectionElement.getConversationHolder(), facade));
                        addPage(new GatheringEventWizardPage(formFactory,
                                        selectionElement.getConversationHolder(), facade));
-                       addPage(new FieldObservationWizardPage(formFactory,
-                                       selectionElement.getConversationHolder(), facade));
-                       addPage(new DerivedUnitBaseWizardPage(formFactory,
+                       addPage(new FieldUnitWizardPage(formFactory,
                                        selectionElement.getConversationHolder(), facade));
-               } else if (entity instanceof Collection) {
+                       if(facade.innerDerivedUnit()!=null){
+                           addPage(new DerivedUnitBaseWizardPage(formFactory,
+                                   selectionElement.getConversationHolder(), facade));
+                       }
+               } 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) {
-                       addPage(new UserDetailWizardPage(formFactory, 
-                                       selectionElement.getConversationHolder(), 
-                                       (User) entity));
-               } else {
-                       StoreUtil.warningDialog("Missing interface", this,
+                                       HibernateProxyHelper.deproxy(rootElement, Institution.class)));
+               } else if (rootElement instanceof User) {
+                       addPage(new UserDetailWizardPage(formFactory,
+                                       selectionElement.getConversationHolder(),
+                                       HibernateProxyHelper.deproxy(rootElement, User.class)));
+               } else if (rootElement instanceof Primer) {
+            addPage(new PrimerWizardPage(formFactory,
+                    selectionElement.getConversationHolder(),
+                    HibernateProxyHelper.deproxy(rootElement, Primer.class)));
+        } else if (rootElement instanceof Amplification) {
+            addPage(new AmplificationGeneralWizardPage(formFactory,
+                    selectionElement.getConversationHolder(),
+                    HibernateProxyHelper.deproxy(rootElement, Amplification.class)));
+        } else if (rootElement instanceof PolytomousKey) {
+            addPage(new PolytomousKeyWizardPage(formFactory,
+                    selectionElement.getConversationHolder(),
+                    HibernateProxyHelper.deproxy(rootElement, PolytomousKey.class)));
+        } else {
+                       MessagingUtils.warningDialog("Missing interface", this,
                                        "No detail element for current selection");
-               } 
+               }
 
        }
 
-       /*
-        * (non-Javadoc)
-        * 
-        * @see org.eclipse.jface.wizard.Wizard#performFinish()
-        */
        /** {@inheritDoc} */
        @Override
        public boolean performFinish() {
+           IService<CdmBase> service = CdmStore.getService(rootElement);
+           if(rootElement.getId()!=0){
+               service.merge(rootElement, true);
+           }
+           if(previousCdmEntitySession!=null){
+               selectionElement.setEntity(previousCdmEntitySession.load(rootElement, true));
+           }
                return true;
        }
 
@@ -158,4 +201,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;
+    }
 }