Project

General

Profile

« Previous | Next » 

Revision 7adc925d

Added by Andreas Kohlbecker almost 6 years ago

ref #7338 TaxonNameEditor mode VALIDATE_AGAINST_HIGHER_NAME_PART implemented for genusOrUninomial

View differences:

src/main/java/eu/etaxonomy/cdm/service/TaxonNameStringFilterablePagingProvider.java
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

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

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

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

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

  
44
    private int pageSize = 20;
45

  
46
    private INameService service;
47

  
48
    private MatchMode matchMode = MatchMode.BEGINNING;
49

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

  
52
    List<String> initStrategy = DEFAULT_INIT_STRATEGY;
53

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

  
56
    private TaxonNamePartsFilter namePartsFilter = new TaxonNamePartsFilter();
57

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

  
60

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

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

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

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

  
81
        for(AbstractField<String> f : registeredToFields.keySet()){
82
            f.removeValueChangeListener(registeredToFields.get(f));
83
        }
84
        registeredToFields.clear();
85

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

  
92
    /**
93
     * @param genusOrUninomialField
94
     */
95
    protected void registerNullSave(AbstractField<String> field, ValueChangeListener listener) {
96
        if(field != null){
97
            registeredToFields.put(field, listener);
98
            field.addValueChangeListener(listener);
99
        }
100
    }
101

  
102
    /**
103
     * @return the matchMode
104
     */
105
    protected MatchMode getMatchMode() {
106
        return matchMode;
107
    }
108

  
109
    /**
110
     * @param matchMode the matchMode to set
111
     */
112
    protected void setMatchMode(MatchMode matchMode) {
113
        this.matchMode = matchMode;
114
    }
115

  
116
    /**
117
     * @return the orderHints
118
     */
119
    protected List<OrderHint> getOrderHints() {
120
        return orderHints;
121
    }
122

  
123
    /**
124
     * @param orderHints the orderHints to set
125
     */
126
    protected void setOrderHints(List<OrderHint> orderHints) {
127
        this.orderHints = orderHints;
128
    }
129

  
130
    public TaxonNamePartsFilter getFilter(){
131
        return namePartsFilter;
132
    }
133

  
134
    /**
135
     * {@inheritDoc}
136
     */
137
    @Override
138
    public List<String> findEntities(int firstRow, String filter) {
139

  
140
        Integer pageIndex = firstRow / pageSize;
141
        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter, pageSize, pageIndex, orderHints);
142
        if(logger.isTraceEnabled()){
143
            logger.trace("findEntities() - page: " + taxonNamePager.getCurrentIndex() + "/" + taxonNamePager.getPagesAvailable() + " totalRecords: " + taxonNamePager.getCount() + "\n" + taxonNamePager.getRecords());
144
        }
145
        List<String> namePartStrings = new ArrayList<>(taxonNamePager.getRecords().size());
146
        for(TaxonNameParts tnp : taxonNamePager.getRecords()){
147
               namePartStrings.add(tnp.rankSpecificNamePart());
148
        }
149
        return namePartStrings;
150
    }
151

  
152

  
153

  
154
    /**
155
     * {@inheritDoc}
156
     */
157
    @Override
158
    public int size(String filter) {
159

  
160
        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter,  1, 0, null);
161
        if(logger.isTraceEnabled()){
162
            logger.trace("size() -  count: " + taxonNamePager.getCount().intValue());
163
        }
164
        return taxonNamePager.getCount().intValue();
165
    }
166

  
167
    /**
168
     * @return the pageSize
169
     */
170
    public int getPageSize() {
171
        return pageSize;
172
    }
173

  
174
    /**
175
     * @param pageSize the pageSize to set
176
     */
177
    public void setPageSize(int pageSize) {
178
        this.pageSize = pageSize;
179
    }
180

  
181

  
182
    /**
183
     * The list of criteria is initially empty.
184
     *
185
     * @return the criteria
186
     */
187
    public List<Criterion> getCriteria() {
188
        return criteria;
189
    }
