Implemented guess for rank of uninomials
authorAndreas Müller <a.mueller@bgbm.org>
Mon, 7 Sep 2009 17:49:06 +0000 (17:49 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Mon, 7 Sep 2009 17:49:06 +0000 (17:49 +0000)
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/strategy/parser/NameParserWarningTest.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserImplTest.java

index 7b0e03af9ad3ea7078f2072381bb47efd7f32957..2488e3f6191377b94ac9f652cd13f962d236112c 100644 (file)
@@ -317,7 +317,7 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
            int nameAndSeparatorLength = nameAndSeparator.length();\r
            int fullRefLength = nameToBeFilled.getFullTitleCache().length();\r
            \r
-           if (nameToBeFilled.isProtectedTitleCache() || nameToBeFilled.getRank() == null ){\r
+           if (nameToBeFilled.isProtectedTitleCache() || nameToBeFilled.getParsingProblems().contains(ParserProblem.CheckRank)){\r
                start = Math.max(0, start);\r
                }else{\r
                        if (ref != null && ref.getParsingProblem()!=0){\r
@@ -729,10 +729,10 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
                                } \r
                                //genus\r
                                else {\r
-                                       rank = null;\r
+                                       rank = guessUninomialRank(nameToBeFilled, epi[0]); \r
                                        nameToBeFilled.setRank(rank);\r
                                        nameToBeFilled.setGenusOrUninomial(epi[0]);\r
-                                       nameToBeFilled.addParsingProblem(ParserProblem.CheckUninomial);\r
+                                       nameToBeFilled.addParsingProblem(ParserProblem.CheckRank);\r
                                        nameToBeFilled.setProblemStarts(0);\r
                                        nameToBeFilled.setProblemEnds(epi[0].length());\r
                                }\r
@@ -852,6 +852,47 @@ public class NonViralNameParserImpl extends NonViralNameParserImplRegExBase impl
 \r
        \r
        \r
+       /**\r
+        * Guesses the rank of uninomial depending on the typical endings for ranks\r
+        * @param nameToBeFilled\r
+        * @param string\r
+        */\r
+       private Rank guessUninomialRank(NonViralName nameToBeFilled, String uninomial) {\r
+               Rank result = Rank.GENUS();\r
+               if (nameToBeFilled.isInstanceOf(BotanicalName.class)){\r
+                       if (false){\r
+                               \r
+                       }else if (uninomial.endsWith("phyta") || uninomial.endsWith("mycota") ){  //plants, fungi\r
+                               result = Rank.SECTION_BOTANY();\r
+                       }else if (uninomial.endsWith("bionta")){\r
+                               result = Rank.SUBKINGDOM();  //TODO\r
+                       }else if (uninomial.endsWith("phytina")|| uninomial.endsWith("mycotina")  ){  //plants, fungi\r
+                               result = Rank.SUBSECTION_BOTANY();\r
+                       }else if (uninomial.endsWith("opsida") || uninomial.endsWith("phyceae") || uninomial.endsWith("mycetes")){  //plants, algae, fungi\r
+                               result = Rank.CLASS();\r
+                       }else if (uninomial.endsWith("idae") || uninomial.endsWith("phycidae") || uninomial.endsWith("mycetidae")){ //plants, algae, fungi\r
+                               result = Rank.SUBCLASS();\r
+                       }else if (uninomial.endsWith("ales")){\r
+                               result = Rank.ORDER();\r
+                       }else if (uninomial.endsWith("ineae")){\r
+                               result = Rank.SUBORDER();\r
+                       }else if (uninomial.endsWith("aceae")){\r
+                                       result = Rank.FAMILY();\r
+                       }else if (uninomial.endsWith("oideae")){\r
+                               result = Rank.SUBFAMILY();\r
+                       }else if (uninomial.endsWith("eae")){\r
+                               result = Rank.TRIBE();\r
+                       }else if (uninomial.endsWith("inae")){\r
+                               result = Rank.SUBTRIBE();\r
+                       }else if (uninomial.endsWith("ota")){\r
+                               result = Rank.KINGDOM();  //TODO\r
+                       }\r
+               }else{\r
+                       //\r
+               }\r
+               return result;\r
+       }\r
+\r
        /**\r
         * Parses the fullAuthorString\r
         * @param fullAuthorString\r
index 3b62f9600b25360bb90dfe938d9ed3c69af760b1..f7f51da634ec86aec708270e41378b192fea0d39 100644 (file)
@@ -21,7 +21,7 @@ import org.apache.log4j.Logger;
  * @version 1.0\r
  */\r
 public enum ParserProblem {\r
-       CheckUninomial(WARNING()),\r
+       CheckRank(WARNING()),\r
        CheckDetailOrYear(WARNING()),\r
        NameReferenceSeparation(ERROR()),\r
        UnparsableReferenceTitle(ERROR()),\r
index ffb95ca86cc6b804c567fcde427e3a548046a2ee..df35cb946c719447785dcd6e05de3e09209b6940 100644 (file)
@@ -27,6 +27,7 @@ import org.junit.Test;
  * @version 1.0\r
  */\r
 public class NameParserWarningTest {\r
+       @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(NameParserWarningTest.class);\r
 \r
        /**\r
@@ -67,7 +68,7 @@ public class NameParserWarningTest {
        public void testWarningList() {\r
                List<ParserProblem> list = ParserProblem.warningList(5);\r
                assertEquals("list must include 2 warnings", 2, list.size());\r
-               assertTrue("Warning list should include warning 0", list.contains(ParserProblem.CheckUninomial));\r
+               assertTrue("Warning list should include warning 0", list.contains(ParserProblem.CheckRank));\r
                assertTrue("Warning list should include warning 2", list.contains(ParserProblem.NameReferenceSeparation));\r
        }\r
        \r
index df4a78aaf927091991a69f18816d4831c2035096..6fb430825727354b27e694100815677fe09dd1ea 100644 (file)
@@ -17,7 +17,6 @@ import static org.junit.Assert.assertTrue;
 \r
 import java.lang.reflect.InvocationTargetException;\r
 import java.lang.reflect.Method;\r
-import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -567,7 +566,7 @@ public class NonViralNameParserImplTest {
                assertTrue(nameGenusUnparse.hasProblem());\r
                list = nameGenusUnparse.getParsingProblems();\r
                assertTrue("Problem detail", list.contains(ParserProblem.CheckDetailOrYear));\r
-               assertTrue("Problem uninomial", list.contains(ParserProblem.CheckUninomial));\r
+               assertTrue("Problem uninomial", list.contains(ParserProblem.CheckRank));\r
                assertEquals(strGenusUnparse, nameGenusUnparse.getFullTitleCache());\r
                assertEquals(0, nameGenusUnparse.getProblemStarts()); \r
                assertEquals(19, nameGenusUnparse.getProblemEnds());   \r