Project

General

Profile

Download (12.2 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.apache.logging.log4j.LogManager;
22
import org.apache.logging.log4j.Logger;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.security.core.Authentication;
25
import org.vaadin.spring.events.EventScope;
26
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
27

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

    
36
import eu.etaxonomy.cdm.api.service.dto.RegistrationDTO;
37
import eu.etaxonomy.cdm.api.service.dto.TypeDesignationStatusFilter;
38
import eu.etaxonomy.cdm.api.service.pager.Pager;
39
import eu.etaxonomy.cdm.api.service.registration.IRegistrationWorkingSetService;
40
import eu.etaxonomy.cdm.model.common.Language;
41
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
42
import eu.etaxonomy.cdm.model.permission.User;
43
import eu.etaxonomy.cdm.model.reference.Reference;
44
import eu.etaxonomy.cdm.service.CdmBeanItemContainerFactory;
45
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItem;
46
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent;
47
import eu.etaxonomy.cdm.vaadin.event.PagingEvent;
48
import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEvent;
49
import eu.etaxonomy.cdm.vaadin.event.UpdateResultsEvent;
50
import eu.etaxonomy.vaadin.mvp.AbstractPresenter;
51
import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
52

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

    
63
    private final static Logger logger = LogManager.getLogger();
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
    @Autowired
81
    protected CdmBeanItemContainerFactory cdmBeanItemContainerFactory;
82

    
83
    private Integer pageIndex = 0;
84
    private Integer pageSize = null;
85

    
86
    /**
87
     * @return the workingSetService
88
     */
89
    public IRegistrationWorkingSetService getWorkingSetService() {
90
        return workingSetService;
91
    }
92

    
93

    
94
    @Override
95
    public void handleViewEntered() {
96

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

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

    
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.setIdentifierPattern(alternativeText);
155
        }
156

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

    
164

    
165
        if(filter.getTypeStatus().contains(TypeDesignationStatusFilter.NULL_ELEMENT)){
166
           Set<TypeDesignationStatusFilter> tmpSet = new HashSet<>();
167
           tmpSet.addAll(filter.getTypeStatus());
168
           tmpSet.remove(TypeDesignationStatusFilter.NULL_ELEMENT);
169
           tmpSet.add(null);
170
           filter.setTypeStatus(tmpSet);
171
        }
172

    
173

    
174
        if(getView().getViewMode().equals(ListView.Mode.inProgress)){
175
            filter.setRegistrationStatus(inProgressStatus);
176
        }
177

    
178
        List<UUID> typeDesignationStatus = new ArrayList<>(TypeDesignationStatusFilter.toTypeDesignationStatusUuids(filter.getTypeStatus()));
179

    
180
        Pager<RegistrationDTO> dtoPager = getWorkingSetService().pageDTOs(
181
                filter.getSubmitter() != null ? filter.getSubmitter().getUuid() : null,
182
                filter.getRegistrationStatus() != null ? new ArrayList<>(filter.getRegistrationStatus()): null,
183
                StringUtils.trimToNull(filter.getIdentifierPattern()),
184
                StringUtils.trimToNull(filter.getNamePattern()),
185
                StringUtils.trimToNull(filter.getReferencePattern()),
186
                typeDesignationStatus,
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(RegistrationItem.VALIDATION_PROBLEMS)){
205

    
206
            getView().openDetailsPopup("Validation Problems", 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
    @SuppressWarnings("unchecked")
260
    public RegistrationSearchFilter loadFilterFromView() {
261

    
262

    
263
        RegistrationSearchFilter filter = new RegistrationSearchFilter();
264
        filter.setIdentifierPattern(getView().getIdentifierFilter().getValue());
265
        filter.setNamePattern(getView().getTaxonNameFilter().getValue());
266
        if(getView().getSubmitterFilter() != null){
267
            Object o = getView().getSubmitterFilter().getValue();
268
            if(o != null){
269
                filter.setSubmitter((User)o);
270
            }
271
        } else {
272
            Authentication authentication = currentSecurityContext().getAuthentication();
273
            if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User){
274
                filter.setSubmitter((User) authentication.getPrincipal());
275
            }
276
        }
277
        if(getView().getStatusTypeFilter().getValue() != null) {
278
            filter.setTypeStatus((Set<TypeDesignationStatusFilter>) getView().getStatusTypeFilter().getValue());
279
        }
280
        Object o = getView().getRegistrationStatusFilter().getValue();
281
        if(o != null){
282
            filter.setRegistrationStatus(EnumSet.of((RegistrationStatus)o));
283
        }
284
        return filter;
285
    }
286

    
287

    
288
    private void loadSearchFilterFromSession() {
289
        Object o = UI.getCurrent().getSession().getAttribute(REGISTRATION_LIST_PRESENTER_SEARCH_FILTER);
290
        if(o != null){
291
            RegistrationSearchFilter filter = (RegistrationSearchFilter)o;
292
            getView().getIdentifierFilter().setValue(filter.getIdentifierPattern());
293
            getView().getTaxonNameFilter().setValue(filter.getNamePattern());
294
            if(getView().getSubmitterFilter() != null){
295
                getView().getSubmitterFilter().setValue(filter.getSubmitter());
296
            }
297
            setSelectValue(getView().getStatusTypeFilter(), filter.getTypeStatus());
298
            setSelectValue(getView().getRegistrationStatusFilter(), filter.getRegistrationStatus());
299
        }
300

    
301
    }
302

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

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

    
319
    }
320

    
321
}
(2-2/18)