X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib-apps.git/blobdiff_plain/783428fc7898b06792b01af03d1ce699719a0e9d..20fc4e0ba2a783eaf7a12c8f025b2f7bb9c6af11:/app-import/src/main/java/eu/etaxonomy/cdm/io/redlist/gefaesspflanzen/RedListGefaesspflanzenImportNames.java diff --git a/app-import/src/main/java/eu/etaxonomy/cdm/io/redlist/gefaesspflanzen/RedListGefaesspflanzenImportNames.java b/app-import/src/main/java/eu/etaxonomy/cdm/io/redlist/gefaesspflanzen/RedListGefaesspflanzenImportNames.java index 71f86576..3be4cfd6 100644 --- a/app-import/src/main/java/eu/etaxonomy/cdm/io/redlist/gefaesspflanzen/RedListGefaesspflanzenImportNames.java +++ b/app-import/src/main/java/eu/etaxonomy/cdm/io/redlist/gefaesspflanzen/RedListGefaesspflanzenImportNames.java @@ -34,13 +34,17 @@ import eu.etaxonomy.cdm.model.common.Annotation; import eu.etaxonomy.cdm.model.common.AnnotationType; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary; import eu.etaxonomy.cdm.model.description.CommonTaxonName; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.name.BotanicalName; +import eu.etaxonomy.cdm.model.name.CultivarPlantName; +import eu.etaxonomy.cdm.model.name.NomenclaturalCode; import eu.etaxonomy.cdm.model.name.NomenclaturalStatus; import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType; import eu.etaxonomy.cdm.model.name.NonViralName; import eu.etaxonomy.cdm.model.name.Rank; +import eu.etaxonomy.cdm.model.name.RankClass; import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.taxon.Synonym; import eu.etaxonomy.cdm.model.taxon.Taxon; @@ -117,6 +121,14 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase name = importName(state, rs, namesToSave); @@ -126,13 +138,22 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase taxonBase = importTaxon(rs, name); + TaxonBase taxonBase = importTaxon(rs, name, state); if(taxonBase==null){ RedListUtil.logMessage(id, "Taxon for name "+name+" could not be created.", logger); return; } //---CONCEPT RELATIONSHIPS--- + //E, W, K, AW, AO, R, O, S + cloneTaxon(taxonBase, relationE, RedListUtil.CLASSIFICATION_NAMESPACE_E, taxaToSave, id, state); + cloneTaxon(taxonBase, relationW, RedListUtil.CLASSIFICATION_NAMESPACE_W, taxaToSave, id, state); + cloneTaxon(taxonBase, relationK, RedListUtil.CLASSIFICATION_NAMESPACE_K, taxaToSave, id, state); + cloneTaxon(taxonBase, relationAW, RedListUtil.CLASSIFICATION_NAMESPACE_AW, taxaToSave, id, state); + cloneTaxon(taxonBase, relationAO, RedListUtil.CLASSIFICATION_NAMESPACE_AO, taxaToSave, id, state); + cloneTaxon(taxonBase, relationR, RedListUtil.CLASSIFICATION_NAMESPACE_R, taxaToSave, id, state); + cloneTaxon(taxonBase, relationO, RedListUtil.CLASSIFICATION_NAMESPACE_O, taxaToSave, id, state); + cloneTaxon(taxonBase, relationS, RedListUtil.CLASSIFICATION_NAMESPACE_S, taxaToSave, id, state); //checklist TaxonBase checklistTaxon = null; if(CdmUtils.isNotBlank(clTaxonString) && !clTaxonString.trim().equals("-")){ @@ -145,41 +166,32 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase gesamtListeTaxon, String sourceNameSpace, Set taxaToSave, long id, RedListGefaesspflanzenImportState state){ - Taxon clonedTaxon = null; + private void cloneTaxon(final TaxonBase gesamtListeTaxon, String relationString, String sourceNameSpace, Set taxaToSave, long id, RedListGefaesspflanzenImportState state){ + if(CdmUtils.isNotBlank(relationString) && !relationString.equals(".")){ + Taxon clonedTaxon = null; - if(gesamtListeTaxon.isInstanceOf(Taxon.class)){ - clonedTaxon = HibernateProxyHelper.deproxy(gesamtListeTaxon.clone(), Taxon.class); - } - else if(gesamtListeTaxon.isInstanceOf(Synonym.class)){ - clonedTaxon = Taxon.NewInstance(gesamtListeTaxon.getName(), gesamtListeTaxon.getSec()); - } - else{ - RedListUtil.logMessage(id, "Taxon base "+gesamtListeTaxon+" is neither taxon nor synonym! Taxon could not be cloned", logger); - return null; + if(gesamtListeTaxon.isInstanceOf(Taxon.class)){ + clonedTaxon = HibernateProxyHelper.deproxy(gesamtListeTaxon.clone(), Taxon.class); + } + else if(gesamtListeTaxon.isInstanceOf(Synonym.class)){ + clonedTaxon = Taxon.NewInstance(gesamtListeTaxon.getName(), gesamtListeTaxon.getSec()); + } + else{ + RedListUtil.logMessage(id, "Taxon base "+gesamtListeTaxon+" is neither taxon nor synonym! Taxon could not be cloned", logger); + return; + } + ImportHelper.setOriginalSource(clonedTaxon, state.getTransactionalSourceReference(), id, sourceNameSpace); + taxaToSave.add(clonedTaxon); } - - ImportHelper.setOriginalSource(clonedTaxon, state.getTransactionalSourceReference(), id, sourceNameSpace); - taxaToSave.add(clonedTaxon); - return clonedTaxon; } - private TaxonBase importTaxon(ResultSet rs, NonViralName name) throws SQLException { + private TaxonBase importTaxon(ResultSet rs, NonViralName name, RedListGefaesspflanzenImportState state) throws SQLException { long id = rs.getLong(RedListUtil.NAMNR); String taxNameString = rs.getString(RedListUtil.TAXNAME); @@ -225,7 +237,7 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase importName(RedListGefaesspflanzenImportState state, ResultSet rs, Set namesToSave) throws SQLException { @@ -330,104 +342,122 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase name = null; Rank rank = makeRank(id, state, rangString, ep3String!=null); - NonViralName name = BotanicalName.NewInstance(rank); + //cultivar + if(rank!= null && rank.equals(Rank.CULTIVAR())){ + CultivarPlantName cultivar = CultivarPlantName.NewInstance(rank); + cultivar.setGenusOrUninomial(ep1String); + cultivar.setSpecificEpithet(ep2String); + cultivar.setCultivarName(ep3String); + name = cultivar; + } + //botanical names + else{ + name = BotanicalName.NewInstance(rank); - //ep1 should always be present - if(CdmUtils.isBlank(ep1String)){ - RedListUtil.logMessage(id, RedListUtil.EPI1+" is empty!", logger); - } - name.setGenusOrUninomial(ep1String); - if(CdmUtils.isNotBlank(ep2String)){ - if(rank!=null && rank.isInfraGeneric()){ - name.setInfraGenericEpithet(ep2String); + //ep1 should always be present + if(CdmUtils.isBlank(ep1String)){ + RedListUtil.logMessage(id, RedListUtil.EPI1+" is empty!", logger); } - else{ - name.setSpecificEpithet(ep2String); - } - } - if(CdmUtils.isNotBlank(ep3String)){ - name.setInfraSpecificEpithet(ep3String); - } - //nomenclatural status - if(CdmUtils.isNotBlank(nomZusatzString)){ - NomenclaturalStatusType statusType = makeNomenclaturalStatus(id, state, nomZusatzString); - if(statusType!=null){ - NomenclaturalStatus status = NomenclaturalStatus.NewInstance(statusType); - //special case for invalid names where the DB entry contains - //additional information in brackets e.g. "nom. inval. (sine basion.)" - if(statusType.equals(NomenclaturalStatusType.INVALID())){ - Pattern pattern = Pattern.compile("\\((.*?)\\)"); - Matcher matcher = pattern.matcher(nomZusatzString); - if (matcher.find()){ - status.setRuleConsidered(matcher.group(1)); - } + name.setGenusOrUninomial(ep1String); + if(CdmUtils.isNotBlank(ep2String)){ + if(rank!=null && rank.isInfraGenericButNotSpeciesGroup()){ + name.setInfraGenericEpithet(ep2String); + } + else{ + name.setSpecificEpithet(ep2String); } - name.addStatus(status); } - } - //hybrid - if(CdmUtils.isNotBlank(hybString)){ - //save hybrid formula - if(CdmUtils.isNotBlank(formelString)){ - Annotation annotation = Annotation.NewDefaultLanguageInstance(formelString); - annotation.setAnnotationType(AnnotationType.TECHNICAL()); - name.addAnnotation(annotation); + if(CdmUtils.isNotBlank(ep3String)){ + name.setInfraSpecificEpithet(ep3String); } - if(hybString.equals(RedListUtil.HYB_X)){ - name.setBinomHybrid(true); - } - else if(hybString.equals(RedListUtil.HYB_G)){ - name.setMonomHybrid(true); + + //nomenclatural status + if(CdmUtils.isNotBlank(nomZusatzString)){ + NomenclaturalStatusType statusType = makeNomenclaturalStatus(id, state, nomZusatzString); + if(statusType!=null){ + NomenclaturalStatus status = NomenclaturalStatus.NewInstance(statusType); + //special case for invalid names where the DB entry contains + //additional information in brackets e.g. "nom. inval. (sine basion.)" + if(statusType.equals(NomenclaturalStatusType.INVALID())){ + Pattern pattern = Pattern.compile("\\((.*?)\\)"); + Matcher matcher = pattern.matcher(nomZusatzString); + if (matcher.find()){ + status.setRuleConsidered(matcher.group(1)); + } + } + name.addStatus(status); + } } - else if(hybString.equals(RedListUtil.HYB_XF)){ - name.setHybridFormula(true); - if(ep1String.contains(RedListUtil.HYB_SIGN)){ - RedListUtil.logMessage(id, "EPI1 has hybrid signs but with flag: "+RedListUtil.HYB_XF, logger); + //hybrid + if(CdmUtils.isNotBlank(hybString)){ + //save hybrid formula + if(CdmUtils.isNotBlank(formelString)){ + Annotation annotation = Annotation.NewDefaultLanguageInstance(formelString); + annotation.setAnnotationType(AnnotationType.TECHNICAL()); + name.addAnnotation(annotation); + } + //more than two hybrids not yet handled by name parser + //TODO: use parser when implemented to fully support hybrids + if(taxNameString.split(RedListUtil.HYB_SIGN).length>2){ + name = BotanicalName.NewInstance(rank); + name.setTitleCache(taxNameString, true); } - else if(ep2String.contains(RedListUtil.HYB_SIGN)){ - String[] split = ep2String.split(RedListUtil.HYB_SIGN); - if(split.length!=2){ - RedListUtil.logMessage(id, "Multiple hybrid signs found in "+ep2String, logger); + else if(hybString.equals(RedListUtil.HYB_X)){ + name.setBinomHybrid(true); + } + else if(hybString.equals(RedListUtil.HYB_G)){ + name.setMonomHybrid(true); + } + else if(hybString.equals(RedListUtil.HYB_XF)){ + name.setHybridFormula(true); + if(ep1String.contains(RedListUtil.HYB_SIGN)){ + RedListUtil.logMessage(id, "EPI1 has hybrid signs but with flag: "+RedListUtil.HYB_XF, logger); + } + else if(ep2String.contains(RedListUtil.HYB_SIGN)){ + String[] split = ep2String.split(RedListUtil.HYB_SIGN); + String hybridFormula1 = ep1String+" "+split[0].trim(); + String hybridFormula2 = ep1String+" "+split[1].trim(); + //check if the specific epithets are from the same genus or not like e.g. EPI2 = pratensis × Lolium multiflorum + String[] secondHybrid = split[1].trim().split(" "); + if(secondHybrid.length>1 && secondHybrid[0].matches("[A-Z].*")){ + hybridFormula2 = split[1]; + } + if(CdmUtils.isNotBlank(ep3String)){ + hybridFormula1 += " "+ep3String; + hybridFormula2 += " "+ep3String; + } + String fullFormula = hybridFormula1+" "+RedListUtil.HYB_SIGN+" "+hybridFormula2; + name = NonViralNameParserImpl.NewInstance().parseFullName(fullFormula, NomenclaturalCode.ICNAFP, rank); } - String hybridFormula1 = ep1String+" "+split[0].trim(); - String hybridFormula2 = ep1String+" "+split[1].trim(); - if(CdmUtils.isNotBlank(ep3String)){ - hybridFormula1 += " "+ep3String; - hybridFormula2 += " "+ep3String; + else if(ep3String.contains(RedListUtil.HYB_SIGN)){ + String[] split = ep3String.split(RedListUtil.HYB_SIGN); + String hybridFormula1 = ep1String+" "+ep2String+" "+split[0]; + String hybridFormula2 = ep1String+" "+ep2String+" "+split[1]; + String fullFormula = hybridFormula1+" "+RedListUtil.HYB_SIGN+" "+hybridFormula2; + name = NonViralNameParserImpl.NewInstance().parseFullName(fullFormula, NomenclaturalCode.ICNAFP, rank); } - String fullFormula = hybridFormula1+" "+RedListUtil.HYB_SIGN+" "+hybridFormula2; - name = NonViralNameParserImpl.NewInstance().parseFullName(fullFormula); } - else if(ep3String.contains(RedListUtil.HYB_SIGN)){ - String[] split = ep3String.split(RedListUtil.HYB_SIGN); - if(split.length!=2){ - RedListUtil.logMessage(id, "Multiple hybrid signs found in "+ep3String, logger); + else if(hybString.equals(RedListUtil.HYB_N)){ + name = NonViralNameParserImpl.NewInstance().parseFullName(taxNameString, NomenclaturalCode.ICNAFP, rank); + } + else if(hybString.equals(RedListUtil.HYB_GF)){ + if(ep1String.contains(RedListUtil.HYB_SIGN)){ + name = NonViralNameParserImpl.NewInstance().parseFullName(ep1String, NomenclaturalCode.ICNAFP, rank); + } + else{ + RedListUtil.logMessage(id, "HYB is "+hybString+" but "+RedListUtil.HYB+" does not contain "+RedListUtil.HYB_SIGN, logger); } - String hybridFormula1 = ep1String+" "+ep2String+" "+split[0]; - String hybridFormula2 = ep1String+" "+ep2String+" "+split[1]; - String fullFormula = hybridFormula1+" "+RedListUtil.HYB_SIGN+" "+hybridFormula2; - name = NonViralNameParserImpl.NewInstance().parseFullName(fullFormula); } - } - else if(hybString.equals(RedListUtil.HYB_N)){ - name = NonViralNameParserImpl.NewInstance().parseFullName(ep1String+" "+ep2String+" nothosubsp. "+ep3String); - } - else if(hybString.equals(RedListUtil.HYB_GF)){ - if(ep1String.contains(RedListUtil.HYB_SIGN)){ - name = NonViralNameParserImpl.NewInstance().parseFullName(ep1String); + else if(hybString.equals(RedListUtil.HYB_XS)){ + //nothing to do } else{ - RedListUtil.logMessage(id, "HYB is "+hybString+" but "+RedListUtil.HYB+" does not contain "+RedListUtil.HYB_SIGN, logger); + logger.error("HYB value "+hybString+" not yet handled"); } } - else if(hybString.equals(RedListUtil.HYB_XS)){ - //nothing to do - } - else{ - logger.error("HYB value "+hybString+" not yet handled"); - } } //add source ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, RedListUtil.NAME_NAMESPACE); @@ -436,8 +466,18 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase name) { + String authorshipCache = name.getAuthorshipCache(); + //FIXME: remove split length check when name parser can parse multiple hybrid parents + if(hybString.equals(RedListUtil.HYB_XF) && name.getTitleCache().split(RedListUtil.HYB_SIGN).length==2){ + if(name.getHybridChildRelations().isEmpty()){ + RedListUtil.logMessage(id, "Hybrid formula but no hybrid child relations: "+name.getTitleCache(), logger); + return; + } + return; + } + if(CdmUtils.isNotBlank(zusatzString)){ authorString = authorString.replace(", "+zusatzString, ""); } @@ -462,29 +502,16 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase taxonBase) { - if(hybString.equals(RedListUtil.HYB_XF)){ - if(HibernateProxyHelper.deproxy(taxonBase.getName(),NonViralName.class).getHybridChildRelations().isEmpty()){ - RedListUtil.logMessage(id, "Hybrid name but no hybrid child relations", logger); - return; - } - return; - } - - + private void checkTaxonConsistency(long id, String taxNameString, String hybString, TaxonBase taxonBase, RedListGefaesspflanzenImportState state) { String nameCache = HibernateProxyHelper.deproxy(taxonBase.getName(), NonViralName.class).getNameCache().trim(); taxNameString = taxNameString.trim(); - taxNameString.replaceAll(" +", " "); + taxNameString = taxNameString.replaceAll(" +", " "); if(taxNameString.endsWith("agg.")){ taxNameString = taxNameString.replace("agg.", "aggr."); } - if(taxNameString.endsWith("aggr.")){ - taxNameString = taxNameString.replaceFirst(" ", " ("); - taxNameString = taxNameString.replace(" aggr.", ") aggr."); - } - if(hybString.equals(RedListUtil.HYB_X)){ + if(hybString.equals(RedListUtil.HYB_X) || hybString.equals(RedListUtil.HYB_N)){ taxNameString = taxNameString.replace(" "+RedListUtil.HYB_SIGN+" ", " "+RedListUtil.HYB_SIGN);//hybrid sign has no space after it in titleCache for binomial hybrids taxNameString = taxNameString.replace(" x ", " "+RedListUtil.HYB_SIGN);//in some cases a standard 'x' is used } @@ -495,26 +522,30 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase Column "+RedListUtil.TAXNAME+": "+nameCache+" <-> "+taxNameString, logger); + RedListUtil.logMessage(id, "Taxon name inconsistent! taxon.nameCache <-> Column "+RedListUtil.TAXNAME+": "+nameCache+" <-> "+taxNameString, logger); } } else{ if(!taxNameString.startsWith(nameCache)){ - RedListUtil.logMessage(id, "Taxon name inconsistent! taxon.titleCache <-> Column "+RedListUtil.TAXNAME+": "+nameCache+" <-> "+taxNameString, logger); + RedListUtil.logMessage(id, "Taxon name inconsistent! taxon.nameCache <-> Column "+RedListUtil.TAXNAME+": "+nameCache+" <-> "+taxNameString, logger); } } } @@ -531,6 +562,9 @@ public class RedListGefaesspflanzenImportNames extends DbImportBase) Rank.GENUS().getVocabulary(), null, RankClass.SpeciesGroup); + } else{ rank = state.getTransformer().getRankByKey(rankStr); }