190
}
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNameEditorPresenter.java
17 17
import org.hibernate.criterion.Restrictions;
18 18
import org.springframework.context.annotation.Scope;
19 19
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
20
import org.vaadin.viritin.fields.LazyComboBox;
20 21

  
21 22
import com.vaadin.spring.annotation.SpringComponent;
22 23

  
......
33 34
import eu.etaxonomy.cdm.model.reference.ReferenceType;
34 35
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
35 36
import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
37
import eu.etaxonomy.cdm.service.TaxonNameStringFilterablePagingProvider;
36 38
import eu.etaxonomy.cdm.service.initstrategies.AgentBaseInit;
37 39
import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
38 40
import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
......
83 85

  
84 86
    private BeanInstantiator<Reference> newReferenceInstantiator;
85 87

  
88
    private TaxonNameStringFilterablePagingProvider taxonNamePartPagingProvider;
89

  
86 90

  
87 91
    /**
88 92
     * {@inheritDoc}
......
96 100
        getView().getRankSelect().setContainerDataSource(selectFieldFactory.buildBeanItemContainer(TermType.Rank));
97 101
        getView().getRankSelect().setItemCaptionPropertyId("label");
98 102

  
103
        // genusOrUninomialField
104
        if(getView().getGenusOrUninomialField() instanceof LazyComboBox){
105
            taxonNamePartPagingProvider = new TaxonNameStringFilterablePagingProvider(getRepo().getNameService());
106
            taxonNamePartPagingProvider.listenToFields(
107
                    getView().getGenusOrUninomialField(),
108
                    getView().getInfraGenericEpithetField(),
109
                    getView().getSpecificEpithetField(),
110
                    getView().getInfraSpecificEpithetField()
111
                   );
112
            ((LazyComboBox)getView().getGenusOrUninomialField()).loadFrom(taxonNamePartPagingProvider, taxonNamePartPagingProvider, taxonNamePartPagingProvider.getPageSize());
113
        }
114

  
99 115
        CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase> termOrPersonPagingProvider = new CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase>(getRepo().getAgentService(), TeamOrPersonBase.class);
100 116
        termOrPersonPagingProvider.setInitStrategy(AgentBaseInit.TEAM_OR_PERSON_INIT_STRATEGY);
101 117
        CdmFilterablePagingProvider<AgentBase, Person> personPagingProvider = new CdmFilterablePagingProvider<AgentBase, Person>(getRepo().getAgentService(), Person.class);
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditor.java
19 19
import org.apache.log4j.Level;
20 20
import org.springframework.context.annotation.Scope;
21 21
import org.springframework.security.core.GrantedAuthority;
22
import org.vaadin.viritin.fields.LazyComboBox;
22 23

  
23 24
import com.vaadin.data.Property;
24 25
import com.vaadin.data.Property.ValueChangeListener;
......
73 74

  
74 75
    private static final boolean HAS_BASIONYM_DEFAULT = false;
75 76

  
76
    private TextField genusOrUninomialField;
77
    private AbstractField<String> genusOrUninomialField;
77 78

  
78
    private TextField infraGenericEpithetField;
79
    private AbstractField<String> infraGenericEpithetField;
79 80

  
80
    private TextField specificEpithetField;
81
    private AbstractField<String> specificEpithetField;
81 82

  
82
    private TextField infraSpecificEpithetField;
83
    private AbstractField<String> infraSpecificEpithetField;
83 84

  
84 85
    private SwitchableTextField fullTitleCacheFiled;
85 86

  
......
277 278
        protectedNameCacheField = addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row, GRID_COLS-1, row);
278 279
        protectedNameCacheField.setWidth(100, Unit.PERCENTAGE);
279 280
        row++;
280
        genusOrUninomialField = addTextField("Genus or uninomial", "genusOrUninomial", 0, row, 1, row);
281
        if(isModeEnabled(TaxonNamePopupEditorMode.VALIDATE_AGAINST_HIGHER_NAME_PART)){
282
            genusOrUninomialField = addTextField("Genus or uninomial", "genusOrUninomial", 0, row, 1, row);
283
        } else {
284
            genusOrUninomialField = new LazyComboBox<String>(String.class);
285
            addField(genusOrUninomialField, "genusOrUninomial", 0, row, 1, row);
286
        }
281 287
        genusOrUninomialField.setWidth(200, Unit.PIXELS);
282 288
        infraGenericEpithetField = addTextField("Infrageneric epithet", "infraGenericEpithet", 2, row, 3, row);
283 289
        infraGenericEpithetField.setWidth(200, Unit.PIXELS);
......
730 736
        return rankSelect;
731 737
    }
732 738

  
739
    /**
740
     * {@inheritDoc}
741
     */
