org.gbif.dwc.record.DarwinCoreTaxon.java Source code

Java tutorial

Introduction

Here is the source code for org.gbif.dwc.record.DarwinCoreTaxon.java

Source

package org.gbif.dwc.record;

import org.gbif.dwc.terms.Term;

import java.lang.reflect.Method;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DarwinCoreTaxon {

    private static final Logger LOG = LoggerFactory.getLogger(DarwinCoreTaxon.class);
    private static final String CLASSIFICATION_DELIMITER = " | ";
    private static final Pattern NORM_AUTHORS = Pattern.compile("[^a-z0-9]+");
    private String type;
    private String modified;
    private String language;
    private String license;
    private String rightsHolder;
    private String accessRights;
    private String bibliographicCitation;
    private String references;

    private String institutionID;
    private String collectionID;
    private String datasetID;
    private String institutionCode;
    private String collectionCode;
    private String datasetName;
    private String ownerInstitutionCode;
    private String basisOfRecord;
    private String informationWithheld;
    private String dataGeneralizations;
    private String dynamicProperties;
    private String taxonID;
    private String scientificNameID;
    private String acceptedNameUsageID;
    private String parentNameUsageID;
    private String originalNameUsageID;
    private String nameAccordingToID;
    private String namePublishedInID;
    private String taxonConceptID;
    private String scientificName;
    private String acceptedNameUsage;
    private String parentNameUsage;
    private String originalNameUsage;
    private String nameAccordingTo;
    private String namePublishedIn;
    private String namePublishedInYear;
    private String higherClassification;
    private String kingdom;
    private String phylum;
    private String classs;
    private String order;
    private String family;
    private String genus;
    private String subgenus;
    private String specificEpithet;
    private String infraspecificEpithet;
    private String taxonRank;
    private String verbatimTaxonRank;
    private String scientificNameAuthorship;
    private String vernacularName;
    private String nomenclaturalCode;
    private String taxonomicStatus;
    private String nomenclaturalStatus;
    private String taxonRemarks;

    public DarwinCoreTaxon() {
    }

    public DarwinCoreTaxon(String scientificName) {
        this.scientificName = norm(scientificName);
    }

    public String buildHigherClassification(Character lowestRank) {
        StringBuilder buf = new StringBuilder();
        if (kingdom != null) {
            buf.append(StringUtils.capitalize(kingdom.toLowerCase()));
            buf.append(CLASSIFICATION_DELIMITER);
        }
        if (lowestRank == null || lowestRank != 'k') {
            if (phylum != null) {
                buf.append(StringUtils.capitalize(phylum.toLowerCase()));
                buf.append(CLASSIFICATION_DELIMITER);
            }
            if (lowestRank == null || lowestRank != 'p') {
                if (classs != null) {
                    buf.append(StringUtils.capitalize(classs.toLowerCase()));
                    buf.append(CLASSIFICATION_DELIMITER);
                }
                if (lowestRank == null || lowestRank != 'c') {
                    if (order != null) {
                        buf.append(StringUtils.capitalize(order.toLowerCase()));
                        buf.append(CLASSIFICATION_DELIMITER);
                    }
                    if (lowestRank == null || lowestRank != 'o') {
                        if (family != null) {
                            buf.append(StringUtils.capitalize(family.toLowerCase()));
                            buf.append(CLASSIFICATION_DELIMITER);
                        }
                        if (lowestRank == null || lowestRank != 'f') {
                            if (genus != null) {
                                buf.append(StringUtils.capitalize(genus.toLowerCase()));
                                buf.append(CLASSIFICATION_DELIMITER);
                            }
                            if (lowestRank == null || lowestRank != 'g') {
                                if (subgenus != null) {
                                    buf.append(StringUtils.capitalize(subgenus.toLowerCase()));
                                    buf.append(CLASSIFICATION_DELIMITER);
                                }
                            }
                        }
                    }
                }
            }
        }

        if (buf.length() > CLASSIFICATION_DELIMITER.length()) {
            buf.delete(buf.length() - CLASSIFICATION_DELIMITER.length(), buf.length());
        }
        return buf.toString();
    }

    public String getFullScientificName() {
        if (scientificNameAuthorship != null && scientificName != null) {
            String normedSciName = NORM_AUTHORS.matcher(scientificName.toLowerCase()).replaceAll(" ");
            String normedAuthors = NORM_AUTHORS.matcher(scientificNameAuthorship.toLowerCase()).replaceAll(" ");
            if (!normedSciName.contains(normedAuthors)) {
                return scientificName + " " + scientificNameAuthorship;
            }
        }
        if (scientificName == null) {
            String sciname = null;
            if (this.genus != null) {
                if (specificEpithet != null) {
                    sciname = genus + " " + specificEpithet;
                    if (infraspecificEpithet != null) {
                        sciname += " " + infraspecificEpithet;
                    }
                    // potentially add authorship in this case
                    if (sciname != null && scientificNameAuthorship != null) {
                        sciname += " " + scientificNameAuthorship;
                    }
                } else {
                    sciname = subgenus != null ? subgenus : genus;
                }
            }
            return sciname;
        }
        return scientificName;
    }

    public String getLowestScientificName() {
        String sciname = getFullScientificName();
        if (sciname == null) {
            if (family != null) {
                sciname = family;
            } else if (order != null) {
                sciname = order;
            } else if (classs != null) {
                sciname = classs;
            } else if (phylum != null) {
                sciname = phylum;
            } else if (kingdom != null) {
                sciname = kingdom;
            }
        }
        return sciname;
    }

    /**
     * Gets a dwc property by its concept term.
     * This method is only able to access official Darwin Core or Dublin Core terms, not any custom extensions.
     *
     * @param prop the concept term to lookup
     *
     * @return the terms value, null or IllegalArgumentException for unsupported terms
     */
    public String getProperty(Term prop) {
        String getter = String.format("get%s", getPropertyName(prop));
        try {
            Method m = getClass().getMethod(getter);
            Object val = m.invoke(this);
            return val == null ? null : val.toString();

        } catch (NoSuchMethodException e) {
            throw new IllegalArgumentException("non existing dwc property: " + prop);

        } catch (Exception e) {
            // should never happen
            throw new RuntimeException(e);
        }
    }

    private String getPropertyName(Term prop) {
        String propName = StringUtils.capitalize(prop.simpleName());
        if (propName.equalsIgnoreCase("Class")) {
            propName = "Classs";
        }
        return propName;
    }

    public String getTaxonRankInterpreted() {
        if (scientificName != null || taxonRank != null) {
            return taxonRank;
        }
        if (genus != null && specificEpithet != null && infraspecificEpithet != null) {
            if (taxonRank != null) {
                return taxonRank;
            }
            if (verbatimTaxonRank != null) {
                return verbatimTaxonRank;
            }
            return "infraspecies";
        }
        if (genus != null && specificEpithet != null) {
            return "species";
        }
        if (subgenus != null) {
            return "subgenus";
        }
        if (genus != null) {
            return "genus";
        }
        if (family != null) {
            return "family";
        }
        if (order != null) {
            return "order";
        }
        if (classs != null) {
            return "class";
        }
        if (phylum != null) {
            return "phylum";
        }
        if (kingdom != null) {
            return "kingdom";
        }
        return null;
    }

    /**
     * The method tries to best assemble the most complete scientific name possible incl the name authorship.
     * It first tries to use scientificName and scientificNameAuthorship if existing.
     * Otherwise it uses the atomized name parts. Warning: this uses the genus property which might be wrong in case
     * of synonym names, see https://code.google.com/p/darwincore/issues/detail?id=151
     * Note also that the assembled name never includes a rank marker.
     *
     * @return the best guess of the full scientific name with authorship
     */
    protected String norm(String x) {
        x = StringUtils.trimToNull(x);
        if (x != null && (x.equalsIgnoreCase("\\N") || x.equalsIgnoreCase("NULL"))) {
            x = null;
        }
        return x;
    }

    public boolean setProperty(Term prop, String value) {
        if (prop == null) {
            return false;
        }
        String setterName = null;
        try {
            setterName = String.format("set%s", getPropertyName(prop));
            Method m = getClass().getMethod(setterName, String.class);
            m.invoke(this, value);
        } catch (Exception e) {
            LOG.warn("Trying to access bad dwc property setter: " + setterName + " for property " + prop);
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("taxonID", this.taxonID)
                .append("scientificName", this.scientificName).toString();
    }

    public String getAcceptedNameUsage() {
        return acceptedNameUsage;
    }

    public String getAcceptedNameUsageID() {
        return acceptedNameUsageID;
    }

    public String getAccessRights() {
        return accessRights;
    }

    public String getBasisOfRecord() {
        return basisOfRecord;
    }

    public String getBibliographicCitation() {
        return bibliographicCitation;
    }

    public String getClasss() {
        return classs;
    }

    public String getCollectionCode() {
        return collectionCode;
    }

    public String getCollectionID() {
        return collectionID;
    }

    public String getDataGeneralizations() {
        return dataGeneralizations;
    }

    public String getDatasetID() {
        return datasetID;
    }

    public String getDatasetName() {
        return datasetName;
    }

    public String getDynamicProperties() {
        return dynamicProperties;
    }

    public String getFamily() {
        return family;
    }

    public String getGenus() {
        return genus;
    }

    public String getHigherClassification() {
        return higherClassification;
    }

    public String getInformationWithheld() {
        return informationWithheld;
    }

    public String getInfraspecificEpithet() {
        return infraspecificEpithet;
    }

    public String getInstitutionCode() {
        return institutionCode;
    }

    public String getInstitutionID() {
        return institutionID;
    }

    public String getKingdom() {
        return kingdom;
    }

    public String getLanguage() {
        return language;
    }

    public String getLicense() {
        return license;
    }

    public String getModified() {
        return modified;
    }

    public String getNameAccordingTo() {
        return nameAccordingTo;
    }

    public String getNameAccordingToID() {
        return nameAccordingToID;
    }

    public String getNamePublishedIn() {
        return namePublishedIn;
    }

    public String getNamePublishedInID() {
        return namePublishedInID;
    }

    public String getNamePublishedInYear() {
        return namePublishedInYear;
    }

    public String getNomenclaturalCode() {
        return nomenclaturalCode;
    }

    public String getNomenclaturalStatus() {
        return nomenclaturalStatus;
    }

    public String getOrder() {
        return order;
    }

    public String getOriginalNameUsage() {
        return originalNameUsage;
    }

    public String getOriginalNameUsageID() {
        return originalNameUsageID;
    }

    public String getOwnerInstitutionCode() {
        return ownerInstitutionCode;
    }

    public String getParentNameUsage() {
        return parentNameUsage;
    }

    public String getParentNameUsageID() {
        return parentNameUsageID;
    }

    public String getPhylum() {
        return phylum;
    }

    public String getReferences() {
        return references;
    }

    public String getRightsHolder() {
        return rightsHolder;
    }

    public String getScientificName() {
        return scientificName;
    }

    public String getScientificNameAuthorship() {
        return scientificNameAuthorship;
    }

    public String getScientificNameID() {
        return scientificNameID;
    }

    public String getSpecificEpithet() {
        return specificEpithet;
    }

    public String getSubgenus() {
        return subgenus;
    }

    public String getTaxonConceptID() {
        return taxonConceptID;
    }

    public String getTaxonID() {
        return taxonID;
    }

    public String getTaxonomicStatus() {
        return taxonomicStatus;
    }

    public String getTaxonRank() {
        return taxonRank;
    }

    public String getTaxonRemarks() {
        return taxonRemarks;
    }

    public String getType() {
        return type;
    }

    public String getVerbatimTaxonRank() {
        return verbatimTaxonRank;
    }

    public String getVernacularName() {
        return vernacularName;
    }

    public void setAcceptedNameUsage(String acceptedNameUsage) {
        this.acceptedNameUsage = acceptedNameUsage;
    }

    public void setAcceptedNameUsageID(String acceptedNameUsageID) {
        this.acceptedNameUsageID = acceptedNameUsageID;
    }

    public void setAccessRights(String accessRights) {
        this.accessRights = norm(accessRights);
    }

    public void setBasisOfRecord(String basisOfRecord) {
        this.basisOfRecord = norm(basisOfRecord);
    }

    public void setBibliographicCitation(String bibliographicCitation) {
        this.bibliographicCitation = bibliographicCitation;
    }

    public void setClasss(String classs) {
        this.classs = norm(classs);
    }

    public void setCollectionCode(String collectionCode) {
        this.collectionCode = norm(collectionCode);
    }

    public void setCollectionID(String collectionID) {
        this.collectionID = norm(collectionID);
    }

    public void setDataGeneralizations(String dataGeneralizations) {
        this.dataGeneralizations = norm(dataGeneralizations);
    }

    public void setDatasetID(String datasetID) {
        this.datasetID = norm(datasetID);
    }

    public void setDatasetName(String datasetName) {
        this.datasetName = datasetName;
    }

    public void setDynamicProperties(String dynamicProperties) {
        this.dynamicProperties = dynamicProperties;
    }

    public void setFamily(String family) {
        this.family = norm(family);
    }

    public void setGenus(String genus) {
        this.genus = norm(genus);
    }

    public void setHigherClassification(String higherClassification) {
        this.higherClassification = higherClassification;
    }

    public void setInformationWithheld(String informationWithheld) {
        this.informationWithheld = norm(informationWithheld);
    }

    public void setInfraspecificEpithet(String infraspecificEpithet) {
        this.infraspecificEpithet = norm(infraspecificEpithet);
    }

    public void setInstitutionCode(String institutionCode) {
        this.institutionCode = norm(institutionCode);
    }

    public void setInstitutionID(String institutionID) {
        this.institutionID = institutionID;
    }

    public void setKingdom(String kingdom) {
        this.kingdom = norm(kingdom);
    }

    public void setLanguage(String language) {
        this.language = norm(language);
    }

    public void setLicense(String license) {
        this.license = norm(license);
    }

    public void setModified(String modified) {
        this.modified = norm(modified);
    }

    public void setNameAccordingTo(String nameAccordingTo) {
        this.nameAccordingTo = nameAccordingTo;
    }

    public void setNameAccordingToID(String nameAccordingToID) {
        this.nameAccordingToID = nameAccordingToID;
    }

    public void setNamePublishedIn(String namePublishedIn) {
        this.namePublishedIn = norm(namePublishedIn);
    }

    public void setNamePublishedInID(String namePublishedInID) {
        this.namePublishedInID = namePublishedInID;
    }

    public void setNamePublishedInYear(String namePublishedInYear) {
        this.namePublishedInYear = namePublishedInYear;
    }

    public void setNomenclaturalCode(String nomenclaturalCode) {
        this.nomenclaturalCode = norm(nomenclaturalCode);
    }

    public void setNomenclaturalStatus(String nomenclaturalStatus) {
        this.nomenclaturalStatus = norm(nomenclaturalStatus);
    }

    public void setOrder(String order) {
        this.order = norm(order);
    }

    public void setOriginalNameUsage(String originalNameUsage) {
        this.originalNameUsage = originalNameUsage;
    }

    public void setOriginalNameUsageID(String originalNameUsageID) {
        this.originalNameUsageID = originalNameUsageID;
    }

    public void setOwnerInstitutionCode(String ownerInstitutionCode) {
        this.ownerInstitutionCode = ownerInstitutionCode;
    }

    public void setParentNameUsage(String parentNameUsage) {
        this.parentNameUsage = parentNameUsage;
    }

    public void setParentNameUsageID(String parentNameUsageID) {
        this.parentNameUsageID = parentNameUsageID;
    }

    public void setPhylum(String phylum) {
        this.phylum = norm(phylum);
    }

    public void setReferences(String references) {
        this.references = norm(references);
    }

    public void setRightsHolder(String rightsHolder) {
        this.rightsHolder = norm(rightsHolder);
    }

    public void setScientificName(String scientificName) {
        this.scientificName = norm(scientificName);
    }

    public void setScientificNameAuthorship(String scientificNameAuthorship) {
        this.scientificNameAuthorship = norm(scientificNameAuthorship);
    }

    public void setScientificNameID(String scientificNameID) {
        this.scientificNameID = scientificNameID;
    }

    public void setSpecificEpithet(String specificEpithet) {
        this.specificEpithet = norm(specificEpithet);
    }

    public void setSubgenus(String subgenus) {
        this.subgenus = norm(subgenus);
    }

    public void setTaxonConceptID(String taxonConceptID) {
        this.taxonConceptID = taxonConceptID;
    }

    public void setTaxonID(String taxonID) {
        this.taxonID = norm(taxonID);
    }

    public void setTaxonomicStatus(String taxonomicStatus) {
        this.taxonomicStatus = norm(taxonomicStatus);
    }

    public void setTaxonRank(String taxonRank) {
        this.taxonRank = norm(taxonRank);
    }

    public void setTaxonRemarks(String taxonRemarks) {
        this.taxonRemarks = norm(taxonRemarks);
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setVerbatimTaxonRank(String verbatimTaxonRank) {
        this.verbatimTaxonRank = verbatimTaxonRank;
    }

    public void setVernacularName(String vernacularName) {
        this.vernacularName = vernacularName;
    }

}