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.component.CdmBeanItemContainerFactory;
39
import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
40
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
41
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent.Type;
42
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
43
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
44
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader;
45
import eu.etaxonomy.cdm.vaadin.ui.config.TaxonNamePopupEditorConfig;
46
import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator;
47
import eu.etaxonomy.vaadin.mvp.AbstractCdmEditorPresenter;
48
import eu.etaxonomy.vaadin.mvp.AbstractView;
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

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

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

    
97

    
98
    /**
99
     * {@inheritDoc}
100
     */
101
    @Override
102
    protected NameTypeDesignation loadCdmEntity(UUID uuid) {
103
        List<String> initStrategy = Arrays.asList(new String []{
104
                "$",
105
                "annotations.*", // * is needed as log as we are using a table in FilterableAnnotationsField
106
                "typifiedNames.typeDesignations", // important !!
107
                "typeName.$",
108
                "citation.authorship.$",
109
                }
110
        );
111

    
112
        NameTypeDesignation typeDesignation;
113
        if(uuid != null){
114
            typeDesignation = (NameTypeDesignation) getRepo().getNameService().loadTypeDesignation(uuid, initStrategy);
115
        } else {
116
            if(beanInstantiator != null){
117
                typeDesignation = beanInstantiator.createNewBean();
118
            } else {
119
                typeDesignation = NameTypeDesignation.NewInstance();
120
            }
121
        }
122

    
123
        typifiedNamesAsLoaded = new HashSet<>(typeDesignation.getTypifiedNames());
124

    
125
        return typeDesignation;
126
    }
127

    
128

    
129

    
130

    
131
    /**
132
     * {@inheritDoc}
133
     */
134
    @Override
135
    public void handleViewEntered() {
136

    
137
        CdmBeanItemContainerFactory selectFactory = new CdmBeanItemContainerFactory(getRepo());
138
        getView().getTypeStatusSelect().setContainerDataSource(selectFactory.buildBeanItemContainer(NameTypeDesignationStatus.class));
139
        getView().getTypeStatusSelect().setItemCaptionPropertyId("description");
140

    
141
        getView().getCitationCombobox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<Reference>());
142
        CdmFilterablePagingProvider<Reference,Reference> referencePagingProvider = pagingProviderFactory.referencePagingProvider();
143
        getView().getCitationCombobox().loadFrom(referencePagingProvider, referencePagingProvider, referencePagingProvider.getPageSize());
144
        getView().getCitationCombobox().setNestedButtonStateUpdater(new ToOneRelatedEntityButtonUpdater<Reference>(getView().getCitationCombobox()));
145
        getView().getCitationCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getCitationCombobox(), this));
146

    
147
        CdmFilterablePagingProvider<TaxonName,TaxonName> namePagingProvider = new CdmFilterablePagingProvider<TaxonName, TaxonName>(getRepo().getNameService());
148
        getView().getTypeNameField().loadFrom(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize());
149
        getView().getTypeNameField().setNestedButtonStateUpdater(new ToOneRelatedEntityButtonUpdater<TaxonName>(getView().getTypeNameField()));
150
        getView().getTypeNameField().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getTypeNameField(), this));
151

    
152
        getView().getTypifiedNamesComboboxSelect().setPagingProviders(namePagingProvider, namePagingProvider, namePagingProvider.getPageSize(), this);
153

    
154
    }
155

    
156

    
157
    /**
158
     * {@inheritDoc}
159
     */
160
    @Override
161
    protected void guaranteePerEntityCRUDPermissions(UUID identifier) {
162
        if(crud != null){
163
            newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(NameTypeDesignation.class, identifier, crud, null);
164
        }
165
    }
166

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

    
174
    }
175

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

    
185
    @Override
186
    protected void deleteBean(NameTypeDesignation bean){
187
        // deleteTypedesignation(uuid, uuid) needs to be called so the name is loaded in the transaction of the method and is saved.
188
        DeleteResult deletResult = getRepo().getNameService().deleteTypeDesignation(typifiedNameInContext.getUuid(), bean.getUuid());
189
        if(deletResult.isOk()){
190
            EntityChangeEvent changeEvent = new EntityChangeEvent(bean, Type.REMOVED, (AbstractView) getView());
191
            viewEventBus.publish(this, changeEvent);
192
        } else {
193
            CdmStore.handleDeleteresultInError(deletResult, getRepo().getSession());
194
        }
195
    }
