bugfix for name parsing of repeatedly parsed uninomials
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 16 Sep 2009 13:33:30 +0000 (13:33 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 16 Sep 2009 13:33:30 +0000 (13:33 +0000)
.gitattributes
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IParsable.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/ReferenceBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/INonViralNameParser.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImpl.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/name/TaxonNameBaseTest.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/ParserProblemTest.java [moved from cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NameParserWarningTest.java with 55% similarity]

index 2834252adb104294ea9fbb34b933b987f397057f..6636007facee0c4bb1f38959c08d8bcffa6bf1d9 100644 (file)
@@ -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
index 8fcd7ed8cb2c9fecf94365ac51cfa7e43bb6db62..d3853aa129526e42c06e135b74dda963b6542ac6 100644 (file)
@@ -38,12 +38,19 @@ public interface IParsable {
        public void setParsingProblem(int hasProblem);\r
        \r
        /**\r
-        * Returns exactly the same int value as the {@link #getHasProblem() getHasProblem} method.  \r
+        * Returns true if any parsing problem (warning or error) exists.  \r
         *  \r
         * @see  #getHasProblem()\r
         */\r
        public boolean hasProblem();\r
        \r
+       /**\r
+        * Returns true, if the specified problem exists. False otherwise.\r
+        * @param problem\r
+        * @return\r
+        */\r
+       public boolean hasProblem(ParserProblem problem);\r
+       \r
        \r
        /**\r
         * Returns a list of all warnings and errors that have been recognized during the parsing\r
@@ -54,9 +61,16 @@ public interface IParsable {
        \r
        /**\r
         * Adds a parsing problem to the list of parsing problems\r
-        * @param warning\r
+        * @param problem\r
         */\r
-       public void addParsingProblem(ParserProblem warning);\r
+       public void addParsingProblem(ParserProblem problem);\r
+       \r
+       /**\r
+        * Removes a parsing problem from the list of parsing problems.\r
+        * If the problem is not in the list or is <code>null</code>, nothing happens.\r
+        * @param warning\r
+        */public void removeParsingProblem(ParserProblem problem);\r
+       \r
        \r
        /**\r
         * Returns the integer value of the position where a parsing problem starts.\r
index de360c118272f7684d292698bf579faaff464fe7..58c9e539bfaec56a52f7ef8a6b34d11fc3438ef6 100644 (file)
@@ -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()
         */
index 578277f0759c11b0574e1deb6775644d3746606d..79ac4368761cfa343a357e2ebf718d5a5ee96f25 100644 (file)
@@ -219,6 +219,13 @@ public abstract class ReferenceBase<S extends IReferenceBaseCacheStrategy> 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<S extends IReferenceBaseCacheStrategy> 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)
index 39f51fe4b1744fb07d18f7337717fe65b776cbfd..d0549e49b50a8715ead3b330fa2b5f979a40258f 100644 (file)
@@ -29,7 +29,7 @@ public interface INonViralNameParser<T extends TaxonNameBase> extends IStrategy
         * @param rank\r
         * @return TaxonNameBase, with rank = Rank.GENUS for all Uninomials  \r
         */\r
-       public T parseSimpleName(String simpleName, Rank rank);\r
+       public T parseSimpleName(String simpleName, NomenclaturalCode code, Rank rank);\r
 \r
        /**\r
         * Parses the taxon name String and returns a TaxonNameBase. \r
index 32e86f906de2b7de46185f4543fc21e1a4d01d7d..e726ffe10f6a281ade8e7971efe79122de5ddd16 100644 (file)
@@ -56,23 +56,28 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
        public static NonViralNameParserImpl NewInstance(){\r
                return new NonViralNameParserImpl();\r
        }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.strategy.ITaxonNameParser#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.Rank)\r
-        */\r
-       public NonViralName parseSimpleName(String simpleName, Rank rank){\r
-               //TODO\r
-               logger.warn("parseSimpleName() not yet implemented. Uses parseFullName() instead");\r
-               return parseFullName(simpleName, null, rank);\r
-       }\r
-\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.strategy.ITaxonNameParser#parseSubGenericSimpleName(java.lang.String)\r
         */\r
        public NonViralName parseSimpleName(String simpleName){\r
-               return parseSimpleName(simpleName, null);\r
+               return parseSimpleName(simpleName, null, null);\r
+       }\r
+       \r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.strategy.parser.INonViralNameParser#parseSimpleName(java.lang.String, eu.etaxonomy.cdm.model.name.NomenclaturalCode, eu.etaxonomy.cdm.model.name.Rank)\r
+        */\r
+       public NonViralName parseSimpleName(String simpleName, NomenclaturalCode code, Rank rank){\r
+               //"parseSimpleName() not yet implemented. Uses parseFullName() instead");\r
+               return parseFullName(simpleName, code, rank);\r
+       }\r
+\r
+       public void parseSimpleName(NonViralName nameToBeFilled, String simpleNameString, Rank rank, boolean makeEmpty){\r
+               //"parseSimpleName() not yet implemented. Uses parseFullName() instead");\r
+               parseFullName(nameToBeFilled, simpleNameString, rank, makeEmpty);\r
        }\r
+\r
        \r
        public NonViralName getNonViralNameInstance(String fullString, NomenclaturalCode code){\r
                return getNonViralNameInstance(fullString, code, null);\r
@@ -693,15 +698,18 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
        \r
        public void parseFullName(NonViralName nameToBeFilled, String fullNameString, Rank rank, boolean makeEmpty) {\r
                //TODO prol. etc.\r
-               \r
+               boolean hasCheckRankProblem = false; //was rank guessed in a previous parsing process?\r
                if (nameToBeFilled == null){\r
                        logger.warn("name is null!");\r
+               }else{\r
+                       hasCheckRankProblem = nameToBeFilled.hasProblem(ParserProblem.CheckRank);\r
                }\r
                String authorString = null;\r
                \r
                if (fullNameString == null){\r
                        return;\r
                }\r
+               \r
                if (makeEmpty){\r
                        makeEmpty(nameToBeFilled);\r
                }\r
@@ -723,11 +731,11 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
                    }\r
                    else if (genusOrSupraGenusPattern.matcher(fullNameString).matches()){\r
                        //supraGeneric\r
-                               if (rank != null && (rank.isSupraGeneric()|| rank.isGenus())){\r
+                               if (rank != null && ! hasCheckRankProblem  && (rank.isSupraGeneric()|| rank.isGenus())){\r
                                        nameToBeFilled.setRank(rank);\r
                                        nameToBeFilled.setGenusOrUninomial(epi[0]);\r
                                } \r
-                               //genus\r
+                               //genus or guess rank\r
                                else {\r
                                        rank = guessUninomialRank(nameToBeFilled, epi[0]); \r
                                        nameToBeFilled.setRank(rank);\r
index e106907c9f913e57bc7d8f2f09bdbf2702e3b7e4..73356b9f579a0143795dec2b5e716a961a8e138e 100644 (file)
@@ -123,14 +123,30 @@ public enum ParserProblem {
         * @param warning\r
         * @return\r
         */\r
-       public static int addWarning(int originalWarnings, ParserProblem newWarning) {\r
-               return originalWarnings | 1 << newWarning.ordinal();\r
+       public static int addProblem(int originalProblems, ParserProblem newProblem) {\r
+               if (newProblem == null){\r
+                       return originalProblems;\r
+               }else{\r
+                       return originalProblems | 1 << newProblem.ordinal();\r
+               }\r
        }\r
        \r
-       public static int addWarnings(int hasProblem, int newWarnings) {\r
-               return hasProblem | newWarnings;\r
+       public static int addProblems(int hasProblem, int newProblems) {\r
+               return hasProblem | newProblems;\r
        }\r
-       \r
+\r
+       /**\r
+        * @param parsingProblem\r
+        * @param problemToRemove\r
+        * @return\r
+        */\r
+       public static int removeProblem(int originalProblems, ParserProblem problemToRemove) {\r
+               if (problemToRemove == null){\r
+                       return originalProblems;\r
+               }else{\r
+                       return originalProblems & ~(1 << problemToRemove.ordinal());\r
+               }\r
+       }       \r
 \r
        \r
        \r
index c6a033bb031a7ce6c4ffa05cbc30f1e3bc7dc322..ceb35c801b0dcb483f789e11715fb07cbed6f8c7 100644 (file)
@@ -497,14 +497,6 @@ public class TaxonNameBaseTest {
                logger.warn("not yet implemented");\r
        }\r
 \r
-       /**\r
-        * Test method for {@link eu.etaxonomy.cdm.model.name.TaxonNameBase#getParsingProblems()}.\r
-        */\r
-       @Test\r
-       public void testGetProblems() {\r
-               logger.warn("not yet implemented");\r
-       }\r
-\r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.model.name.TaxonNameBase#getReferenceYear()}.\r
         */\r
index afcedb63cf80cbf1c75125664a6d5bbe02a59b01..434338a23089af766e2ecfae85bab5570045bc33 100644 (file)
@@ -124,7 +124,36 @@ public class NonViralNameParserImplTest {
         */\r
        @Test\r
        public final void testParseSimpleName() {\r
-               logger.warn("Not yet implemented"); // TODO\r
+               \r
+               //Uninomials\r
+               ZoologicalName milichiidae = (ZoologicalName)parser.parseSimpleName("Milichiidae", NomenclaturalCode.ICZN, null);\r
+               assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank());\r
+               BotanicalName crepidinae = (BotanicalName)parser.parseSimpleName("Crepidinae", NomenclaturalCode.ICBN, null);\r
+               assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank());\r
+               BotanicalName abies = (BotanicalName)parser.parseSimpleName("Abies", NomenclaturalCode.ICBN, null);\r
+               assertEquals("Family rank expected", Rank.GENUS(), abies.getRank());\r
+               \r
+               abies.addParsingProblem(ParserProblem.CheckRank);\r
+               parser.parseSimpleName(abies, "Abies", abies.getRank(), true);\r
+               assertTrue(abies.getParsingProblems().contains(ParserProblem.CheckRank));\r
+               \r
+               BotanicalName rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);\r
+               assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));\r
+               assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+               parser.parseSimpleName(rosa, "Rosaceaex", abies.getRank(), true);\r
+               assertEquals("Rosaceaex have rank genus", Rank.GENUS(), rosa.getRank());\r
+               assertTrue("Rosaceaex must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+       \r
+               //repeat but remove warning after first parse\r
+               rosa = (BotanicalName)parser.parseSimpleName("Rosaceae", NomenclaturalCode.ICBN, null);\r
+               assertTrue("Rosaceae have rank family", rosa.getRank().equals(Rank.FAMILY()));\r
+               assertTrue("Rosaceae must have a rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+               rosa.removeParsingProblem(ParserProblem.CheckRank);\r
+               parser.parseSimpleName(rosa, "Rosaceaex", rosa.getRank(), true);\r
+               assertEquals("Rosaceaex have rank family", Rank.FAMILY(), rosa.getRank());\r
+               assertFalse("Rosaceaex must have no rank warning", rosa.hasProblem(ParserProblem.CheckRank));\r
+\r
+               \r
        }\r
 \r
        /**\r
@@ -228,15 +257,11 @@ public class NonViralNameParserImplTest {
                NonViralName nameNull = parser.parseFullName(strNameNull);\r
                assertNull(nameNull);\r
                \r
-               //Uninomials\r
-               ZoologicalName milichiidae = (ZoologicalName)parser.parseFullName("Milichiidae", NomenclaturalCode.ICZN, null);\r
-               assertEquals("Family rank expected", Rank.FAMILY(), milichiidae.getRank());\r
-               BotanicalName crepidinae = (BotanicalName)parser.parseFullName("Crepidinae", NomenclaturalCode.ICBN, null);\r
-               assertEquals("Family rank expected", Rank.SUBTRIBE(), crepidinae.getRank());\r
-               BotanicalName abies = (BotanicalName)parser.parseFullName("Abies", NomenclaturalCode.ICBN, null);\r
-               assertEquals("Family rank expected", Rank.GENUS(), abies.getRank());\r
-               \r
-               \r
+               //some authors\r
+               String fullNameString = "Abies alba (Greuther & L'Hiver & al. ex Müller & Schmidt)Clark ex Ciardelli"; \r
+               BotanicalName authorname = (BotanicalName)parser.parseFullName(fullNameString);\r
+               assertFalse(authorname.hasProblem());\r
+               assertEquals("Basionym author should have 3 authors", 3, ((Team)authorname.getBasionymAuthorTeam()).getTeamMembers().size());\r
        }\r
        \r
        private void testName_StringNomcodeRank(Method parseMethod) \r
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 df35cb946c719447785dcd6e05de3e09209b6940..d7a07c7e0ca8e9a260ff061a69e077caa5296cee 100644 (file)
@@ -12,6 +12,7 @@ package eu.etaxonomy.cdm.strategy.parser;
 \r
 import static org.junit.Assert.*;\r
 \r
+import java.util.BitSet;\r
 import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -26,9 +27,9 @@ import org.junit.Test;
  * @created 04.09.2009\r
  * @version 1.0\r
  */\r
-public class NameParserWarningTest {\r
+public class ParserProblemTest {\r
        @SuppressWarnings("unused")\r
-       private static final Logger logger = Logger.getLogger(NameParserWarningTest.class);\r
+       private static final Logger logger = Logger.getLogger(ParserProblemTest.class);\r
 \r
        /**\r
         * @throws java.lang.Exception\r
@@ -73,18 +74,39 @@ public class NameParserWarningTest {
        }\r
        \r
        @Test\r
-       public void testAddWarning(){\r
-               int warning = ParserProblem.addWarning(0, ParserProblem.NameReferenceSeparation);\r
+       public void testAddProblem(){\r
+               int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation);\r
                int expected = (int)Math.pow(2, ParserProblem.NameReferenceSeparation.ordinal()) ;\r
                assertEquals("Unexpected value for addWarning", expected,warning);\r
-               warning = ParserProblem.addWarning(warning, ParserProblem.CheckDetailOrYear);\r
+               warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear);\r
                expected = expected + (int)Math.pow(2, ParserProblem.CheckDetailOrYear.ordinal()) ;\r
                assertEquals("Unexpected value for addWarning", expected,warning);\r
        }\r
        \r
        @Test\r
-       public void testAddWarnings(){\r
-               assertEquals("Unexpected value for addWarning", 23, ParserProblem.addWarnings(21, 6));\r
+       public void testRemoveProblem(){\r
+               int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation);\r
+               warning = ParserProblem.addProblem(warning, ParserProblem.CheckRank);\r
+               warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear);\r
+               assertEquals("Number of problems must be 3", 3, ParserProblem.warningList(warning).size());\r
+               assertTrue("Check Rank must be a problem", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank));\r
+               \r
+               warning = ParserProblem.removeProblem(warning, ParserProblem.CheckRank);\r
+               assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size());\r
+               assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank));\r
+               \r
+               warning = ParserProblem.removeProblem(warning, ParserProblem.CheckRank);\r
+               assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size());\r
+               assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank));\r
+\r
+               warning = ParserProblem.removeProblem(warning, null);\r
+               assertEquals("Number of problems must be 2", 2, ParserProblem.warningList(warning).size());\r
+               assertFalse("Check Rank must not be a problem anymore", ParserProblem.warningList(warning).contains(ParserProblem.CheckRank));\r
+       }\r
+       \r
+       @Test\r
+       public void testAddProblems(){\r
+               assertEquals("Unexpected value for addWarning", 23, ParserProblem.addProblems(21, 6));\r
        }\r
        \r
        @Test\r
@@ -99,8 +121,8 @@ public class NameParserWarningTest {
        \r
        @Test\r
        public void testHasError() {\r
-               int warning = ParserProblem.addWarning(0, ParserProblem.NameReferenceSeparation);\r
-               warning = ParserProblem.addWarning(warning, ParserProblem.CheckDetailOrYear);\r
+               int warning = ParserProblem.addProblem(0, ParserProblem.NameReferenceSeparation);\r
+               warning = ParserProblem.addProblem(warning, ParserProblem.CheckDetailOrYear);\r
                assertTrue("warning list with NameReferenceSeparation must have error", ParserProblem.hasError(warning));\r
        }\r
 \r