Project

General

Profile

Download (11.7 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.registration;
10

    
11
import java.util.ArrayList;
12
import java.util.EnumSet;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
import org.apache.commons.lang3.StringUtils;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.security.core.Authentication;
21
import org.vaadin.spring.events.EventScope;
22
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
23

    
24
import com.vaadin.data.util.BeanItemContainer;
25
import com.vaadin.navigator.Navigator;
26
import com.vaadin.spring.annotation.SpringComponent;
27
import com.vaadin.spring.annotation.ViewScope;
28
import com.vaadin.ui.AbstractSelect;
29
import com.vaadin.ui.TextField;
30
import com.vaadin.ui.UI;
31

    
32
import eu.etaxonomy.cdm.api.service.dto.RegistrationDTO;
33
import eu.etaxonomy.cdm.api.service.pager.Pager;
34
import eu.etaxonomy.cdm.api.service.registration.IRegistrationWorkingSetService;
35
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
36
import eu.etaxonomy.cdm.model.common.User;
37
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
38
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
39
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
40
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
41
import eu.etaxonomy.cdm.model.reference.Reference;
42
import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
43
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItem;
44
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
45
import eu.etaxonomy.cdm.vaadin.event.PagingEvent;
46
import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEvent;
47
import eu.etaxonomy.cdm.vaadin.event.UpdateResultsEvent;
48
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationTermLists;
49
import eu.etaxonomy.vaadin.mvp.AbstractPresenter;
50
import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
51

    
52
/**
53
 *
54
 * @author a.kohlbecker
55
 * @since Mar 3, 2017
56
 *
57
 */
58
@SpringComponent
59
@ViewScope
60
public class ListPresenter extends AbstractPresenter<ListView> {
61

    
62
    /**
63
     *
64
     */
65
    private static final String REGISTRATION_LIST_PRESENTER_SEARCH_FILTER = "registration.listPresenter.searchFilter";
66

    
67
    private static final EnumSet<RegistrationStatus> inProgressStatus = EnumSet.of(
68
            RegistrationStatus.PREPARATION,
69
            RegistrationStatus.CURATION,
70
            RegistrationStatus.READY
71
            );
72

    
73
    private static final long serialVersionUID = 5419947244621450665L;
74

    
75
    protected TypeDesignationStatusBase<?> NULL_TYPE_STATUS = NameTypeDesignationStatus.NewInstance("- none -", "- none -", "- none -");
76

    
77
    @Autowired
78
    private IRegistrationWorkingSetService workingSetService;
79

    
80
    private Integer pageIndex = 0;
81
    private Integer pageSize = null;
82

    
83
    /**
84
     * @return the workingSetService
85
     */
86
    public IRegistrationWorkingSetService getWorkingSetService() {
87
        return workingSetService;
88
    }
89

    
90

    
91
    @Override
92
    public void handleViewEntered() {
93

    
94
        List<String> viewParameters = getNavigationManager().getCurrentViewParameters();
95
        if(viewParameters.get(0).equals(ListView.Mode.inProgress.name())){
96
            getView().setViewMode(ListViewBean.Mode.inProgress);
97
            getView().getRegistrationStatusFilter().setVisible(false);
98
        } else {
99
            getView().setViewMode(ListViewBean.Mode.all);
100
        }
101
        if(viewParameters.size() > 1){
102
            // expecting the second param to be the page index
103
            try {
104
                pageIndex = Integer.parseInt(viewParameters.get(1));
105
            } catch (NumberFormatException e) {
106
                // only log and display the page 0
107
                logger.error("Invalid page index parameter " + viewParameters.get(1) + " in " + ((Navigator)getNavigationManager()).getState());
108
            }
109
        }
110

    
111
        CdmBeanItemContainerFactory selectFieldFactory = new CdmBeanItemContainerFactory(getRepo());
112

    
113
        if(getView().getSubmitterFilter() != null){
114
            getView().getSubmitterFilter().setContainerDataSource(selectFieldFactory.buildBeanItemContainer(User.class));
115
            getView().getSubmitterFilter().setItemCaptionPropertyId("username");
116
        }
117

    
118
        List<UUID> typeDesignationStatusUUIDS = new ArrayList<>();
119
        typeDesignationStatusUUIDS.addAll(RegistrationTermLists.NAME_TYPE_DESIGNATION_STATUS_UUIDS());
120
        typeDesignationStatusUUIDS.addAll(RegistrationTermLists.SPECIMEN_TYPE_DESIGNATION_STATUS_UUIDS());
121
        BeanItemContainer<DefinedTermBase> buildTermItemContainer = selectFieldFactory.buildTermItemContainer(typeDesignationStatusUUIDS);
122
        buildTermItemContainer.addItem(NULL_TYPE_STATUS);
123
        getView().getStatusTypeFilter().setContainerDataSource(buildTermItemContainer);
124
        for(DefinedTermBase dt : buildTermItemContainer.getItemIds()){
125
            String caption;
126
            if(dt == NULL_TYPE_STATUS){
127
                caption = "- NONE -";
128
            } else {
129
                caption = (dt instanceof SpecimenTypeDesignationStatus ? "ST" : "NT") + " - " + dt.getLabel();
130
            }
131
            getView().getStatusTypeFilter().setItemCaption(dt, caption);
132
        }
133

    
134
        loadSearchFilterFromSession();
135

    
136
        getView().populate(pageRegistrations(null, null));
137
    }
138

    
139
    /**
140
     * {@inheritDoc}
141
     */
142
    @Override
143
    public void onViewExit() {
144
        preserveSearchFilterInSession();
145
        super.onViewExit();
146
    }
147

    
148
    /**
149
     * FIXME write test !!!!!!!!!!!!!!!!!
150
     *
151
     * @return
152
     */
153
    private Pager<RegistrationDTO> pageRegistrations(TextField textFieldOverride, String alternativeText) {
154

    
155
        // prepare the filters
156
        RegistrationSearchFilter filter = loadFilterFromView();
157
        if(textFieldOverride != null && textFieldOverride == getView().getIdentifierFilter()){
158
            filter.identifierPattern = alternativeText;
159
        }
160

    
161
        if(textFieldOverride != null && textFieldOverride == getView().getTaxonNameFilter()){
162
            filter.namePattern = alternativeText;
163
        }
164

    
165
       if(filter.typeStatus.isEmpty()){
166
           filter.typeStatus = null;
167
        } else {
168
            if(filter.typeStatus.contains(NULL_TYPE_STATUS)){
169
               Set<TypeDesignationStatusBase> tmpSet = new HashSet<>();
170
               tmpSet.addAll(filter.typeStatus);
171
               tmpSet.remove(NULL_TYPE_STATUS);
172
               tmpSet.add(null);
173
               filter.typeStatus = tmpSet;
174
            }
175
        }
176

    
177
        if(getView().getViewMode().equals(ListView.Mode.inProgress)){
178
            filter.registrationStatus = inProgressStatus;
179
        }
180

    
181
        Pager<RegistrationDTO> dtoPager = getWorkingSetService().pageDTOs(
182
                filter.submitter,
183
                filter.registrationStatus,
184
                StringUtils.trimToNull(filter.identifierPattern),
185
                StringUtils.trimToNull(filter.namePattern),
186
                filter.typeStatus ,
187
                pageSize,
188
                pageIndex,
189
                null);
190
        return dtoPager;
191
    }
192

    
193
    @EventBusListenerMethod
194
    public void onShowDetailsEvent(ShowDetailsEvent<RegistrationDTO, UUID> event) {
195

    
196
        // FIXME check from own view!!!
197
        if(getView() == null){
198
            return;
199
        }
200

    
201
        UUID registrationUuid = event.getIdentifier();
202

    
203
        RegistrationDTO regDto = getWorkingSetService().loadDtoByUuid(registrationUuid);
204
        if(event.getProperty().equals("messages")){
205

    
206
            getView().openDetailsPopup("Messages", regDto.getValidationProblems());
207

    
208
        } else if(event.getProperty().equals("blockedBy")){
209

    
210
            Set<RegistrationDTO> blockingRegs = getWorkingSetService().loadBlockingRegistrations(registrationUuid);
211
            RegistrationItem regItem = getView().getRegistrationItem(registrationUuid);
212
            regItem.showBlockingRegistrations(blockingRegs);
213
        }
214

    
215
    }
216

    
217
    @EventBusListenerMethod
218
    public void onEntityChangeEvent(EntityChangeEvent event){
219
        if(event.getEntityType().isAssignableFrom(Reference.class)){
220
            // TODO update component showing the according reference, is there a Vaadin event supporting this?
221
        }
222
    }
223

    
224
    @EventBusListenerMethod
225
    public void onUpdateResultsEvent(UpdateResultsEvent event){
226
        getView().populate(pageRegistrations(event.getField(), event.getNewText()));
227
    }
228

    
229
    @EventBusListenerMethod
230
    public void onPagingEvent(PagingEvent event){
231

    
232
        if(!event.getSourceView().equals(getView())){
233
            return;
234
        }
235
        String viewName = getNavigationManager().getCurrentViewName();
236
        List<String> viewNameParams = new ArrayList(getNavigationManager().getCurrentViewParameters());
237
        if(viewNameParams.size() > 1){
238
            viewNameParams.set(1, event.getPageIndex().toString());
239
        } else {
240
            viewNameParams.add(event.getPageIndex().toString());
241
        }
242
        viewEventBus.publish(EventScope.UI, this, new NavigationEvent(viewName, viewNameParams.toArray(new String[viewNameParams.size()])));
243
    }
244

    
245

    
246
    /**
247
     *
248
     */
249
    private void preserveSearchFilterInSession() {
250

    
251
        RegistrationSearchFilter filter = loadFilterFromView();
252
        UI.getCurrent().getSession().setAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER, filter);
253
    }
254

    
255

    
256
    /**
257
     *
258
     */
259
    public RegistrationSearchFilter loadFilterFromView() {
260

    
261

    
262
        RegistrationSearchFilter filter = new RegistrationSearchFilter();
263
        filter.identifierPattern = getView().getIdentifierFilter().getValue();
264
        filter.namePattern = getView().getTaxonNameFilter().getValue();
265
        if(getView().getSubmitterFilter() != null){
266
            Object o = getView().getSubmitterFilter().getValue();
267
            if(o != null){
268
                filter.submitter = (User)o;
269
            }
270
        } else {
271
            Authentication authentication = currentSecurityContext().getAuthentication();
272
            if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User){
273
                filter.submitter = (User) authentication.getPrincipal();
274
            }
275
        }
276
        filter.typeStatus = (Set<TypeDesignationStatusBase>) getView().getStatusTypeFilter().getValue();
277
        EnumSet<RegistrationStatus> registrationStatusFilter = null;
278
        Object o = getView().getRegistrationStatusFilter().getValue();
279
        if(o != null){
280
            filter.registrationStatus = EnumSet.of((RegistrationStatus)o);
281
        }
282
        return filter;
283
    }
