Project

General

Profile

Download (12.1 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.vaadin.mvp.AbstractPresenter;
49
import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
50

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

    
61
    private static final String REGISTRATION_LIST_PRESENTER_SEARCH_FILTER = "registration.listPresenter.searchFilter";
62

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

    
69
    private static final long serialVersionUID = 5419947244621450665L;
70

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

    
73
    @Autowired
74
    private IRegistrationWorkingSetService workingSetService;
75

    
76
    @Autowired
77
    protected CdmBeanItemContainerFactory cdmBeanItemContainerFactory;
78

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

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

    
89

    
90
    @Override
91
    public void handleViewEntered() {
92

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

    
110
        if(getView().getSubmitterFilter() != null){
111
            getView().getSubmitterFilter().setContainerDataSource(cdmBeanItemContainerFactory.buildBeanItemContainer(User.class));
112
            getView().getSubmitterFilter().setItemCaptionPropertyId("username");
113
        }
114

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

    
126
        loadSearchFilterFromSession();
127

    
128
        getView().populate(pageRegistrations(null, null));
129
    }
130

    
131
    /**
132
     * {@inheritDoc}
133
     */
134
    @Override
135
    public void onViewExit() {
136
        preserveSearchFilterInSession();
137
        super.onViewExit();
138
    }
139

    
140
    /**
141
     * FIXME write test !!!!!!!!!!!!!!!!!
142
     *
143
     * @return
144
     */
145
    private Pager<RegistrationDTO> pageRegistrations(TextField textFieldOverride, String alternativeText) {
146

    
147
        // prepare the filters
148
        RegistrationSearchFilter filter = loadFilterFromView();
149
        if(textFieldOverride != null && textFieldOverride == getView().getIdentifierFilter()){
150
            filter.identifierPattern = alternativeText;
151
        }
152

    
153
        if(textFieldOverride != null && textFieldOverride == getView().getTaxonNameFilter()){
154
            filter.namePattern = alternativeText;
155
        }
156
        if(textFieldOverride != null && textFieldOverride == getView().getReferenceFilter()){
157
            filter.referencePattern = alternativeText;
158
        }
159

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

    
172
        if(getView().getViewMode().equals(ListView.Mode.inProgress)){
173
            filter.registrationStatus = inProgressStatus;
174
        }
175

    
176
        List<UUID> typeDesignationStatus = null;
177
        if(filter.typeStatus != null){
178
            typeDesignationStatus = new ArrayList<>(TypeDesignationStatusFilter.toTypeDesignationStatusUuids(filter.typeStatus));
179
        }
180

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

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

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

    
202
        UUID registrationUuid = event.getIdentifier();
203

    
204
        RegistrationDTO regDto = getWorkingSetService().loadDtoByUuid(registrationUuid);
205
        if(event.getProperty().equals(RegistrationItem.VALIDATION_PROBLEMS)){
206

    
207
            getView().openDetailsPopup("Validation Problems", regDto.getValidationProblems());
208

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

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

    
216
    }
217

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

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

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

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

    
246

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

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

    
256

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

    
262

    
263
        RegistrationSearchFilter filter = new RegistrationSearchFilter();
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
        } else {
272
            Authentication authentication = currentSecurityContext().getAuthentication();
273
            if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User){
274
                filter.submitter = (User) authentication.getPrincipal();
275
            }
276
        }
277
        filter.typeStatus = (Set<TypeDesignationStatusFilter>) getView().getStatusTypeFilter().getValue();
278
        EnumSet<RegistrationStatus> registrationStatusFilter = null;
279
        Object o = getView().getRegistrationStatusFilter().getValue();
280
        if(o != null){
281
            filter.registrationStatus = EnumSet.of((RegistrationStatus)o);
282
        }
283
        return filter;
284
    }
285

    
286

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

    
303
    }
304

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

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

    
321
    }
322

    
323
}
(2-2/18)