diff --git a/src/main/java/net/fortuna/ical4j/model/AbstractContentBuilder.java b/src/main/java/net/fortuna/ical4j/model/AbstractContentBuilder.java index ce6630a48..c4e45c684 100644 --- a/src/main/java/net/fortuna/ical4j/model/AbstractContentBuilder.java +++ b/src/main/java/net/fortuna/ical4j/model/AbstractContentBuilder.java @@ -4,6 +4,17 @@ public abstract class AbstractContentBuilder { private final boolean allowIllegalNames; + /** + * Default constructor. + */ + public AbstractContentBuilder() { + this(true); + } + + /** + * + * @param allowIllegalNames store unrecognised names as experimental content + */ public AbstractContentBuilder(boolean allowIllegalNames) { this.allowIllegalNames = allowIllegalNames; } diff --git a/src/main/java/net/fortuna/ical4j/model/ComponentBuilder.java b/src/main/java/net/fortuna/ical4j/model/ComponentBuilder.java index 7520eb796..e600312a2 100644 --- a/src/main/java/net/fortuna/ical4j/model/ComponentBuilder.java +++ b/src/main/java/net/fortuna/ical4j/model/ComponentBuilder.java @@ -1,7 +1,6 @@ package net.fortuna.ical4j.model; import net.fortuna.ical4j.model.component.XComponent; -import net.fortuna.ical4j.util.CompatibilityHints; import java.util.Collections; import java.util.List; @@ -16,12 +15,16 @@ public class ComponentBuilder extends AbstractContentBuilde private ComponentList subComponents = new ComponentList<>(); - public ComponentBuilder() { - this(Collections.emptyList()); + public ComponentBuilder(boolean allowIllegalNames) { + this(Collections.emptyList(), allowIllegalNames); } public ComponentBuilder(List> factories) { - super(CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING)); + this(factories, true); + } + + public ComponentBuilder(List> factories, boolean allowIllegalNames) { + super(allowIllegalNames); this.factories = factories; } diff --git a/src/main/java/net/fortuna/ical4j/model/ParameterBuilder.java b/src/main/java/net/fortuna/ical4j/model/ParameterBuilder.java index fd5b29321..3dd303299 100644 --- a/src/main/java/net/fortuna/ical4j/model/ParameterBuilder.java +++ b/src/main/java/net/fortuna/ical4j/model/ParameterBuilder.java @@ -1,7 +1,6 @@ package net.fortuna.ical4j.model; import net.fortuna.ical4j.model.parameter.XParameter; -import net.fortuna.ical4j.util.CompatibilityHints; import org.apache.commons.codec.DecoderException; import java.net.URISyntaxException; @@ -24,7 +23,6 @@ public ParameterBuilder() { } public ParameterBuilder(List> factories) { - super(CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING)); this.factories = factories; } diff --git a/src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java b/src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java index 5e93554d3..afea32303 100644 --- a/src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java +++ b/src/main/java/net/fortuna/ical4j/model/PropertyBuilder.java @@ -1,7 +1,6 @@ package net.fortuna.ical4j.model; import net.fortuna.ical4j.model.property.XProperty; -import net.fortuna.ical4j.util.CompatibilityHints; import org.apache.commons.codec.DecoderException; import java.io.IOException; @@ -30,7 +29,6 @@ public PropertyBuilder() { } public PropertyBuilder(List> factories) { - super(CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING)); this.factories = factories; } diff --git a/src/test/groovy/net/fortuna/ical4j/model/ComponentBuilderTest.groovy b/src/test/groovy/net/fortuna/ical4j/model/ComponentBuilderTest.groovy index ce8d82cfe..d566b905c 100644 --- a/src/test/groovy/net/fortuna/ical4j/model/ComponentBuilderTest.groovy +++ b/src/test/groovy/net/fortuna/ical4j/model/ComponentBuilderTest.groovy @@ -1,6 +1,7 @@ package net.fortuna.ical4j.model import net.fortuna.ical4j.model.component.VEvent +import net.fortuna.ical4j.model.component.XComponent import spock.lang.Specification class ComponentBuilderTest extends Specification { @@ -19,7 +20,7 @@ class ComponentBuilderTest extends Specification { c == new ContentBuilder().vevent() } - def 'test build invalid component'() { + def 'test build unrecognised component'() { given: 'a component builder instance' ComponentBuilder builder = [Arrays.asList(new VEvent.Factory())] @@ -29,7 +30,7 @@ class ComponentBuilderTest extends Specification { when: 'build method called' Component c = builder.build() - then: 'an exception is thrown' - thrown(IllegalArgumentException) + then: 'component vtodo is unrecognised' + c instanceof XComponent } } diff --git a/src/test/groovy/net/fortuna/ical4j/model/ParameterBuilderTest.groovy b/src/test/groovy/net/fortuna/ical4j/model/ParameterBuilderTest.groovy index 1a99d95ec..3a1e59668 100644 --- a/src/test/groovy/net/fortuna/ical4j/model/ParameterBuilderTest.groovy +++ b/src/test/groovy/net/fortuna/ical4j/model/ParameterBuilderTest.groovy @@ -2,6 +2,7 @@ package net.fortuna.ical4j.model import net.fortuna.ical4j.model.parameter.Value +import net.fortuna.ical4j.model.parameter.XParameter import net.fortuna.ical4j.util.CompatibilityHints import spock.lang.Specification @@ -29,7 +30,7 @@ class ParameterBuilderTest extends Specification { p == new ContentBuilder().value('test') } - def 'test build invalid parameter'() { + def 'test build unrecognised parameter'() { given: 'a parameter builder instance' ParameterBuilder builder = [Arrays.asList(new Value.Factory())] @@ -39,7 +40,7 @@ class ParameterBuilderTest extends Specification { when: 'build method called' Parameter p = builder.build() - then: 'an exception is thrown' - thrown(IllegalArgumentException) + then: 'type param is unrecognised' + p instanceof XParameter } } diff --git a/src/test/java/net/fortuna/ical4j/data/CalendarBuilderCustomRegistryTest.java b/src/test/java/net/fortuna/ical4j/data/CalendarBuilderCustomRegistryTest.java index db68f762f..8f68e15d8 100644 --- a/src/test/java/net/fortuna/ical4j/data/CalendarBuilderCustomRegistryTest.java +++ b/src/test/java/net/fortuna/ical4j/data/CalendarBuilderCustomRegistryTest.java @@ -35,6 +35,7 @@ import junit.framework.TestCase; import net.fortuna.ical4j.model.*; import net.fortuna.ical4j.model.component.VEvent; +import net.fortuna.ical4j.model.parameter.XParameter; import net.fortuna.ical4j.util.Strings; import java.io.StringReader; @@ -90,11 +91,9 @@ public void testCustomParameter() throws Exception { // try to build with a regular builder CalendarBuilder builder = new CalendarBuilder(); - try { - builder.build(new StringReader(VEVENT_WITH_SCHEDULE_STATUS)); - fail("expected exception"); - } catch (ParserException ioe) { - } + Calendar cal = builder.build(new StringReader(VEVENT_WITH_SCHEDULE_STATUS)); + assertTrue(cal.getComponent(Component.VEVENT).getProperty(Property.ATTENDEE) + .getParameter(SCHEDULE_STATUS) instanceof XParameter); // try to build with a custom parameter factory final ParameterFactoryRegistry paramFactory = new ParameterFactoryRegistry(); @@ -118,7 +117,7 @@ public Parameter createParameter(final String value) throws URISyntaxException { paramFactory, TimeZoneRegistryFactory.getInstance().createRegistry()); - Calendar cal = builder.build(new StringReader(VEVENT_WITH_SCHEDULE_STATUS)); + cal = builder.build(new StringReader(VEVENT_WITH_SCHEDULE_STATUS)); VEvent event = (VEvent)cal.getComponent(Component.VEVENT); VEvent eventBis = (VEvent)event.copy(); diff --git a/src/test/java/net/fortuna/ical4j/data/CalendarParserImplTest.java b/src/test/java/net/fortuna/ical4j/data/CalendarParserImplTest.java index b157e05da..b26cfe6aa 100644 --- a/src/test/java/net/fortuna/ical4j/data/CalendarParserImplTest.java +++ b/src/test/java/net/fortuna/ical4j/data/CalendarParserImplTest.java @@ -120,13 +120,8 @@ public static TestSuite suite() { TestSuite suite = new TestSuite(); suite.addTest(new CalendarParserImplTest("/samples/invalid/google_aus_holidays.ics", 11)); suite.addTest(new CalendarParserImplTest("/samples/invalid/13-MoonPhase.ics", 215)); - - suite.addTest(new CalendarParserImplTest("/samples/invalid/CalendarDataFile.ics", 25)); - suite.addTest(new CalendarParserImplTest("/samples/invalid/overlaps.ics", 1)); suite.addTest(new CalendarParserImplTest("/samples/invalid/schedule-unstable.ics", 196)); - suite.addTest(new CalendarParserImplTest("/samples/invalid/smallcluster.ics", 12)); - suite.addTest(new CalendarParserImplTest("/samples/invalid/twinkle.ics", 67)); suite.addTest(new CalendarParserImplTest("/samples/invalid/zidestoreical4jbomb.ics", 10)); return suite; } diff --git a/src/test/resources/samples/invalid/twinkle.ics b/src/test/resources/samples/invalid/twinkle.ics index 62b5fbcba..00e96161c 100644 --- a/src/test/resources/samples/invalid/twinkle.ics +++ b/src/test/resources/samples/invalid/twinkle.ics @@ -1,149 +1,149 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN -BEGIN:VEVENT -UID:5891e670-4f21-11d9-8b74-f10fa40dce9b -SUMMARY:Christmas Day -CATEGORIES:Public Holiday -URL:www.downtownchristmas.com.au -STATUS:CONFIRMED -CLASS:PRIVATE -X-MOZILLA-RECUR-DEFAULT-UNITS:years -RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 -DTSTART;VALUE=DATE:20041225 -DTEND;VALUE=DATE:20041226 -DTSTAMP:20041216T051355Z -LAST-MODIFIED:20041217T041608Z -END:VEVENT -BEGIN:VEVENT -UID:71d6e59b-4fe2-11d9-931a-93489f4147fd -SUMMARY:New Year -CATEGORIES:Public Holiday -STATUS:CONFIRMED -CLASS:PUBLIC -RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SA -DTSTART;VALUE=DATE:20050101 -DTEND;VALUE=DATE:20050102 -DTSTAMP:20041217T041611Z -END:VEVENT -BEGIN:VTODO -UID:9a478274-4fe2-11d9-a2d6-c5a782812110 -SUMMARY:Wash the Dishes -LOCATION:Home Kitchen -CATEGORIES:Miscellaneous -PRIORITY:5 -STATUS:NEEDS-ACTION -CLASS:PUBLIC -RRULE:FREQ=WEEKLY;UNTIL=20041231;INTERVAL=1;BYDAY=WE,TH -DTSTART:20041201T080000 -DUE:20041201T084000 -DTSTAMP:20041217T041643Z -END:VTODO -BEGIN:VTODO -UID:319f3400-4f21-11d9-90ca-c8c0f27f698c -SUMMARY:Return library book -LOCATION:National Library -CATEGORIES:Personal -PRIORITY:1 -STATUS:NEEDS-ACTION -CLASS:PRIVATE -X-MOZILLA-ALARM-DEFAULT-UNITS:days -X-MOZILLA-ALARM-DEFAULT-LENGTH:1 -DTSTART:20041222T100000 -DUE:20041222T100000 -DTSTAMP:20041216T051240Z -LAST-MODIFIED:20041217T041826Z -BEGIN:VALARM -TRIGGER;VALUE=DURATION:-P1D -END:VALARM -END:VTODO -BEGIN:VEVENT -UID:be7c2450-4f20-11d9-9da0-b08ca157c90f -SUMMARY:Weekly Meeting -LOCATION:Room 134 -CATEGORIES:Business -STATUS:CONFIRMED -CLASS:PUBLIC -X;MEMBER=AlarmEmailAddress:twinkst19@hotmail.com -DTSTART:20041220T151000 -DTEND:20041220T161000 -DTSTAMP:20041216T050911Z -LAST-MODIFIED:20041217T041844Z -BEGIN:VALARM -TRIGGER;VALUE=DURATION:-PT15M -END:VALARM -END:VEVENT -BEGIN:VEVENT -UID:dcd3dc57-4fe2-11d9-8ba0-8bb6049e7f2e -SUMMARY:MCSD Due Date -CATEGORIES:Projects -STATUS:CONFIRMED -CLASS:PUBLIC -DTSTART:20041206T090000 -DTEND:20041206T090000 -DTSTAMP:20041217T041850Z -END:VEVENT -BEGIN:VEVENT -UID:11d0751a-4fe3-11d9-ad61-d99ae0821462 -SUMMARY:Chinese Chess Compeitition -LOCATION:Expo -CATEGORIES:Competition -STATUS:CANCELLED -CLASS:PUBLIC -RRULE:FREQ=WEEKLY;COUNT=1;INTERVAL=1;BYDAY=WE -DTSTART:20041208T130000 -DTEND:20041208T190000 -DTSTAMP:20041217T041939Z -END:VEVENT -BEGIN:VTODO -UID:4345f85c-4fe3-11d9-b7a3-f9da4aab8015 -SUMMARY:Buy Pete's Birthday Gift -CATEGORIES:Gifts -PRIORITY:5 -STATUS:NEEDS-ACTION -CLASS:PRIVATE -X-MOZILLA-ALARM-DEFAULT-UNITS:days -X-MOZILLA-ALARM-DEFAULT-LENGTH:2 -DTSTART:-0011130T100000 -DUE:-0011130T160000 -DTSTAMP:20041217T042116Z -BEGIN:VALARM -TRIGGER;VALUE=DURATION:-P2D -END:VALARM -END:VTODO -BEGIN:VEVENT -UID:5d942275-4fe3-11d9-b0d6-915bd3cc821f -SUMMARY:Pete's Birthday -CATEGORIES:Birthday -STATUS:CONFIRMED -CLASS:PUBLIC -X-MOZILLA-ALARM-DEFAULT-UNITS:days -X-MOZILLA-ALARM-DEFAULT-LENGTH:7 -X-MOZILLA-RECUR-DEFAULT-UNITS:years -RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 -DTSTART;VALUE=DATE:20041228 -DTEND;VALUE=DATE:20041229 -DTSTAMP:20041217T042235Z -BEGIN:VALARM -TRIGGER;VALUE=DURATION:-P7D -END:VALARM -END:VEVENT -BEGIN:VEVENT -UID:75110de6-4fe3-11d9-b8e8-c4fd88cb67e6 -SUMMARY:Wedding Anniversary -CATEGORIES:Anniversary -STATUS:CONFIRMED -CLASS:PRIVATE -X-MOZILLA-ALARM-DEFAULT-UNITS:days -X-MOZILLA-LASTALARMACK:20041217T142359 -X-MOZILLA-RECUR-DEFAULT-UNITS:years -RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 -DTSTART;VALUE=DATE:20041203 -DTEND;VALUE=DATE:20041204 -DTSTAMP:20041217T042317Z -LAST-MODIFIED:20041217T042359Z -BEGIN:VALARM -TRIGGER;VALUE=DURATION:-P15D -END:VALARM -END:VEVENT +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN +BEGIN:VEVENT +UID:5891e670-4f21-11d9-8b74-f10fa40dce9b +SUMMARY:Christmas Day +CATEGORIES:Public Holiday +URL:www.downtownchristmas.com.au +STATUS:CONFIRMED +CLASS:PRIVATE +X-MOZILLA-RECUR-DEFAULT-UNITS:years +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART;VALUE=DATE:20041225 +DTEND;VALUE=DATE:20041226 +DTSTAMP:20041216T051355Z +LAST-MODIFIED:20041217T041608Z +END:VEVENT +BEGIN:VEVENT +UID:71d6e59b-4fe2-11d9-931a-93489f4147fd +SUMMARY:New Year +CATEGORIES:Public Holiday +STATUS:CONFIRMED +CLASS:PUBLIC +RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SA +DTSTART;VALUE=DATE:20050101 +DTEND;VALUE=DATE:20050102 +DTSTAMP:20041217T041611Z +END:VEVENT +BEGIN:VTODO +UID:9a478274-4fe2-11d9-a2d6-c5a782812110 +SUMMARY:Wash the Dishes +LOCATION:Home Kitchen +CATEGORIES:Miscellaneous +PRIORITY:5 +STATUS:NEEDS-ACTION +CLASS:PUBLIC +RRULE:FREQ=WEEKLY;UNTIL=20041231;INTERVAL=1;BYDAY=WE,TH +DTSTART:20041201T080000 +DUE:20041201T084000 +DTSTAMP:20041217T041643Z +END:VTODO +BEGIN:VTODO +UID:319f3400-4f21-11d9-90ca-c8c0f27f698c +SUMMARY:Return library book +LOCATION:National Library +CATEGORIES:Personal +PRIORITY:1 +STATUS:NEEDS-ACTION +CLASS:PRIVATE +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-ALARM-DEFAULT-LENGTH:1 +DTSTART:20041222T100000 +DUE:20041222T100000 +DTSTAMP:20041216T051240Z +LAST-MODIFIED:20041217T041826Z +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-P1D +END:VALARM +END:VTODO +BEGIN:VEVENT +UID:be7c2450-4f20-11d9-9da0-b08ca157c90f +SUMMARY:Weekly Meeting +LOCATION:Room 134 +CATEGORIES:Business +STATUS:CONFIRMED +CLASS:PUBLIC +X;MEMBER=AlarmEmailAddress:twinkst19@hotmail.com +DTSTART:20041220T151000 +DTEND:20041220T161000 +DTSTAMP:20041216T050911Z +LAST-MODIFIED:20041217T041844Z +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-PT15M +END:VALARM +END:VEVENT +BEGIN:VEVENT +UID:dcd3dc57-4fe2-11d9-8ba0-8bb6049e7f2e +SUMMARY:MCSD Due Date +CATEGORIES:Projects +STATUS:CONFIRMED +CLASS:PUBLIC +DTSTART:20041206T090000 +DTEND:20041206T090000 +DTSTAMP:20041217T041850Z +END:VEVENT +BEGIN:VEVENT +UID:11d0751a-4fe3-11d9-ad61-d99ae0821462 +SUMMARY:Chinese Chess Compeitition +LOCATION:Expo +CATEGORIES:Competition +STATUS:CANCELLED +CLASS:PUBLIC +RRULE:FREQ=WEEKLY;COUNT=1;INTERVAL=1;BYDAY=WE +DTSTART:20041208T130000 +DTEND:20041208T190000 +DTSTAMP:20041217T041939Z +END:VEVENT +BEGIN:VTODO +UID:4345f85c-4fe3-11d9-b7a3-f9da4aab8015 +SUMMARY:Buy Pete's Birthday Gift +CATEGORIES:Gifts +PRIORITY:5 +STATUS:NEEDS-ACTION +CLASS:PRIVATE +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-ALARM-DEFAULT-LENGTH:2 +DTSTART:-0011130T100000 +DUE:-0011130T160000 +DTSTAMP:20041217T042116Z +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-P2D +END:VALARM +END:VTODO +BEGIN:VEVENT +UID:5d942275-4fe3-11d9-b0d6-915bd3cc821f +SUMMARY:Pete's Birthday +CATEGORIES:Birthday +STATUS:CONFIRMED +CLASS:PUBLIC +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-ALARM-DEFAULT-LENGTH:7 +X-MOZILLA-RECUR-DEFAULT-UNITS:years +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART;VALUE=DATE:20041228 +DTEND;VALUE=DATE:20041229 +DTSTAMP:20041217T042235Z +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-P7D +END:VALARM +END:VEVENT +BEGIN:VEVENT +UID:75110de6-4fe3-11d9-b8e8-c4fd88cb67e6 +SUMMARY:Wedding Anniversary +CATEGORIES:Anniversary +STATUS:CONFIRMED +CLASS:PRIVATE +X-MOZILLA-ALARM-DEFAULT-UNITS:days +X-MOZILLA-LASTALARMACK:20041217T142359 +X-MOZILLA-RECUR-DEFAULT-UNITS:years +RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12 +DTSTART;VALUE=DATE:20041203 +DTEND;VALUE=DATE:20041204 +DTSTAMP:20041217T042317Z +LAST-MODIFIED:20041217T042359Z +BEGIN:VALARM +TRIGGER;VALUE=DURATION:-P15D +END:VALARM +END:VEVENT END:VCALENDAR \ No newline at end of file diff --git a/src/test/resources/samples/invalid/CalendarDataFile.ics b/src/test/resources/samples/valid/CalendarDataFile.ics similarity index 100% rename from src/test/resources/samples/invalid/CalendarDataFile.ics rename to src/test/resources/samples/valid/CalendarDataFile.ics