Project: Calendar-Application
package calendar;
 
import au.com.bytecode.opencsv.CSVReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Calendar; 
 
/**
 * @author Thomas Milner 
 * @date 24/02/2012 
 * 
 * @brief 
 * Data Class, Stores the collections, Deals with adding, changing and removing  
 * events, contacts, settings. Also deals with the calls to the CSV package. 
 */
 
public class Data { 
    private static ContactsCollection m_contacts; 
    private static EventsCollection m_events; 
    private static SettingsCollection m_settings; 
    private static int m_max_event_id = 0
    private static int m_max_contact_id = 0
 
    /**
     * Returns the contacts collection 
     * @return ContactsCollection  
     */
 
    public static ContactsCollection GetContacts() { 
        return m_contacts; 
    } 
 
    /**
     * Returns the events collection 
     * @return EventsCollection 
     */
 
    public static EventsCollection GetEvents() { 
        return m_events; 
    } 
 
    /**
     * Returns the settings collection 
     * @return 
     */
 
    public static SettingsCollection GetSettings() { 
        return m_settings; 
    } 
     
    /**
     * Allocates an event ID, by incrementing the current highest id,  
     * and returning it 
     * @return Event ID 
     */
 
    public static int AllocateEventId() { 
        return ++m_max_event_id; 
    } 
     
    /**
     * Allocates a contact ID, by incrementing the current highest id,  
     * and returning it 
     * @return Contact ID 
     */
 
    public static int AllocateContactId() { 
        return ++m_max_contact_id; 
    } 
     
    /**
     * Gets the current day 
     * @return Day of the month as an Int 
     */
 
    public static int GetCurrentDay() { 
        return Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 
    } 
     
    /**
     * Gets the current month 
     * @return Current Month as an Int 
     */
 
    public static int GetCurrentMonth() { 
        return Calendar.getInstance().get(Calendar.MONTH); 
    } 
     
    /**
     * Gets the current year 
     * @return The current year as an Int 
     */
 
    public static int GetCurrentYear() { 
        return Calendar.getInstance().get(Calendar.YEAR); 
    } 
     
    /**
     * Adds a new setting 
     * @param name The name of the setting  
     * @param value The value of the setting 
     * @param type The type of setting you are trying to make 
     * @throws Exception If its unable to add the setting 
     */
 
    public static boolean AddSetting(String name, String value, int type)  
      throws Exception { 
        m_settings.Add(new Setting(name, value, type)); 
        writeSettings(); 
        return true
    } 
     
    public static boolean RemoveContact(int id) throws Exception { 
     int idx = m_contacts.GetIndexById(id); 
     m_contacts.Remove(idx); 
     writeContacts(); 
     return true
    } 
     
    /**
     * Adds a new contact 
     * @param name The contacts Name 
     * @param dob The contacts Date of Birth 
     * @param landphone The home phone number 
     * @param mobilephone The mobile phone number 
     * @param workphone The work phone number 
     * @param email The email address 
     * @param workemail The work email address 
     * @throws Exception If an error occurs  
     */
 