742
    @Override
743
    public AbstractField<String> getGenusOrUninomialField(){
744
        return genusOrUninomialField;
745
    }
746

  
733 747
    /**
734 748
     * @return the exBasionymAuthorshipField
735 749
     */
......
813 827
        }
814 828
    }
815 829

  
830
    /**
831
     * @return the infraGenericEpithetField
832
     */
833
    @Override
834
    public AbstractField<String> getInfraGenericEpithetField() {
835
        return infraGenericEpithetField;
836
    }
837

  
838
    /**
839
     * @return the specificEpithetField
840
     */
841
    @Override
842
    public AbstractField<String> getSpecificEpithetField() {
843
        return specificEpithetField;
844
    }
816 845

  
846
    /**
847
     * @return the infraSpecificEpithetField
848
     */
849
    @Override
850
    public AbstractField<String> getInfraSpecificEpithetField() {
851
        return infraSpecificEpithetField;
852
    }
817 853

  
818 854

  
819 855
}
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorMode.java
36 36
     * that existing data is considered complete if the combination
37 37
     * authors are set.
38 38
     */
39
    REQUIRE_NOMENCLATURALREFERENCE
39
    REQUIRE_NOMENCLATURALREFERENCE,
40

  
41
    /**
42
     * The next higher name must be in the system or it needs to be entered. For species the next higher name is
43
     * the genus, for sub-species it is the species, etc.
44
     */
45
    VALIDATE_AGAINST_HIGHER_NAME_PART
40 46

  
41 47
}
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorView.java
10 10

  
11 11
import java.util.EnumSet;
12 12

  
13
import com.vaadin.ui.AbstractField;
13 14
import com.vaadin.ui.CheckBox;
14 15
import com.vaadin.ui.ListSelect;
15 16

  
......
94 95
     */
95 96
    NameRelationField getValidationField();
96 97

  
98
    /**
99
     * @return
100
     */
101
    AbstractField<String> getGenusOrUninomialField();
102

  
103
    /**
104
     * @return the infraGenericEpithetField
105
     */
106
    public AbstractField<String> getInfraGenericEpithetField();
107

  
108
    /**
109
     * @return the specificEpithetField
110
     */
111
    public AbstractField<String> getSpecificEpithetField();
112

  
113
    /**
114
     * @return the infraSpecificEpithetField
115
     */
116
    public AbstractField<String> getInfraSpecificEpithetField();
117

  
97 118
}
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationWorkingsetPresenter.java
384 384
    protected void configureTaxonNameEditor(TaxonNamePopupEditorView popup) {
385 385
        popup.enableMode(TaxonNamePopupEditorMode.AUTOFILL_AUTHORSHIP_DATA);
386 386
        popup.enableMode(TaxonNamePopupEditorMode.NOMENCLATURALREFERENCE_SECTION_EDITING_ONLY);
387
        popup.enableMode(TaxonNamePopupEditorMode.VALIDATE_AGAINST_HIGHER_NAME_PART);
387 388
        // popup.enableMode(TaxonNamePopupEditorMode.REQUIRE_NOMENCLATURALREFERENCE);
388 389
    }
389 390

  

Also available in: Unified diff