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]); + } + +}