TimePeriod toString
authorAndreas Müller <a.mueller@bgbm.org>
Mon, 18 May 2009 16:25:37 +0000 (16:25 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Mon, 18 May 2009 16:25:37 +0000 (16:25 +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 6b061c14450739f944cde76d07796cb200d61e47..64ee540a87ce790d2e5a6b3ebe27e0a1fcb3edf2 100644 (file)
@@ -22,17 +22,18 @@ import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.log4j.Logger;
-import org.apache.lucene.document.Field.Index;
 import org.hibernate.annotations.Type;
 import org.hibernate.search.annotations.Field;
 import org.hibernate.search.annotations.FieldBridge;
-import org.hibernate.search.annotations.Indexed;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeFieldType;
 import org.joda.time.LocalDate;
 import org.joda.time.Partial;
 import org.joda.time.ReadableInstant;
+import org.joda.time.ReadablePartial;
+import org.joda.time.format.DateTimeFormatter;
 
+import eu.etaxonomy.cdm.common.CdmUtils;
 import eu.etaxonomy.cdm.hibernate.PartialBridge;
 import eu.etaxonomy.cdm.jaxb.PartialAdapter;
 
@@ -392,6 +393,99 @@ public class TimePeriod implements Cloneable, Serializable {
                }
        }
        
+       
+       public static TimePeriod parseString(String strPeriod) throws IllegalArgumentException{
+               //FIXME until now only quick and dirty and wrong
+               if (strPeriod == null){
+                       return null;
+               }
+               String[] years = strPeriod.split("-");
+               Partial dtStart = null;
+               Partial dtEnd = null;
+               
+               if (years.length > 2 || years.length <= 0){
+                       throw new IllegalArgumentException("More than 1 '-' in period String: " + strPeriod);
+               }else {
+                       //start
+                       if (! CdmUtils.Nz(years[0]).trim().equals("")){
+                               dtStart = parseSingleDate(years[0]);
+                       }
+                       
+                       //end
+                       if (years.length >= 2 && ! CdmUtils.Nz(years[1]).trim().equals("")){
+                               if (years[1].length()==2 && dtStart != null && dtStart.isSupported(DateTimeFieldType.year())){
+                                       years[1] = String.valueOf(dtStart.get(DateTimeFieldType.year())/100) + years[1];
+                               }
+                               dtEnd = parseSingleDate(years[1]);
+                       }
+               }
+               TimePeriod result = TimePeriod.NewInstance(dtStart, dtEnd);
+               return result;
+       }
+       
+       
+       protected static Partial parseSingleDate(String singleDateString){
+               //FIXME until now only quick and dirty and wrong
+               Partial partial =  new Partial();
+               if (CdmUtils.isNumeric(singleDateString)){
+                       try {
+                               Integer year = Integer.valueOf(singleDateString.trim());
+                               if (year > 1750 && year < 2050){
+                                       partial = partial.with(yearType, year);
+                               }
+                       } catch (NumberFormatException e) {
+                               logger.debug("Not a Integer format in getCalendar()");
+                               throw new IllegalArgumentException(e);
+                       }
+               }
+               return partial;
+
+       }
+       
+       
+       private class TimePeriodPartialFormatter extends DateTimeFormatter{
+               private TimePeriodPartialFormatter(){
+                       super(null, null);
+               }
+               public String print(ReadablePartial partial){
+                       //TODO
+                       String result = "";
+                       String year = (partial.isSupported(yearType))? String.valueOf(partial.get(yearType)):null;
+                       String month = (partial.isSupported(monthType))? String.valueOf(partial.get(monthType)):null;;
+                       String day = (partial.isSupported(dayType))? String.valueOf(partial.get(dayType)):null;;
+                       
+                       if (month !=null){
+                               if (year == null){
+                                       year = "xxxx";
+                               }
+                       }
+                       if (day != null){
+                               if (month == null){
+                                       month = "xx";
+                               }
+                               if (year == null){
+                                       year = "xxxx";
+                               }
+                       }
+                       result = (day != null)? day + "." : "";
+                       result += (month != null)? month + "." : "";
+                       result += (year != null)? year : "";
+                       
+                       return result;
+               }
+               
+       }
+       
+       public String toString(){
+               String result = null;
+               DateTimeFormatter formatter = new TimePeriodPartialFormatter();
+               
+               String strStart = start != null? start.toString(formatter): null;
+               String strEnd = end != null? end.toString(formatter): null;
+               result = CdmUtils.concat("-", strStart, strEnd);
+               return result;
+       }
+       
 //*********** CLONE **********************************/        
        
        /* (non-Javadoc)
index c91da4f72c07280c38d8297628c2dd3191743b6c..22cc1b14dc2d43f07a3be51dcd5f23c6c3fa4e14 100644 (file)
@@ -4,8 +4,12 @@
 package eu.etaxonomy.cdm.model.common;\r
 \r
 import static org.junit.Assert.*;\r
+import junit.framework.Assert;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.joda.time.DateTime;\r
+import org.joda.time.DateTimeFieldType;\r
+import org.joda.time.Partial;\r
 import org.junit.After;\r
 import org.junit.AfterClass;\r
 import org.junit.Before;\r
@@ -330,6 +334,62 @@ public class TimePeriodTest {
        public void testSetEndDay() {\r
                logger.warn("Not yet implemented");\r
        }\r
+       \r
+       @Test\r
+       public void testParseSingleDateString() {\r
+               String strDate = "1756";\r
+               Partial date = TimePeriod.parseSingleDate(strDate);\r
+               assertNotNull(date);\r
+               Assert.assertEquals(Integer.parseInt(strDate), date.get(DateTimeFieldType.year()));\r
+               try {\r
+                       date.get(DateTimeFieldType.monthOfYear());\r
+                       assertFalse(true); //should not be reached\r
+               } catch (Exception e) {\r
+                       assertTrue(e instanceof IllegalArgumentException);\r
+               }\r
+               try {\r
+                       date.get(DateTimeFieldType.dayOfMonth());\r
+                       assertFalse(true); //should not be reached\r
+               } catch (Exception e) {\r
+                       assertTrue(e instanceof IllegalArgumentException);\r
+               }\r
+               //to be continued\r
+       }\r
+       \r
+       \r
+       /**\r
+        * Test method for {@link eu.etaxonomy.cdm.model.common.TimePeriod#parseString(java.lang.String)}.\r
+        */\r
+       @Test\r
+       public void testParseStringString() {\r
+               String strTimePeriod = "1756";\r
+               TimePeriod tp1 = TimePeriod.parseString(strTimePeriod);\r
+               assertNotNull(tp1);\r
+               Assert.assertEquals(strTimePeriod, tp1.getYear());\r
+               Assert.assertEquals(strTimePeriod, String.valueOf(tp1.getStartYear()));\r
+               assertNull(tp1.getEnd());\r
+               assertNull(tp1.getStartMonth());\r
+               strTimePeriod = "1756-88";\r
+               tp1 = TimePeriod.parseString(strTimePeriod);\r
+               assertNotNull(tp1);\r
+               Assert.assertEquals("1756-1788", tp1.getYear());\r
+               Assert.assertEquals("1756", String.valueOf(tp1.getStartYear()));\r
+               Assert.assertEquals("1788", String.valueOf(tp1.getEndYear()));\r
+               assertNull(tp1.getEndMonth());\r
+               assertNull(tp1.getStartMonth());\r
+       }\r
+       \r
+       @Test\r
+       public void testToStringTimePeriod() {\r
+               TimePeriod tp1 = TimePeriod.NewInstance(1788,1799);\r
+               assertNotNull(tp1);\r
+               Assert.assertEquals("1788-1799", tp1.toString());\r
+               tp1.setStartDay(3);\r
+               Assert.assertEquals("3.xx.1788-1799", tp1.toString());\r
+               tp1.setEndMonth(11);\r
+               Assert.assertEquals("3.xx.1788-11.1799", tp1.toString());\r
+       }\r
+       \r
 \r
        /**\r
         * Test method for {@link eu.etaxonomy.cdm.model.common.TimePeriod#clone()}.\r