Esempio n. 1
0
        public static GGItem Parse(string input)
        {
            if (IsInvalidInput(input))
            {
                throw new Exception("Invalid input passed to QuickParser");
            }

            string description = string.Empty;
            string tag = string.Empty;
            DateTime endDate = GGItem.DEFAULT_ENDDATE;
            GGItem result = null;
            if (InputContainsQuotes(input))
            {
                string restOfInput = string.Empty;
                description = GetDescriptionFromWithinQuotes(input, ref restOfInput);
                if (restOfInput == null || restOfInput.Trim().Equals(string.Empty))
                {
                    result = new GGItem(description);
                    return result;
                }
                GetDateAndRestOfInputFromInput(restOfInput, ref tag, ref endDate);
                tag = GetTagIfTagExist(restOfInput);
                result = new GGItem(description, endDate, tag);
                return result;
            }
            description = input;
            GetDateAndRestOfInputFromInput(input, ref description, ref endDate);
            GetDescriptionAndTagFromInput(input, ref description, ref tag);
            description = RemoveTrailingPrepositionsFromDescription(description);
            result = new GGItem(description, endDate, tag);
            return result;
        }
Esempio n. 2
0
 public override GGResult Execute(string userCommand, GGList ggList)
 {
     Debug.Assert(userCommand != null && !userCommand.Equals(string.Empty));
     Debug.Assert(ggList != null);
     this.SetGGList(ggList);
     userCommand = StripAddCommandFromUserCommand(userCommand).Trim();
     try
     {
         ThrowExceptionIfIsEmptyInput(userCommand);
         newGgItem = QuickParser.Parse(userCommand);
         ggList.AddGGItem(newGgItem);
         this.SetIsSuccessful(true);
         string successMsg = string.Format(MESSAGE_ADD_SUCCESS, newGgItem.GetDescription());
         Debug.WriteLine(successMsg, "info");
         result = CreateResultInstance(successMsg, GGResult.RESULT_TYPE.RESULT_ADD, ggList.IndexOfGGItem(newGgItem),newGgItem.GetTag());
     }
     catch (Exception e)
     {
         error = e.Message;
         string errorMsg = string.Format(MESSAGE_ERROR, error);
         Debug.WriteLine(errorMsg, "error");
         result = CreateResultInstance(errorMsg, GGResult.RESULT_TYPE.RESULT_INVALID);
     }
     return result;
 }
Esempio n. 3
0
 /// <summary>
 /// Deletes an item from the ggList as specified by the user
 /// </summary>
 /// <param name="userCommand">The command issued by the user</param>
 /// <param name="ggList">The list of task items</param>
 public override GGResult Execute(string userCommand, GGList list)
 {
     Debug.Assert(userCommand != null && !userCommand.Equals(string.Empty));
     this.SetGGList(list);
     if (InvalidInput(userCommand))
     {
         string errorMsg = "Error: Please specify an item id to remove\n";
         Debug.WriteLine(errorMsg);
         return CreateErrorResultInstance(errorMsg);
     }
     int itemIndexToShow = GetItemIndexFromUserCommand(userCommand);
     itemIndex = itemIndexToShow - 1;
     if (IndexOutOfBounds(itemIndex))
     {
         string errorMsg = string.Format("Error: There is no list item of index {0}\n", itemIndexToShow);
         Debug.WriteLine(errorMsg);
         return CreateErrorResultInstance(errorMsg);
     }
     GGList ggList = this.GetGGList();
     removedGgItem = ggList.GetGGItemAt(itemIndex);
     ggList.RemoveGGItemAt(itemIndex);
     this.SetIsSuccessful(true);
     string successMsg = string.Format(MESSAGE_REMOVE_SUCCESS, removedGgItem.GetDescription());
     Debug.WriteLine(successMsg);
     result = new GGResult(string.Empty, successMsg, itemIndex, GGResult.RESULT_TYPE.RESULT_REMOVE, removedGgItem.GetTag()); //useless to return itemindex since item does not exist
     return result;
 }
