Project

General

Profile

Download (10.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 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.HashSet;
14
import java.util.List;
15

    
16
import org.springframework.beans.factory.annotation.Autowired;
17
import org.springframework.context.annotation.Scope;
18
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
19

    
20
import com.vaadin.spring.annotation.SpringComponent;
21

    
22
import eu.etaxonomy.cdm.api.service.DeleteResult;
23
import eu.etaxonomy.cdm.api.service.IService;
24
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
25
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
26
import eu.etaxonomy.cdm.model.name.TaxonName;
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.service.CdmStore;
31
import eu.etaxonomy.cdm.service.IRegistrationWorkingSetService;
32
import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
33
import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
34
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
35
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent.Type;
36
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
37
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
38
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
39
import eu.etaxonomy.cdm.vaadin.security.UserHelper;
40
import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator;
41
import eu.etaxonomy.cdm.vaadin.util.converter.TypeDesignationSetManager.TypeDesignationWorkingSet;
42
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO;
43
import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
44
import eu.etaxonomy.vaadin.mvp.AbstractView;
45
import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent;
46
import eu.etaxonomy.vaadin.ui.view.DoneWithPopupEvent.Reason;
47

    
48
/**
49
 * @author a.kohlbecker
50
 * @since Jan 26, 2018
51
 *
52
 */
53
@SpringComponent
54
@Scope("prototype")
55
public class NameTypeDesignationPresenter
56
        extends AbstractCdmEditorPresenter<NameTypeDesignation, NameTypeDesignationEditorView> {
57

    
58
    @Autowired
59
    private IRegistrationWorkingSetService registrationWorkingSetService;
60

    
61
    HashSet<TaxonName> typifiedNamesAsLoaded;
62

    
63
    private TaxonNamePopupEditor typeNamePopup;
64

    
65
    private TaxonName typifiedNameInContext;
66

    
67

    
68
    /**
69
     * {@inheritDoc}
70
     */
71
    @Override
72
    protected NameTypeDesignation loadBeanById(Object identifier) {
73
        if(identifier instanceof Integer || identifier == null){
74
            return super.loadBeanById(identifier);
75
//        } else if(identifier instanceof TypedEntityReference && ((TypedEntityReference)identifier).getType().equals(TaxonName.class)) {
76
//            typifiedNameInContext = getRepo().getNameService().find(((TypedEntityReference)identifier).getId());
77
//            bean = super.loadBeanById(null);
78
        } else {
79
            TypeDesignationWorkingsetEditorIdSet idset = (TypeDesignationWorkingsetEditorIdSet)identifier;
80
            RegistrationDTO regDTO = registrationWorkingSetService.loadDtoById(idset.registrationId);
81
            typifiedNameInContext = regDTO.getTypifiedName();
82
            // find the working set
83
            TypeDesignationWorkingSet typeDesignationWorkingSet = regDTO.getTypeDesignationWorkingSet(idset.baseEntityRef);
84

    
85
            // NameTypeDesignation bameTypeDesignation = regDTO.getNameTypeDesignation(typeDesignationWorkingSet.getBaseEntityReference());
86
            if(!typeDesignationWorkingSet.getBaseEntityReference().getType().equals(NameTypeDesignation.class)){
87
                throw new RuntimeException("TypeDesignationWorkingsetEditorIdSet references not a NameTypeDesignation");
88
            }
89
            // TypeDesignationWorkingSet for NameTyped only contain one item!!!
90
            int nameTypeDesignationId = typeDesignationWorkingSet.getTypeDesignations().get(0).getId();
91
            return super.loadBeanById(nameTypeDesignationId);
92
        }
93
    }
94

    
95

    
96
    /**
97
     * {@inheritDoc}
98
     */
99
    @Override
100
    protected NameTypeDesignation loadCdmEntityById(Integer identifier) {
101
        List<String> initStrategy = Arrays.asList(new String []{
102
                "$",
103
                "typifiedNames.typeDesignations", // important !!
104
                "typeName.$",
105
                "citation.authorship.$",
106
                }
107
        );
108

    
109
        NameTypeDesignation typeDesignation;
110
        if(identifier != null){
111
            typeDesignation = (NameTypeDesignation) getRepo().getNameService().loadTypeDesignation(identifier, initStrategy);
112
        } else {
113
            if(beanInstantiator != null){
114
                typeDesignation = beanInstantiator.createNewBean();
115
            } else {
116
                typeDesignation = NameTypeDesignation.NewInstance();
117
            }
118
        }
119

    
120
        typifiedNamesAsLoaded = new HashSet<>(typeDesignation.getTypifiedNames());
121

    
122
        return typeDesignation;
123
    }
124

    
125

    
126

    
127

    
128
    /**
129
     * {@inheritDoc}
130
     */
131
    @Override
132
    public void handleViewEntered() {
133

    
134
        CdmBeanItemContainerFactory selectFactory = new CdmBeanItemContainerFactory(getRepo());
135
        getView().getTypeStatusSelect().setContainerDataSource(selectFactory.buildBeanItemContainer(NameTypeDesignationStatus.class));
136
        getView().getTypeStatusSelect().setItemCaptionPropertyId("description");
137

    
138
        getView().getCitationCombobox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<Reference>());
139
        CdmFilterablePagingProvider<Reference,Reference> referencePagingProvider = new CdmFilterablePagingProvider<Reference, Reference>(getRepo().getReferenceService());
140
        getView().getCitationCombobox().loadFrom(referencePagingProvider, referencePagingProvider, referencePagingProvider.getPageSize());
141
        getView().getCitationCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityButtonUpdater<Reference>(getView().getCitationCombobox()));
142
        getView().getCitationCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getCitationCombobox(), this));
