package hudson.plugins.global_build_stats.model;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public enum HistoricScale {
HOURLY(Calendar.HOUR_OF_DAY, new Integer[]{ Calendar.MINUTE }, "hours", "EEE HH:mm"),
HOURLY_FROM_NOW(Calendar.HOUR_OF_DAY, "hours", "EEE HH:mm"),
DAILY(Calendar.DAY_OF_YEAR, new Integer[]{ Calendar.HOUR_OF_DAY, Calendar.MINUTE }, "days", "EEE dd HH'h'"),
DAILY_FROM_NOW(Calendar.DAY_OF_YEAR, "days", "EEE dd HH'h'"),
WEEKLY(Calendar.WEEK_OF_YEAR, new Integer[]{ Calendar.DAY_OF_WEEK, Calendar.HOUR_OF_DAY, Calendar.MINUTE}, "weeks", "'W'w, EEE"),
WEEKLY_FROM_NOW(Calendar.WEEK_OF_YEAR, "weeks", "'W'w, EEE"),
MONTHLY(Calendar.MONTH, new Integer[]{ Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE}, "monthes", "dd MMM ''yy"),
MONTHLY_FROM_NOW(Calendar.MONTH, "monthes", "dd MMM ''yy"),
YEARLY(Calendar.YEAR, new Integer[]{ Calendar.MONTH, Calendar.DAY_OF_YEAR, Calendar.HOUR_OF_DAY, Calendar.MINUTE}, "years", "''yy 'd'D"),
YEARLY_FROM_NOW(Calendar.YEAR, "years", "''yy 'd'D");
private int calendarField;
private Integer[] fieldsToReset;
private String tickLabel;
private DateFormat dateRangeFormatter;
private HistoricScale(int _calendarField, String tickLabel, String dateRangeFormatterPattern){
this(_calendarField, new Integer[0], tickLabel, dateRangeFormatterPattern);
}
private HistoricScale(int _calendarField, Integer[] _fieldsToReset, String tickLabel, String dateRangeFormatterPattern){
this.calendarField = _calendarField;
this.fieldsToReset = _fieldsToReset;
this.tickLabel = tickLabel;
// TODO: internationalize this !
this.dateRangeFormatter = new SimpleDateFormat(dateRangeFormatterPattern);
}
public String getLabel(){
return this.tickLabel;
}
public Calendar getPreviousStep(Calendar currentStep){
Calendar previousStep = (Calendar)currentStep.clone();
// Rounding date
boolean atLeastOneFieldToResetIsNotReseted = false;
int i=0;
while(!atLeastOneFieldToResetIsNotReseted && i<fieldsToReset.length){
atLeastOneFieldToResetIsNotReseted = !isFieldReseted(fieldsToReset[i], currentStep);
i++;
}
if(atLeastOneFieldToResetIsNotReseted){
for(i=0; i<fieldsToReset.length; i++){
previousStep.set(fieldsToReset[i], getResetValueForCalendarField(fieldsToReset[i], previousStep));
}
} else {
previousStep.add(calendarField, -1);
}
return previousStep;
}
private boolean isFieldReseted(int calendarField, Calendar c){
return c.get(calendarField)==getResetValueForCalendarField(calendarField, c);
}
private int getResetValueForCalendarField(int calendarField, Calendar c){
int resetValue = -1;
if(calendarField==Calendar.DAY_OF_YEAR || calendarField==Calendar.DAY_OF_MONTH){
resetValue = 1;
} else if(calendarField==Calendar.DAY_OF_WEEK){
resetValue=c.getFirstDayOfWeek();
} else {
resetValue = 0;
}
return resetValue;
}
public DateFormat getDateRangeFormatter() {
return dateRangeFormatter;
}
}