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;
}
}
+
+ 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)
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
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