1   package com.atlassian.core.cron.parser;
2   
3   import com.atlassian.core.util.DateUtils;
4   import org.apache.log4j.Logger;
5   
6   /**
7    * Holder of a 12 hour time with a meridian indicator (am/pm).
8    */
9   public final class MeridianHour
10  {
11      private static final Logger log = Logger.getLogger(MeridianHour.class);
12  
13      private static final int MERIDIAN_HOURS = 12;
14  
15      private final int hour;
16      private final String meridian;
17  
18      public MeridianHour(int hour, String meridian)
19      {
20          this.hour = hour;
21          this.meridian = meridian;
22      }
23  
24      public int getHour()
25      {
26          return hour;
27      }
28  
29      public String getMeridian()
30      {
31          return meridian;
32      }
33  
34      /**
35       * Takes a 24 hour time and parses the 12 hour time with meridian indicator into a MeridianHour object.
36       * <p/>
37       * Be aware that 12:00 is 12pm (noon), 00:00 is 12am and 24:00 doesn't exist.
38       *
39       * @param twentyFourHour a time value in 24 hour format ("0" - "23").
40       *
41       * @return a MeridianHour representing the given time or null on arse failure.
42       */
43      public static MeridianHour parseMeridianHour(String twentyFourHour)
44      {
45          int hour;
46          String meridian = DateUtils.AM; // default to AM
47          try
48          {
49              hour = Integer.parseInt(twentyFourHour);
50              if (hour < 0 || hour > 23)
51              {
52                  log.debug("The hour of the cron entry is out of range (0-23): " + twentyFourHour);
53                  return null;
54              }
55              else if (hour == 0)
56              {
57                  hour = 12;
58              }
59              else if (hour == 12)
60              {
61                  meridian = DateUtils.PM;
62              }
63              else if (hour >= MERIDIAN_HOURS)
64              {
65                  meridian = DateUtils.PM;
66                  hour -= MERIDIAN_HOURS;
67              }
68  
69              return new MeridianHour(hour, meridian);
70          }
71          catch (NumberFormatException nfe)
72          {
73              log.debug("The hour of the cron entry must be an integer, instead it is: " + twentyFourHour);
74          }
75          return null;
76      }
77  
78      public boolean equals(final Object o)
79      {
80          if (this == o)
81          {
82              return true;
83          }
84          if (o == null || getClass() != o.getClass())
85          {
86              return false;
87          }
88  
89          final MeridianHour that = (MeridianHour) o;
90  
91          if (hour != that.hour)
92          {
93              return false;
94          }
95          if (meridian != null ? !meridian.equals(that.meridian) : that.meridian != null)
96          {
97              return false;
98          }
99  
100         return true;
101     }
102 
103     public int hashCode()
104     {
105         int result;
106         result = hour;
107         result = 31 * result + (meridian != null ? meridian.hashCode() : 0);
108         return result;
109     }
110 }