001 package sale;
002
003 import java.util.*;
004 import java.text.SimpleDateFormat;
005
006 /**
007 * This class is an implementation of the {@link Time Time} interface.
008 *
009 * <p>The time is represented as a Gregorian Calendar.
010 *
011 * <p>Only a simple Adapterclass for java.util.GregorianCalendar
012 *
013 * @author Thomas Medack
014 * @version 2.0 29/11/2000
015 * @since v2.0
016 */
017 public class CalendarTime extends Object implements Time {
018
019 /**
020 * ID for serialization.
021 */
022 private static final long serialVersionUID = 4581292419488109887L;
023
024 /**
025 * The Calender containing the current date
026 *
027 * @serial
028 */
029 private Calendar m_cCalendar;
030
031 /**
032 * The default interval for timesteps
033 *
034 * @serial
035 */
036 private int m_iDefaultInterval = 1;
037
038 /**
039 * The field which {@link #goAhead} will increase.
040 *
041 * @see #YEAR
042 * @see #MONTH
043 * @see #DATE
044 * @see #HOUR
045 * @see #MINUTE
046 * @see #SECOND
047 *
048 * @serial
049 */
050 private int m_iTimeToCount;
051
052 /**
053 * Creates a new CalendarTime with the current systemtime.
054 */
055 public CalendarTime() {
056 this(System.currentTimeMillis());
057 }
058
059 /**
060 * Creates a new CalendarTime with the given starting time.
061 *
062 * @param lTimeInMillis a long representing the time in milliseconds
063 */
064 public CalendarTime(long lTimeInMillis) {
065 this(lTimeInMillis, DATE);
066 }
067
068 /**
069 * Creates a new CalendarTime with the given starting time and an int that defines the field which will
070 * be increased by {@link #goAhead}.
071 * @see #YEAR
072 * @see #MONTH
073 * @see #DATE
074 * @see #HOUR
075 * @see #MINUTE
076 * @see #SECOND
077 *
078 * @param lTimeInMillis a long representing the time in milliseconds
079 * @param iTimeToCount an int representing the field which will be increased by {@link #goAhead}
080 */
081 public CalendarTime(long lTimeInMillis, int iTimeToCount) {
082 m_cCalendar = new GregorianCalendar(TimeZone.getTimeZone("Europe/Berlin"), Locale.GERMAN);
083 m_cCalendar.setTime(new java.util.Date(lTimeInMillis));
084
085 m_iTimeToCount = iTimeToCount;
086 }
087
088 /**
089 * Creates a new CalendarTime with the given starting time
090 *
091 * @param year an int representing the Year you want to start with
092 * @param month an int representing the Month you want to start with
093 * @param date an int representing the Day you want to start with
094 * @param hours an int representing the Hour you want to start with
095 * @param minutes an int representing the Minute you want to start with
096 * @param seconds an int representing the Second you want to start with
097 */
098 public CalendarTime(int year, int month, int date, int hours, int minutes, int seconds) {
099 this(year, month, date, hours, minutes, seconds, DATE);
100 }
101
102 /**
103 * Creates a new CalendarTime with the given starting time and an int that defines the field which will
104 * be increased by {@link #goAhead}.
105 *
106 * @see #YEAR
107 * @see #MONTH
108 * @see #DATE
109 * @see #HOUR
110 * @see #MINUTE
111 * @see #SECOND
112 *
113 * @param year an int representing the Year you want to start with
114 * @param month an int representing the Month you want to start with
115 * @param date an int representing the Day you want to start with
116 * @param hours an int representing the Hour you want to start with
117 * @param minutes an int representing the Minute you want to start with
118 * @param seconds an int representing the Second you want to start with
119 * @param iTimeToCount an int representing the field which will be increased by {@link #goAhead}
120 */
121 public CalendarTime(int year, int month, int date, int hours, int minutes, int seconds, int iTimeToCount) {
122 m_cCalendar = new GregorianCalendar(year, month, date, hours, minutes, seconds);
123
124 // set the Timezone
125 m_cCalendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
126
127 // Timestep constant( SECOND, MINUTE, HOUR, DATE, MONTH, YEAR )
128 m_iTimeToCount = iTimeToCount;
129 }
130
131 /**
132 * Set the given date.
133 *
134 * @override Never
135 *
136 * @param oTime a java.util.Date representing the date to be set
137 *
138 * @exception IllegalArgumentException if Parameter is not a java.util.Date
139 */
140 public void setTime(Object oTime) throws IllegalArgumentException {
141 try {
142 // sets the Time as java.util.Date
143 m_cCalendar.setTime((java.util.Date)oTime);
144 }
145 catch (ClassCastException cce) {
146 throw new IllegalArgumentException("Parameter has to be of type java.util.Date.");
147 }
148 }
149
150 /**
151 * Set an int that will define which time field will be increased by {@link #goAhead}.
152 *
153 * @override Never
154 *
155 * @param iTime an int representing a constant
156 *
157 * @see #YEAR
158 * @see #MONTH
159 * @see #DATE
160 * @see #HOUR
161 * @see #MINUTE
162 * @see #SECOND
163 */
164 public void setTimeToCount(int iTime) {
165 m_iTimeToCount = iTime;
166 }
167
168 /**
169 * Get the calendars date
170 *
171 * @override Never
172 *
173 * @return a java.util.Date representing the calendars date
174 */
175 public Object getTime() {
176 return m_cCalendar.getTime();
177 }
178
179 /**
180 * Increment the time by the given time interval.
181 *
182 * @override Never
183 *
184 * @param oInterval the interval by which to increment time. Must be an Integer object that gives the
185 * number of days by which to increment.
186 *
187 * @exception IllegalArgumentException if the given interval is no Integer or is null.
188 */
189 public void goAhead(Object oInterval) throws IllegalArgumentException {
190 try {
191 m_cCalendar.add(m_iTimeToCount, ((Integer)oInterval).intValue());
192 }
193 catch (NullPointerException npe) {
194 throw new IllegalArgumentException("Interval must be specified in calls to goAhead!");
195 }
196 catch (ClassCastException cce) {
197 throw new IllegalArgumentException("Parameter has to be of type long");
198 }
199 }
200
201 /**
202 * Get the default time interval.
203 *
204 * @override Never
205 *
206 * @return an Integer describing the default time step.
207 */
208 public Object getDefaultInterval() {
209 return new Integer(m_iDefaultInterval);
210 }
211
212 /**
213 * Get the adapted Calendar.
214 *
215 * @override Never
216 *
217 * @return a Calendar object describing the calendar of this class.
218 */
219 public Calendar getCalendar() {
220 return m_cCalendar;
221 }
222
223 /**
224 * Left-pad the given number with 0 to fill a two digit string.
225 *
226 * <p>Helper function used by {@link #getTimeStamp}.</p>
227 */
228 private String getCorrectString(int iTime) {
229 if (Integer.toString(iTime).length() == 1) {
230 return ("0" + Integer.toString(iTime));
231 }
232
233 return Integer.toString(iTime);
234 }
235
236 /**
237 * Create and return a time stamp.
238 *
239 * @override Never
240 *
241 * @param lStampNumber the number of the stamp
242 *
243 * @return a fresh time stamp.
244 */
245 public Comparable<String> getTimeStamp(long lStampNumber) {
246 String sReturn = ("0000000000000000000" +
247 Long.toString(lStampNumber)).substring(Long.toString(lStampNumber).length());
248
249 sReturn = (getCorrectString(m_cCalendar.get(SECOND))) + sReturn; //second
250 sReturn = (getCorrectString(m_cCalendar.get(MINUTE))) + sReturn; //minute
251 sReturn = (getCorrectString(m_cCalendar.get(HOUR) +
252 m_cCalendar.get(Calendar.ZONE_OFFSET) / (1000 * 60 * 60))) + sReturn; //hour
253 sReturn = (getCorrectString(m_cCalendar.get(DATE))) + sReturn; //day
254 sReturn = (getCorrectString(m_cCalendar.get(MONTH) + 1)) + sReturn; //month
255 sReturn = (Integer.toString(m_cCalendar.get(YEAR))) + sReturn; //year
256
257 return sReturn;
258 }
259
260 /**
261 * @return a string representation of this date.
262 */
263 public String toString() {
264 SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
265 return sdf.format(m_cCalendar.getTime());
266 }
267
268 /**
269 * Field number for {@link #setTimeToCount} indicates that the seconds will be increased by {@link #goAhead}
270 */
271 public static int SECOND = Calendar.SECOND;
272
273 /**
274 * Field number for {@link #setTimeToCount} indicates that the minutes will be increased by {@link #goAhead}
275 */
276 public static int MINUTE = Calendar.MINUTE;
277
278 /**
279 * Field number for {@link #setTimeToCount} indicates that the hours will be increased by {@link #goAhead}
280 */
281 public static int HOUR = Calendar.HOUR_OF_DAY;
282
283 /**
284 * Field number for {@link #setTimeToCount} indicates that the days will be increased by {@link #goAhead}
285 */
286 public static int DATE = Calendar.DATE;
287
288 /**
289 * Field number for {@link #setTimeToCount} indicates that the month will be increased by {@link #goAhead}
290 */
291 public static int MONTH = Calendar.MONTH;
292
293 /**
294 * Field number for {@link #setTimeToCount} indicates that the years will be increased by {@link #goAhead}
295 */
296 public static int YEAR = Calendar.YEAR;
297 }