    public static Contact AddContact(String name, Calendar dob,  
      String landphone,  
      String mobilephone, String workphone, String email,  
      String workemail, String website) throws Exception { 
        try
         Contact cnt = new Contact(AllocateContactId(), name, dob, landphone,  
              mobilephone, workphone, email, workemail, website); 
         m_contacts.Add(cnt); 
         writeContacts(); 
         return cnt; 
        }catch(Exception e){ 
         System.out.println("HOLY SHIT AN ERROR"); 
         return null
        } 
    } 
     
    public static Contact EditContact(int id, String name, Calendar dob,  
      String landphone,  
      String mobilephone, String workphone, String email,  
      String workemail, String website) { 
     try
      RemoveContact(id); 
         Contact cnt = new Contact(id, name, dob, landphone,  
              mobilephone, workphone, email, workemail, website); 
         m_contacts.Add(cnt); 
         writeContacts(); 
         return cnt; 
        }catch(Exception e){ 
         System.out.println("HOLY SHIT AN ERROR"); 
         return null
        } 
    } 
     
    /**
     * Remove an event 
     * @param id The events ID 
     * @throws Exception If an error occurs 
     */
 
    public static boolean RemoveEvent(int id) throws Exception { 
        int idx = m_events.GetEventIndexById(id); 
        m_events.Remove(idx); 
        writeEvents(); 
        return true
    } 
     
    /**
     * Edit an event 
     * @param id the id of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    public static boolean EditEvent(int id, String title, Calendar start_date,  
      Calendar end_date, String description, int repetition)  
        throws Exception { 
  RemoveEvent(id); 
  AddEventWithID(id,title, start_date, end_date, description, repetition); 
     return true
    } 
     
    /**
     * Add a Basic Event with ID 
     * @param id The ID of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    private static boolean AddEventWithID(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int repetition)  
        throws Exception { 
     m_events.Add(new Event(id, title, start_date, end_date,  
          description, repetition)); 
     writeEvents(); 
     return true
    } 
     
    /**
     * Add a Basic Event 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    public static boolean AddEvent(String title, Calendar start_date,  
      Calendar end_date, String description, int repetition)  
        throws Exception { 
     m_events.Add(new Event(AllocateEventId(), title, start_date, end_date,  
          description, repetition)); 
     writeEvents(); 
     return true
    } 
     
    /**
     * Edit a social event 
     * @param id the id of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    public static boolean EditSocialEvent(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
  RemoveEvent(id); 
  AddSocialEventWithID(id,title, start_date, end_date, description,  
    repetition, guests); 
     return true
    } 
     
    /**
     * Add a Social Event with ID 
     * @param id The ID of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    private static boolean AddSocialEventWithID(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
     m_events.Add(new SocialEvent(id, title, start_date, end_date,  
          description, repetition, guests)); 
     writeEvents(); 
     return true
    } 
     
    /**
     * Add a Social Event 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @param guests Who else is attending the event 
     * @throws Exception 
     */
 
    public static boolean AddSocialEvent(String title, Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
        m_events.Add(new SocialEvent(AllocateEventId(), title, start_date, 
          end_date, description, repetition, guests)); 
        writeEvents(); 
        return true
    } 
     
    /**
     * Edit a Work event 
     * @param id the id of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    public static boolean EditWorkEvent(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
  RemoveEvent(id); 
  AddWorkEventWithID(id, title, start_date, end_date, description,  
    repetition, guests); 
     return true
    } 
     
    /**
     * Add a work Event with ID 
     * @param id The ID of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @throws Exception If an error occurs 
     */
 
    private static boolean AddWorkEventWithID(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
     m_events.Add(new WorkEvent(id, title, start_date, end_date,  
          description, repetition, guests)); 
     writeEvents(); 
     return true
    } 
     
    /**
     * Add a Work Event 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param repetition How often the even repeats, as a int.  
     * @param guests Who else is attending the event 
     * @throws Exception 
     */
 
    public static boolean AddWorkEvent(String title, Calendar start_date,  
      Calendar end_date, String description, int repetition, int guests)  
        throws Exception { 
        try
         m_events.Add(new WorkEvent(AllocateEventId(), title, start_date,  
          end_date, description, repetition, guests)); 
         writeEvents(); 
        }catch(Exception e){ 
         return false
        } 
        return true
    } 
     
    /**
     * Edit a Birthday event 
     * @param id the id of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @throws Exception If an error occurs 
     */
 
    public static boolean EditBirthdayEvent(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int guests)  
        throws Exception { 
  RemoveEvent(id); 
  AddBirthdayEventWithID(id, title, start_date, end_date, description,  
    guests); 
     return true
    } 
     
    /**
     * Add a Birthday Event with ID 
     * @param id The ID of the event to edit 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @throws Exception If an error occurs 
     */
 
    private static boolean AddBirthdayEventWithID(int id, String title,  
      Calendar start_date,  
      Calendar end_date, String description, int guests)  
        throws Exception { 
     m_events.Add(new BirthdayEvent(id, title, start_date, end_date,  
          description, guests)); 
     writeEvents(); 
     return true
    } 
     
    /**
     * Add a Birthday Event 
     * @param title The events title 
     * @param start_date The events start date 
     * @param end_date The events end date 
     * @param description The description of the event 
     * @param guests Who else is attending the event 
     * @throws Exception 
     */
 
    public static boolean AddBirthdayEvent(String title, Calendar start_date, 
      Calendar end_date, String description, int guests) 
        throws Exception { 
     m_events.Add(new BirthdayEvent(AllocateEventId(), title, start_date,  
          end_date, description, guests));  
     writeEvents(); 
        return true
    } 
     
    /**
     * Write the settings to the CSV file 
     * @throws Exception if file isn't found or error occurs 
     */
 
    private static boolean writeSettings() throws Exception { 
        String data = m_settings.ToCSV(); 
        FileWriter fw = new FileWriter("data/settings.csv"); 
        BufferedWriter writer = new BufferedWriter(fw); 
        writer.write(data); 
        writer.close(); 
        return true
    } 
     
    /**
     * Write the Events to the CSV file 
     * @throws Exception if file isn't found or error occurs 
     */
 
    private static boolean writeEvents() throws Exception { 
        String data = m_events.ToCSV(); 
        FileWriter fw = new FileWriter("data/events.csv"); 
        BufferedWriter writer = new BufferedWriter(fw); 
        writer.write(data); 
        writer.close(); 
        return true
    } 
     
    /**
     * Write the Contacts to the CSV file 
     * @throws Exception if file isn't found or error occurs 
     */
 
    private static boolean writeContacts() throws Exception { 
        String data = m_contacts.ToCSV(); 
        FileWriter fw = new FileWriter("data/contacts.csv"); 
        BufferedWriter writer = new BufferedWriter(fw); 
        writer.write(data); 
        writer.close(); 
        return true
    } 
     
    /**
     * Set up the Data class, Create the Collections 
     * @throws Exception if an error occurs during execution 
     */
 
    public static boolean Init() throws Exception { 
        m_settings = new SettingsCollection(); 
        m_events = new EventsCollection(); 
        m_contacts = new ContactsCollection(); 
        testDir(); 
        initSettings(); 
        initContacts(); 
        initEvents(); 
         
        /*//This is test code! Uncomment! 
        Calendar cal = Calendar.getInstance(); 
        Calendar cale = Calendar.getInstance(); 
        cale.add(Calendar.HOUR, 2); 
        AddEvent("title1", cal, cale, "desc", Event.REPEATING_WORKING_DAYS); 
        AddEvent("title2", cal, cale, "desc", Event.REPEATING_WEEKENDS); 
         
        cal.add(Calendar.HOUR, 4); 
        cale.add(Calendar.HOUR,4); 
        AddSocialEvent("socialEvent1", cal, cale, "descr",  
        Event.REPEATING_FOUR_WEEKS, 0); 
        cal.add(Calendar.HOUR, 2); 
        cale.add(Calendar.HOUR, 2); 
        AddWorkEvent("workEvent1", cal, cale, "descr",  
        Event.REPEATING_MONTHLY, 0);*/
 
         
        return true
    } 
     
     
    /**
     * Test the data directory actually exists, if not make it! 
     */
 
    private static boolean testDir() { 
        File data = new File("data"); 
        if(!data.isDirectory() || !data.exists()) { 
            data.mkdir(); 
        } 
        return true
    } 
     
    /**
     * Initialise the contacts collection, This loads contacts from the CSV 
     * file and saves them into the collection.  
     * @throws Exception in an error occurs, eg while reading the file 
     */
 
    private static boolean initContacts() throws Exception { 
        try { 
            File contacts_file = new File("data/contacts.csv"); 
            if(!contacts_file.exists()) 
                contacts_file.createNewFile(); 
            CSVReader reader = new CSVReader(new FileReader(contacts_file)); 
            String [] nextLine; 
            int line = 0
            while ((nextLine = reader.readNext()) != null) { 
                line++; 
                if(nextLine.length != Contact.NO_FIELDS) { 
                    throw new Exception("Wrong format for csv file " + 
                      "contacts.csv at line "+line); 
                } else { 
                    m_contacts.Add(new Contact( 
                            Data.ParseInt(nextLine[Contact.IDX_ID]),  
                            nextLine[Contact.IDX_NAME],  
                            Data.ParseDate(nextLine[Contact.IDX_DOB]),  
                            nextLine[Contact.IDX_LANDPHONE],  
                            nextLine[Contact.IDX_MOBILEPHONE],  
                            nextLine[Contact.IDX_WORKPHONE],  
                            nextLine[Contact.IDX_EMAIL],  
                            nextLine[Contact.IDX_WORKEMAIL], 
                            nextLine[Contact.IDX_WEBSITE]) 
                        ); 
                    int id = Data.ParseInt(nextLine[Contact.IDX_ID]); 
                    if(id > m_max_contact_id) 
                        m_max_contact_id = id; 
                } 
            } 
        } catch(IOException e) { 
            throw new Exception("Something wrong with file reading... Please "  
              +"contact an administrator"); 
        } 
        return true
    } 
     
    /**
     * Initialise the Events collection, import events form csv and save them  
     * as events in the collection. 
     * @throws Exception 
     */
 
    private static boolean initEvents() throws Exception { 
        try { 
            File events_file = new File("data/events.csv"); 
            if(!events_file.exists()) 
                events_file.createNewFile(); 
            CSVReader reader = new CSVReader(new FileReader(events_file)); 
            String [] nextLine; 
            int line = 0
            while ((nextLine = reader.readNext()) != null) { 
                line++; 
                int no_fields; 
                Event e; 
                int id; 
                switch(Data.ParseInt(nextLine[0])) { 
                    case Event.GENERAL_EVENT:{    
                     no_fields = Event.NO_FIELDS; 
                        e = new Event( 
                            Data.ParseInt(nextLine[Event.IDX_ID]), 
                            nextLine[Event.IDX_TITLE], 
                            Data.ParseDate(nextLine[Event.IDX_START_DATE]), 
                            Data.ParseDate(nextLine[Event.IDX_END_DATE]), 
                            nextLine[Event.IDX_DESCRIPTION], 
                            Data.ParseInt(nextLine[Event.IDX_REPETITION]) 
                        ); 
                        id = Data.ParseInt(nextLine[Event.IDX_ID]); 
                        break
                    } 
                    case Event.BIRTHDAY_EVENT:{   
                     no_fields = BirthdayEvent.NO_FIELDS; 
                        e = new BirthdayEvent( 
                           Data.ParseInt(nextLine[BirthdayEvent.IDX_ID]), 
                           nextLine[BirthdayEvent.IDX_TITLE], 
                         Data.ParseDate(nextLine[BirthdayEvent.IDX_START_DATE]), 
                           Data.ParseDate(nextLine[BirthdayEvent.IDX_END_DATE]), 
                           nextLine[BirthdayEvent.IDX_DESCRIPTION], 
                          //Data.ParseInt(nextLine[BirthdayEvent. 
                           //IDX_REPETITION]), 
                           Data.ParseInt(nextLine[BirthdayEvent.IDX_GUESTS]) 
                        ); 
                        id = Data.ParseInt(nextLine[BirthdayEvent.IDX_ID]); 
                        break
                    } 
                    case Event.WORK_EVENT:{       
                     no_fields = WorkEvent.NO_FIELDS; 
                        e = new WorkEvent( 
                            Data.ParseInt(nextLine[WorkEvent.IDX_ID]), 
                            nextLine[WorkEvent.IDX_TITLE], 
                            Data.ParseDate(nextLine[WorkEvent.IDX_START_DATE]), 
                            Data.ParseDate(nextLine[WorkEvent.IDX_END_DATE]), 
                            nextLine[WorkEvent.IDX_DESCRIPTION], 
                            Data.ParseInt(nextLine[WorkEvent.IDX_REPETITION]), 
                            Data.ParseInt(nextLine[WorkEvent.IDX_GUESTS]) 
                        ); 
                        id = Data.ParseInt(nextLine[WorkEvent.IDX_ID]); 
                        break
                    } 
                    case Event.SOCIAL_EVENT:{     
                     no_fields = SocialEvent.NO_FIELDS; 
                        e = new SocialEvent( 
                            Data.ParseInt(nextLine[SocialEvent.IDX_ID]), 
                            nextLine[SocialEvent.IDX_TITLE], 
                            Data.ParseDate(nextLine[SocialEvent.IDX_START_DATE] 
                              ), 
                            Data.ParseDate(nextLine[SocialEvent.IDX_END_DATE]), 
                            nextLine[SocialEvent.IDX_DESCRIPTION], 
                            Data.ParseInt(nextLine[SocialEvent.IDX_REPETITION] 
                              ), 
                            Data.ParseInt(nextLine[SocialEvent.IDX_GUESTS]) 
                        ); 
                        id = Data.ParseInt(nextLine[SocialEvent.IDX_ID]); 
                        break
                    } 
                    default : { 
                        throw new Exception("Unknown event type in events.csv"  
                         + " at line "+line); 
                    } 
                } 
                if(nextLine.length != no_fields) { 
                    throw new Exception("Wrong format for csv file events.csv"  
                      +" at line "+line); 
                } else { 
                    m_events.Add(e); 
                    if(id > m_max_event_id) 
                        m_max_event_id = id; 
                } 
            } 
        } catch(IOException e) { 
            throw new Exception("Something wrong with file reading... Please" + 
              " contact an administrator"); 
        } 
        return true
    } 
     
    /**
     * Initialise the Settings collection, parse all settings into the  
     * collection 
     * @throws Exception 
     */
 
    private static boolean initSettings() throws Exception { 
        try { 
            File settings_file = new File("data/settings.csv"); 
            if(!settings_file.exists())  
                settings_file.createNewFile(); 
            CSVReader reader = new CSVReader(new FileReader(settings_file)); 
            String [] nextLine; 
            int line = 0
            while ((nextLine = reader.readNext()) != null) { 
                line++; 
                if(nextLine.length != Setting.NO_FIELDS) { 
                    throw new Exception("Wrong format for csv file settings." + 
                      "csv at line "+line); 
                } else { 
                    m_settings.Add(new Setting( 
                            nextLine[Setting.IDX_NAME], 
                            nextLine[Setting.IDX_VALUE], 
                            Data.ParseInt(nextLine[Setting.IDX_TYPE])) 
                        ); 
                } 
            } 
            //adding must-have pre-defined settings 
            if(!m_settings.Exists("locale")) 
                AddSetting("locale""EN", Setting.TYPE_STRING); 
        } catch(IOException e) { 
            throw new Exception("Something wrong with file reading... Please" + 
              " contact an administrator: "+e.getMessage()); 
        } 
        return true
    } 
     
    /**
     * Parse an int from a string 
     * @param value The string of the int 
     * @return The int 
     */
 
    public static int ParseInt(String value) { 
        return new Integer(value).intValue(); 
    } 
     
    /**
     * Parse a double from a string 
     * @param value The string of the double 
     * @return the double 
     */
 
    public static double ParseDouble(String value) { 
        return new Double(value).doubleValue(); 
    } 
     
    /**
     * Parse the data a data in the format dd/mm/yyyy hh:mm:ss into a correct  
     * calendar object 
     * @param value 
     * @return 
     * @throws Exception 
     */
 
    public static Calendar ParseDate(String value) throws Exception {  
        value = value.trim(); 
        int space = value.indexOf(" "); 
        if(space == -1
            throw new Exception("Date '"+value+"' is not in the format" + 
              " dd/mm/yyyy hh:mm:ss"); 
        String date = value.substring(0, space); 
        String time = value.substring(space+1); 
        int sep1 = date.indexOf("/"); 
        if(sep1 == -1
            throw new Exception("Date '"+value+"' is not in the format " + 
              "dd/mm/yyyy hh:mm:ss"); 
        int sep2 = date.indexOf("/", sep1+1); 
        if(sep2 == -1
            throw new Exception("Date '"+value+"' is not in the format " + 
              "dd/mm/yyyy hh:mm:ss"); 
        int sep3 = time.indexOf(":"); 
        if(sep3 == -1
            throw new Exception("Date '"+value+"' is not in the format " + 
              "dd/mm/yyyy hh:mm:ss"); 
        int sep4 = time.indexOf(":", sep3+1); 
        if(sep4 == -1
            throw new Exception("Date '"+value+"' is not in the format " + 
              "dd/mm/yyyy hh:mm:ss"); 
        String day = date.substring(0, sep1); 
        String month = date.substring(sep1+1, sep2); 
        String year = date.substring(sep2+1); 
        String hour = time.substring(0, sep3); 
        String minute = time.substring(sep3+1, sep4); 
        String second = time.substring(sep4+1); 
         
        Calendar cal = Calendar.getInstance(); 
        cal.set(Calendar.DAY_OF_MONTH, Data.ParseInt(day)); 
        cal.set(Calendar.MONTH, Data.ParseInt(month)-1); 
        cal.set(Calendar.YEAR, Data.ParseInt(year)); 
        cal.set(Calendar.HOUR_OF_DAY, Data.ParseInt(hour)); 
        cal.set(Calendar.MINUTE, Data.ParseInt(minute)); 
        cal.set(Calendar.SECOND, Data.ParseInt(second)); 
         
        return cal; 
    } 
     
    /**
     * Convert a calendar into the format dd/mm/yyyy hh:mm:ss 
     * @param date A calendar object to convert 
     * @return the correctly formated string 
     */
 
    public static String FromDate(Calendar date) { 
        String day = new Integer(date.get(Calendar.DAY_OF_MONTH)).toString(); 
        String month = new Integer(date.get(Calendar.MONTH)+1).toString(); 
        String year = new Integer(date.get(Calendar.YEAR)).toString(); 
        String hour = new Integer(date.get(Calendar.HOUR_OF_DAY)).toString(); 
        String minute = new Integer(date.get(Calendar.MINUTE)).toString(); 
        String second = new Integer(date.get(Calendar.SECOND)).toString(); 
         
        return day+'/'+month+'/'+year+' '+hour+':'+minute+':'+second; 
    } 
     
    public static void main(String args[]) throws Exception { 
     Init(); 
        Calendar temp = ParseDate("04/12/1991 10:02:33"); 
        String date = FromDate(Calendar.getInstance()); 
        System.out.println("Month" + temp.get(Calendar.MONTH)); 
        System.out.println("Year" + temp.get(Calendar.YEAR)); 
        System.out.println("Day" + temp.get(Calendar.DAY_OF_MONTH)); 
        System.out.println("Hour" + temp.get(Calendar.HOUR)); 
        System.out.println("Min" + temp.get(Calendar.MINUTE)); 
        System.out.println("Sec" + temp.get(Calendar.SECOND)); 
         
        System.out.println("Current Date is " + date); 
        String testDate = "04/12/1991 10:02:33"
        temp = ParseDate(testDate); 
        date = FromDate(temp); 
         
        System.out.println(testDate + "  =? " + date); 
    } 
     
}