Project

General

Profile

Download (9.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 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.view.name;
10

    
11
import java.util.Arrays;
12
import java.util.EnumSet;
13
import java.util.List;
14
import java.util.Set;
15

    
16
import org.apache.log4j.Logger;
17
import org.springframework.context.event.EventListener;
18

    
19
import eu.etaxonomy.cdm.api.service.INameService;
20
import eu.etaxonomy.cdm.model.agent.AgentBase;
21
import eu.etaxonomy.cdm.model.agent.Person;
22
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
23
import eu.etaxonomy.cdm.model.common.TermType;
24
import eu.etaxonomy.cdm.model.name.Rank;
25
import eu.etaxonomy.cdm.model.name.TaxonName;
26
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
27
import eu.etaxonomy.cdm.model.reference.Reference;
28
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
29
import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
30
import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
31
import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
32
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
33
import eu.etaxonomy.cdm.vaadin.security.UserHelper;
34
import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator;
35
import eu.etaxonomy.cdm.vaadin.view.reference.ReferencePopupEditor;
36
import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
37
import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent;
38
import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent.Reason;
39

    
40
/**
41
 * @author a.kohlbecker
42
 * @since May 22, 2017
43
 *
44
 */
45
public class TaxonNameEditorPresenter extends AbstractCdmEditorPresenter<TaxonName, TaxonNamePopupEditorView> {
46

    
47
    private static final long serialVersionUID = -3538980627079389221L;
48

    
49
    private static final Logger logger = Logger.getLogger(TaxonNameEditorPresenter.class);
50

    
51
    ReferencePopupEditor newReferencePopup = null;
52

    
53
    /**
54
     * {@inheritDoc}
55
     */
56
    @Override
57
    public void handleViewEntered() {
58

    
59
        super.handleViewEntered();
60

    
61
        CdmBeanItemContainerFactory selectFieldFactory = new CdmBeanItemContainerFactory(getRepo());
62
        getView().getRankSelect().setContainerDataSource(selectFieldFactory.buildBeanItemContainer(TermType.Rank));
63
        getView().getRankSelect().setItemCaptionPropertyId("label");
64

    
65
        CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase> termOrPersonPagingProvider = new CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase>(getRepo().getAgentService(), TeamOrPersonBase.class);
66
        CdmFilterablePagingProvider<AgentBase, Person> personPagingProvider = new CdmFilterablePagingProvider<AgentBase, Person>(getRepo().getAgentService(), Person.class);
67

    
68
        getView().getCombinationAuthorshipField().setFilterableTeamPagingProvider(termOrPersonPagingProvider, this);
69
        getView().getCombinationAuthorshipField().setFilterablePersonPagingProvider(personPagingProvider, this);
70

    
71
        getView().getExCombinationAuthorshipField().setFilterableTeamPagingProvider(termOrPersonPagingProvider, this);
72
        getView().getExCombinationAuthorshipField().setFilterablePersonPagingProvider(personPagingProvider, this);
73

    
74
        getView().getBasionymAuthorshipField().setFilterableTeamPagingProvider(termOrPersonPagingProvider, this);
75
        getView().getBasionymAuthorshipField().setFilterablePersonPagingProvider(personPagingProvider, this);
76

    
77
        getView().getExBasionymAuthorshipField().setFilterableTeamPagingProvider(termOrPersonPagingProvider, this);
78
        getView().getExBasionymAuthorshipField().setFilterablePersonPagingProvider(personPagingProvider, this);
79

    
80
        getView().getNomReferenceCombobox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<Reference>());
81
        CdmFilterablePagingProvider<Reference, Reference> referencePagingProvider = new CdmFilterablePagingProvider<Reference, Reference>(getRepo().getReferenceService());
82
        getView().getNomReferenceCombobox().loadFrom(referencePagingProvider, referencePagingProvider, referencePagingProvider.getPageSize());
83
        getView().getNomReferenceCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityButtonUpdater<Reference>(getView().getNomReferenceCombobox()));
84

    
85

    
86
        getView().getBasionymCombobox().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<TaxonName>());
87
        CdmFilterablePagingProvider<TaxonName, TaxonName> namePagingProvider = new CdmFilterablePagingProvider<TaxonName, TaxonName>(getRepo().getNameService());
88

    
89
        getView().getBasionymCombobox().setPagingProviders(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize());
90
    }
91

    
92
    /**
93
     * {@inheritDoc}
94
     */
95
    @Override
