ref #7338 TaxonNameEditor mode VALIDATE_AGAINST_HIGHER_NAME_PART implemented for...
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 13 Jun 2018 15:48:59 +0000 (17:48 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Wed, 13 Jun 2018 15:48:59 +0000 (17:48 +0200)
src/main/java/eu/etaxonomy/cdm/service/TaxonNameStringFilterablePagingProvider.java [new file with mode: 0644]
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNameEditorPresenter.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditor.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorMode.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorView.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/registration/RegistrationWorkingsetPresenter.java

diff --git a/src/main/java/eu/etaxonomy/cdm/service/TaxonNameStringFilterablePagingProvider.java b/src/main/java/eu/etaxonomy/cdm/service/TaxonNameStringFilterablePagingProvider.java
new file mode 100644 (file)
index 0000000..70864d4
--- /dev/null
@@ -0,0 +1,190 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.hibernate.criterion.Criterion;
+import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider;
+import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider;
+
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.ui.AbstractField;
+
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.pager.Pager;
+import eu.etaxonomy.cdm.api.utility.TaxonNamePartsFilter;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNameParts;
+import eu.etaxonomy.cdm.persistence.query.MatchMode;
+import eu.etaxonomy.cdm.persistence.query.OrderHint;
+
+/**
+ * @author a.kohlbecker
+ * @since Jun 7, 2017
+ *
+ */
+public class TaxonNameStringFilterablePagingProvider implements FilterablePagingProvider<String>, FilterableCountProvider {
+
+    private static final List<String> DEFAULT_INIT_STRATEGY = Arrays.asList("$");
+
+    private static final Logger logger = Logger.getLogger(TaxonNameStringFilterablePagingProvider.class);
+
+    private int pageSize = 20;
+
+    private INameService service;
+
+    private MatchMode matchMode = MatchMode.BEGINNING;
+
+    private List<OrderHint> orderHints = OrderHint.ORDER_BY_TITLE_CACHE.asList();
+
+    List<String> initStrategy = DEFAULT_INIT_STRATEGY;
+
+    private List<Criterion> criteria = new ArrayList<>();
+
+    private TaxonNamePartsFilter namePartsFilter = new TaxonNamePartsFilter();
+
+    private Map<AbstractField<String>, ValueChangeListener> registeredToFields = new HashMap<>();
+
+
+    public TaxonNameStringFilterablePagingProvider(INameService service) {
+        this(service, Rank.GENUS(), null);
+    }
+
+    public TaxonNameStringFilterablePagingProvider(INameService service, Rank rank) {
+        this(service, rank, null);
+    }
+
+    public TaxonNameStringFilterablePagingProvider(INameService service, Rank rank, MatchMode matchMode) {
+        super();
+        this.service = service;
+        if(matchMode != null){
+            this.matchMode = matchMode;
+        }
+        namePartsFilter.setRank(rank);
+    }
+
+    public void listenToFields(AbstractField<String> genusOrUninomialField, AbstractField<String> infraGenericEpithetField,
+            AbstractField<String> specificEpithetField, AbstractField<String> infraSpecificEpithetField){
+
+        for(AbstractField<String> f : registeredToFields.keySet()){
+            f.removeValueChangeListener(registeredToFields.get(f));
+        }
+        registeredToFields.clear();
+
+        registerNullSave(genusOrUninomialField, e -> namePartsFilter.setGenusOrUninomial(genusOrUninomialField.getValue()));
+        registerNullSave(infraGenericEpithetField, e -> namePartsFilter.setGenusOrUninomial(infraGenericEpithetField.getValue()));
+        registerNullSave(specificEpithetField, e -> namePartsFilter.setGenusOrUninomial(specificEpithetField.getValue()));
+        registerNullSave(infraSpecificEpithetField, e -> namePartsFilter.setGenusOrUninomial(infraSpecificEpithetField.getValue()));
+    }
+
+    /**
+     * @param genusOrUninomialField
+     */
+    protected void registerNullSave(AbstractField<String> field, ValueChangeListener listener) {
+        if(field != null){
+            registeredToFields.put(field, listener);
+            field.addValueChangeListener(listener);
+        }
+    }
+
+    /**
+     * @return the matchMode
+     */
+    protected MatchMode getMatchMode() {
+        return matchMode;
+    }
+
+    /**
+     * @param matchMode the matchMode to set
+     */
+    protected void setMatchMode(MatchMode matchMode) {
+        this.matchMode = matchMode;
+    }
+
+    /**
+     * @return the orderHints
+     */
+    protected List<OrderHint> getOrderHints() {
+        return orderHints;
+    }
+
+    /**
+     * @param orderHints the orderHints to set
+     */
+    protected void setOrderHints(List<OrderHint> orderHints) {
+        this.orderHints = orderHints;
+    }
+
+    public TaxonNamePartsFilter getFilter(){
+        return namePartsFilter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<String> findEntities(int firstRow, String filter) {
+
+        Integer pageIndex = firstRow / pageSize;
+        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter, pageSize, pageIndex, orderHints);
+        if(logger.isTraceEnabled()){
+            logger.trace("findEntities() - page: " + taxonNamePager.getCurrentIndex() + "/" + taxonNamePager.getPagesAvailable() + " totalRecords: " + taxonNamePager.getCount() + "\n" + taxonNamePager.getRecords());
+        }
+        List<String> namePartStrings = new ArrayList<>(taxonNamePager.getRecords().size());
+        for(TaxonNameParts tnp : taxonNamePager.getRecords()){
+               namePartStrings.add(tnp.rankSpecificNamePart());
+        }
+        return namePartStrings;
+    }
+
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int size(String filter) {
+
+        Pager<TaxonNameParts> taxonNamePager = service.findTaxonNameParts(namePartsFilter, filter,  1, 0, null);
+        if(logger.isTraceEnabled()){
+            logger.trace("size() -  count: " + taxonNamePager.getCount().intValue());
+        }
+        return taxonNamePager.getCount().intValue();
+    }
+
+    /**
+     * @return the pageSize
+     */
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    /**
+     * @param pageSize the pageSize to set
+     */
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+
+    /**
+     * The list of criteria is initially empty.
+     *
+     * @return the criteria
+     */
+    public List<Criterion> getCriteria() {
+        return criteria;
+    }
+}
index d3f9a50fe63e8d30d594c6765a3bba161b5b367b..8cb663bbd6c0921a3a7e8053460805c56a13e737 100644 (file)
@@ -17,6 +17,7 @@ import org.apache.log4j.Logger;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.context.annotation.Scope;
 import org.vaadin.spring.events.annotation.EventBusListenerMethod;
+import org.vaadin.viritin.fields.LazyComboBox;
 
 import com.vaadin.spring.annotation.SpringComponent;
 
@@ -33,6 +34,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
 import eu.etaxonomy.cdm.model.reference.ReferenceType;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider;
+import eu.etaxonomy.cdm.service.TaxonNameStringFilterablePagingProvider;
 import eu.etaxonomy.cdm.service.initstrategies.AgentBaseInit;
 import eu.etaxonomy.cdm.vaadin.component.CdmBeanItemContainerFactory;
 import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter;
@@ -83,6 +85,8 @@ public class TaxonNameEditorPresenter extends AbstractCdmDTOEditorPresenter<Taxo
 
     private BeanInstantiator<Reference> newReferenceInstantiator;
 
+    private TaxonNameStringFilterablePagingProvider taxonNamePartPagingProvider;
+
 
     /**
      * {@inheritDoc}
@@ -96,6 +100,18 @@ public class TaxonNameEditorPresenter extends AbstractCdmDTOEditorPresenter<Taxo
         getView().getRankSelect().setContainerDataSource(selectFieldFactory.buildBeanItemContainer(TermType.Rank));
         getView().getRankSelect().setItemCaptionPropertyId("label");
 
+        // genusOrUninomialField
+        if(getView().getGenusOrUninomialField() instanceof LazyComboBox){
+            taxonNamePartPagingProvider = new TaxonNameStringFilterablePagingProvider(getRepo().getNameService());
+            taxonNamePartPagingProvider.listenToFields(
+                    getView().getGenusOrUninomialField(),
+                    getView().getInfraGenericEpithetField(),
+                    getView().getSpecificEpithetField(),
+                    getView().getInfraSpecificEpithetField()
+                   );
+            ((LazyComboBox)getView().getGenusOrUninomialField()).loadFrom(taxonNamePartPagingProvider, taxonNamePartPagingProvider, taxonNamePartPagingProvider.getPageSize());
+        }
+
         CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase> termOrPersonPagingProvider = new CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase>(getRepo().getAgentService(), TeamOrPersonBase.class);
         termOrPersonPagingProvider.setInitStrategy(AgentBaseInit.TEAM_OR_PERSON_INIT_STRATEGY);
         CdmFilterablePagingProvider<AgentBase, Person> personPagingProvider = new CdmFilterablePagingProvider<AgentBase, Person>(getRepo().getAgentService(), Person.class);
index 0ce37ea7c01f2cf92f6f3e88a878155786d4580b..e6199366b66a977dd47419ca387edcfa269636ea 100644 (file)
@@ -19,6 +19,7 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.log4j.Level;
 import org.springframework.context.annotation.Scope;
 import org.springframework.security.core.GrantedAuthority;
+import org.vaadin.viritin.fields.LazyComboBox;
 
 import com.vaadin.data.Property;
 import com.vaadin.data.Property.ValueChangeListener;
@@ -73,13 +74,13 @@ public class TaxonNamePopupEditor extends AbstractCdmDTOPopupEditor<TaxonNameDTO
 
     private static final boolean HAS_BASIONYM_DEFAULT = false;
 
-    private TextField genusOrUninomialField;
+    private AbstractField<String> genusOrUninomialField;
 
-    private TextField infraGenericEpithetField;
+    private AbstractField<String> infraGenericEpithetField;
 
-    private TextField specificEpithetField;
+    private AbstractField<String> specificEpithetField;
 
-    private TextField infraSpecificEpithetField;
+    private AbstractField<String> infraSpecificEpithetField;
 
     private SwitchableTextField fullTitleCacheFiled;
 
@@ -277,7 +278,12 @@ public class TaxonNamePopupEditor extends AbstractCdmDTOPopupEditor<TaxonNameDTO
         protectedNameCacheField = addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row, GRID_COLS-1, row);
         protectedNameCacheField.setWidth(100, Unit.PERCENTAGE);
         row++;
-        genusOrUninomialField = addTextField("Genus or uninomial", "genusOrUninomial", 0, row, 1, row);
+        if(isModeEnabled(TaxonNamePopupEditorMode.VALIDATE_AGAINST_HIGHER_NAME_PART)){
+            genusOrUninomialField = addTextField("Genus or uninomial", "genusOrUninomial", 0, row, 1, row);
+        } else {
+            genusOrUninomialField = new LazyComboBox<String>(String.class);
+            addField(genusOrUninomialField, "genusOrUninomial", 0, row, 1, row);
+        }
         genusOrUninomialField.setWidth(200, Unit.PIXELS);
         infraGenericEpithetField = addTextField("Infrageneric epithet", "infraGenericEpithet", 2, row, 3, row);
         infraGenericEpithetField.setWidth(200, Unit.PIXELS);
@@ -730,6 +736,14 @@ public class TaxonNamePopupEditor extends AbstractCdmDTOPopupEditor<TaxonNameDTO
         return rankSelect;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public AbstractField<String> getGenusOrUninomialField(){
+        return genusOrUninomialField;
+    }
+
     /**
      * @return the exBasionymAuthorshipField
      */
@@ -813,7 +827,29 @@ public class TaxonNamePopupEditor extends AbstractCdmDTOPopupEditor<TaxonNameDTO
         }
     }
 