143

    
144
        CdmFilterablePagingProvider<TaxonName,TaxonName> namePagingProvider = new CdmFilterablePagingProvider<TaxonName, TaxonName>(getRepo().getNameService());
145
        getView().getTypeNameField().loadFrom(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize());
146
        getView().getTypeNameField().getSelect().addValueChangeListener(new ToOneRelatedEntityButtonUpdater<TaxonName>(getView().getTypeNameField()));
147
        getView().getTypeNameField().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getTypeNameField(), this));
148

    
149
        getView().getTypifiedNamesComboboxSelect().setPagingProviders(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize(), this);
150

    
151
    }
152

    
153

    
154
    /**
155
     * {@inheritDoc}
156
     */
157
    @Override
158
    protected void guaranteePerEntityCRUDPermissions(Integer identifier) {
159
        if(crud != null){
160
            newAuthorityCreated = UserHelper.fromSession().createAuthorityForCurrentUser(NameTypeDesignation.class, identifier, crud, null);
161
        }
162
    }
163

    
164
    /**
165
     * {@inheritDoc}
166
     */
167
    @Override
168
    protected void guaranteePerEntityCRUDPermissions(NameTypeDesignation bean) {
169
        // TODO Auto-generated method stub
170

    
171
    }
172

    
173
    /**
174
     * {@inheritDoc}
175
     */
176
    @Override
177
    protected IService<NameTypeDesignation> getService() {
178
        // No TypeDesignationService :( so I need override the generic save and delete methods
179
        return null;
180
    }
181

    
182
    @Override
183
    protected void deleteBean(NameTypeDesignation bean){
184
        DeleteResult deletResult = getRepo().getNameService().deleteTypeDesignation(typifiedNameInContext, bean);
185
        if(deletResult.isOk()){
186
            EntityChangeEvent changeEvent = new EntityChangeEvent(bean.getClass(), bean.getId(), Type.REMOVED, (AbstractView) getView());
187
            viewEventBus.publish(this, changeEvent);
188
        } else {
189
            CdmStore.handleDeleteresultInError(deletResult);
190
        }
191
    }
192

    
193

    
194
    /**
195
     * {@inheritDoc}
196
     */
197
    @Override
198
    protected NameTypeDesignation handleTransientProperties(NameTypeDesignation bean) {
199

    
200
        // the typifiedNames can only be set on the name side, so we need to
201
        // handle changes explicitly here
202
        HashSet<TaxonName> typifiedNames = new HashSet<>(bean.getTypifiedNames());
203

    
204
        // handle adds
205
        for(TaxonName name : typifiedNames){
206
            if(!name.getTypeDesignations().contains(bean)){
207
                name.addTypeDesignation(bean, false);
208
            }
209
        }
210
        // handle removed
211
        for(TaxonName name : typifiedNamesAsLoaded){
212
            if(!typifiedNames.contains(name)){
213
                name.removeTypeDesignation(bean);
214
            }
215
            // FIXME do we need to save the names here or is the delete cascaded from the typedesignation to the name?
216
        }
217

    
218
        return bean;
219
    }
220

    
221

    
222
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
223
    public void onTaxonNameEditorActionAdd(TaxonNameEditorAction action){
224

    
225
        if(!isFromOwnView(action)){
226
            return;
227
        }
228

    
229
        typeNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class, getView());
230
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
231
        typeNamePopup.withDeleteButton(true);
232
        // TODO configure Modes???
233
        typeNamePopup.loadInEditor(null);
234

    
235
    }
236

    
237

    
238
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
239
    public void onTaxonNameEditorActionEdit(TaxonNameEditorAction action){
240

    
241
        if(!isFromOwnView(action)){
242
            return;
243
        }
244

    
245
        //  basionymSourceField = (AbstractField<TaxonName>)event.getSourceComponent();
246

    
247
        typeNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class, getView());
248
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
249
        typeNamePopup.withDeleteButton(true);
250
        // TODO configure Modes???
251
        typeNamePopup.loadInEditor(action.getEntityId());
252

    
253
    }
254

    
255
    @EventBusListenerMethod
256
    public void onDoneWithPopupEvent(DoneWithPopupEvent event){
257

    
258
        if(event.getPopup() == typeNamePopup){
259
            if(event.getReason() == Reason.SAVE){
260
                getView().getTypeNameField().reload();
261
            }
262
            if(event.getReason() == Reason.DELETE){
263
                getView().getTypeNameField().selectNewItem(null);
264
            }
265
            typeNamePopup = null;
266

    
267
        }
268
    }
269

    
270
}
(4-4/13)