Project

General

Profile

Download (12 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.ArrayList;
12
import java.util.Arrays;
13
import java.util.EnumSet;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.UUID;
17

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

    
22
import com.vaadin.spring.annotation.SpringComponent;
23

    
24
import eu.etaxonomy.cdm.api.service.DeleteResult;
25
import eu.etaxonomy.cdm.api.service.IService;
26
import eu.etaxonomy.cdm.api.service.dto.RegistrationDTO;
27
import eu.etaxonomy.cdm.api.service.name.TypeDesignationSetManager.TypeDesignationWorkingSet;
28
import eu.etaxonomy.cdm.api.service.registration.IRegistrationWorkingSetService;
29
import eu.etaxonomy.cdm.model.common.Annotation;
30
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
31
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
32
import eu.etaxonomy.cdm.model.name.TaxonName;
33
import eu.etaxonomy.cdm.model.reference.Reference;
34
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
35
import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
36
import eu.etaxonomy.cdm.service.CdmStore;
37
import eu.etaxonomy.cdm.service.UserHelperAccess;
38
import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
39
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
40
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent.Type;
41
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
42
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
43
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
44
import eu.etaxonomy.cdm.vaadin.ui.config.TaxonNamePopupEditorConfig;
45
import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator;
46
import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
47
import eu.etaxonomy.vaadin.mvp.AbstractView;
48
import eu.etaxonomy.vaadin.mvp.BeanInstantiator;
49
import eu.etaxonomy.vaadin.mvp.BoundField;
50
import eu.etaxonomy.vaadin.ui.view.PopupView;
51

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

    
62
    @Autowired
63
    private IRegistrationWorkingSetService registrationWorkingSetService;
64

    
65
    HashSet<TaxonName> typifiedNamesAsLoaded;
66

    
67
    private TaxonName typifiedNameInContext;
68

    
69
    protected static BeanInstantiator<NameTypeDesignation> defaultBeanInstantiator = new BeanInstantiator<NameTypeDesignation>() {
70

    
71
        @Override
72
        public NameTypeDesignation createNewBean() {
73
            return NameTypeDesignation.NewInstance();
74
        }
75
    };
76

    
77

    
78
    @Override
79
    protected BeanInstantiator<NameTypeDesignation> defaultBeanInstantiator(){
80
       return defaultBeanInstantiator;
81
    }
82

    
83
    /**
84
     * {@inheritDoc}
85
     */
86
    @Override
87
    protected NameTypeDesignation loadBeanById(Object identifier) {
88
        if(identifier instanceof Integer || identifier == null){
89
            return super.loadBeanById(identifier);
90
//        } else if(identifier instanceof TypedEntityReference && ((TypedEntityReference)identifier).getType().equals(TaxonName.class)) {
91
//            typifiedNameInContext = getRepo().getNameService().find(((TypedEntityReference)identifier).getUuid());
92
//            bean = super.loadBeanById(null);
93
        } else {
94
            TypeDesignationWorkingsetEditorIdSet idset = (TypeDesignationWorkingsetEditorIdSet)identifier;
95
            RegistrationDTO regDTO = registrationWorkingSetService.loadDtoByUuid(idset.registrationUuid);
96
            typifiedNameInContext = regDTO.getTypifiedName();
97
            // find the working set
98
            TypeDesignationWorkingSet typeDesignationWorkingSet = regDTO.getTypeDesignationWorkingSet(idset.baseEntityRef);
99

    
100
            // NameTypeDesignation bameTypeDesignation = regDTO.getNameTypeDesignation(typeDesignationWorkingSet.getBaseEntityReference());
101
            if(!typeDesignationWorkingSet.getBaseEntityReference().getType().equals(NameTypeDesignation.class)){
102
                throw new RuntimeException("TypeDesignationWorkingsetEditorIdSet references not a NameTypeDesignation");
103
            }
104
            // TypeDesignationWorkingSet for NameTyped only contain one item!!!
105
            UUID nameTypeDesignationUuid = typeDesignationWorkingSet.getTypeDesignations().get(0).getUuid();
106
            return super.loadBeanById(nameTypeDesignationUuid);
107
        }
108
    }
109

    
110

    
111
    /**
112
     * {@inheritDoc}
113
     */
114
    @Override
115
    protected NameTypeDesignation loadCdmEntity(UUID uuid) {
116
        List<String> initStrategy = Arrays.asList(new String []{
117
                "$",
118
                "annotations.*", // * is needed as log as we are using a table in FilterableAnnotationsField
119
                "typifiedNames.typeDesignations", // important !!
120
                "typeName.$",
121
                "citation.authorship.$",
122
                }
123
        );
124

    
125
        NameTypeDesignation typeDesignation;
126
        if(uuid != null){
127
            typeDesignation = (NameTypeDesignation) getRepo().getNameService().loadTypeDesignation(uuid, initStrategy);
128
        } else {
129
            typeDesignation = createNewBean();
130
        }
131

    
132
        typifiedNamesAsLoaded = new HashSet<>(typeDesignation.getTypifiedNames());
133

    
134
        return typeDesignation;
135
    }
136

    
137

    
138

    
139

    
140
    /**
141
     * {@inheritDoc}
142
     */
143
    @Override
144
    public void handleViewEntered() {
145

    
146
        getView().getTypeStatusSelect().setContainerDataSource(cdmBeanItemContainerFactory.buildBeanItemContainer(NameTypeDesignationStatus.class));
147
        getView().getTypeStatusSelect().setItemCaptionPropertyId("description");
148

    
149
        getView().getCitationCombobox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<Reference>());
150
        CdmFilterablePagingProvider<Reference,Reference> referencePagingProvider = pagingProviderFactory.referencePagingProvider();
151
        getView().getCitationCombobox().loadFrom(referencePagingProvider, referencePagingProvider, referencePagingProvider.getPageSize());
152
        getView().getCitationCombobox().setNestedButtonStateUpdater(new ToOneRelatedEntityButtonUpdater<Reference>(getView().getCitationCombobox()));
153
        getView().getCitationCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getCitationCombobox(), this));