Esempio n. 4
0
 private static void AddOriginalDataToList(GGList originalList)
 {
     for (int i = 0; i < originalData.Length / 3; i++)
     {
         GGItem item = new GGItem(originalData[i, 0], DateTime.Parse(originalData[i, 1], usCulture), originalData[i, 2]);
         originalList.AddGGItem(item);
     }
 }
Esempio n. 5
0
 private GGItem DetermineFieldAndChange(string newInfoToChangeTo, GGItem itemToChange)
 {
     Match newInfoMatch = null;
     GGItem changedItem = itemToChange;
     DateTime endDate = GGItem.DEFAULT_ENDDATE;
     if (NewInfoIsTag(newInfoToChangeTo, out newInfoMatch))
     {
         string tag = GetTagFromNewInfoMatch(newInfoMatch);
         changedItem.SetTag(tag);
     }
     else if (NewInfoIsDate(newInfoToChangeTo, out endDate))
     {
         changedItem.SetEndDate(endDate);
     }
     else
         changedItem.SetDescription(newInfoToChangeTo);
     return changedItem;
 }
Esempio n. 6
0
        private void GGSyncCornerCaseTest()
        {
            GGSync syncTest = new GGSync("*****@*****.**", "cs2103trocks");
            GGList testList = new GGList();

            PrintSperateLine();

            Console.WriteLine("\nPlease delete GG to-do calendar.");
            Console.ReadKey();

            Console.WriteLine("\nTest: Sync with empty GGList");
            Console.ReadKey();

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("\nPlease check: there should be no event on both sides");

            PrintSperateLine();

            Console.WriteLine("\nTest: Add to empty calendar");
            Console.ReadKey();

            for (int i = 0; i < 3; i++)
            {
                testList.AddGGItem(new GGItem("corner test description " + i, DateTime.Now.AddDays(-i).AddHours(i), "corner test tag " + i));
            }

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("\nPlease check: there should be 3 events on Google Calendar");

            PrintSperateLine();

            Console.WriteLine("\nTest: Add to non-empty calendar");
            Console.ReadKey();

            for (int i = 3; i < 5; i++)
            {
                GGItem testItem = new GGItem("corner test description " + i, DateTime.Now.AddDays(-i).AddHours(i), "corner test tag " + i);
                testList.AddGGItem(testItem);
                Console.WriteLine("\nAdd to local GGList: " + testItem.ToString());
            }

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("\nPlease check: there should be 5 events on Google Calendar");

            PrintSperateLine();

            Console.WriteLine("\nTest: Sync after deleting all events in local GGList");
            Console.ReadKey();

            testList.ClearGGList();

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("\nPlease check: there should be no event on Google Calendar");
            Console.ReadKey();

            PrintSperateLine();

            Console.WriteLine("\nTest: Sync after deleting all events on Google Calendar");

            for (int i = 0; i < 3; i++)
            {
                testList.AddGGItem(new GGItem("corner test description " + i, DateTime.Now.AddDays(-i).AddHours(i), "corner test tag " + i));
            }

            syncTest.SyncWithGoogleCalendar(testList);

            Console.WriteLine("\nPlease delete all 3 events on Google Calendar");
            Console.ReadKey();

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("Please check: there should be no events in local GGList");
            Console.ReadKey();

            PrintSperateLine();

            Console.WriteLine("\nTest: Delete the same event both sides");

            testList.AddGGItem(new GGItem("corner test description 0", DateTime.Now, "corner test tag 0"));
            syncTest.SyncWithGoogleCalendar(testList);

            Console.WriteLine("Please delete the only event on Google Calendar");
            Console.ReadKey();

            testList.ClearGGList();

            PreTestPrint(testList);
            syncTest.SyncWithGoogleCalendar(testList);
            PostTestPrint(testList);

            Console.WriteLine("Please check: there should be no event on both sides");

            Console.ReadKey();
        }
