10 |
10 |
package eu.etaxonomy.cdm.model.common;
|
11 |
11 |
|
12 |
12 |
import java.io.Serializable;
|
|
13 |
import java.text.DateFormat;
|
|
14 |
import java.text.ParsePosition;
|
13 |
15 |
import java.util.Calendar;
|
|
16 |
import java.util.Date;
|
14 |
17 |
import java.util.regex.Matcher;
|
15 |
18 |
import java.util.regex.Pattern;
|
16 |
19 |
|
... | ... | |
23 |
26 |
import javax.xml.bind.annotation.XmlType;
|
24 |
27 |
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
25 |
28 |
|
|
29 |
import org.apache.commons.lang.time.DateUtils;
|
26 |
30 |
import org.apache.log4j.Logger;
|
27 |
31 |
import org.hibernate.annotations.Type;
|
28 |
32 |
import org.hibernate.search.annotations.Field;
|
... | ... | |
464 |
468 |
periodString = periodString.trim();
|
465 |
469 |
|
466 |
470 |
result.setFreeText(null);
|
|
471 |
Date date;
|
467 |
472 |
|
468 |
473 |
//case "1806"[1807];
|
469 |
474 |
if (uncorrectYearPatter.matcher(periodString).matches()){
|
... | ... | |
487 |
492 |
parseDotDatePattern(periodString, result);
|
488 |
493 |
}else if (standardPattern.matcher(periodString).matches()){
|
489 |
494 |
parseStandardPattern(periodString, result);
|
|
495 |
//TODO first check ambiguity of parser results e.g. for 7/12/11
|
|
496 |
// }else if (isDateString(periodString)){
|
|
497 |
// String[] startEnd = makeStartEnd(periodString);
|
|
498 |
// String start = startEnd[0];
|
|
499 |
// DateTime startDateTime = dateStringParse(start, true);
|
|
500 |
// result.setStart(startDateTime);
|
|
501 |
// if (startEnd.length > 1){
|
|
502 |
// DateTime endDateTime = dateStringParse(startEnd[1], true);
|
|
503 |
// ;
|
|
504 |
// result.setEnd(endDateTime.toLocalDate());
|
|
505 |
// }
|
|
506 |
|
490 |
507 |
}else{
|
491 |
508 |
result.setFreeText(periodString);
|
492 |
509 |
}
|
493 |
510 |
return result;
|
494 |
511 |
}
|
495 |
512 |
|
|
513 |
private static boolean isDateString(String periodString) {
|
|
514 |
String[] startEnd = makeStartEnd(periodString);
|
|
515 |
String start = startEnd[0];
|
|
516 |
DateTime startDateTime = dateStringParse(start, true);
|
|
517 |
if (startDateTime == null){
|
|
518 |
return false;
|
|
519 |
}
|
|
520 |
if (startEnd.length > 1){
|
|
521 |
DateTime endDateTime = dateStringParse(startEnd[1], true);
|
|
522 |
if (endDateTime != null){
|
|
523 |
return true;
|
|
524 |
}
|
|
525 |
}
|
|
526 |
return false;
|
|
527 |
}
|
|
528 |
|
|
529 |
|
|
530 |
/**
|
|
531 |
* @param periodString
|
|
532 |
* @return
|
|
533 |
*/
|
|
534 |
private static String[] makeStartEnd(String periodString) {
|
|
535 |
String[] startEnd = new String[]{periodString};
|
|
536 |
if (periodString.contains("-") && periodString.matches("^-{2,}-^-{2,}")){
|
|
537 |
startEnd = periodString.split("-");
|
|
538 |
}
|
|
539 |
return startEnd;
|
|
540 |
}
|
|
541 |
|
|
542 |
|
|
543 |
private static DateTime dateStringParse(String string, boolean strict) {
|
|
544 |
DateFormat dateFormat = DateFormat.getDateInstance();
|
|
545 |
ParsePosition pos = new ParsePosition(0);
|
|
546 |
Date a = dateFormat.parse(string, pos);
|
|
547 |
if (a == null || pos.getIndex() != string.length()){
|
|
548 |
return null;
|
|
549 |
}
|
|
550 |
Calendar cal = Calendar.getInstance();
|
|
551 |
cal.setTime(a);
|
|
552 |
DateTime result = new DateTime(cal);
|
|
553 |
return result;
|
|
554 |
}
|
|
555 |
|
|
556 |
|
496 |
557 |
/**
|
497 |
558 |
* @param periodString
|
498 |
559 |
* @param result
|
bugfix for Coordinate Parser with whitespaces, Dateparsing, etc.