154

    
155
        CdmFilterablePagingProvider<TaxonName,TaxonName> namePagingProvider = pagingProviderFactory.taxonNamesWithoutOrthophicIncorrect();
156
        getView().getTypeNameField().loadFrom(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize());
157
        getView().getTypeNameField().setNestedButtonStateUpdater(new ToOneRelatedEntityButtonUpdater<TaxonName>(getView().getTypeNameField()));
158
        getView().getTypeNameField().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getTypeNameField(), this));
159

    
160
        getView().getTypifiedNamesComboboxSelect().setPagingProviders(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize(), this);
161

    
162
    }
163

    
164

    
165
    /**
166
     * {@inheritDoc}
167
     */
168
    @Override
169
    protected void guaranteePerEntityCRUDPermissions(UUID identifier) {
170
        if(crud != null){
171
            newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(NameTypeDesignation.class, identifier, crud, null);
172
        }
173
    }
174

    
175
    /**
176
     * {@inheritDoc}
177
     */
178
    @Override
179
    protected void guaranteePerEntityCRUDPermissions(NameTypeDesignation bean) {
180
        // TODO Auto-generated method stub
181

    
182
    }
183

    
184
    /**
185
     * {@inheritDoc}
186
     */
187
    @Override
188
    protected IService<NameTypeDesignation> getService() {
189
        // No TypeDesignationService :( so I need override the generic save and delete methods
190
        return null;
191
    }
192

    
193
    @Override
194
    protected void deleteBean(NameTypeDesignation bean){
195
        // deleteTypedesignation(uuid, uuid) needs to be called so the name is loaded in the transaction of the method and is saved.
196
        DeleteResult deletResult = getRepo().getNameService().deleteTypeDesignation(typifiedNameInContext.getUuid(), bean.getUuid());
197
        if(deletResult.isOk()){
198
            EntityChangeEvent changeEvent = new EntityChangeEvent(bean, Type.REMOVED, (AbstractView) getView());
199
            viewEventBus.publish(this, changeEvent);
200
        } else {
201
            CdmStore.handleDeleteresultInError(deletResult);
202
        }
203
    }
