/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
/**
* An immutable date without any time. Java does not have such a type and there is no way to re-use java.util.Date since
* it is already used for representing date and time values.
*
* @see org.obiba.magma.type.DateType
*/
public class MagmaDate implements Serializable, Comparable<MagmaDate> {
private static final long serialVersionUID = 1L;
private final int year;
private final int month;
private final int dayOfMonth;
private transient int hashCode;
private transient String toString;
public MagmaDate(Calendar calendar) {
if(calendar == null) throw new IllegalArgumentException("calendar cannot be null");
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
}
public MagmaDate(int year, int month, int dayOfMonth) {
this(asCalendar(year, month, dayOfMonth));
}
public MagmaDate(Date date) {
this(asCalendar(date));
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDayOfMonth() {
return dayOfMonth;
}
public Calendar asCalendar() {
Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
return c;
}
public Date asDate() {
return asCalendar().getTime();
}
@Override
public int compareTo(MagmaDate o) {
return 10000 * (year - o.year)//
+ 100 * (month - o.month)//
+ dayOfMonth - o.dayOfMonth;
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj == null) return false;
if(obj instanceof MagmaDate) {
MagmaDate rhs = (MagmaDate) obj;
return year == rhs.year && month == rhs.month && dayOfMonth == rhs.dayOfMonth;
}
return super.equals(obj);
}
@Override
public int hashCode() {
// Lazily initialized, cached hashCode
if(hashCode == 0) {
int result = 17;
result = 37 * result + year;
result = 37 * result + month;
result = 37 * result + dayOfMonth;
hashCode = result;
}
return hashCode;
}
@Override
public String toString() {
return toString != null ? toString : (toString = String.valueOf(year) + '-' + (month + 1) + '-' + dayOfMonth);
}
private static Calendar asCalendar(Date date) {
if(date == null) throw new IllegalArgumentException("date cannot be null");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
private static Calendar asCalendar(int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, month, dayOfMonth);
return calendar;
}
}