package org.openstack.atlas.service.domain.logs.entities;
import java.util.*;
public class DateTime implements Comparable<DateTime> {
public static final int ISO = 1;
public static final int ISO_DATE = 2;
public static final int APACHE = 3;
public static final int RUNTIME = 4;
private static final Map<String, Integer> MONTH_MAP = new HashMap<String, Integer>();
private String dates[];
private Calendar dumbCalendar;
private String times[];
private int year;
private int month;
private int day;
private int hour;
private int minute;
private int second;
private int millis = 0;
public DateTime() {
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/Chicago"));
dumbCalendar = c;
refreshDates();
}
public DateTime(Calendar c) {
this.dumbCalendar = c;
refreshDates();
}
public DateTime(Date date) {
dumbCalendar = Calendar.getInstance(TimeZone.getTimeZone("America/Chicago"));
dumbCalendar.setTime(date);
refreshDates();
}
public DateTime(String iso) {
this(iso, DateTime.ISO);
}
public DateTime(String date, int format) {
dumbCalendar = Calendar.getInstance(TimeZone.getTimeZone("America/Chicago"));
populateValuesFromFormatString(date, format);
dumbCalendar.set(year, month, day, hour, minute, second);
dumbCalendar.set(Calendar.MILLISECOND, millis);
}
static {
MONTH_MAP.put("JAN", 1);
MONTH_MAP.put("FEB", 2);
MONTH_MAP.put("MAR", 3);
MONTH_MAP.put("APR", 4);
MONTH_MAP.put("MAY", 5);
MONTH_MAP.put("JUN", 6);
MONTH_MAP.put("JUL", 7);
MONTH_MAP.put("AUG", 8);
MONTH_MAP.put("SEP", 9);
MONTH_MAP.put("OCT", 10);
MONTH_MAP.put("NOV", 11);
MONTH_MAP.put("DEC", 12);
}
public static int getNumericalMonth(String month) {
Integer monthInt = MONTH_MAP.get(month.toUpperCase());
if (monthInt == null) {
return 0;
} else {
return monthInt;
}
}
public static String getMonthStringSymbol(Integer month) {
for (Map.Entry<String, Integer> value : MONTH_MAP.entrySet()) {
if (value.getValue() == month.intValue()) {
String capsMo = value.getKey();
return capsMo.substring(0, 1) + capsMo.substring(1).toLowerCase();
}
}
return "";
}
public static String prependZero(int i) {
String s = Integer.toString(i);
return (s.length() == 1) ? "0" + s : "" + s;
}
public int compareTo(DateTime arg0) {
return dumbCalendar.compareTo(arg0.getCalendar());
}
public Calendar getCalendar() {
return dumbCalendar;
}
public int getDay() {
return day;
}
public int getHour() {
return hour;
}
public String getIso() {
return year + "-" + prependZero(month + 1) + "-" + prependZero(day) + " " + prependZero(hour) + ":"
+ prependZero(minute) + ":" + prependZero(second);
}
public String getApache() {
return prependZero(day) + "/" + getMonthStringSymbol(month + 1) + "/" + year + ":" + prependZero(hour) + ":"
+ prependZero(minute) + ":" + prependZero(second);
}
public int getMinute() {
return minute;
}
public int getMonth() {
return month;
}
public int getSecond() {
return second;
}
public int getYear() {
return year;
}
public void roll(int field, int amount) {
dumbCalendar.add(field, amount);
refreshDates();
}
public void setDay(int day) {
dumbCalendar.set(Calendar.DAY_OF_MONTH, day);
this.day = day;
}
public void setHour(int hour) {
dumbCalendar.set(Calendar.HOUR_OF_DAY, hour);
this.hour = hour;
}
public void setMinute(int minute) {
dumbCalendar.set(Calendar.MINUTE, minute);
this.minute = minute;
}
public void setMonth(int month) {
dumbCalendar.set(Calendar.MONTH, month - 1);
this.month = month - 1;
}
public void setSecond(int second) {
dumbCalendar.set(Calendar.SECOND, second);
this.second = second;
}
public void setYear(int year) {
dumbCalendar.set(Calendar.YEAR, year);
this.year = year;
}
@Override
public String toString() {
return getIso();
}
private void populateValuesFromFormatString(String date, int format) {
switch (format) {
case DateTime.ISO:
dates = date.split(" ", 2)[0].split("-", 3);
times = date.split(" ", 2)[1].split(":", 3);
year = Integer.parseInt(dates[0]);
month = Integer.parseInt(dates[1]) - 1;
day = Integer.parseInt(dates[2]);
hour = Integer.parseInt(times[0]);
minute = Integer.parseInt(times[1]);
second = Integer.parseInt(times[2]);
break;
case DateTime.ISO_DATE:
dates = date.split(" ", 2)[0].split("-", 3);
year = Integer.parseInt(dates[0]);
month = Integer.parseInt(dates[1]) - 1;
day = Integer.parseInt(dates[2]);
break;
case DateTime.APACHE:
dates = date.split(":", 2)[0].split("/", 3);
times = date.split(":", 2)[1].split(":", 3);
year = Integer.parseInt(dates[2]);
month = DateTime.getNumericalMonth(dates[1]) - 1;
day = Integer.parseInt(dates[0]);
hour = Integer.parseInt(times[0]);
minute = Integer.parseInt(times[1]);
second = Integer.parseInt(times[2]);
break;
case DateTime.RUNTIME:
//20100528-144250
String[] items = date.split("-");
year = Integer.parseInt(items[0].substring(0, 4));
month = Integer.parseInt(items[0].substring(4, 6)) - 1;
day = Integer.parseInt(items[0].substring(6, 8));
hour = Integer.parseInt(items[1].substring(0, 2));
minute = Integer.parseInt(items[1].substring(2, 4));
second = Integer.parseInt(items[1].substring(4, 6));
break;
default:
break;
}
}
private void refreshDates() {
year = dumbCalendar.get(Calendar.YEAR);
month = dumbCalendar.get(Calendar.MONTH);
day = dumbCalendar.get(Calendar.DAY_OF_MONTH);
hour = dumbCalendar.get(Calendar.HOUR_OF_DAY);
minute = dumbCalendar.get(Calendar.MINUTE);
second = dumbCalendar.get(Calendar.SECOND);
}
}