Project

General

Profile

Download (14.4 KB) Statistics
| Branch: | Tag: | Revision:
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

    
460

    
461
    /* (non-Javadoc)
462
     * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#update()
463
     */
464
    @Override
465
    public <T extends CdmBase> void update() {
466
        taxonNode = getCdmEntitySession().remoteUpdate(service, taxonNode);
467
    }
468
}
(14-14/18)