Fix editing of transient entities in EntitySelectionElement #5592
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / selection / EditFromSelectionWizard.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.selection;
12
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Map;
16
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.jface.wizard.Wizard;
19 import org.eclipse.jface.wizard.WizardDialog;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.events.SelectionListener;
22
23 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
24 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
25 import eu.etaxonomy.cdm.api.service.IService;
26 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
27 import eu.etaxonomy.cdm.model.agent.Institution;
28 import eu.etaxonomy.cdm.model.agent.Person;
29 import eu.etaxonomy.cdm.model.agent.Team;
30 import eu.etaxonomy.cdm.model.common.CdmBase;
31 import eu.etaxonomy.cdm.model.common.User;
32 import eu.etaxonomy.cdm.model.molecular.Amplification;
33 import eu.etaxonomy.cdm.model.molecular.Primer;
34 import eu.etaxonomy.cdm.model.name.NonViralName;
35 import eu.etaxonomy.cdm.model.occurrence.Collection;
36 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
37 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
38 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
39 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
40 import eu.etaxonomy.cdm.model.reference.Reference;
41 import eu.etaxonomy.taxeditor.model.MessagingUtils;
42 import eu.etaxonomy.taxeditor.model.TextHelper;
43 import eu.etaxonomy.taxeditor.newWizard.AmplificationGeneralWizardPage;
44 import eu.etaxonomy.taxeditor.newWizard.PrimerWizardPage;
45 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
46 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
47 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
48 import eu.etaxonomy.taxeditor.store.CdmStore;
49 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
50 import eu.etaxonomy.taxeditor.ui.section.agent.InstitutionWizardPage;
51 import eu.etaxonomy.taxeditor.ui.section.agent.PersonWizardPage;
52 import eu.etaxonomy.taxeditor.ui.section.agent.TeamWizardPage;
53 import eu.etaxonomy.taxeditor.ui.section.name.NonViralNameWizardPage;
54 import eu.etaxonomy.taxeditor.ui.section.occurrence.CollectionWizardPage;
55 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseWizardPage;
56 import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralWizardPage;
57 import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitWizardPage;
58 import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventWizardPage;
59 import eu.etaxonomy.taxeditor.ui.section.reference.ReferenceWizardPage;
60 import eu.etaxonomy.taxeditor.ui.section.user.UserDetailWizardPage;
61
62 /**
63 * @author n.hoffmann
64 * @created Jun 1, 2010
65 * @version 1.0
66 */
67 public class EditFromSelectionWizard extends Wizard implements
68 SelectionListener, ICdmEntitySessionEnabled {
69
70 private ICdmEntitySession cdmEntitySession;
71 private ICdmEntitySession previousCdmEntitySession;
72 private final EntitySelectionElement selectionElement;
73 private CdmBase rootElement;
74
75 public EditFromSelectionWizard(EntitySelectionElement selectionElement) {
76 if (CdmStore.isActive() && CdmStore.getCurrentSessionManager().isRemoting()) {
77 previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession();
78 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
79 cdmEntitySession.bind();
80 }
81 this.selectionElement = selectionElement;
82 this.setWindowTitle(String.format("Edit %s", TextHelper.deproxyClassName(selectionElement.getEntity().getClass())));
83 }
84
85 /** {@inheritDoc} */
86 @Override
87 public void addPages() {
88
89 CdmFormFactory formFactory = selectionElement.getFormFactory();
90 CdmBase entity = (CdmBase) HibernateProxyHelper
91 .deproxy(selectionElement.getEntity());
92 //check if entity has already been persisted
93 if(entity.getId()==0){
94 rootElement = entity;
95 }
96 else{
97 IService<CdmBase> service = CdmStore.getService(entity);
98 rootElement = service.load(entity.getUuid());
99 }
100 if (rootElement.isInstanceOf(Reference.class)) {
101 addPage(new ReferenceWizardPage(formFactory,
102 selectionElement.getConversationHolder(),
103 (HibernateProxyHelper.deproxy(rootElement, Reference.class))));
104 } else if (rootElement.isInstanceOf(Team.class)) {
105 addPage(new TeamWizardPage(formFactory,
106 selectionElement.getConversationHolder(), HibernateProxyHelper.deproxy(rootElement, Team.class)));
107 } else if (rootElement.isInstanceOf(Person.class)) {
108 addPage(new PersonWizardPage(formFactory,
109 selectionElement.getConversationHolder(), HibernateProxyHelper.deproxy(rootElement, Person.class)));
110 } else if (rootElement.isInstanceOf(NonViralName.class)) {
111 addPage(new NonViralNameWizardPage(formFactory,
112 selectionElement.getConversationHolder(),
113 HibernateProxyHelper.deproxy(rootElement, NonViralName.class)));
114 } else if (rootElement.isInstanceOf(SpecimenOrObservationBase.class)) {
115
116 DerivedUnitFacade facade;
117 try {
118 if(rootElement.isInstanceOf(DerivedUnit.class)){
119 facade = DerivedUnitFacade.NewInstance(
120 HibernateProxyHelper.deproxy(rootElement, DerivedUnit.class),
121 PreferencesUtil.getDerivedUnitConfigurator());
122 }
123 else {
124 facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit,
125 HibernateProxyHelper.deproxy(rootElement, FieldUnit.class),
126 PreferencesUtil.getDerivedUnitConfigurator());
127 }
128
129 } catch (DerivedUnitFacadeNotSupportedException e) {
130 // we should never get here
131 throw new IllegalStateException();
132 }
133
134 addPage(new DerivedUnitGeneralWizardPage(formFactory,
135 selectionElement.getConversationHolder(), facade));
136 addPage(new GatheringEventWizardPage(formFactory,
137 selectionElement.getConversationHolder(), facade));
138 addPage(new FieldUnitWizardPage(formFactory,
139 selectionElement.getConversationHolder(), facade));
140 if(facade.innerDerivedUnit()!=null){
141 addPage(new DerivedUnitBaseWizardPage(formFactory,
142 selectionElement.getConversationHolder(), facade));
143 }
144 } else if (rootElement.isInstanceOf(Collection.class)) {
145 addPage(new CollectionWizardPage(formFactory,
146 selectionElement.getConversationHolder(),
147 HibernateProxyHelper.deproxy(rootElement, Collection.class)));
148 } else if (rootElement instanceof Institution) {
149 addPage(new InstitutionWizardPage(formFactory,
150 selectionElement.getConversationHolder(),
151 HibernateProxyHelper.deproxy(rootElement, Institution.class)));
152 } else if (rootElement instanceof User) {
153 addPage(new UserDetailWizardPage(formFactory,
154 selectionElement.getConversationHolder(),
155 HibernateProxyHelper.deproxy(rootElement, User.class)));
156 } else if (rootElement instanceof Primer) {
157 addPage(new PrimerWizardPage(formFactory,
158 selectionElement.getConversationHolder(),
159 HibernateProxyHelper.deproxy(rootElement, Primer.class)));
160 } else if (rootElement instanceof Amplification) {
161 addPage(new AmplificationGeneralWizardPage(formFactory,
162 selectionElement.getConversationHolder(),
163 HibernateProxyHelper.deproxy(rootElement, Amplification.class)));
164 } else {
165 MessagingUtils.warningDialog("Missing interface", this,
166 "No detail element for current selection");
167 }
168
169 }
170
171 /** {@inheritDoc} */
172 @Override
173 public boolean performFinish() {
174 IService<CdmBase> service = CdmStore.getService(rootElement);
175 service.merge(rootElement, true);
176 if(previousCdmEntitySession!=null){
177 previousCdmEntitySession.load(rootElement, true);
178 }
179 return true;
180 }
181
182 /** {@inheritDoc} */
183 @Override
184 public void widgetSelected(SelectionEvent e) {
185 WizardDialog dialog = new WizardDialog(selectionElement.getShell(),
186 this);
187 if (dialog.open() == IStatus.OK) {
188 selectionElement.updateFromWizard();
189 }
190 }
191
192 /** {@inheritDoc} */
193 @Override
194 public void widgetDefaultSelected(SelectionEvent e) {
195 }
196
197 @Override
198 public void dispose() {
199 super.dispose();
200 if(cdmEntitySession != null) {
201 cdmEntitySession.dispose();
202 }
203 if(previousCdmEntitySession!=null){
204 previousCdmEntitySession.bind();
205 }
206 }
207
208 @Override
209 public ICdmEntitySession getCdmEntitySession() {
210 return cdmEntitySession;
211 }
212
213 @Override
214 public java.util.Collection<CdmBase> getRootEntities() {
215 return Collections.singleton(rootElement);
216 }
217
218 @Override
219 public Map<Object, List<String>> getPropertyPathsMap() {
220 return null;
221 }
222 }