From e9ba0978f25ff7ff6a716e1b70710b8798f8be00 Mon Sep 17 00:00:00 2001 From: Harpritt Kalsi Date: Wed, 29 Aug 2012 13:14:14 +0000 Subject: [PATCH] Complete - task : ALF-2904 Meeting Workspace with wildcards is displayed incorrectly. SP workspace creation failing because shortname not javascript escaped before submission - now correctly escaped. Calendar event information being lost due to incorrect splitting of iCal lines. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@40978 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../cmr/calendar/CalendarTimezoneHelper.java | 44 ++++++++++++++- .../calendar/CalendarTimezoneHelperTest.java | 53 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelperTest.java diff --git a/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelper.java b/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelper.java index 5f194d7720..40d06f55f7 100644 --- a/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelper.java +++ b/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelper.java @@ -227,6 +227,48 @@ public class CalendarTimezoneHelper return new int[] {month, dayOfMonth, dayOfWeek}; } + + /** + * Splits an iCal line into key and value by the first + * unquoted colon. + * @param icalLine + */ + protected static String[] icalLineKeyValue(String icalLine){ + int delim = indexOfFirstUnquotedColon(icalLine); + if(delim == -1){ + return new String[]{"",""}; + } + String key = icalLine.substring(0,delim); + String value = icalLine.substring(delim+1); + return new String[]{key,value}; + } + + /** + * @param icalLine + * @return location of first non quote enclosed colon + */ + private static int indexOfFirstUnquotedColon(String icalLine){ + int colon = icalLine.indexOf(":"); + int quote = icalLine.indexOf("\""); + + if(quote == -1){ + return colon; + }else{ + if(colon stack = new Stack(); for (String line : segregatedLines) { - String[] keyValue = line.split(":"); + String[] keyValue = icalLineKeyValue(line); if (keyValue.length >= 2) { if (keyValue[0].equals("BEGIN")) diff --git a/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelperTest.java b/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelperTest.java new file mode 100644 index 0000000000..2ea61faff3 --- /dev/null +++ b/source/java/org/alfresco/service/cmr/calendar/CalendarTimezoneHelperTest.java @@ -0,0 +1,53 @@ +package org.alfresco.service.cmr.calendar; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class CalendarTimezoneHelperTest { + + /** + * Ensure that iCal lines are split into key and value + * by the first unquoted colon + */ + @Test + public void icalLineKeyValue(){ + + //blank line + String icalLine = ""; + String[] keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("", keyVal[0]); + assertEquals("", keyVal[1]); + + //single unquoted + icalLine = "a:b"; + keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("a", keyVal[0]); + assertEquals("b", keyVal[1]); + + //multiple unquoted colons + icalLine = "a:bcd:ds"; + keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("a", keyVal[0]); + assertEquals("bcd:ds", keyVal[1]); + + //deliminating colon preceded by quoted colon + icalLine = "a\":bcdA\":ds"; + keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("a\":bcdA\"", keyVal[0]); + assertEquals("ds", keyVal[1]); + + //deliminating colon preceded and followed by quoted colons + icalLine = "a\":bcdA\":ds\"hello\""; + keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("a\":bcdA\"", keyVal[0]); + assertEquals("ds\"hello\"", keyVal[1]); + + //unbalanced quotes + icalLine = "a\":bcdA:ds"; + keyVal = CalendarTimezoneHelper.icalLineKeyValue(icalLine); + assertEquals("", keyVal[0]); + assertEquals("", keyVal[1]); + } + +}