Project

General

Profile

Download (11.6 KB) Statistics
| Branch: | Tag: | Revision:
1 ec462234 Andreas Kohlbecker
/**
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 29078af6 Andreas Kohlbecker
package eu.etaxonomy.cdm.vaadin.view.registration;
10 ec462234 Andreas Kohlbecker
11 1a4c1ca7 Andreas Kohlbecker
import java.util.ArrayList;
12 86b2da34 Andreas Kohlbecker
import java.util.EnumSet;
13 dcd8a4c1 Andreas Kohlbecker
import java.util.HashSet;
14 1a4c1ca7 Andreas Kohlbecker
import java.util.List;
15 699de23b Andreas Kohlbecker
import java.util.Set;
16 0844524a Andreas Kohlbecker
import java.util.UUID;
17 ec462234 Andreas Kohlbecker
18 65c80174 Andreas Kohlbecker
import org.apache.commons.lang3.StringUtils;
19 b0fdf0ab Andreas Kohlbecker
import org.springframework.beans.factory.annotation.Autowired;
20 86b2da34 Andreas Kohlbecker
import org.springframework.security.core.Authentication;
21 1a4c1ca7 Andreas Kohlbecker
import org.vaadin.spring.events.EventScope;
22 be4a9789 Andreas Kohlbecker
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
23 ec462234 Andreas Kohlbecker
24 56432bdd Andreas Kohlbecker
import com.vaadin.data.util.BeanItemContainer;
25 1a4c1ca7 Andreas Kohlbecker
import com.vaadin.navigator.Navigator;
26 ec462234 Andreas Kohlbecker
import com.vaadin.spring.annotation.SpringComponent;
27
import com.vaadin.spring.annotation.ViewScope;
28 1e6c448a Andreas Kohlbecker
import com.vaadin.ui.AbstractSelect;
29 8d14e2c1 Andreas Kohlbecker
import com.vaadin.ui.TextField;
30 1e6c448a Andreas Kohlbecker
import com.vaadin.ui.UI;
31 ec462234 Andreas Kohlbecker
32 6d6d19d1 Andreas Kohlbecker
import eu.etaxonomy.cdm.api.service.dto.RegistrationDTO;
33 65c80174 Andreas Kohlbecker
import eu.etaxonomy.cdm.api.service.pager.Pager;
34 56432bdd Andreas Kohlbecker
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
35 86b2da34 Andreas Kohlbecker
import eu.etaxonomy.cdm.model.common.User;
36 dcd8a4c1 Andreas Kohlbecker
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
37 86b2da34 Andreas Kohlbecker
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
38 56432bdd Andreas Kohlbecker
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
39
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
40 9d5ae601 Andreas Kohlbecker
import eu.etaxonomy.cdm.model.reference.Reference;
41 c5b3791f Andreas Kohlbecker
import eu.etaxonomy.cdm.service.IRegistrationWorkingSetService;
42 65c80174 Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
43 699de23b Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItem;
44 9d5ae601 Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
45 1a4c1ca7 Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.event.PagingEvent;
46 2d981b4e Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEvent;
47 65c80174 Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.event.UpdateResultsEvent;
48 56432bdd Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationTermLists;
49 ec462234 Andreas Kohlbecker
import eu.etaxonomy.vaadin.mvp.AbstractPresenter;
50 1a4c1ca7 Andreas Kohlbecker
import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
51 ec462234 Andreas Kohlbecker
52
/**
53 86b2da34 Andreas Kohlbecker
 *
54 ec462234 Andreas Kohlbecker
 * @author a.kohlbecker
55
 * @since Mar 3, 2017
56
 *
57
 */
