Project

General

Profile

Download (12.5 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.Arrays;
13
import java.util.Collection;
14
import java.util.EnumSet;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Set;
18
import java.util.UUID;
19

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

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

    
34
import eu.etaxonomy.cdm.api.service.dto.RegistrationDTO;
35
import eu.etaxonomy.cdm.api.service.dto.TypeDesignationStatusFilter;
36
import eu.etaxonomy.cdm.api.service.pager.Pager;
37
import eu.etaxonomy.cdm.api.service.registration.IRegistrationWorkingSetService;
38
import eu.etaxonomy.cdm.model.common.Language;
39
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
40
import eu.etaxonomy.cdm.model.permission.User;
41
import eu.etaxonomy.cdm.model.reference.Reference;
42
import eu.etaxonomy.cdm.service.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
    private static final String REGISTRATION_LIST_PRESENTER_SEARCH_FILTER = "registration.listPresenter.searchFilter";
63

    
64
    private static final EnumSet<RegistrationStatus> inProgressStatus = EnumSet.of(
65
            RegistrationStatus.PREPARATION,
66
            RegistrationStatus.CURATION,
67
            RegistrationStatus.READY
68
            );
69

    
70
    private static final long serialVersionUID = 5419947244621450665L;
71

    
72
//    protected TypeDesignationStatusBase<?> NULL_TYPE_STATUS = NameTypeDesignationStatus.NewInstance("- none -", "- none -", "- none -");
73

    
74
    @Autowired
75
    private IRegistrationWorkingSetService workingSetService;
76

    
77
    @Autowired
78
    protected CdmBeanItemContainerFactory cdmBeanItemContainerFactory;
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
        if(getView().getSubmitterFilter() != null){
112
            getView().getSubmitterFilter().setContainerDataSource(cdmBeanItemContainerFactory.buildBeanItemContainer(User.class));
113
            getView().getSubmitterFilter().setItemCaptionPropertyId("username");
114
        }
115

    
116
        List<UUID> typeDesignationStatusUUIDS = new ArrayList<>();
117
        typeDesignationStatusUUIDS.addAll(RegistrationTermLists.NAME_TYPE_DESIGNATION_STATUS_UUIDS());
118
        typeDesignationStatusUUIDS.addAll(RegistrationTermLists.SPECIMEN_TYPE_DESIGNATION_STATUS_UUIDS());
119
        BeanItemContainer<TypeDesignationStatusFilter> buildTermItemContainer = new BeanItemContainer<>(TypeDesignationStatusFilter.class);
120
        // TODO use UI.getCurrent().getPage().getWebBrowser().getLocale() or the LocaleContext component to get the preferredLanguage?
121
        Collection<TypeDesignationStatusFilter> statusFilterTerms = new ArrayList<>(getRepo().getNameService().getTypeDesignationStatusFilterTerms(Arrays.asList(Language.DEFAULT())));
122
        statusFilterTerms.add(TypeDesignationStatusFilter.NULL_ELEMENT);
123
        buildTermItemContainer.addAll(statusFilterTerms);
124
        getView().getStatusTypeFilter().setContainerDataSource(buildTermItemContainer);
125
        for(TypeDesignationStatusFilter dt : buildTermItemContainer.getItemIds()){
126
            getView().getStatusTypeFilter().setItemCaption(dt, dt.toString());
127
        }
128
        buildTermItemContainer.sort(new String[]{"label"}, new boolean[]{true});
129

    
130
        loadSearchFilterFromSession();
131

    
132
        getView().populate(pageRegistrations(null, null));
133
    }
134

    
135
    /**
136
     * {@inheritDoc}
137
     */
138
    @Override
139
    public void onViewExit() {
140
        preserveSearchFilterInSession();
141
        super.onViewExit();
142
    }
143

    
144
    /**
145
     * FIXME write test !!!!!!!!!!!!!!!!!
146
     *
147
     * @return
148
     */