Esempio n. 7
0
        private void GGSyncUnitTest()
        {
            GGSync mySync = new GGSync("*****@*****.**", "cs2103trocks");

            PrintSperateLine();
            Console.WriteLine("\nPlease delete GG to-do calendar\n");
            Console.ReadKey();

            GGList myList = new GGList();
            for (int i = 0; i < 3; i++)
            {
                myList.AddGGItem(new GGItem("desciption_test" + i, DateTime.Now.AddDays(i + 1), "tag_test" + i));
            }

            PrintSperateLine();
            Console.WriteLine("\nTest: add to empty google calender\n");

            PreTestPrint(myList);
            mySync.SyncWithGoogleCalendar(myList);
            PostTestPrint(myList);

            Console.WriteLine("\nPlease check if Google Calendar has 3 events.");

            PrintSperateLine();
            Console.WriteLine("\nTest: local has the latest version\n");
            Console.ReadKey();

            myList.GetGGItemAt(0).SetDescription(myList.GetGGItemAt(0).GetDescription() + " local updated");
            Console.WriteLine("\nupdate local: " + myList.GetGGItemAt(0).ToString());

            GGItem newGGItem = new GGItem("description_test_new", DateTime.Now.AddDays(5).AddHours(3), "tag_test3");
            myList.AddGGItem(newGGItem);
            Console.WriteLine("\nadd local: " + newGGItem.ToString());

            PreTestPrint(myList);
            mySync.SyncWithGoogleCalendar(myList);
            PostTestPrint(myList);

            Console.WriteLine("\nPlease check Google Calendar: event0->description: 'local updated' appended");
            Console.WriteLine("\nPlease check Google Calendar: new event added: tag_test3");

            PrintSperateLine();
            Console.WriteLine("\nTest: server has the latest version\n");
            Console.WriteLine("\nPlease modified one task, add one task and delete one task on calendar");
            Console.ReadKey();

            PreTestPrint(myList);
            mySync.SyncWithGoogleCalendar(myList);
            PostTestPrint(myList);

            Console.WriteLine("\nPlease check: there should be 4 items after sync");

            PrintSperateLine();
            Console.WriteLine("\nTest: both have some latest events\n");
            myList.GetGGItemAt(2).SetTag(myList.GetGGItemAt(2).GetTag() + " local update");
            Console.WriteLine("\nupdate local: " + myList.GetGGItemAt(2).ToString());
            Console.WriteLine("\nPlease update on server");
            Console.ReadKey();

            PreTestPrint(myList);
            mySync.SyncWithGoogleCalendar(myList);
            PostTestPrint(myList);

            Console.WriteLine("\nPlease check Google Calendar: event_2->tag: 'local update' appended");
            Console.WriteLine("\nPlease check: there should be 4 items after sync");

            PrintSperateLine();
            Console.WriteLine("\nTest: delete from server");

            Console.WriteLine("\nRemove at local list: " + myList.GetGGItemAt(0));
            myList.GetDeletedList().Add(myList.GetGGItemAt(0));
            myList.GetInnerList().Remove(myList.GetGGItemAt(0));
            Console.ReadKey();

            PreTestPrint(myList);
            mySync.SyncWithGoogleCalendar(myList);
            PostTestPrint(myList);

            Console.WriteLine("\nPlease check Google Calendar: there should be 3 events");

            Console.ReadKey();
        }
Esempio n. 8
0
 /// <summary>
 /// Sync GG calendar events to local list
 /// </summary>
 /// <param name="addToLocal">List of GGItems to be added to local GGList</param>
 /// <param name="GGEvents">Google event query results</param>
 /// <param name="server">List of bools to indicate if a Google event has a local version</param>
 private void SyncFromServerToLocal(List<GGItem> addToLocal, EventFeed GGEvents, List<bool> server)
 {
     // Loop through Google events
     for (int i = 0; i < GGEvents.Entries.Count; i++)
     {
         if (!server[i])
         {   // Google event does not has a local version, create on GG calendar : add to local list
             EventEntry e = (EventEntry)GGEvents.Entries[i];
             GGItem newGGItem = new GGItem(e.Title.Text, e.Times[0].EndTime, ExtractTagFromContents(e.Content.Content), DateTime.Parse(e.Updated.ToLongTimeString()), e.Id.AbsoluteUri, ExtractPathFromContents(e.Content.Content));
             addToLocal.Add(newGGItem);
             Log("Add to local: " + newGGItem.ToString());
         }
     }
 }
