Project

General

Profile

Download (8.69 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
        getView().getBasionymCombobox().setPagingProviders(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize());
89
    }
90

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

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

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

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

    
105
                "status.type",
106

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

    
112
                "basionyms.rank",
113
                "basionyms.nomenclaturalReference.authorship",
114
                "basionyms.nomenclaturalReference.inReference",
115

    
116
                }
117
        );
118

    
119
        TaxonName bean;
120
        if(identifier != null){
121
            bean = getRepo().getNameService().load(identifier, initStrategy);
122
        } else {
123
            bean = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
124
        }
125
        return bean;
126
    }
127

    
128
    /**
129
     * {@inheritDoc}
130
     */
131
    @Override
132
    protected void guaranteePerEntityCRUDPermissions(Integer identifier) {
133
        if(crud != null){
134
            newAuthorityCreated = UserHelper.fromSession().createAuthorityForCurrentUser(TaxonName.class, identifier, crud, null);
135
        }
136

    
137
    }
138

    
139
    /**
140
     * {@inheritDoc}
141
     */
142
    @Override
143
    protected void guaranteePerEntityCRUDPermissions(TaxonName bean) {
144
        if(crud != null){
145
            newAuthorityCreated = UserHelper.fromSession().createAuthorityForCurrentUser(bean, crud, null);
146
        }
147
    }
148

    
149
    @Override
150
    protected TaxonName handleTransientProperties(TaxonName bean) {
151
        logger.trace(this._toString() + ".onEditorSaveEvent - handling transient properties");
152
        List<TaxonName> newBasionymNames = getView().getBasionymCombobox().getValueFromNestedFields();
153
        Set<TaxonName> oldBasionyms = bean.getBasionyms();
154
        boolean updateBasionyms = false;
155
        for(TaxonName newB : newBasionymNames){
156

    
157
            updateBasionyms = updateBasionyms || !oldBasionyms.contains(newB);
158
        }
159
        for(TaxonName oldB : oldBasionyms){
160
            updateBasionyms = updateBasionyms || !newBasionymNames.contains(oldB);
161
        }
162
        if(updateBasionyms){
163
            bean.removeBasionyms();
164
            for(TaxonName basionymName :newBasionymNames){
165
                if(basionymName != null){
166
                    if(basionymName .getUuid() != null){
167
                        // reload
168
                        basionymName = getRepo().getNameService().load(basionymName.getUuid());
169
                    }
170
                    bean.addBasionym(basionymName);
171
                }
172
            }
173
        }
174
        return bean;
175
    }
176

    
177
    /**
178
     * {@inheritDoc}
179
     */
180
    @Override
181
    protected INameService getService() {
182
        return getRepo().getNameService();
183
    }
184

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

    
188
        if(getView() == null || event.getSourceView() != getView() ){
189
            return;
190
        }
191
        newReferencePopup = getNavigationManager().showInPopup(ReferencePopupEditor.class);
192

    
193
        newReferencePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
194
        newReferencePopup.withDeleteButton(true);
195
        newReferencePopup.loadInEditor(null);
196
    }
197

    
198
    @EventListener
199
    public void onDoneWithPopupEvent(DoneWithPopupEvent event){
200
        if(event.getPopup() == newReferencePopup){
201
            if(event.getReason() == Reason.SAVE){
202

    
203
                Reference newReference = newReferencePopup.getBean();
204

    
205
                // TODO the bean contained in the popup editor is not yet updated at this point.
206
                //      so re reload it using the uuid since new beans will not have an Id at this point.
207
                newReference = getRepo().getReferenceService().find(newReference.getUuid());
208
                getView().getNomReferenceCombobox().setValue(newReference);
209
            }
210

    
211
            newReferencePopup = null;
212
        }
213
    }
214

    
215

    
216

    
217
}
(6-6/9)