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