Project

General

Profile

Download (6.6 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2015 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
package eu.etaxonomy.cdm.vaadin.presenter;
10

    
11
import java.sql.SQLException;
12
import java.util.Arrays;
13
import java.util.List;
14
import java.util.UUID;
15

    
16
import org.springframework.beans.factory.annotation.Autowired;
17
import org.springframework.context.annotation.Scope;
18
import org.springframework.transaction.TransactionStatus;
19

    
20
import com.vaadin.data.util.sqlcontainer.RowId;
21
import com.vaadin.spring.annotation.SpringComponent;
22

    
23
import eu.etaxonomy.cdm.api.application.CdmRepository;
24
import eu.etaxonomy.cdm.api.service.pager.Pager;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.model.name.INonViralName;
27
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
28
import eu.etaxonomy.cdm.model.reference.Reference;
29
import eu.etaxonomy.cdm.model.taxon.Classification;
30
import eu.etaxonomy.cdm.model.taxon.Synonym;
31
import eu.etaxonomy.cdm.model.taxon.SynonymType;
32
import eu.etaxonomy.cdm.model.taxon.Taxon;
33
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
34
import eu.etaxonomy.cdm.persistence.query.MatchMode;
35
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
36
import eu.etaxonomy.cdm.vaadin.container.CdmSQLContainer;
37
import eu.etaxonomy.cdm.vaadin.container.IdUuidName;
38
import eu.etaxonomy.cdm.vaadin.view.INewTaxonBaseComponentListener;
39

    
40
/**
41
 * @author cmathew
42
 * @date 2 Apr 2015
43
 *
44
 */
45
@SpringComponent
46
@Scope("prototype")
47
public class NewTaxonBasePresenter implements INewTaxonBaseComponentListener {
48

    
49
    @Autowired
50
    private CdmRepository cdmRepo = null;
51

    
52
    private final CdmSQLContainer accTaxonSecRefContainer;
53
    private final CdmSQLContainer synSecRefContainer;
54

    
55

    
56
    @Override
57
    public CdmSQLContainer getAccTaxonSecRefContainer() {
58
        return accTaxonSecRefContainer;
59
    }
60

    
61
    @Override
62
    public CdmSQLContainer getSynSecRefContainer() {
63
        return synSecRefContainer;
64
    }
65

    
66
    public NewTaxonBasePresenter() throws SQLException {
67
        accTaxonSecRefContainer = CdmSQLContainer.newInstance("Reference");
68
        synSecRefContainer = CdmSQLContainer.newInstance("Reference");
69
    }
70

    
71
    private boolean checkIfNameExists(INonViralName nvn) {
72
        TaxonNameBase<?,?> name = TaxonNameBase.castAndDeproxy(nvn);
73
        Pager<TaxonNameBase> names = cdmRepo.getNameService().findByName(name.getClass(),
74
                name.getNameCache(),
75
                MatchMode.EXACT,
76
                null,
77
                null,
78
                -1,
79
                null,
80
                null);
81
        if(names.getCount() > 0) {
82
            return true;
83
        }
84
        return false;
85
    }
86

    
87
    @Override
88
    //@Transactional // FIXME use this annotation instead of the explicit start commit below
89
    public IdUuidName newTaxon(String scientificName, Object secRefItemId, UUID classificationUuid) {
90
        NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();
91
        INonViralName name = parser.parseFullName(scientificName);
92

    
93
        if(checkIfNameExists(name)) {
94
            throw new IllegalArgumentException("Given name already exists");
95
        }
96
        TransactionStatus tx = cdmRepo.startTransaction();
97
        UUID uuid = accTaxonSecRefContainer.getUuid(secRefItemId);
98
        Reference sec = CdmBase.deproxy(cdmRepo.getReferenceService().load(uuid), Reference.class);
99

    
100
        //name.setTitleCache(scientificName, true);
101
        Taxon newTaxon = Taxon.NewInstance(name, sec);
102
        List<String> CLASSIFICATION_INIT_STRATEGY = Arrays.asList(new String []{
103
                "rootNode.childNodes"
104
        });
105
        Classification classification = CdmBase.deproxy(cdmRepo.getClassificationService().load(classificationUuid, CLASSIFICATION_INIT_STRATEGY), Classification.class);
106
        TaxonNode newTaxonNode = classification.addChildTaxon(newTaxon, null, null);
107
        cdmRepo.getTaxonNodeService().saveOrUpdate(newTaxonNode);
108
        newTaxonNode.setUnplaced(true);
109

    
110
        cdmRepo.commitTransaction(tx);
111
        return new IdUuidName(newTaxonNode.getTaxon().getId(), newTaxonNode.getTaxon().getUuid(), newTaxonNode.getTaxon().getTitleCache());
112
    }
113

    
114
    @Override
115
    //@Transactional // FIXME use this annotation instead of the explicit start commit below
116
    public IdUuidName newSynonym(String scientificName, Object synSecRefItemId, Object accTaxonSecRefItemId, UUID accTaxonUuid) {
117
        NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();
118
        INonViralName name = parser.parseFullName(scientificName);
119

    
120
        if(checkIfNameExists(name)) {
121
            throw new IllegalArgumentException("Given name already exists");
122
        }
123
        TransactionStatus tx = cdmRepo.startTransaction();
124
        List<String> ACC_TAXON_INIT_STRATEGY = Arrays.asList(new String []{
125
                "synonymRelations"
126
        });
127

    
128
        UUID synRefUuid = synSecRefContainer.getUuid(synSecRefItemId);
129
        Reference synSec = CdmBase.deproxy(cdmRepo.getReferenceService().load(synRefUuid), Reference.class);
130

    
131
        //name.setTitleCache(scientificName, true);
132
        Synonym newSynonym = Synonym.NewInstance(name, synSec);
133

    
134

    
135
        UUID accTaxonRefUuid = accTaxonSecRefContainer.getUuid(accTaxonSecRefItemId);
136
        Reference accTaxonSec = CdmBase.deproxy(cdmRepo.getReferenceService().load(accTaxonRefUuid), Reference.class);
137
        Taxon accTaxon = CdmBase.deproxy(cdmRepo.getTaxonService().load(accTaxonUuid, ACC_TAXON_INIT_STRATEGY), Taxon.class);
138
        accTaxon.setSec(accTaxonSec);
139

    
140
        accTaxon.addSynonym(newSynonym, SynonymType.SYNONYM_OF());
141

    
142
        UUID newUuid = cdmRepo.getTaxonService().save(newSynonym).getUuid();
143
        cdmRepo.commitTransaction(tx);
144
        return new IdUuidName(newSynonym.getId(), newUuid, newSynonym.getTitleCache());
145
    }
146

    
147

    
148
    @Override
149
    public Object getAcceptedTaxonRefId(UUID accTaxonUuid) {
150
        Taxon accTaxon = CdmBase.deproxy(cdmRepo.getTaxonService().load(accTaxonUuid), Taxon.class);
151
        if(accTaxon.getSec() != null) {
152
            int refId = accTaxon.getSec().getId();
153
            RowId itemId = new RowId(refId);
154
            return itemId;
155
        }
156
        return null;
157
    }
158

    
159
    @Override
160
    public Object getClassificationRefId(UUID classificationUuid) {
161
        Classification classification = CdmBase.deproxy(cdmRepo.getClassificationService().load(classificationUuid), Classification.class);
162
        if(classification.getReference() != null) {
163
            int refId = classification.getReference().getId();
164
            RowId itemId = new RowId(refId);
165
            return itemId;
166
        }
167
        return null;
168
    }
169

    
170

    
171

    
172
}
(4-4/5)