196

    
197

    
198
    /**
199
     * {@inheritDoc}
200
     */
201
    @Override
202
    protected NameTypeDesignation preSaveBean(NameTypeDesignation bean) {
203

    
204
        // the typifiedNames can only be set on the name side, so we need to
205
        // handle changes explicitly here
206
        HashSet<TaxonName> typifiedNames = new HashSet<>(bean.getTypifiedNames());
207

    
208
        // handle adds
209
        for(TaxonName name : typifiedNames){
210
            if(name == null){
211
                throw new NullPointerException("typifiedName must not be null");
212
            }
213
            if(!name.getTypeDesignations().contains(bean)){
214
                name.addTypeDesignation(bean, false);
215
            }
216
        }
217
        // handle removed
218
        for(TaxonName name : typifiedNamesAsLoaded){
219
            if(!typifiedNames.contains(name)){
220
                name.removeTypeDesignation(bean);
221
            }
222
            // FIXME do we need to save the names here or is the delete cascaded from the typedesignation to the name?
223
        }
224

    
225
        // handle annotation changes
226
        List<Annotation> annotations = getView().getAnnotationsField().getValue();
227
        List<Annotation> currentAnnotations = new ArrayList<>(bean.getAnnotations());
228
        List<Annotation> annotationsSeen = new ArrayList<>();
229
        for(Annotation a : annotations){
230
            if(a == null){
231
                continue;
232
            }
233
            if(!currentAnnotations.contains(a)){
234
                bean.addAnnotation(a);
235
            }
236
            annotationsSeen.add(a);
237
        }
238
        for(Annotation a : currentAnnotations){
239
            if(!annotationsSeen.contains(a)){
240
                bean.removeAnnotation(a);
241
            }
242
        }
243

    
244

    
245
        return bean;
246
    }
247

    
248

    
249

    
250
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class)
251
    public void onTaxonNameEditorActionAdd(TaxonNameEditorAction action){
252

    
253
        if(!isFromOwnView(action)){
254
            return;
255
        }
256

    
257
        TaxonNamePopupEditor typeNamePopup = openPopupEditor(TaxonNamePopupEditor.class, action);
258
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
259
        typeNamePopup.withDeleteButton(true);
260
        TaxonNamePopupEditorConfig.configure(typeNamePopup);
261
        typeNamePopup.loadInEditor(null);
262

    
263
    }
264

    
265

    
266
    @EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class)
267
    public void onTaxonNameEditorActionEdit(TaxonNameEditorAction action){
268

    
269
        if(!isFromOwnView(action)){
270
            return;
271
        }
272

    
273
        TaxonNamePopupEditor typeNamePopup = openPopupEditor(TaxonNamePopupEditor.class, action);
274
        typeNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE));
275
        typeNamePopup.withDeleteButton(true);
276
        TaxonNamePopupEditorConfig.configure(typeNamePopup);
277
        typeNamePopup.loadInEditor(action.getEntityUuid());
278

    
279
    }
280

    
281
    @EventBusListenerMethod
282
    public void onEntityChangeEvent(EntityChangeEvent<?>event){
283

    
284
        BoundField boundTargetField = boundTargetField((PopupView) event.getSourceView());
285

    
286
        if(boundTargetField != null){
287
            if(boundTargetField.matchesPropertyIdPath("typeName")){
288
                if(event.isCreateOrModifiedType()){
289
                    getCache().load(event.getEntity());
290
                    if(event.isCreatedType()){
291
                        getView().getTypeNameField().setValue((TaxonName) event.getEntity());
292
                    } else {
293
                        getView().getTypeNameField().reload();
294
                    }
295
                }
296
                if(event.isRemovedType()){
297
                    getView().getTypeNameField().selectNewItem(null);
298
                }
299

    
300
            }
301
        }
302
    }
303

    
304
}
(4-4/13)