DefaultTimeValueConverter.java
package sk.iway.iwcm.system.jpa;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter
public class DefaultTimeValueConverter implements AttributeConverter<Date, Date> {
@Override
public Date convertToDatabaseColumn(Date oldDate) {
return getValidTimeValue(oldDate);
}
@Override
public Date convertToEntityAttribute(Date oldDate) {
return getValidTimeValue(oldDate);
}
// All Date values of type DataTableColumnType.TIME_HM or DataTableColumnType.TIME_HMS must have same day/month/year (01.01.2000)
/**
* If input oldValue is null, it will be returned default Date 01-01-2000 00:00:00. If input oldValue isnt null,
* value of hours/minutes/seconds will remain, but
* value of day/month/year will be set on default value 01-01-2000 (rest is same).
* @param oldDate value of date we need to correct
* @return valid date for TIME_HM and TIME_HMS DataTableColumnTypes
*/
public static Date getValidTimeValue(Date oldDate) {
if(oldDate == null) {
Calendar newInstance = Calendar.getInstance();
newInstance.set(2000, 0, 1, 0, 0, 0);
newInstance.set(Calendar.MILLISECOND, 0);
return newInstance.getTime();
}
Calendar oldInstance = Calendar.getInstance();
oldInstance.setTime(oldDate);
Calendar newInstance = Calendar.getInstance();
newInstance.set(2000, 0, 1, oldInstance.get(Calendar.HOUR_OF_DAY), oldInstance.get(Calendar.MINUTE), oldInstance.get(Calendar.SECOND));
newInstance.set(Calendar.MILLISECOND, 0);
//Return valid date time
return newInstance.getTime();
}
/**
* Create valid date where day/month/year is set to 01.01.2000, seconds are set at 0 and
* hours/minutes are set using input values.
* @param hours number of hours we want to set into date
* @param minutes number of minutes we want to set into date
* @return valid date for TIME_HM and TIME_HMS DataTableColumnTypes
*/
public static Date getValidTimeValue(int hours, int minutes) {
return getValidTimeValue(hours, minutes, 0);
}
/**
* Create valid date where day/month/year is set to 01.01.2000 and
* seconds/hours/minutes are set using input values.
* @param hours number of hours we want to set into date
* @param minutes number of minutes we want to set into date
* @param seconds number of seconds we want to set into date
* @return valid date for TIME_HM and TIME_HMS DataTableColumnTypes
*/
public static Date getValidTimeValue(int hours, int minutes, int seconds) {
Calendar newInstance = Calendar.getInstance();
newInstance.set(2000, 0, 1, hours, minutes, seconds);
newInstance.set(Calendar.MILLISECOND, 0);
//Return valid date time
return newInstance.getTime();
}
/**
* Combine yyyy-mm-dd from input "date" with hh:mm:ss from input "time"
* and return new date. Milliseconds are default set to 0.
* If any of iput values is null, null will be returned.
* @param date date value representing yyyy-mm-dd in new date
* @param time date value representing hh:mm:ss in new date
* @return date value represent date time combination
*/
public static Date combineDateWithTime(Date date, Date time) {
if(date == null || time == null) return null;
return combineDateWithTime(date.getTime(), time.getTime());
}
public static Date combineDateWithTime(long date, long time) {
if(date < 0 || time < 0) return null;
Calendar dateInstance = Calendar.getInstance();
dateInstance.setTimeInMillis(date);
Calendar timeInstance = Calendar.getInstance();
timeInstance.setTimeInMillis(time);
//Move hh:mm:ss from time to date
dateInstance.set(Calendar.HOUR_OF_DAY, timeInstance.get(Calendar.HOUR_OF_DAY));
dateInstance.set(Calendar.MINUTE, timeInstance.get(Calendar.MINUTE));
dateInstance.set(Calendar.SECOND, timeInstance.get(Calendar.SECOND));
dateInstance.set(Calendar.MILLISECOND, 0);
return dateInstance.getTime();
}
}