284

    
285

    
286
    /**
287
     *
288
     */
289
    private void loadSearchFilterFromSession() {
290
        Object o = UI.getCurrent().getSession().getAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER);
291
        if(o != null){
292
            RegistrationSearchFilter filter = (RegistrationSearchFilter)o;
293
            getView().getIdentifierFilter().setValue(filter.identifierPattern);
294
            getView().getTaxonNameFilter().setValue(filter.namePattern);
295
            if(getView().getSubmitterFilter() != null){
296
                getView().getSubmitterFilter().setValue(filter.submitter);
297
            }
298
            setSelectValue(getView().getStatusTypeFilter(), filter.typeStatus);
299
            setSelectValue(getView().getRegistrationStatusFilter(), filter.registrationStatus);
300
        }
301

    
302
    }
303

    
304
    /**
305
     * @param statusTypeFilter
306
     * @param typeStatus
307
     */
308
    private void setSelectValue(AbstractSelect select, Set<?> itemsToChoose) {
309

    
310
        if(itemsToChoose != null){
311
            for(Object item : select.getContainerDataSource().getItemIds()){
312
                if(item != null){
313
                    if(itemsToChoose.contains(item)){
314
                        select.select(item);
315
                    }
316
                }
317
            }
318
        }
319

    
320
    }
321

    
322
}
(2-2/21)