204

    
205

    
206
    /**
207
     * {@inheritDoc}
208
     */
209
    @Override
210
    protected NameTypeDesignation preSaveBean(NameTypeDesignation bean) {
211

    
212
        // the typifiedNames can only be set on the name side, so we need to
213
        // handle changes explicitly here
214
        HashSet<TaxonName> typifiedNames = new HashSet<>(bean.getTypifiedNames());
215

    
216
        // handle adds
217
        for(TaxonName name : typifiedNames){
218
            if(name == null){
219
                throw new NullPointerException("typifiedName must not be null");
220
            }
221
            if(!name.getTypeDesignations().contains(bean)){
222
                name.addTypeDesignation(bean, false);
223
            }
224
        }
225
        // handle removed
226
        for(TaxonName name : typifiedNamesAsLoaded){
227
            if(!typifiedNames.contains(name)){
228
                name.removeTypeDesignation(bean);
229
            }
230
            // FIXME do we need to save the names here or is the delete cascaded from the typedesignation to the name?
231
        }
232

    
233
        // handle annotation changes
234
        List<Annotation> annotations = getView().getAnnotationsField().getValue();
235
        List<Annotation> currentAnnotations = new ArrayList<>(bean.getAnnotations());
236
        List<Annotation> annotationsSeen = new ArrayList<>();
237
        for(Annotation a : annotations){
238
            if(a == null){
239
                continue;
240
            }
241
            if(!currentAnnotations.contains(a)){
242
                bean.addAnnotation(a);
243
            }
244
            annotationsSeen.add(a);
245
        }
246
        for(Annotation a : currentAnnotations){
247
            if(!annotationsSeen.contains(a)){
248
                bean.removeAnnotation(a);
249
            }
250
        }
251

    
252

    
253
        return bean;
254
    }
255

    
256

    
257

    
258
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
259
    public void onTaxonNameEditorActionAdd(TaxonNameEditorAction action){
260

    
261
        if(!isFromOwnView(action)){
262
            return;
263
        }
264

    
265
        TaxonNamePopupEditor typeNamePopup = openPopupEditor(TaxonNamePopupEditor.class, action);
266
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
267
        typeNamePopup.withDeleteButton(true);
268
        TaxonNamePopupEditorConfig.configure(typeNamePopup);
269
        typeNamePopup.loadInEditor(null);
270

    
271
    }
272

    
273

    
274
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
275
    public void onTaxonNameEditorActionEdit(TaxonNameEditorAction action){
276

    
277
        if(!isFromOwnView(action)){
278
            return;
279
        }
280

    
281
        TaxonNamePopupEditor typeNamePopup = openPopupEditor(TaxonNamePopupEditor.class, action);
282
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
283
        typeNamePopup.withDeleteButton(true);
284
        TaxonNamePopupEditorConfig.configure(typeNamePopup);
285
        typeNamePopup.loadInEditor(action.getEntityUuid());
286

    
287
    }
288

    
289
    @EventBusListenerMethod
290
    public void onEntityChangeEvent(EntityChangeEvent<?>event){
291

    
292
        BoundField boundTargetField = boundTargetField((PopupView) event.getSourceView());
293

    
294
        if(boundTargetField != null){
295
            if(boundTargetField.matchesPropertyIdPath("typeName")){
296
                if(event.isCreateOrModifiedType()){
297
                    getCache().load(event.getEntity());
298
                    if(event.isCreatedType()){
299
                        getView().getTypeNameField().setValue((TaxonName) event.getEntity());
300
                    } else {
301
                        getView().getTypeNameField().reload();
302
                    }
303
                }
304
                if(event.isRemovedType()){
305
                    getView().getTypeNameField().selectNewItem(null);
306
                }
307

    
308
            }
309
        }
310
    }
311

    
312
}
(4-4/14)