Project

General

Profile

Download (6.92 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.service;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16

    
17
import org.apache.log4j.Logger;
18
import org.hibernate.criterion.Criterion;
19
import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider;
20
import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider;
21

    
22
import com.vaadin.data.Property.ValueChangeListener;
23
import com.vaadin.ui.AbstractField;
24
import com.vaadin.ui.Field;
25

    
26
import eu.etaxonomy.cdm.api.service.INameService;
27
import eu.etaxonomy.cdm.api.service.pager.Pager;
28
import eu.etaxonomy.cdm.api.utility.TaxonNamePartsFilter;
29
import eu.etaxonomy.cdm.model.name.Rank;
30
import eu.etaxonomy.cdm.persistence.dto.TaxonNameParts;
31
import eu.etaxonomy.cdm.persistence.query.MatchMode;
32
import eu.etaxonomy.cdm.persistence.query.OrderHint;
33

    
34
/**
35
 * @author a.kohlbecker
36
 * @since Jun 7, 2017
37
 *
38
 */
39
public class TaxonNameStringFilterablePagingProvider implements FilterablePagingProvider<String>, FilterableCountProvider {
40

    
41
    private static final List<String> DEFAULT_INIT_STRATEGY = Arrays.asList("$");
42

    
43
    private static final Logger logger = Logger.getLogger(TaxonNameStringFilterablePagingProvider.class);
44

    
45
    private int pageSize = 20;
46

    
47
    private INameService service;
48

    
49
    private MatchMode matchMode = MatchMode.BEGINNING;
50

    
51
    private List<OrderHint> orderHints = OrderHint.ORDER_BY_TITLE_CACHE.asList();
52

    
53
    List<String> initStrategy = DEFAULT_INIT_STRATEGY;
54

    
55
    private List<Criterion> criteria = new ArrayList<>();
56

    
57
    private TaxonNamePartsFilter namePartsFilter = new TaxonNamePartsFilter();
58

    
59
    private Map<AbstractField<String>, ValueChangeListener> registeredToFields = new HashMap<>();
60

    
61

    
62
    public TaxonNameStringFilterablePagingProvider(INameService service) {
63
        this(service, Rank.GENUS(), null);
64
    }
65

    
66
    public TaxonNameStringFilterablePagingProvider(INameService service, Rank rank) {
67
        this(service, rank, null);
68
    }
69

    
70
    public TaxonNameStringFilterablePagingProvider(INameService service, Rank rank, MatchMode matchMode) {
71
        super();
72
        this.service = service;
73
        if(matchMode != null){
74
            this.matchMode = matchMode;
75
        }
76
        namePartsFilter.setRank(rank);
77
    }
78

    
79
    public void listenToFields(AbstractField<String> genusOrUninomialField, AbstractField<String> infraGenericEpithetField,
80
            AbstractField<String> specificEpithetField, AbstractField<String> infraSpecificEpithetField){
81

    
82
        unlistenAllFields();
83

    
84
        registerNullSave(genusOrUninomialField, e -> namePartsFilter.setGenusOrUninomial(genusOrUninomialField.getValue()));
85
        registerNullSave(infraGenericEpithetField, e -> namePartsFilter.setGenusOrUninomial(infraGenericEpithetField.getValue()));
86
        registerNullSave(specificEpithetField, e -> namePartsFilter.setGenusOrUninomial(specificEpithetField.getValue()));
87
        registerNullSave(infraSpecificEpithetField, e -> namePartsFilter.setGenusOrUninomial(infraSpecificEpithetField.getValue()));
88
    }
89

    
90
    /**
91
     *
92
     */
93
    public void unlistenAllFields() {
94
        for(AbstractField<String> f : registeredToFields.keySet()){
95
            f.removeValueChangeListener(registeredToFields.get(f));
96
        }
97
        registeredToFields.clear();
98
    }
99

    
100
    public void replaceFields(AbstractField<String> unlistenField, AbstractField<String> listenToField) throws UnknownFieldException{
101
        if(registeredToFields.containsKey(unlistenField)){
102
            ValueChangeListener listener = registeredToFields.get(unlistenField);
103
            unlistenField.removeValueChangeListener(listener);
104
            registeredToFields.remove(unlistenField);
105
            registerNullSave(listenToField, listener);
106
        } else {
107
            throw new UnknownFieldException();
108
        }
109
    }
110

    
111
    public void updateFromFields(){
112
        for(AbstractField<String> f : registeredToFields.keySet()){
113
            ValueChangeListener listener = registeredToFields.get(f);
114
            listener.valueChange(new Field.ValueChangeEvent(f));
115
        }
116
    }
117

    
118
    /**
119
     * @param genusOrUninomialField
120
     */
121
    protected void registerNullSave(AbstractField<String> field, ValueChangeListener listener) {
122
        if(field != null){
123
            registeredToFields.put(field, listener);
124
            field.addValueChangeListener(listener);
125
        }
126
    }
127

    
128
    /**
129
     * @return the matchMode
130
     */
131
    protected MatchMode getMatchMode() {
132
        return matchMode;
133
    }
134

    
135
    /**
136
     * @param matchMode the matchMode to set
137
     */
138
    protected void setMatchMode(MatchMode matchMode) {
139
        this.matchMode = matchMode;
140
    }
141

    
142
    /**
143
     * @return the orderHints
144
     */
145
    protected List<OrderHint> getOrderHints() {
146
        return orderHints;
147
    }
148

    
149
    /**
150
     * @param orderHints the orderHints to set
151
     */
152
    protected void setOrderHints(List<OrderHint> orderHints) {
153
        this.orderHints = orderHints;
154
    }
155

    
156
    public TaxonNamePartsFilter getFilter(){
157
        return namePartsFilter;
158
    }
159

    
160
    /**
161
     * {@inheritDoc}
162
     */
163
    @Override
164
    public List<String> findEntities(int firstRow, String filter) {
165

    
166
        Integer pageIndex = firstRow / pageSize;
167
        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter, pageSize, pageIndex, orderHints);
168
        if(logger.isTraceEnabled()){
169
            logger.trace("findEntities() - page: " + taxonNamePager.getCurrentIndex() + "/" + taxonNamePager.getPagesAvailable() + " totalRecords: " + taxonNamePager.getCount() + "\n" + taxonNamePager.getRecords());
170
        }
171
        List<String> namePartStrings = new ArrayList<>(taxonNamePager.getRecords().size());
172
        for(TaxonNameParts tnp : taxonNamePager.getRecords()){
173
               namePartStrings.add(tnp.rankSpecificNamePart());
174
        }
175
        return namePartStrings;
176
    }
177

    
178

    
179

    
180
    /**
181
     * {@inheritDoc}
182
     */
183
    @Override
184
    public int size(String filter) {
185

    
186
        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter,  1, 0, null);
187
        if(logger.isTraceEnabled()){
188
            logger.trace("size() -  count: " + taxonNamePager.getCount().intValue());
189
        }
190
        return taxonNamePager.getCount().intValue();
191
    }
192

    
193
    /**
194
     * @return the pageSize
195
     */
196
    public int getPageSize() {
197
        return pageSize;
198
    }
199

    
200
    /**
201
     * @param pageSize the pageSize to set
202
     */
203
    public void setPageSize(int pageSize) {
204
        this.pageSize = pageSize;
205
    }
206

    
207

    
208
    /**
209
     * The list of criteria is initially empty.
210
     *
211
     * @return the criteria
212
     */
213
    public List<Criterion> getCriteria() {
214
        return criteria;
215
    }
216

    
217
    public class UnknownFieldException extends Exception {
218

    
219
        private static final long serialVersionUID = 1L;
220

    
221

    
222
    }
223
}
(6-6/7)