/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;
import org.hibernate.annotations.Type;
+import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.FieldBridge;
import org.joda.time.DateTime;
public static final DateTimeFieldType MONTH_TYPE = DateTimeFieldType.monthOfYear();
public static final DateTimeFieldType YEAR_TYPE = DateTimeFieldType.year();
public static final DateTimeFieldType DAY_TYPE = DateTimeFieldType.dayOfMonth();
-
+
@XmlElement(name = "Start")
@XmlJavaTypeAdapter(value = PartialAdapter.class)
@Type(type="partialUserType")
- @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+ @Field(analyze = Analyze.NO)
@FieldBridge(impl = PartialBridge.class)
private Partial start;
-
+
@XmlElement(name = "End")
@XmlJavaTypeAdapter(value = PartialAdapter.class)
@Type(type="partialUserType")
- @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+ @Field(analyze = Analyze.NO)
@FieldBridge(impl = PartialBridge.class)
private Partial end;
-
+
@XmlElement(name = "FreeText")
private String freeText;
-
-
+
+
/**
* Factory method
* @return
public static TimePeriod NewInstance(){
return new TimePeriod();
}
-
-
+
+
/**
* Factory method
* @return
public static TimePeriod NewInstance(Partial startDate){
return new TimePeriod(startDate);
}
-
-
+
+
/**
* Factory method
* @return
public static TimePeriod NewInstance(Partial startDate, Partial endDate){
return new TimePeriod(startDate, endDate);
}
-
-
+
+
/**
* Factory method
* @return
Integer endYear = null;
return NewInstance(year, endYear);
}
-
+
/**
* Factory method
* @return
return new TimePeriod(startDate, endDate);
}
-
-
+
+
/**
- * Factory method to create a TimePeriod from a <code>Calendar</code>. The Calendar is stored as the starting instant.
+ * Factory method to create a TimePeriod from a <code>Calendar</code>. The Calendar is stored as the starting instant.
* @return
*/
public static TimePeriod NewInstance(Calendar startCalendar){
/**
* Factory method to create a TimePeriod from a <code>ReadableInstant</code>(e.g. <code>DateTime</code>).
- * The <code>ReadableInstant</code> is stored as the starting instant.
+ * The <code>ReadableInstant</code> is stored as the starting instant.
* @return
*/
public static TimePeriod NewInstance(ReadableInstant readableInstant){
return NewInstance(readableInstant, null);
}
-
+
/**
- * Factory method to create a TimePeriod from a starting and an ending <code>Calendar</code>
+ * Factory method to create a TimePeriod from a starting and an ending <code>Calendar</code>
* @return
*/
public static TimePeriod NewInstance(Calendar startCalendar, Calendar endCalendar){
}
return new TimePeriod(startDate, endDate);
}
-
+
/**
- * Factory method to create a TimePeriod from a starting and an ending <code>Date</code>
+ * Factory method to create a TimePeriod from a starting and an ending <code>Date</code>
* @return TimePeriod
*/
public static TimePeriod NewInstance(Date startDate, Date endDate){
return NewInstance(calStart, calEnd);
}
-
+
/**
- * Factory method to create a TimePeriod from a starting and an ending <code>ReadableInstant</code>(e.g. <code>DateTime</code>)
+ * Factory method to create a TimePeriod from a starting and an ending <code>ReadableInstant</code>(e.g. <code>DateTime</code>)
* @return
*/
public static TimePeriod NewInstance(ReadableInstant startInstant, ReadableInstant endInstant){
return new TimePeriod(startDate, endDate);
}
-
+
/**
* Transforms a <code>Calendar</code> into a <code>Partial</code>
* @param calendar
Partial partial = new Partial(ld);
return partial;
}
-
+
/**
* Transforms a <code>Calendar</code> into a <code>Partial</code>
* @param calendar
Partial partial = new Partial(ld);
return partial;
}
-
+
/**
* Constructor
*/
return false;
}
}
-
+
/**
* True, if there is no start date and no end date and no freetext representation exists.
* @return
return false;
}
}
-
-
+
+
public Partial getStart() {
return start;
}
-
+
public void setStart(Partial start) {
this.start = start;
}
-
+
public Partial getEnd() {
return end;
}
-
+
public void setEnd(Partial end) {
this.end = end;
}
-
+
/**
* For time periods that need to store more information than the one
* that can be stored in <code>start</code> and <code>end</code>.
}
return result;
}
-
+
@Transient
public Integer getStartYear(){
return getPartialValue(start, YEAR_TYPE);
}
-
+
@Transient
public Integer getStartMonth(){
return getPartialValue(start, MONTH_TYPE);
public Integer getEndDay(){
return getPartialValue(end, DAY_TYPE);
}
-
+
public static Integer getPartialValue(Partial partial, DateTimeFieldType type){
if (partial == null || ! partial.isSupported(type)){
return null;
}else{
return partial.get(type);
}
-
+
}
-
+
public TimePeriod setStartYear(Integer year){
return setStartField(year, YEAR_TYPE);
}
-
+
public TimePeriod setStartMonth(Integer month) throws IndexOutOfBoundsException{
return setStartField(month, MONTH_TYPE);
}
public TimePeriod setStartDay(Integer day) throws IndexOutOfBoundsException{
return setStartField(day, DAY_TYPE);
}
-
+
public TimePeriod setEndYear(Integer year){
return setEndField(year, YEAR_TYPE);
}
public TimePeriod setEndDay(Integer day) throws IndexOutOfBoundsException{
return setEndField(day, DAY_TYPE);
}
-
- public static Partial setPartialField(Partial partial, Integer value, DateTimeFieldType type)
+
+ public static Partial setPartialField(Partial partial, Integer value, DateTimeFieldType type)
throws IndexOutOfBoundsException{
if (partial == null){
partial = new Partial();
return partial.with(type, value);
}
}
-
- private TimePeriod setStartField(Integer value, DateTimeFieldType type)
+
+ private TimePeriod setStartField(Integer value, DateTimeFieldType type)
throws IndexOutOfBoundsException{
start = setPartialField(start, value, type);
return this;
end = setPartialField(end, value, type);
return this;
}
-
+
/**
* Throws an IndexOutOfBoundsException if the value does not have a valid value
* (e.g. month > 12, month < 1, day > 31, etc.)
if (month == 2){
max = 29;
}else if (month == 4 ||month == 6 ||month == 9 ||month == 11){
- max = 30;
+ max = 30;
}
}
}
throw new IndexOutOfBoundsException("Value must be between 1 and " + max);
}
}
-
+
private void initStart(){
if (start == null){
start = new Partial();
}
}
-
+
private void initEnd(){
if (end == null){
end = new Partial();
}
}
-
-
+
+
//patter for first year in string;
private static final Pattern firstYearPattern = Pattern.compile("\\d{4}");
//case "1806"[1807];
private static final String strDotDate = "[0-3]?\\d\\.[01]?\\d\\.\\d{4,4}";
private static final String strDotDatePeriodPattern = String.format("%s(\\s*-\\s*%s?)?", strDotDate, strDotDate);
private static final Pattern dotDatePattern = Pattern.compile(strDotDatePeriodPattern);
-
-
+
+
public static TimePeriod parseString(TimePeriod timePeriod, String periodString){
//TODO move to parser class
//TODO until now only quick and dirty (and partly wrong)
TimePeriod result = timePeriod;
-
+
if(timePeriod == null){
return timePeriod;
}
-
+
if (periodString == null){
return result;
}
periodString = periodString.trim();
-
+
result.setFreeText(null);
Date date;
-
+
//case "1806"[1807];
if (uncorrectYearPatter.matcher(periodString).matches()){
result.setFreeText(periodString);
parseDotDatePattern(periodString, result);
}else if (standardPattern.matcher(periodString).matches()){
parseStandardPattern(periodString, result);
-//TODO first check ambiguity of parser results e.g. for 7/12/11
+//TODO first check ambiguity of parser results e.g. for 7/12/11
// }else if (isDateString(periodString)){
// String[] startEnd = makeStartEnd(periodString);
// String start = startEnd[0];
// ;
// result.setEnd(endDateTime.toLocalDate());
// }
-
+
}else{
result.setFreeText(periodString);
}
String[] dates = periodString.split("-");
Partial dtStart = null;
Partial dtEnd = null;
-
+
if (dates.length > 2 || dates.length <= 0){
logger.warn("More than 1 '-' in period String: " + periodString);
result.setFreeText(periodString);
if (! CdmUtils.isEmpty(dates[0])){
dtStart = parseSingleDotDate(dates[0].trim());
}
-
+
//end
if (dates.length >= 2 && ! CdmUtils.isEmpty(dates[1])){
dtEnd = parseSingleDotDate(dates[1].trim());
}
-
+
result.setStart(dtStart);
result.setEnd(dtEnd);
} catch (IllegalArgumentException e) {
}
}
}
-
-
+
+
/**
* @param periodString
* @param result
String[] years = periodString.split("-");
Partial dtStart = null;
Partial dtEnd = null;
-
+
if (years.length > 2 || years.length <= 0){
logger.warn("More than 1 '-' in period String: " + periodString);
}else {
if (! CdmUtils.isEmpty(years[0])){
dtStart = parseSingleDate(years[0].trim());
}
-
+
//end
if (years.length >= 2 && ! CdmUtils.isEmpty(years[1])){
years[1] = years[1].trim();
}
dtEnd = parseSingleDate(years[1]);
}
-
+
result.setStart(dtStart);
result.setEnd(dtEnd);
} catch (IllegalArgumentException e) {
}
}
}
-
+
public static TimePeriod parseString(String strPeriod) {
TimePeriod timePeriod = TimePeriod.NewInstance();
return parseString(timePeriod, strPeriod);
}
-
-
+
+
protected static Partial parseSingleDate(String singleDateString) throws IllegalArgumentException{
//FIXME until now only quick and dirty and incomplete
Partial partial = new Partial();
return partial;
}
-
+
protected static Partial parseSingleDotDate(String singleDateString) throws IllegalArgumentException{
Partial partial = new Partial();
singleDateString = singleDateString.trim();
String strYear = split[split.length-1];
String strMonth = length >= 2? split[split.length-2]: null;
String strDay = length >= 3? split[split.length-3]: null;
-
-
+
+
try {
Integer year = Integer.valueOf(strYear.trim());
Integer month = Integer.valueOf(strMonth.trim());
return partial;
}
-
-
-
+
+
+
private class TimePeriodPartialFormatter extends DateTimeFormatter{
private TimePeriodPartialFormatter(){
super(null, null);
}
- public String print(ReadablePartial partial){
+ @Override
+ public String print(ReadablePartial partial){
//TODO
String result = "";
String year = (partial.isSupported(YEAR_TYPE))? String.valueOf(partial.get(YEAR_TYPE)):null;
String month = (partial.isSupported(MONTH_TYPE))? String.valueOf(partial.get(MONTH_TYPE)):null;;
String day = (partial.isSupported(DAY_TYPE))? String.valueOf(partial.get(DAY_TYPE)):null;;
-
+
if (month !=null){
if (year == null){
year = "xxxx";
result = (day != null)? day + "." : "";
result += (month != null)? month + "." : "";
result += (year != null)? year : "";
-
+
return result;
}
-
+
}
-
-//**************************** to String ****************************************
-
- /**
+
+//**************************** 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.
- *
+ * Otherwise the concatenation of <code>start</code> and <code>end</code> is returned.
+ *
* @see java.lang.Object#toString()
*/
- public String toString(){
+ @Override
+ public String toString(){
String result = null;
DateTimeFormatter formatter = new TimePeriodPartialFormatter();
if ( CdmUtils.isNotEmpty(this.getFreeText())){
}
return result;
}
-
-//*********** EQUALS **********************************/
-
+
+//*********** EQUALS **********************************/
+
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
return false;
}
TimePeriod that = (TimePeriod)obj;
-
+
if (! CdmUtils.nullSafeEqual(this.start, that.start)){
return false;
}
}
return true;
}
-
+
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
int hashCode = 7;
- hashCode = 29*hashCode +
- (start== null? 33: start.hashCode()) +
- (end== null? 39: end.hashCode()) +
- (freeText== null? 41: freeText.hashCode());
+ hashCode = 29*hashCode +
+ (start== null? 33: start.hashCode()) +
+ (end== null? 39: end.hashCode()) +
+ (freeText== null? 41: freeText.hashCode());
return super.hashCode();
- }
-
-
-//*********** CLONE **********************************/
-
+ }
+
+
+//*********** CLONE **********************************/
+
/* (non-Javadoc)
* @see java.lang.Object#clone()
try {
TimePeriod result = (TimePeriod)super.clone();
result.setStart(this.start); //DateTime is immutable
- result.setEnd(this.end);
+ result.setEnd(this.end);
result.setFreeText(this.freeText);
return result;
} catch (CloneNotSupportedException e) {
}
}
-
+
}
\ No newline at end of file