14fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/****************************************************************
24fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Licensed to the Apache Software Foundation (ASF) under one   *
34fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * or more contributor license agreements.  See the NOTICE file *
44fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * distributed with this work for additional information        *
54fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * regarding copyright ownership.  The ASF licenses this file   *
64fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * to you under the Apache License, Version 2.0 (the            *
74fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "License"); you may not use this file except in compliance   *
84fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * with the License.  You may obtain a copy of the License at   *
94fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *                                                              *
104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *   http://www.apache.org/licenses/LICENSE-2.0                 *
114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *                                                              *
124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Unless required by applicable law or agreed to in writing,   *
134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * software distributed under the License is distributed on an  *
144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * KIND, either express or implied.  See the License for the    *
164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * specific language governing permissions and limitations      *
174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * under the License.                                           *
184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ****************************************************************/
194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypackage org.apache.james.mime4j.field.datetime;
214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.datetime.parser.ParseException;
244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.datetime.parser.TokenMgrError;
254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.Date;
274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.Calendar;
284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.TimeZone;
294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.GregorianCalendar;
304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.StringReader;
314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypublic class DateTime {
334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final Date date;
344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int year;
354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int month;
364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int day;
374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int hour;
384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int minute;
394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int second;
404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private final int timeZone;
414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) {
434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.year = convertToYear(yearString);
444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.date = convertToDate(year, month, day, hour, minute, second, timeZone);
454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.month = month;
464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.day = day;
474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.hour = hour;
484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.minute = minute;
494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.second = second;
504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        this.timeZone = timeZone;
514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private int convertToYear(String yearString) {
544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int year = Integer.parseInt(yearString);
554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        switch (yearString.length()) {
564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            case 1:
574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            case 2:
584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                if (year >= 0 && year < 50)
594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                    return 2000 + year;
604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                else
614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                    return 1900 + year;
624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            case 3:
634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                return 1900 + year;
644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            default:
654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                return year;
664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) {
704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        c.set(year, month - 1, day, hour, minute, second);
724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        c.set(Calendar.MILLISECOND, 0);
734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        if (timeZone != Integer.MIN_VALUE) {
754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            int minutes = ((timeZone / 100) * 60) + timeZone % 100;
764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            c.add(Calendar.MINUTE, -1 * minutes);
774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return c.getTime();
804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public Date getDate() {
834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return date;
844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getYear() {
874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return year;
884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getMonth() {
914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return month;
924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getDay() {
954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return day;
964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getHour() {
994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return hour;
1004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getMinute() {
1034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return minute;
1044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getSecond() {
1074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return second;
1084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public int getTimeZone() {
1114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return timeZone;
1124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public void print() {
1154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        System.out.println(getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone());
1164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static DateTime parse(String dateString) throws ParseException {
1204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        try {
1214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            return new DateTimeParser(new StringReader(dateString)).parseAll();
1224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        catch (TokenMgrError err) {
1244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            throw new ParseException(err.getMessage());
1254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy}
128