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; }
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; }
/// <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; }
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); } }
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; }
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(); }
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(); }
/// <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()); } } }
/// <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); } } }
/// <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()); } }
public void InsertGGItem(int index, GGItem item) { UpdateTagListForNewItem(item.GetTag()); list.Insert(index, item); }
public void CopyToArray(GGItem[] array, int arrayIndex) { list.CopyTo(array, arrayIndex); }
public bool ContainsGGItem(GGItem item) { return list.Contains(item); }
public void AddGGItem(GGItem ggItem) { UpdateTagListForNewItem(ggItem.GetTag()); list.Add(ggItem); }
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; }
public void RemoveGGItem(GGItem ggItem) { UpdateTagListForDeletedItem(ggItem.GetTag()); list.Remove(ggItem); deletedList.Add(ggItem); }
/// <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(); }
/// <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; }
/// <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(); } } }
public int IndexOfGGItem(GGItem item) { return list.IndexOf(item); }