Esempio n. 9
0
        /// <summary>
        /// Sync local GGItem to GG calendar
        /// </summary>
        /// <param name="addToLocal">List of GGItems to be added to local GGList</param>
        /// <param name="removeFromLocal">List of GGItems to be removed from local GGList</param>
        /// <param name="GGService">Google calendar service object</param>
        /// <param name="GGCalendar">GG calendar</param>
        /// <param name="GGEvents">Google event query results</param>
        /// <param name="server">List of bools to indicate if a Google event has a local version</param>
        /// <param name="ggItem">The local GGItem to be synced</param>
        private void SyncFromLocalToServer(List<GGItem> addToLocal, List<GGItem> removeFromLocal, CalendarService GGService, CalendarEntry GGCalendar, EventFeed GGEvents, List<bool> server, GGItem ggItem)
        {
            if (ggItem.GetEventAbsoluteUrl() == String.Empty)
            {   // Not synced : add to GG Calendar
                Log("Never synced");
                ggItem.SetEventAbsoluteUrl(AddGGEvent(GGService, GGCalendar, ggItem));
                Log("Add to server: " + ggItem.ToString());
            }
            else
            {   // Synced before
                Log("Synced before");
                string id = ggItem.GetEventAbsoluteUrl();

                // Find the coresponding Google event
                AtomEntry theEvent = FindGoogleEvent(GGEvents, server, id);

                if (theEvent == null)
                {   // Not found: deleted on GG calendar : remove from local list
                    Log("Event is deleted on server");
                    removeFromLocal.Add(ggItem);
                    Log("Removed in local list");
                }
                else
                {   // Found
                    SolveConflict(addToLocal, removeFromLocal, GGService, GGCalendar, ggItem, theEvent);
                }
            }
        }
Esempio n. 10
0
 /// <summary>
 /// Solve conflict by comparing last modified time
 /// </summary>
 /// <param name="addToLocal">List of GGItems to be added to local GGList</param>
 /// <param name="removeFromLocal">List of GGItems to be removed from local GGList</param>
 /// <param name="GGService">Google calendar service object</param>
 /// <param name="GGCalendar">GG calendar</param>
 /// <param name="ggItem">The local GGItem to be compared</param>
 /// <param name="theEvent">The Google event to be compared</param>
 private void SolveConflict(List<GGItem> addToLocal, List<GGItem> removeFromLocal, CalendarService GGService, CalendarEntry GGCalendar, GGItem ggItem, AtomEntry theEvent)
 {
     if (theEvent.Updated.CompareTo(ggItem.GetLastModifiedTime()) < 0)
     {   // Local is the latest version : delete on server, then add the latest one
         Log("Local is the latest");
         theEvent.Delete();
         Log("Delete on server");
         ggItem.SetEventAbsoluteUrl(AddGGEvent(GGService, GGCalendar, ggItem));
         Log("Add to server: " + ggItem.ToString());
     }
     else
     {   // Server is the latest version : delete on local, then add the latest one
         Log("Server is the latest");
         EventEntry e = (EventEntry)theEvent;
         GGItem newGGItem = new GGItem(e.Title.Text, e.Times[0].EndTime, ExtractTagFromContents(e.Content.Content), DateTime.Parse(e.Updated.ToLongTimeString()), e.Id.AbsoluteUri, ExtractPathFromContents(e.Content.Content));
         removeFromLocal.Add(ggItem);
         addToLocal.Add(newGGItem);
         Log("Update to lsocal: " + newGGItem.ToString());
     }
 }
Esempio n. 11
0
 public void InsertGGItem(int index, GGItem item)
 {
     UpdateTagListForNewItem(item.GetTag());
     list.Insert(index, item);
 }
Esempio n. 12
0
 public void CopyToArray(GGItem[] array, int arrayIndex)
 {
     list.CopyTo(array, arrayIndex);
 }
Esempio n. 13
0
 public bool ContainsGGItem(GGItem item)
 {
     return list.Contains(item);
 }
Esempio n. 14
0
 public void AddGGItem(GGItem ggItem)
 {
     UpdateTagListForNewItem(ggItem.GetTag());
     list.Add(ggItem);
 }