58
@SpringComponent
59
@ViewScope
60
public class ListPresenter extends AbstractPresenter<ListView> {
61
62 1e6c448a Andreas Kohlbecker
    /**
63
     *
64
     */
65
    private static final String REGISTRATION_LIST_PRESENTER_SEARCH_FILTER = "registration.listPresenter.searchFilter";
66
67 86b2da34 Andreas Kohlbecker
    private static final EnumSet<RegistrationStatus> inProgressStatus = EnumSet.of(
68
            RegistrationStatus.PREPARATION,
69
            RegistrationStatus.CURATION,
70
            RegistrationStatus.READY
71
            );
72
73 74f4344f Andreas Kohlbecker
    private static final long serialVersionUID = 5419947244621450665L;
74
75 dcd8a4c1 Andreas Kohlbecker
    protected TypeDesignationStatusBase<?> NULL_TYPE_STATUS = NameTypeDesignationStatus.NewInstance("- none -", "- none -", "- none -");
76
77 b0fdf0ab Andreas Kohlbecker
    @Autowired
78 c4f5e696 Andreas Kohlbecker
    private IRegistrationWorkingSetService workingSetService;
79 b0fdf0ab Andreas Kohlbecker
80 1a4c1ca7 Andreas Kohlbecker
    private Integer pageIndex = 0;
81
    private Integer pageSize = null;
82
83 fe785c1e Andreas Kohlbecker
    /**
84
     * @return the workingSetService
85
     */
86
    public IRegistrationWorkingSetService getWorkingSetService() {
87
        return workingSetService;
88
    }
89
90 be4a9789 Andreas Kohlbecker
91 ec462234 Andreas Kohlbecker
    @Override
92 5ba148ae Andreas Kohlbecker
    public void handleViewEntered() {
93 65c80174 Andreas Kohlbecker
94 1a4c1ca7 Andreas Kohlbecker
        List<String> viewParameters = getNavigationManager().getCurrentViewParameters();
95
        if(viewParameters.get(0).equals(ListView.Mode.inProgress.name())){
96 65c80174 Andreas Kohlbecker
            getView().setViewMode(ListViewBean.Mode.inProgress);
97 1e6c448a Andreas Kohlbecker
            getView().getRegistrationStatusFilter().setVisible(false);
98 65c80174 Andreas Kohlbecker
        } else {
99
            getView().setViewMode(ListViewBean.Mode.all);
100
        }
101 1a4c1ca7 Andreas Kohlbecker
        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 65c80174 Andreas Kohlbecker
111
        CdmBeanItemContainerFactory selectFieldFactory = new CdmBeanItemContainerFactory(getRepo());
112
113 11d45846 Andreas Kohlbecker
        if(getView().getSubmitterFilter() != null){
114
            getView().getSubmitterFilter().setContainerDataSource(selectFieldFactory.buildBeanItemContainer(User.class));
115
            getView().getSubmitterFilter().setItemCaptionPropertyId("username");
116
        }
117 65c80174 Andreas Kohlbecker
118 56432bdd Andreas Kohlbecker
        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 dcd8a4c1 Andreas Kohlbecker
        buildTermItemContainer.addItem(NULL_TYPE_STATUS);
123 56432bdd Andreas Kohlbecker
        getView().getStatusTypeFilter().setContainerDataSource(buildTermItemContainer);
124
        for(DefinedTermBase dt : buildTermItemContainer.getItemIds()){
125 dcd8a4c1 Andreas Kohlbecker
            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 56432bdd Andreas Kohlbecker
        }
133
134 1e6c448a Andreas Kohlbecker
        loadSearchFilterFromSession();
135
136 8d14e2c1 Andreas Kohlbecker
        getView().populate(pageRegistrations(null, null));
137 ec462234 Andreas Kohlbecker
    }
138
139 1e6c448a Andreas Kohlbecker
    /**
140
     * {@inheritDoc}
141
     */
142
    @Override
143
    public void onViewExit() {
144
        preserveSearchFilterInSession();
145
        super.onViewExit();
146
    }
147
148 ec462234 Andreas Kohlbecker
    /**
149 86b2da34 Andreas Kohlbecker
     * FIXME write test !!!!!!!!!!!!!!!!!
150
     *
151 ec462234 Andreas Kohlbecker
     * @return
152
     */
153 8d14e2c1 Andreas Kohlbecker
    private Pager<RegistrationDTO> pageRegistrations(TextField textFieldOverride, String alternativeText) {
154 86b2da34 Andreas Kohlbecker
155
        // list all if the authenticated user is having the role CURATION of if it is an admin
156
        Authentication authentication = currentSecurityContext().getAuthentication();
157 65c80174 Andreas Kohlbecker
158
        // prepare the filters
159 1e6c448a Andreas Kohlbecker
        SearchFilter filter = loadFilterFromView();
160 8d14e2c1 Andreas Kohlbecker
        if(textFieldOverride != null && textFieldOverride == getView().getIdentifierFilter()){
161 1e6c448a Andreas Kohlbecker
            filter.identifierPattern = alternativeText;
162 8d14e2c1 Andreas Kohlbecker
        }
163 56432bdd Andreas Kohlbecker
164 8d14e2c1 Andreas Kohlbecker
        if(textFieldOverride != null && textFieldOverride == getView().getTaxonNameFilter()){
165 1e6c448a Andreas Kohlbecker
            filter.namePattern = alternativeText;
166 86b2da34 Andreas Kohlbecker
        }
167 56432bdd Andreas Kohlbecker
168 1e6c448a Andreas Kohlbecker
       if(filter.typeStatus.isEmpty()){
169
           filter.typeStatus = null;
170 dcd8a4c1 Andreas Kohlbecker
        } else {
171 1e6c448a Andreas Kohlbecker
            if(filter.typeStatus.contains(NULL_TYPE_STATUS)){
172 dcd8a4c1 Andreas Kohlbecker
               Set<TypeDesignationStatusBase> tmpSet = new HashSet<>();
173 1e6c448a Andreas Kohlbecker
               tmpSet.addAll(filter.typeStatus);
174 dcd8a4c1 Andreas Kohlbecker
               tmpSet.remove(NULL_TYPE_STATUS);
175
               tmpSet.add(null);
176 1e6c448a Andreas Kohlbecker
               filter.typeStatus = tmpSet;
177 dcd8a4c1 Andreas Kohlbecker
            }
178 56432bdd Andreas Kohlbecker
        }
179
180 1e6c448a Andreas Kohlbecker
181
        if(getView().getViewMode().equals(ListView.Mode.inProgress)){
182
            filter.registrationStatus = inProgressStatus;
183 86b2da34 Andreas Kohlbecker
        }
184
185 65c80174 Andreas Kohlbecker
        Pager<RegistrationDTO> dtoPager = getWorkingSetService().pageDTOs(
186 1e6c448a Andreas Kohlbecker
                filter.submitter,
187
                filter.registrationStatus,
188
                StringUtils.trimToNull(filter.identifierPattern),
189
                StringUtils.trimToNull(filter.namePattern),
190
                filter.typeStatus ,
191 1a4c1ca7 Andreas Kohlbecker
                pageSize,
192
                pageIndex);
193 65c80174 Andreas Kohlbecker
        return dtoPager;
194 ec462234 Andreas Kohlbecker
    }
195
196 be4a9789 Andreas Kohlbecker
    @EventBusListenerMethod
197 0844524a Andreas Kohlbecker
    public void onShowDetailsEvent(ShowDetailsEvent<RegistrationDTO, UUID> event) {
198 699de23b Andreas Kohlbecker
199
        // FIXME check from own view!!!
200
        if(getView() == null){
201
            return;
202 2d981b4e Andreas Kohlbecker
        }
203 699de23b Andreas Kohlbecker
204 0844524a Andreas Kohlbecker
        UUID registrationUuid = event.getIdentifier();
205 699de23b Andreas Kohlbecker
206 0844524a Andreas Kohlbecker
        RegistrationDTO regDto = getWorkingSetService().loadDtoByUuid(registrationUuid);
207 699de23b Andreas Kohlbecker
        if(event.getProperty().equals("messages")){
208
209 16c4d668 Andreas Kohlbecker
            getView().openDetailsPopup("Messages", regDto.getValidationProblems());
210 699de23b Andreas Kohlbecker
211
        } else if(event.getProperty().equals("blockedBy")){
212
213 0844524a Andreas Kohlbecker
            Set<RegistrationDTO> blockingRegs = getWorkingSetService().loadBlockingRegistrations(registrationUuid);
214
            RegistrationItem regItem = getView().getRegistrationItem(registrationUuid);
215 699de23b Andreas Kohlbecker
            regItem.showBlockingRegistrations(blockingRegs);
216
        }
217
218 2d981b4e Andreas Kohlbecker
    }
219
220 be4a9789 Andreas Kohlbecker
    @EventBusListenerMethod
221 9d5ae601 Andreas Kohlbecker
    public void onEntityChangeEvent(EntityChangeEvent event){
222
        if(event.getEntityType().isAssignableFrom(Reference.class)){
223
            // TODO update component showing the according reference, is there a Vaadin event supporting this?
224
        }
225 65c80174 Andreas Kohlbecker
    }
226 9d5ae601 Andreas Kohlbecker
227 be4a9789 Andreas Kohlbecker
    @EventBusListenerMethod
228 65c80174 Andreas Kohlbecker
    public void onUpdateResultsEvent(UpdateResultsEvent event){
229 8d14e2c1 Andreas Kohlbecker
        getView().populate(pageRegistrations(event.getField(), event.getNewText()));
230 9d5ae601 Andreas Kohlbecker
    }
231
232 1a4c1ca7 Andreas Kohlbecker
    @EventBusListenerMethod
233
    public void onPagingEvent(PagingEvent event){
234
235
        if(!event.getSourceView().equals(getView())){
236
            return;
237
        }
238
        String viewName = getNavigationManager().getCurrentViewName();
239
        List<String> viewNameParams = new ArrayList(getNavigationManager().getCurrentViewParameters());
240
        if(viewNameParams.size() > 1){
241
            viewNameParams.set(1, event.getPageIndex().toString());
242
        } else {
243
            viewNameParams.add(event.getPageIndex().toString());
244
        }
245
        viewEventBus.publish(EventScope.UI, this, new NavigationEvent(viewName, viewNameParams.toArray(new String[viewNameParams.size()])));
246
    }
247
248 1e6c448a Andreas Kohlbecker
249
    /**
250
     *
251
     */
252
    private void preserveSearchFilterInSession() {
253
254
        SearchFilter filter = loadFilterFromView();
255
        UI.getCurrent().getSession().setAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER, filter);
256
    }