96
    protected TaxonName loadCdmEntityById(Integer identifier) {
97

    
98
        List<String> initStrategy = Arrays.asList(new String []{
99

    
100
                "$",
101
                "rank.vocabulary", // needed for comparing ranks
102

    
103
                "nomenclaturalReference.authorship",
104
                "nomenclaturalReference.inReference",
105

    
106
                "status.type",
107

    
108
                "combinationAuthorship",
109
                "exCombinationAuthorship",
110
                "basionymAuthorship",
111
                "exBasionymAuthorship",
112

    
113
                // basionyms: relationsToThisName.fromName
114
                "relationsToThisName.type",
115
                "relationsToThisName.fromName.rank",
116
                "relationsToThisName.fromName.nomenclaturalReference.authorship",
117
                "relationsToThisName.fromName.nomenclaturalReference.inReference",
118
                "relationsToThisName.fromName.relationsToThisName",
119
                "relationsToThisName.fromName.relationsFromThisName",
120

    
121
                "relationsFromThisName",
122
                //"relationsToThisName",
123
                "homotypicalGroup.typifiedNames"
124

    
125
                }
126
        );
127

    
128
        TaxonName bean;
129
        if(identifier != null){
130
            bean = getRepo().getNameService().load(identifier, initStrategy);
131
        } else {
132
            bean = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
133
        }
134
        return bean;
135
    }
136

    
137
    /**
138
     * {@inheritDoc}
139
     */
140
    @Override
141
    protected void guaranteePerEntityCRUDPermissions(Integer identifier) {
142
        if(crud != null){
143
            newAuthorityCreated = UserHelper.fromSession().createAuthorityForCurrentUser(TaxonName.class, identifier, crud, null);
144
        }
145

    
146
    }
147

    
148
    /**
149
     * {@inheritDoc}
150
     */
151
    @Override
152
    protected void guaranteePerEntityCRUDPermissions(TaxonName bean) {
153
        if(crud != null){
154
            newAuthorityCreated = UserHelper.fromSession().createAuthorityForCurrentUser(bean, crud, null);
155
        }
156
    }
157

    
158
    @Override
159
    protected TaxonName handleTransientProperties(TaxonName bean) {
160

    
161
        logger.trace(this._toString() + ".onEditorSaveEvent - handling transient properties");
162
        List<TaxonName> newBasionymNames = getView().getBasionymCombobox().getValueFromNestedFields();
163
        Set<TaxonName> oldBasionyms = bean.getBasionyms();
164
        boolean updateBasionyms = false;
165

    
166
        for(TaxonName newB : newBasionymNames){
167
            updateBasionyms = updateBasionyms || !oldBasionyms.contains(newB);
168
        }
169

    
170
        for(TaxonName oldB : oldBasionyms){
171
            updateBasionyms = updateBasionyms || !newBasionymNames.contains(oldB);
172
        }
173

    
174
        if(updateBasionyms){
175
            bean.removeBasionyms();
176
            for(TaxonName basionymName :newBasionymNames){
177
                if(basionymName != null){
178
                    if(basionymName .getUuid() != null){
179
                        // reload
180
                        basionymName = getRepo().getNameService().load(basionymName.getUuid(), Arrays.asList("$", "relationsFromThisName", "homotypicalGroup.typifiedNames"));
181
                    }
182
                    bean.addBasionym(basionymName);
183
                }
184
            }
185
        }
186
        return bean;
187
    }
188

    
189
    /**
190
     * {@inheritDoc}
191
     */
192
    @Override
193
    protected INameService getService() {
194
        return getRepo().getNameService();
195
    }
196

    
197
    @EventListener(condition = "#event.type == T(eu.etaxonomy.cdm.vaadin.event.AbstractEditorAction.Action).ADD")
198
    public void onReferenceEditorActionAdd(ReferenceEditorAction event) {
199

    
200
        if(getView() == null || event.getSourceView() != getView() ){
201
            return;
202
        }
203
        newReferencePopup = getNavigationManager().showInPopup(ReferencePopupEditor.class);
204

    
205
        newReferencePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
206
        newReferencePopup.withDeleteButton(true);
207
        newReferencePopup.loadInEditor(null);
208
    }
209

    
210
    @EventListener
211
    public void onDoneWithPopupEvent(DoneWithPopupEvent event){
212
        if(event.getPopup() == newReferencePopup){
213
            if(event.getReason() == Reason.SAVE){
214

    
215
                Reference newReference = newReferencePopup.getBean();
216

    
217
                // TODO the bean contained in the popup editor is not yet updated at this point.
218
                //      so re reload it using the uuid since new beans will not have an Id at this point.
219
                newReference = getRepo().getReferenceService().find(newReference.getUuid());
220
                getView().getNomReferenceCombobox().setValue(newReference);
221
            }
222

    
223
            newReferencePopup = null;
224
        }
225
    }
226

    
227

    
228

    
229
}
(6-6/9)