+    /**
+     * @return the infraGenericEpithetField
+     */
+    @Override
+    public AbstractField<String> getInfraGenericEpithetField() {
+        return infraGenericEpithetField;
+    }
+
+    /**
+     * @return the specificEpithetField
+     */
+    @Override
+    public AbstractField<String> getSpecificEpithetField() {
+        return specificEpithetField;
+    }
 
+    /**
+     * @return the infraSpecificEpithetField
+     */
+    @Override
+    public AbstractField<String> getInfraSpecificEpithetField() {
+        return infraSpecificEpithetField;
+    }
 
 
 }
index e12bde48aa7326860862378bda4eff08a57aa3b8..d16a6c5a939014d288cd0e69f41618a103999f14 100644 (file)
@@ -36,6 +36,12 @@ public enum TaxonNamePopupEditorMode {
      * that existing data is considered complete if the combination
      * authors are set.
      */
-    REQUIRE_NOMENCLATURALREFERENCE
+    REQUIRE_NOMENCLATURALREFERENCE,
+
+    /**
+     * The next higher name must be in the system or it needs to be entered. For species the next higher name is
+     * the genus, for sub-species it is the species, etc.
+     */
+    VALIDATE_AGAINST_HIGHER_NAME_PART
 
 }
index 2065008beb70b0d547fe6a4043f62944f9d39310..64454e33e4cc83cf49894353486d102240a0bce8 100644 (file)
@@ -10,6 +10,7 @@ package eu.etaxonomy.cdm.vaadin.view.name;
 
 import java.util.EnumSet;
 