257
258
259
    /**
260
     *
261
     */
262
    public SearchFilter loadFilterFromView() {
263
        SearchFilter filter = new SearchFilter();
264
        filter.identifierPattern = getView().getIdentifierFilter().getValue();
265
        filter.namePattern = getView().getTaxonNameFilter().getValue();
266
        if(getView().getSubmitterFilter() != null){
267
            Object o = getView().getSubmitterFilter().getValue();
268
            if(o != null){
269
                filter.submitter = (User)o;
270
            }
271
        }
272
        filter.typeStatus = (Set<TypeDesignationStatusBase>) getView().getStatusTypeFilter().getValue();
273
        EnumSet<RegistrationStatus> registrationStatusFilter = null;
274
        Object o = getView().getRegistrationStatusFilter().getValue();
275
        if(o != null){
276
            filter.registrationStatus = EnumSet.of((RegistrationStatus)o);
277
        }
278
        return filter;
279
    }
280
281
282
    /**
283
     *
284
     */
285
    private void loadSearchFilterFromSession() {
286
        Object o = UI.getCurrent().getSession().getAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER);
287
        if(o != null){
288
            SearchFilter filter = (SearchFilter)o;
289
            getView().getIdentifierFilter().setValue(filter.identifierPattern);
290
            getView().getTaxonNameFilter().setValue(filter.namePattern);
291
            if(getView().getSubmitterFilter() != null){
292
                getView().getSubmitterFilter().setValue(filter.submitter);
293
            }
294
            setSelectValue(getView().getStatusTypeFilter(), filter.typeStatus);
295
            setSelectValue(getView().getRegistrationStatusFilter(), filter.registrationStatus);
296
        }
297
298
    }
299
300
    /**
301
     * @param statusTypeFilter
302
     * @param typeStatus
303
     */
304
    private void setSelectValue(AbstractSelect select, Set<?> itemsToChoose) {
305
306
        for(Object item : select.getContainerDataSource().getItemIds()){
307
            if(item != null){
308
                if(itemsToChoose.contains(item)){
309
                    select.select(item);
310
                }
311
            }
312
        }
313
314
    }
315
316
    class SearchFilter {
317
        String identifierPattern;
318
        String namePattern;
319
        User submitter;
320
        Set<TypeDesignationStatusBase> typeStatus;
321
        Set<RegistrationStatus> registrationStatus;
322
    }
323
324 ec462234 Andreas Kohlbecker
}