cba7d5eff230d0a550b6b8ee5b508fd1b688a0c1
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / TaxonEditorInput.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.editor;
11
12 import java.util.Arrays;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Set;
16 import java.util.UUID;
17
18 import org.eclipse.jface.resource.ImageDescriptor;
19 import org.eclipse.ui.IEditorInput;
20 import org.eclipse.ui.IMemento;
21 import org.eclipse.ui.IPersistableElement;
22
23 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
24 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
25 import eu.etaxonomy.cdm.api.service.IClassificationService;
26 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
27 import eu.etaxonomy.cdm.api.service.ITaxonService;
28 import eu.etaxonomy.cdm.model.common.CdmBase;
29 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
30 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
31 import eu.etaxonomy.cdm.model.taxon.Synonym;
32 import eu.etaxonomy.cdm.model.taxon.Taxon;
33 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
34 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
35 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
36 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
37 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
38 import eu.etaxonomy.taxeditor.model.DataChangeBridge;
39 import eu.etaxonomy.taxeditor.model.MessagingUtils;
40 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
41 import eu.etaxonomy.taxeditor.store.CdmStore;
42
43
44 /**
45 * <p>TaxonEditorInput class.</p>
46 *
47 * @author n.hoffmann
48 * @created 19.03.2009
49 * @version 1.0
50 */
51 public class TaxonEditorInput extends CdmEntitySessionInput implements IEditorInput, IConversationEnabled, IPersistableElement {
52
53 private final ConversationHolder conversation;
54
55 private TaxonNode taxonNode;
56
57 private TaxonEditorInputDataChangeBehaviour dataChangeBehavior;
58
59 private TaxonBase initiallySelectedTaxonBase;
60
61 private final ITaxonNodeService service;
62
63 private enum CdmType {
64 TAXON_NODE,
65 TAXON_BASE,
66 PARENT_TAXON_NODE
67 }
68
69 private TaxonEditorInput(UUID uuid, CdmType type) {
70 this.conversation = CdmStore.createConversation();
71 service = CdmStore.getService(ITaxonNodeService.class);
72 switch(type) {
73 case PARENT_TAXON_NODE:
74 initForParentTaxonNode(uuid);
75 break;
76 case TAXON_BASE:
77 initForTaxonBase(uuid);
78 break;
79 case TAXON_NODE:
80 initForTaxonNode(uuid);
81 break;
82 }
83 }
84
85 private void init(TaxonNode taxonNode) {
86 this.taxonNode = taxonNode;
87 }
88
89
90 /**
91 * <p>NewInstance</p>
92 *
93 * @param taxonNodeUuid a {@link java.util.UUID} object.
94 * @return a {@link eu.etaxonomy.taxeditor.editor.TaxonEditorInput} object.
95 * @throws java.lang.Exception if any.
96 */
97 private void initForTaxonNode(UUID taxonNodeUuid) {
98
99
100 TaxonNode taxonNode = getCdmEntitySession().remoteLoad(service,taxonNodeUuid, null);
101 taxonNode = getCdmEntitySession().load(taxonNode);
102 if(taxonNode == null){
103 MessagingUtils.warningDialog("Not yet implemented", TaxonEditorInput.class, "Selected element is not type TaxonBase.");
104 }
105 init(taxonNode);
106
107 }
108
109 private void initForTaxonBase(UUID taxonBaseUuid) {
110
111 TaxonBase taxonBase = getCdmEntitySession().remoteLoad(CdmStore.getService(ITaxonService.class),taxonBaseUuid);
112 if (taxonBase != null){
113 if(taxonBase.isInstanceOf(Taxon.class)){
114 Taxon taxon = CdmBase.deproxy(taxonBase, Taxon.class);
115
116 if (taxon.getTaxonNodes().size() == 0 && taxon.isMisapplication()){
117 // TODO get accepted taxon
118 MessagingUtils.info("trying to open Mispplied Name ");
119
120 Set<Taxon> acceptedTaxa = new HashSet<Taxon>();
121 Set<TaxonRelationship> relations = taxon.getRelationsFromThisTaxon();
122 for(TaxonRelationship relation : relations){
123 if(relation.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())){
124 acceptedTaxa.add(relation.getToTaxon());
125 }
126 }
127 setInputForMultipleTaxa(conversation, acceptedTaxa);
128
129 }else{
130 setInputForMultipleNodes(conversation, taxon.getTaxonNodes());
131 }
132 }else if(taxonBase instanceof Synonym){
133 Synonym synonym = (Synonym) taxonBase;
134
135 Set<Taxon> taxa = synonym.getAcceptedTaxa();
136 setInputForMultipleTaxa(conversation, taxa);
137 }
138 }
139 }
140
141
142 /**
143 * <p>NewEmptyInstance</p>
144 *
145 * @param parentNodeUuid a {@link java.util.UUID} object.
146 * @return a {@link eu.etaxonomy.taxeditor.editor.TaxonEditorInput} object.
147 */
148 private void initForParentTaxonNode(UUID parentNodeUuid){
149
150
151 TaxonNameBase<?, ?> name = PreferencesUtil.getPreferredNomenclaturalCode().getNewTaxonNameInstance(null);
152 ITaxonTreeNode parentNode = CdmStore.getService(IClassificationService.class).getTreeNodeByUuid(parentNodeUuid);
153 parentNode = getCdmEntitySession().load(parentNode);
154
155 Taxon newTaxon = Taxon.NewInstance(name, parentNode.getReference());
156 TaxonNode newTaxonNode = parentNode.addChildTaxon(newTaxon, parentNode.getReference(), parentNode.getMicroReference());
157
158 // add the new taxon to the editors persistence context
159 UUID newTaxonNodeUuid = getCdmEntitySession().remoteSave(CdmStore.getService(ITaxonNodeService.class),newTaxonNode);
160
161 initForTaxonNode(newTaxonNodeUuid);
162 }
163
164
165 private void setInputForMultipleNodes(ConversationHolder conversation, Set<TaxonNode> taxonNodes){
166 if(taxonNodes.size() == 1){
167 TaxonNode taxonNode = taxonNodes.iterator().next();
168 init(taxonNode);
169 }else if(taxonNodes.size() > 1){
170 TaxonNode taxonNode = ChooseFromMultipleTaxonNodesDialog.choose(taxonNodes);
171 if(taxonNode != null){
172 init(taxonNode);
173 }
174 }else if(taxonNodes.size() == 0){
175 // this is an undesired state
176 MessagingUtils.warningDialog("Incorrect state", TaxonEditorInput.class, "The accepted taxon is not part of any classification. This should not have happened.");
177 }
178 }
179
180 private void setInputForMultipleTaxa(ConversationHolder conversation, Set<Taxon> taxa){
181 if(taxa.size() == 1){
182 Taxon taxon = taxa.iterator().next();
183 Set<TaxonNode> nodes = taxon.getTaxonNodes();
184 setInputForMultipleNodes(conversation, nodes);
185 }else if(taxa.size() > 1){
186 Set<TaxonNode> taxonNodes = new HashSet<TaxonNode>();
187 for ( Taxon taxon : taxa ){
188 taxonNodes.addAll(taxon.getTaxonNodes());
189 }
190 setInputForMultipleNodes(conversation, taxonNodes);
191 }else if(taxa.size() == 0){
192 // this is an undesired state
193 MessagingUtils.warningDialog("Incorrect state", TaxonEditorInput.class, "Trying to open accepted taxon for a synonym or misapplication but" +
194 " no accepted taxa are present. This should not have happened.");
195 }
196 }
197
198 /**
199 * <p>NewInstance</p>
200 *
201 * @param taxonNodeUuid a {@link java.util.UUID} object.
202 * @return a {@link eu.etaxonomy.taxeditor.editor.TaxonEditorInput} object.
203 * @throws java.lang.Exception if any.
204 */
205 public static TaxonEditorInput NewInstance(UUID taxonNodeUuid) throws Exception {
206 return new TaxonEditorInput(taxonNodeUuid, CdmType.TAXON_NODE);
207
208 }
209
210 /**
211 * <p>NewInstanceFromTaxonBase</p>
212 *
213 * @param taxonBaseUuid a {@link java.util.UUID} object.
214 * @return a {@link eu.etaxonomy.taxeditor.editor.TaxonEditorInput} object.
215 */
216 public static TaxonEditorInput NewInstanceFromTaxonBase(UUID taxonBaseUuid){
217 return new TaxonEditorInput(taxonBaseUuid, CdmType.TAXON_BASE);
218 }
219
220
221
222
223 /**
224 * <p>NewEmptyInstance</p>
225 *
226 * @param parentNodeUuid a {@link java.util.UUID} object.
227 * @return a {@link eu.etaxonomy.taxeditor.editor.TaxonEditorInput} object.
228 */
229 public static TaxonEditorInput NewEmptyInstance(UUID parentNodeUuid){
230 return new TaxonEditorInput(parentNodeUuid, CdmType.PARENT_TAXON_NODE);
231 }
232
233 /* (non-Javadoc)
234 * @see org.eclipse.ui.IEditorInput#exists()
235 */
236 /**
237 * <p>exists</p>
238 *
239 * @return a boolean.
240 */
241 @Override
242 public boolean exists() {
243 return taxonNode != null;
244 }
245
246 /* (non-Javadoc)
247 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
248 */
249 /**
250 * <p>getImageDescriptor</p>
251 *
252 * @return a {@link org.eclipse.jface.resource.ImageDescriptor} object.
253 */
254 @Override
255 public ImageDescriptor getImageDescriptor() {
256 return null;
257 }
258
259 /* (non-Javadoc)
260 * @see org.eclipse.ui.IEditorInput#getName()
261 */
262 /**
263 * <p>getName</p>
264 *
265 * @return a {@link java.lang.String} object.
266 */
267 @Override
268 public String getName() {
269 if(getTaxon() == null){
270 return null;
271 }
272 TaxonNameBase<?, ?> name = getTaxon().getName();
273 if (name == null || name.getTitleCache() == null) {
274 return "New taxon";
275 } else {
276 return name.getTitleCache();
277 }
278 }
279
280 /* (non-Javadoc)
281 * @see org.eclipse.ui.IEditorInput#getPersistable()
282 */
283 /**
284 * <p>getPersistable</p>
285 *
286 * @return a {@link org.eclipse.ui.IPersistableElement} object.
287 */
288 @Override
289 public IPersistableElement getPersistable() {
290 // if(CdmStore.isActive()){
291 // TaxonNode test = CdmStore.getTaxonTreeService().getTaxonNodeByUuid(taxonNode.getUuid());
292 // boolean isPersistable = CdmStore.getTaxonTreeService().getTaxonNodeByUuid(taxonNode.getUuid()) != null;
293 // if (isPersistable) {
294 // return this;
295 // }
296 // }
297 return null;
298 }
299
300 /* (non-Javadoc)
301 * @see org.eclipse.ui.IEditorInput#getToolTipText()
302 */
303 /**
304 * <p>getToolTipText</p>
305 *
306 * @return a {@link java.lang.String} object.
307 */
308 @Override
309 public String getToolTipText() {
310 return getName();
311 }
312
313 /* (non-Javadoc)
314 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
315 */
316 /** {@inheritDoc} */
317 @Override
318 public Object getAdapter(Class adapter) {
319
320 if (adapter == Taxon.class) {
321 return getTaxon();
322 }
323
324 if (adapter == TaxonNode.class) {
325 return taxonNode;
326 }
327
328 return null;
329 }
330
331 /**
332 * {@inheritDoc}
333 *
334 * Overrides equals to ensure that a taxon can only be edited by
335 * one editor at a time.
336 */
337 @Override
338 public boolean equals(Object obj) {
339 if (TaxonEditorInput.class.equals(obj.getClass())
340 && getTaxon() != null
341 && getTaxon().equals(((TaxonEditorInput) obj).getTaxon())){
342 if(((TaxonEditorInput) obj).getInitiallySelectedTaxonBase() != null){
343 setInitiallySelectedTaxonBase(((TaxonEditorInput) obj).getInitiallySelectedTaxonBase());
344 }
345 return true;
346 }
347 return false;
348 }
349
350 /**
351 * <p>getTaxon</p>
352 *
353 * @return the taxon
354 */
355 public Taxon getTaxon(){
356 Taxon taxon = CdmBase.deproxy(taxonNode.getTaxon(), Taxon.class);
357 return taxon;
358 }
359
360 /**
361 * <p>Getter for the field <code>taxonNode</code>.</p>
362 *
363 * @return the taxonNode
364 */
365 public TaxonNode getTaxonNode() {
366 return taxonNode;
367 }
368
369 /*
370 * (non-Javadoc)
371 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
372 */
373 /**
374 * <p>getConversationHolder</p>
375 *
376 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
377 */
378 @Override
379 public ConversationHolder getConversationHolder() {
380 return conversation;
381 }
382
383 /*
384 * (non-Javadoc)
385 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
386 */
387 /** {@inheritDoc} */
388 @Override
389 public void update(CdmDataChangeMap events) {
390 if(dataChangeBehavior == null){
391 dataChangeBehavior = new TaxonEditorInputDataChangeBehaviour(this);
392 }
393
394 DataChangeBridge.handleDataChange(events, dataChangeBehavior);
395 }
396
397 /* (non-Javadoc)
398 * @see org.eclipse.ui.IPersistableElement#getFactoryId()
399 */
400 /**
401 * <p>getFactoryId</p>
402 *
403 * @return a {@link java.lang.String} object.
404 */
405 @Override
406 public String getFactoryId() {
407 return TaxonEditorInputFactory.getFactoryId();
408 }
409
410 /* (non-Javadoc)
411 * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento)
412 */
413 /** {@inheritDoc} */
414 @Override
415 public void saveState(IMemento memento) {
416 TaxonEditorInputFactory.saveState(memento, this);
417 }
418
419
420 /**
421 * <p>Setter for the field <code>initiallySelectedTaxonBase</code>.</p>
422 *
423 * @param taxonBase a {@link eu.etaxonomy.cdm.model.taxon.TaxonBase} object.
424 */
425 public void setInitiallySelectedTaxonBase(TaxonBase taxonBase) {
426 this.initiallySelectedTaxonBase = taxonBase;
427 }
428
429 /**
430 * <p>Getter for the field <code>initiallySelectedTaxonBase</code>.</p>
431 *
432 * @return a {@link eu.etaxonomy.cdm.model.taxon.TaxonBase} object.
433 */
434 public TaxonBase getInitiallySelectedTaxonBase() {
435 return initiallySelectedTaxonBase;
436 }
437
438 @Override
439 public String toString() {
440 return String.format("%s[%s]", this.getClass().getSimpleName(), getTaxon());
441 }
442
443 /* (non-Javadoc)
444 * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#getService()
445 */
446 @Override
447 public ITaxonNodeService getService() {
448 return service;
449 }
450
451
452 /* (non-Javadoc)
453 * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#getRootEntities()
454 */
455 @Override
456 public List<TaxonNode> getRootEntities() {
457 return Arrays.asList(taxonNode);
458 }
459 }