149
    private Pager<RegistrationDTO> pageRegistrations(TextField textFieldOverride, String alternativeText) {
150

    
151
        // prepare the filters
152
        RegistrationSearchFilter filter = loadFilterFromView();
153
        if(textFieldOverride != null && textFieldOverride == getView().getIdentifierFilter()){
154
            filter.identifierPattern = alternativeText;
155
        }
156

    
157
        if(textFieldOverride != null && textFieldOverride == getView().getTaxonNameFilter()){
158
            filter.namePattern = alternativeText;
159
        }
160
        if(textFieldOverride != null && textFieldOverride == getView().getReferenceFilter()){
161
            filter.referencePattern = alternativeText;
162
        }
163

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

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

    
180
        List<UUID> typeDesignationStatus = null;
181
        if(filter.typeStatus != null){
182
            typeDesignationStatus = new ArrayList<>(TypeDesignationStatusFilter.toTypeDesignationStatusUuids(filter.typeStatus));
183
        }
184

    
185
        Pager<RegistrationDTO> dtoPager = getWorkingSetService().pageDTOs(
186
                filter.submitter != null ? filter.submitter.getUuid() : null,
187
                filter.registrationStatus != null ? new ArrayList<>(filter.registrationStatus): null,
188
                StringUtils.trimToNull(filter.identifierPattern),
189
                StringUtils.trimToNull(filter.namePattern),
190
                StringUtils.trimToNull(filter.referencePattern),
191
                typeDesignationStatus,
192
                pageSize,
193
                pageIndex,
194
                null);
195
        return dtoPager;
196
    }
197

    
198
    @EventBusListenerMethod
199
    public void onShowDetailsEvent(ShowDetailsEvent<RegistrationDTO, UUID> event) {
200

    
201
        // FIXME check from own view!!!
202
        if(getView() == null){
203
            return;
204
        }
205

    
206
        UUID registrationUuid = event.getIdentifier();
207

    
208
        RegistrationDTO regDto = getWorkingSetService().loadDtoByUuid(registrationUuid);
209
        if(event.getProperty().equals(RegistrationItem.VALIDATION_PROBLEMS)){
210

    
211
            getView().openDetailsPopup("Validation Problems", regDto.getValidationProblems());
212

    
213
        } else if(event.getProperty().equals("blockedBy")){
214

    
215
            Set<RegistrationDTO> blockingRegs = getWorkingSetService().loadBlockingRegistrations(registrationUuid);
216
            RegistrationItem regItem = getView().getRegistrationItem(registrationUuid);
217
            regItem.showBlockingRegistrations(blockingRegs);
218
        }
219

    
220
    }
221

    
222
    @EventBusListenerMethod
223
    public void onEntityChangeEvent(EntityChangeEvent event){
224
        if(event.getEntityType().isAssignableFrom(Reference.class)){
225
            // TODO update component showing the according reference, is there a Vaadin event supporting this?
226
        }
227
    }
228

    
229
    @EventBusListenerMethod
230
    public void onUpdateResultsEvent(UpdateResultsEvent event){
231
        getView().populate(pageRegistrations(event.getField(), event.getNewText()));
232
    }
233

    
234
    @EventBusListenerMethod
235
    public void onPagingEvent(PagingEvent event){
236

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

    
250

    
251
    /**
252
     *
253
     */
254
    private void preserveSearchFilterInSession() {
255

    
256
        RegistrationSearchFilter filter = loadFilterFromView();
257
        UI.getCurrent().getSession().setAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER, filter);
258
    }
259

    
260

    
261
    /**
262
     *
263
     */
264
    public RegistrationSearchFilter loadFilterFromView() {
265

    
266

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

    
290

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

    
307
    }
308

    
309
    /**
310
     * @param statusTypeFilter
311
     * @param typeStatus
312
     */
313
    private void setSelectValue(AbstractSelect select, Set<?> itemsToChoose) {
314

    
315
        if(itemsToChoose != null){
316
            for(Object item : select.getContainerDataSource().getItemIds()){
317
                if(item != null){
318
                    if(itemsToChoose.contains(item)){
319
                        select.select(item);
320
                    }
321
                }
322
            }
323
        }
324

    
325
    }
326

    
327
}
(2-2/18)