package org.ovirt.engine.core.common.businessentities.gluster; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import org.ovirt.engine.core.compat.StringFormat; public class StorageSyncSchedule implements Serializable{ private static final long serialVersionUID = -3688076333085745256L; public enum Frequency { DAILY, WEEKLY, NONE }; public enum Day { MON, TUE, WED, THU, FRI, SAT, SUN } private Frequency frequency; private Day[] days; @Min(value = 0, message = "SCHEDULE_HOUR_OUT_OF_RANGE") @Max(value = 23, message = "SCHEDULE_HOUR_OUT_OF_RANGE") private Integer hour; @Min(value = 0, message = "SCHEDULE_MINS_OUT_OF_RANGE") @Max(value = 59, message = "SCHEDULE_MINS_OUT_OF_RANGE") private Integer mins; public StorageSyncSchedule() { } public StorageSyncSchedule(String cronExpression) { if (cronExpression == null || cronExpression.isEmpty() || cronExpression.split(" ").length != 7) { this.setFrequency(StorageSyncSchedule.Frequency.NONE); return; } String[] cronParts = cronExpression.split(" "); if (cronParts[5].equals("?")) { this.setFrequency(StorageSyncSchedule.Frequency.DAILY); } else { this.setFrequency(StorageSyncSchedule.Frequency.WEEKLY); List<Day> dayList = new ArrayList<>(); for(String day: cronParts[5].split(",")) { dayList.add(StorageSyncSchedule.Day.valueOf(day)); } this.setDays(dayList.toArray(new Day[dayList.size()])); } this.setMins(Integer.parseInt(cronParts[1])); this.setHour(Integer.parseInt(cronParts[2])); } public Frequency getFrequency() { return frequency; } public void setFrequency(Frequency frequency) { this.frequency = frequency; } public Day[] getDays() { return days; } public void setDays(Day[] days) { this.days = days; } public int getHour() { return hour; } public void setHour(int hour) { this.hour = hour; } public int getMins() { return mins; } public void setMins(int mins) { this.mins = mins; } private String toDaysCron() { StringBuffer sb = new StringBuffer(); Arrays.sort(days); for (Day day : days) { sb.append(day.name()).append(","); } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } public String toCronExpression() { String cronExpression = ""; switch (frequency) { case DAILY: if (mins != null && hour != null) { cronExpression = StringFormat.format("0 %s %s * * ? *", mins, hour); } break; case WEEKLY: if (mins != null && hour != null && days != null) { cronExpression = StringFormat.format("0 %s %s ? * %s *", mins, hour, toDaysCron()); } break; case NONE: cronExpression = ""; } return cronExpression; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(frequency.name()); switch (frequency) { case WEEKLY: sb.append(" on ").append(toDaysCron()); sb.append(" at ").append(StringFormat.format("%02d", hour)).append(":").append(StringFormat.format("%02d", mins)); break; case DAILY: sb.append(" at ").append(StringFormat.format("%02d", hour)).append(":").append(StringFormat.format("%02d", mins)); break; case NONE: } return sb.toString(); } @Override public int hashCode() { return Objects.hash(frequency, days, hour, mins); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof StorageSyncSchedule)) { return false; } StorageSyncSchedule other = (StorageSyncSchedule) obj; return Objects.equals(frequency, other.frequency) && Arrays.equals(days, other.days ) && Objects.equals(hour, other.hour) && Objects.equals(mins, other.mins); } }