+import com.vaadin.ui.AbstractField;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.ListSelect;
 
@@ -94,4 +95,24 @@ public interface TaxonNamePopupEditorView extends ApplicationView<TaxonNameEdito
      */
     NameRelationField getValidationField();
 
+    /**
+     * @return
+     */
+    AbstractField<String> getGenusOrUninomialField();
+
+    /**
+     * @return the infraGenericEpithetField
+     */
+    public AbstractField<String> getInfraGenericEpithetField();
+
+    /**
+     * @return the specificEpithetField
+     */
+    public AbstractField<String> getSpecificEpithetField();
+
+    /**
+     * @return the infraSpecificEpithetField
+     */
+    public AbstractField<String> getInfraSpecificEpithetField();
+
 }
index 4f17e72a80329b8c1fc9569895657a1f34ce3471..8a1ebe31e71056af2e2b77854fdc67c83e592f41 100644 (file)
@@ -384,6 +384,7 @@ public class RegistrationWorkingsetPresenter extends AbstractPresenter<Registrat
     protected void configureTaxonNameEditor(TaxonNamePopupEditorView popup) {
         popup.enableMode(TaxonNamePopupEditorMode.AUTOFILL_AUTHORSHIP_DATA);
         popup.enableMode(TaxonNamePopupEditorMode.NOMENCLATURALREFERENCE_SECTION_EDITING_ONLY);
+        popup.enableMode(TaxonNamePopupEditorMode.VALIDATE_AGAINST_HIGHER_NAME_PART);
         // popup.enableMode(TaxonNamePopupEditorMode.REQUIRE_NOMENCLATURALREFERENCE);
     }