Esempio n. 15
0
 public void SetGGItemAt(int index, GGItem newItem)
 {
     Debug.WriteLineIf(index >= list.Count || index < 0, "GGItem.SetGGItemAt(): Index out of bound");
     Debug.Assert(index < list.Count && index >= 0);
     list[index] = newItem;
 }
Esempio n. 16
0
 public void RemoveGGItem(GGItem ggItem)
 {
     UpdateTagListForDeletedItem(ggItem.GetTag());
     list.Remove(ggItem);
     deletedList.Add(ggItem);
 }
Esempio n. 17
0
        /// <summary>
        /// Parse a GGItem to CSV string
        /// </summary>
        /// <param name="ggItem"></param>
        /// <returns></returns>
        private string ToCSVString(GGItem ggItem)
        {
            string description = ggItem.GetDescription().Replace(Environment.NewLine, "[newline]");
            description = description.Replace(",", "[comma]");

            string tag = ggItem.GetTag().Replace(Environment.NewLine, "[newline]");
            tag = tag.Replace(",", "[comma]");
            CultureInfo usCulture = CultureInfo.CreateSpecificCulture("en-US");

            return description + ","
                   + ggItem.GetEndDate().ToString(usCulture) + ","
                   + tag + ","
                   + ggItem.GetLastModifiedTime().ToString() + ","
                   + ggItem.GetEventAbsoluteUrl() + ","
                   + ggItem.GetPath();
        }
Esempio n. 18
0
        /// <summary>
        /// Add a local event to Google Calendar
        /// </summary>
        /// <param name="GGService">Google calendar service object</param>
        /// <param name="GGCalendar">GG calendar object</param>
        /// <param name="myGGItem">GGItem object to be added to GG calendar</param>
        /// <returns>Google event's ID</returns>
        private string AddGGEvent(CalendarService GGService, CalendarEntry GGCalendar, GGItem myGGItem)
        {
            // Create a event object
            EventEntry entry = new EventEntry();

            // Use description as event title (necessary)
            entry.Title.Text = myGGItem.GetDescription();
            // Use tag as event content (optional)
            entry.Content.Content = myGGItem.GetTag() + " | " + myGGItem.GetPath();

            // Set event start and end time
            if (myGGItem.GetEndDate().CompareTo(GGItem.DEFAULT_ENDDATE) != 0)
            {   // Specified endDate
                // Use endDate - 2hours as start time and endDate as end time
                When eventTime = new When(myGGItem.GetEndDate().AddHours(-2), myGGItem.GetEndDate());
                entry.Times.Add(eventTime);
            }
            else
            {   // Default endDate
                // Treat as tasks, set due date as 3 days later
                When eventTime = new When(DateTime.Today, DateTime.Today.AddDays(3));
                entry.Times.Add(eventTime);
            }

            // Log(entry.Updated.ToLongDateString());

            // Set email reminder: 15 minutes before end time
            Reminder GGReminder = new Reminder();
            GGReminder.Minutes = 15;
            GGReminder.Method = Reminder.ReminderMethod.email;
            entry.Reminders.Add(GGReminder);

            // Create the event on Google Calendar
            Uri postUri = new Uri("https://www.google.com/calendar/feeds/" + GGCalendar.Id.AbsoluteUri.Substring(63) + "/private/full");
            AtomEntry insertedEntry = GGService.Insert(postUri, entry);

            // Return the event's ID
            return insertedEntry.Id.AbsoluteUri;
        }
Esempio n. 19
0
 /// <summary>
 /// Delete a event on Google calendar
 /// </summary>
 /// <param name="GGEvents">Google event query results</param>
 /// <param name="server">List of bools to indicate if a Google event has a local version</param>
 /// <param name="ggItem">local version of the Google Event</param>
 private void DeleteEvents(EventFeed GGEvents, List<bool> server, GGItem ggItem)
 {
     if (ggItem.GetEventAbsoluteUrl().CompareTo(string.Empty) != 0)
     {
         AtomEntry theEvent = FindGoogleEvent(GGEvents, server, ggItem.GetEventAbsoluteUrl());
         if (theEvent != null)
         {
             theEvent.Delete();
         }
     }
 }
Esempio n. 20
0
 public int IndexOfGGItem(GGItem item)
 {
     return list.IndexOf(item);
 }