From b314f1a8ec880321188683c26628232b5cc24247 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andreas=20M=C3=BCller?= Date: Wed, 16 Sep 2009 13:33:30 +0000 Subject: [PATCH] bugfix for name parsing of repeatedly parsed uninomials --- .gitattributes | 2 +- .../etaxonomy/cdm/model/common/IParsable.java | 20 +++++++-- .../cdm/model/name/TaxonNameBase.java | 25 +++++++++-- .../cdm/model/reference/ReferenceBase.java | 16 ++++++- .../strategy/parser/INonViralNameParser.java | 2 +- .../parser/NonViralNameParserImpl.java | 36 +++++++++------ .../cdm/strategy/parser/ParserProblem.java | 26 ++++++++--- .../cdm/model/name/TaxonNameBaseTest.java | 8 ---- .../parser/NonViralNameParserImplTest.java | 45 ++++++++++++++----- ...arningTest.java => ParserProblemTest.java} | 40 +++++++++++++---- 10 files changed, 164 insertions(+), 56 deletions(-) rename cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/{NameParserWarningTest.java => ParserProblemTest.java} (55%) diff --git a/.gitattributes b/.gitattributes index 2834252adb..6636007fac 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1685,8 +1685,8 @@ cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/name/ZoologicalNameCa cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/cache/reference/CdDvdDefaultCacheStrategyTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/match/DefaultMatchStrategyTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/merge/DefaultMergeStrategyTest.java -text -cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NameParserWarningTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java -text +cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestFullReferenceParser.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestModel.java -text cdmlib-model/src/test/java/eu/etaxonomy/cdm/test/function/TestSpecimen.java -text diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java index 8fcd7ed8cb..d3853aa129 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java @@ -38,12 +38,19 @@ public interface IParsable { public void setParsingProblem(int hasProblem); /** - * Returns exactly the same int value as the {@link #getHasProblem() getHasProblem} method. + * Returns true if any parsing problem (warning or error) exists. * * @see #getHasProblem() */ public boolean hasProblem(); + /** + * Returns true, if the specified problem exists. False otherwise. + * @param problem + * @return + */ + public boolean hasProblem(ParserProblem problem); + /** * Returns a list of all warnings and errors that have been recognized during the parsing @@ -54,9 +61,16 @@ public interface IParsable { /** * Adds a parsing problem to the list of parsing problems - * @param warning + * @param problem */ - public void addParsingProblem(ParserProblem warning); + public void addParsingProblem(ParserProblem problem); + + /** + * Removes a parsing problem from the list of parsing problems. + * If the problem is not in the list or is null, nothing happens. + * @param warning + */public void removeParsingProblem(ParserProblem problem); + /** * Returns the integer value of the position where a parsing problem starts. diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java index de360c1182..58c9e539bf 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java @@ -804,15 +804,22 @@ public void addRelationshipToName(TaxonNameBase toName, NameRelationshipType typ /* (non-Javadoc) * @see eu.etaxonomy.cdm.model.common.IParsable#addProblem(eu.etaxonomy.cdm.strategy.parser.NameParserWarning) */ - public void addParsingProblem(ParserProblem warning){ - parsingProblem = ParserProblem.addWarning(parsingProblem, warning); + public void addParsingProblem(ParserProblem problem){ + parsingProblem = ParserProblem.addProblem(parsingProblem, problem); + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.common.IParsable#removeParsingProblem(eu.etaxonomy.cdm.strategy.parser.ParserProblem) + */ + public void removeParsingProblem(ParserProblem problem) { + parsingProblem = ParserProblem.removeProblem(parsingProblem, problem); } /** * @param warnings */ - public void addParsingProblems(int warnings){ - parsingProblem = ParserProblem.addWarnings(parsingProblem, warnings); + public void addParsingProblems(int problems){ + parsingProblem = ParserProblem.addProblems(parsingProblem, problems); } /* (non-Javadoc) @@ -822,6 +829,16 @@ public void addRelationshipToName(TaxonNameBase toName, NameRelationshipType typ return parsingProblem != 0; } + + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.common.IParsable#hasProblem(eu.etaxonomy.cdm.strategy.parser.ParserProblem) + */ + public boolean hasProblem(ParserProblem problem) { + return getParsingProblems().contains(problem); + } + + /* (non-Javadoc) * @see eu.etaxonomy.cdm.model.common.IParsable#problemStarts() */ diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceBase.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceBase.java index 578277f075..79ac436876 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceBase.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceBase.java @@ -219,6 +219,13 @@ public abstract class ReferenceBase exten return parsingProblem != 0; } + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.common.IParsable#hasProblem(eu.etaxonomy.cdm.strategy.parser.ParserProblem) + */ + public boolean hasProblem(ParserProblem problem) { + return getParsingProblems().contains(problem); + } + /* (non-Javadoc) * @see eu.etaxonomy.cdm.model.common.IParsable#problemStarts() @@ -252,7 +259,14 @@ public abstract class ReferenceBase exten * @see eu.etaxonomy.cdm.model.common.IParsable#addProblem(eu.etaxonomy.cdm.strategy.parser.NameParserWarning) */ public void addParsingProblem(ParserProblem warning){ - parsingProblem = ParserProblem.addWarning(parsingProblem, warning); + parsingProblem = ParserProblem.addProblem(parsingProblem, warning); + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.model.common.IParsable#removeParsingProblem(eu.etaxonomy.cdm.strategy.parser.ParserProblem) + */ + public void removeParsingProblem(ParserProblem problem) { + parsingProblem = ParserProblem.removeProblem(parsingProblem, problem); } /* (non-Javadoc) diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/INonViralNameParser.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/INonViralNameParser.java index 39f51fe4b1..d0549e49b5 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/INonViralNameParser.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/INonViralNameParser.java @@ -29,7 +29,7 @@ public interface INonViralNameParser extends IStrategy * @param rank * @return TaxonNameBase, with rank = Rank.GENUS for all Uninomials */ - public T parseSimpleName(String simpleName, Rank rank); + public T parseSimpleName(String simpleName, NomenclaturalCode code, Rank rank); /** * Parses the taxon name String and returns a TaxonNameBase. diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImpl.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImpl.java index 32e86f906d..e726ffe10f 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImpl.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImpl.java @@ -56,23 +56,28 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl public static NonViralNameParserImpl NewInstance(){ return new NonViralNameParserImpl(); } - - /* (non-Javadoc) - * @see eu.etaxonomy.cdm.strategy.ITaxonNameParser#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank) - */ - public NonViralName parseSimpleName(String simpleName, Rank rank){ - //TODO - logger.warn("parseSimpleName() not yet implemented. Uses parseFullName() instead"); - return parseFullName(simpleName, null, rank); - } - /* (non-Javadoc) * @see eu.etaxonomy.cdm.strategy.ITaxonNameParser#parseSubGenericSimpleName(java.lang.String) */ public NonViralName parseSimpleName(String simpleName){ - return parseSimpleName(simpleName, null); + return parseSimpleName(simpleName, null, null); + } + + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.strategy.parser.INonViralNameParser#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.NomenclaturalCode, eu.etaxonomy.cdm.model.name.Rank) + */ + public NonViralName parseSimpleName(String simpleName, NomenclaturalCode code, Rank rank){ + //"parseSimpleName() not yet implemented. Uses parseFullName() instead"); + return parseFullName(simpleName, code, rank); + } + + public void parseSimpleName(NonViralName nameToBeFilled, String simpleNameString, Rank rank, boolean makeEmpty){ + //"parseSimpleName() not yet implemented. Uses parseFullName() instead"); + parseFullName(nameToBeFilled, simpleNameString, rank, makeEmpty); } + public NonViralName getNonViralNameInstance(String fullString, NomenclaturalCode code){ return getNonViralNameInstance(fullString, code, null); @@ -693,15 +698,18 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl public void parseFullName(NonViralName nameToBeFilled, String fullNameString, Rank rank, boolean makeEmpty) { //TODO prol. etc. - + boolean hasCheckRankProblem = false; //was rank guessed in a previous parsing process? if (nameToBeFilled == null){ logger.warn("name is null!"); + }else{ + hasCheckRankProblem = nameToBeFilled.hasProblem(ParserProblem.CheckRank); } String authorString = null; if (fullNameString == null){ return; } + if (makeEmpty){ makeEmpty(nameToBeFilled); } @@ -723,11 +731,11 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl } else if (genusOrSupraGenusPattern.matcher(fullNameString).matches()){ //supraGeneric - if (rank != null && (rank.isSupraGeneric()|| rank.isGenus())){ + if (rank != null && ! hasCheckRankProblem && (rank.isSupraGeneric()|| rank.isGenus())){ nameToBeFilled.setRank(rank); nameToBeFilled.setGenusOrUninomial(epi[0]); } - //genus + //genus or guess rank else { rank = guessUninomialRank(nameToBeFilled, epi[0]); nameToBeFilled.setRank(rank); diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java index e106907c9f..73356b9f57 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java @@ -123,14 +123,30 @@ public enum ParserProblem { * @param warning * @return */ - public static int addWarning(int originalWarnings, ParserProblem newWarning) { - return originalWarnings | 1 << newWarning.ordinal(); + public static int addProblem(int originalProblems, ParserProblem newProblem) { + if (newProblem == null){ + return originalProblems; + }else{ + return originalProblems | 1 << newProblem.ordinal(); + } } - public static int addWarnings(int hasProblem, int newWarnings) { - return hasProblem | newWarnings; + public static int addProblems(int hasProblem, int newProblems) { + return hasProblem | newProblems; } - + + /** + * @param parsingProblem + * @param problemToRemove + * @return + */ + public static int removeProblem(int originalProblems, ParserProblem problemToRemove) { + if (problemToRemove == null){ + return originalProblems; + }else{ + return originalProblems & ~(1 << problemToRemove.ordinal()); + } + } diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/name/TaxonNameBaseTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/name/TaxonNameBaseTest.java index c6a033bb03..ceb35c801b 100644 --- a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/name/TaxonNameBaseTest.java +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/name/TaxonNameBaseTest.java @@ -497,14 +497,6 @@ public class TaxonNameBaseTest { logger.warn("not yet implemented"); } - /** - * Test method for {@link eu.etaxonomy.cdm.model.name.TaxonNameBase#getParsingProblems()}. - */ - @Test - public void testGetProblems() { - logger.warn("not yet implemented"); - } - /** * Test method for {@link eu.etaxonomy.cdm.model.name.TaxonNameBase#getReferenceYear()}. */ diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java index afcedb63cf..434338a230 100644 --- a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java @@ -124,7 +124,36 @@ public class NonViralNameParserImplTest { */ @Test public final void testParseSimpleName() { - logger.warn("Not yet implemented"); // TODO + + //Uninomials + ZoologicalName milichiidae = (ZoologicalName)parser.parseSimpleName("Milichiidae", NomenclaturalCode.ICZN, null); + assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank()); + BotanicalName crepidinae = (BotanicalName)parser.parseSimpleName("Crepidinae", NomenclaturalCode.ICBN, null); + assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank()); + BotanicalName abies = (BotanicalName)parser.parseSimpleName("Abies", NomenclaturalCode.ICBN, null); + assertEquals("Family rank expected", Rank.GENUS(), abies.getRank()); + + abies.addParsingProblem(ParserProblem.CheckRank); + parser.parseSimpleName(abies, "Abies", abies.getRank(), true); + assertTrue(abies.getParsingProblems().contains(ParserProblem.CheckRank)); + + BotanicalName rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null); + assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY())); + assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank)); + parser.parseSimpleName(rosa, "Rosaceaex", abies.getRank(), true); + assertEquals("Rosaceaex have rank genus", Rank.GENUS(), rosa.getRank()); + assertTrue("Rosaceaex must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank)); + + //repeat but remove warning after first parse + rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null); + assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY())); + assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank)); + rosa.removeParsingProblem(ParserProblem.CheckRank); + parser.parseSimpleName(rosa, "Rosaceaex", rosa.getRank(), true); + assertEquals("Rosaceaex have rank family", Rank.FAMILY(), rosa.getRank()); + assertFalse("Rosaceaex must have no rank warning", rosa.hasProblem(ParserProblem.CheckRank)); + + } /** @@ -228,15 +257,11 @@ public class NonViralNameParserImplTest { NonViralName nameNull = parser.parseFullName(strNameNull); assertNull(nameNull); - //Uninomials - ZoologicalName milichiidae = (ZoologicalName)parser.parseFullName("Milichiidae", NomenclaturalCode.ICZN, null); - assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank()); - BotanicalName crepidinae = (BotanicalName)parser.parseFullName("Crepidinae", NomenclaturalCode.ICBN, null); - assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank()); - BotanicalName abies = (BotanicalName)parser.parseFullName("Abies", NomenclaturalCode.ICBN, null); - assertEquals("Family rank expected", Rank.GENUS(), abies.getRank()); - - + //some authors + String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex Müller & Schmidt)Clark ex Ciardelli"; + BotanicalName authorname = (BotanicalName)parser.parseFullName(fullNameString); + assertFalse(authorname.hasProblem()); + assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getBasionymAuthorTeam()).getTeamMembers().size()); } private void testName_StringNomcodeRank(Method parseMethod) diff --git a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NameParserWarningTest.java b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java similarity index 55% rename from cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NameParserWarningTest.java rename to cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java index df35cb946c..d7a07c7e0c 100644 --- a/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NameParserWarningTest.java +++ b/cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java @@ -12,6 +12,7 @@ package eu.etaxonomy.cdm.strategy.parser; import static org.junit.Assert.*; +import java.util.BitSet; import java.util.List; import org.apache.log4j.Logger; @@ -26,9 +27,9 @@ import org.junit.Test; * @created 04.09.2009 * @version 1.0 */ -public class NameParserWarningTest { +public class ParserProblemTest { @SuppressWarnings("unused") - private static final Logger logger = Logger.getLogger(NameParserWarningTest.class); + private static final Logger logger = Logger.getLogger(ParserProblemTest.class); /** * @throws java.lang.Exception @@ -73,18 +74,39 @@ public class NameParserWarningTest { } @Test - public void testAddWarning(){ - int warning = ParserProblem.addWarning(0, ParserProblem.NameReferenceSeparation); + public void testAddProblem(){ + int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation); int expected = (int)Math.pow(2, ParserProblem.NameReferenceSeparation.ordinal()) ; assertEquals("Unexpected value for addWarning", expected,warning); - warning = ParserProblem.addWarning(warning, ParserProblem.CheckDetailOrYear); + warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear); expected = expected + (int)Math.pow(2, ParserProblem.CheckDetailOrYear.ordinal()) ; assertEquals("Unexpected value for addWarning", expected,warning); } @Test - public void testAddWarnings(){ - assertEquals("Unexpected value for addWarning", 23, ParserProblem.addWarnings(21, 6)); + public void testRemoveProblem(){ + int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation); + warning = ParserProblem.addProblem(warning, ParserProblem.CheckRank); + warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear); + assertEquals("Number of problems must be 3", 3, ParserProblem.warningList(warning).size()); + assertTrue("Check Rank must be a problem", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank)); + + warning = ParserProblem.removeProblem(warning, ParserProblem.CheckRank); + assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size()); + assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank)); + + warning = ParserProblem.removeProblem(warning, ParserProblem.CheckRank); + assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size()); + assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank)); + + warning = ParserProblem.removeProblem(warning, null); + assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size()); + assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank)); + } + + @Test + public void testAddProblems(){ + assertEquals("Unexpected value for addWarning", 23, ParserProblem.addProblems(21, 6)); } @Test @@ -99,8 +121,8 @@ public class NameParserWarningTest { @Test public void testHasError() { - int warning = ParserProblem.addWarning(0, ParserProblem.NameReferenceSeparation); - warning = ParserProblem.addWarning(warning, ParserProblem.CheckDetailOrYear); + int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation); + warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear); assertTrue("warning list with NameReferenceSeparation must have error", ParserProblem.hasError(warning)); } -- 2.34.1