bugfix for TimePeriod parser and toString #2161
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 23 Mar 2011 20:49:55 +0000 (20:49 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 23 Mar 2011 20:49:55 +0000 (20:49 +0000)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/TimePeriod.java
cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/common/TimePeriodTest.java

index 1af3ddf19273be6ec7af0427be6c7d458864cbd7..d2e5b671d5149a22b44297ad65c17482cc3cd216 100644 (file)
@@ -266,6 +266,11 @@ public class TimePeriod implements Cloneable, Serializable {
        }
        
        /**
+        * For time periods that need to store more information than the one
+        * that can be stored in <code>start</code> and <code>end</code>.
+        * If free text is not <code>null</null> {@link #toString()} will always
+        * return the free text value.
+        * <BR>Use {@link #toString()} for public use.
         * @return the freeText
         */
        protected String getFreeText() {
@@ -274,6 +279,7 @@ public class TimePeriod implements Cloneable, Serializable {
 
 
        /**
+        * Use {@link #parseSingleDate(String)} for public use.
         * @param freeText the freeText to set
         */
        protected void setFreeText(String freeText) {
@@ -454,15 +460,18 @@ public class TimePeriod implements Cloneable, Serializable {
                }
                periodString = periodString.trim();
                
-               result.setFreeText(periodString);
+               result.setFreeText(null);
                
                //case "1806"[1807];
                if (uncorrectYearPatter.matcher(periodString).matches()){
+                       result.setFreeText(periodString);
                        String realYear = periodString.split("\\[")[1];
                        realYear = realYear.replace("]", "");
                        result.setStartYear(Integer.valueOf(realYear));
+                       result.setFreeText(periodString);
                //case fl. 1806 or c. 1806 or fl. 1806?
                }else if(prefixedYearPattern.matcher(periodString).matches()){
+                       result.setFreeText(periodString);
                        Matcher yearMatcher = firstYearPattern.matcher(periodString);
                        yearMatcher.find();
                        String startYear = yearMatcher.group();
@@ -498,9 +507,11 @@ public class TimePeriod implements Cloneable, Serializable {
                                        result.setEnd(dtEnd);
                                } catch (IllegalArgumentException e) {
                                        //logger.warn(e.getMessage());
-                                       //use freetext instead
+                                       result.setFreeText(periodString);
                                }
                        }
+               }else{
+                       result.setFreeText(periodString);
                }
                return result;
        }
@@ -574,6 +585,12 @@ public class TimePeriod implements Cloneable, Serializable {
        
 //**************************** to String ****************************************      
        
+       /** 
+        * Returns the {@link #getFreeText()} value if free text is not <code>null</code>.
+        * Otherwise the concatenation of <code>start</code> and <code>end</code> is returned. 
+        * 
+        * @see java.lang.Object#toString()
+        */
        public String toString(){
                String result = null;
                DateTimeFormatter formatter = new TimePeriodPartialFormatter();
index 4dc28cfddec45145dd8de97dcf5e799162b77b51..478f7278f4b16d1f355a009ec14a456bb935930b 100644 (file)
@@ -33,10 +33,10 @@ import org.junit.Test;
 public class TimePeriodTest {\r
        private static final Logger logger = Logger.getLogger(TimePeriodTest.class);\r
        \r
-       TimePeriod onlyStartYear;\r
-       TimePeriod onlyEndYear;\r
-       TimePeriod startAndEndYear;\r
-       TimePeriod noStartAndEndYear;\r
+       private TimePeriod onlyStartYear;\r
+       private TimePeriod onlyEndYear;\r
+       private TimePeriod startAndEndYear;\r
+       private TimePeriod noStartAndEndYear;\r
        \r
        \r
        /**\r
@@ -179,33 +179,48 @@ public class TimePeriodTest {
                Assert.assertNotNull("Time period must be created",tp);\r
        }\r
 \r
-       @Ignore\r
+//     @Ignore\r
        @Test\r
        public void testSetStart(){\r
                Partial startDate = new Partial().with(DateTimeFieldType.year(), 2010)\r
                                .with(DateTimeFieldType.monthOfYear(), 12)\r
                                .with(DateTimeFieldType.dayOfMonth(), 16);\r
+               Partial newStartDate = new Partial().with(DateTimeFieldType.year(), 1984)\r
+                       .with(DateTimeFieldType.monthOfYear(), 12)\r
+                       .with(DateTimeFieldType.dayOfMonth(), 14);\r
+\r
                TimePeriod tp = TimePeriod.NewInstance(startDate);\r
-               \r
                String startString = tp.toString();\r
-               \r
-               Partial partial = new Partial().with(DateTimeFieldType.year(), 1984)\r
-                               .with(DateTimeFieldType.monthOfYear(), 12)\r
-                               .with(DateTimeFieldType.dayOfMonth(), 14);\r
-               \r
-               tp.setStart(partial);\r
+               assertNull("Freetext should be not set", tp.getFreeText());\r
+               tp.setStart(newStartDate);\r
                String changedString = tp.toString();\r
-               \r
                Assert.assertTrue("Setting the partial should change the string representation of the TimePeriod", !startString.equals(changedString));\r
                \r
                //\r
-               tp = TimePeriod.parseString("15.12.1730");\r
-               \r
+               tp = TimePeriod.parseString("1752");\r
+               assertNull("Freetext should be not set", tp.getFreeText());\r
                startString = tp.toString();\r
-               tp.setStart(partial);\r
+               tp.setStart(newStartDate);\r
                changedString = tp.toString();\r
-                               \r
                Assert.assertTrue("Setting a partial for a parsed time period should change the string representation of the TimePeriod ", !startString.equals(changedString));\r
+\r
+               //\r
+               tp = TimePeriod.parseString("any strange date");\r
+               assertNotNull("Freetext should be set", tp.getFreeText());\r
+               startString = tp.toString();\r
+               tp.setStart(newStartDate);\r
+               changedString = tp.toString();\r
+               Assert.assertEquals("Setting a partial for a time period having the freetext set should not change the string representation of the TimePeriod  ", startString, changedString);\r
+\r
+               \r
+               //\r
+//             tp = TimePeriod.parseString("15.12.1730"); //TODO currently not parsed\r
+//             \r
+//             startString = tp.toString();\r
+//             tp.setStart(newStartDate);\r
+//             changedString = tp.toString();\r
+//                             \r
+//             Assert.assertTrue("Setting a partial for a parsed time period should change the string representation of the TimePeriod ", !startString.equals(changedString));\r
        }\r
        \r
        /**\r