ical4j icon indicating copy to clipboard operation
ical4j copied to clipboard

Clarification: NumberFormatException vs ParserException

Open rfc2822 opened this issue 6 years ago • 3 comments

Currently, parsing iCalendars with invalid values often throw a NumberFormatException. For instance:

BEGIN:VEVENT
DTSTAMP:20190112T110842Z
CREATED:20190112T110818Z
UID:[email protected]
SEQUENCE:2
LAST-MODIFIED:20190112T110842Z
DESCRIPTION:Ankunft: Sonntag\, 28. Juli 2019\, anreise zwischen 15:30 - 21:
 00\n\nAbreise: Samstag\, 3. August 2019\, abreise zwischen 10:00 - 10:30\n
 \nSie können Ihre Buchung hier ansehen\, ändern oder stornieren
SUMMARY:Some Hotel
LOCATION:Puchen 209\, Altaussee\, 8992\, Austria
GEO:47.634239\;13.767147
DTSTART;VALUE=DATE:20190728
DTEND;VALUE=DATE:20190804
TRANSP:OPAQUE
CLASS:PRIVATE
END:VEVENT

causes

java.lang.NumberFormatException: For input string: "47634239\"
	at java.lang.Long.parseLong(Long.java:443)
	at java.lang.Long.parseLong(Long.java:485)
	at java.math.BigDecimal.<init>(BigDecimal.java:344)
	at java.math.BigDecimal.<init>(BigDecimal.java:425)
	at net.fortuna.ical4j.model.property.Geo.setValue(Geo.java:211)
	at net.fortuna.ical4j.data.CalendarBuilder$ContentHandlerImpl.propertyValue(CalendarBuilder.java:299)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.parse(CalendarParserImpl.java:282)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.access$1100(CalendarParserImpl.java:229)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:210)
	at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.parse(CalendarParserImpl.java:422)
	at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.access$900(CalendarParserImpl.java:406)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:208)
	at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendar(CalendarParserImpl.java:115)
	at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendarList(CalendarParserImpl.java:180)
	at net.fortuna.ical4j.data.CalendarParserImpl.parse(CalendarParserImpl.java:149)
	at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:198)
	at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:178)
	at at.bitfire.ical4android.Event$Companion.fromReader(Event.kt:78)

Another example:

BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:Wieseclan
PRODID:-//The Horde Project//Horde iCalendar Library//EN
BEGIN:VTODO
UID:1d58e8e0-4fac-4632-8d43-ec79757490d2.1519164997000
SUMMARY:Alex Geschenkeliste
DESCRIPTION:[ ] Tip Toi Rund um die Uhr\n[ ] Ravensburger Wort für Wort\n[
  ] Hula Hoop Reifen\n[ ] Pfeil und Bogen mit Zielscheibe\n[ ] Tip Toi
  Spielwelt Autorennen
PRIORITY:
STATUS:NEEDS-ACTION
END:VTODO
END:VCALENDAR

causes

EXCEPTION java.lang.NumberFormatException: For input string: ""
	at java.lang.Integer.parseInt(Integer.java:620)
	at java.lang.Integer.parseInt(Integer.java:643)
	at net.fortuna.ical4j.model.property.Priority.setValue(Priority.java:218)
	at net.fortuna.ical4j.data.CalendarBuilder$ContentHandlerImpl.propertyValue(CalendarBuilder.java:299)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.parse(CalendarParserImpl.java:282)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.access$1100(CalendarParserImpl.java:229)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:210)
	at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.parse(CalendarParserImpl.java:422)
	at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.access$900(CalendarParserImpl.java:406)
	at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:208)
	at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendar(CalendarParserImpl.java:115)
	at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendarList(CalendarParserImpl.java:180)
	at net.fortuna.ical4j.data.CalendarParserImpl.parse(CalendarParserImpl.java:149)
	at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:198)
	at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:178)
	at at.bitfire.ical4android.Task$Companion.fromReader(Task.kt:66)

I wonder whether this

  1. is intended behavior – in this case, it should be documented in CalenderBuilder.build JavaDoc that these methods @throws IllegalArgumentException or NumberFormatException. I could send a merge request for that. or
  2. should be wrapped in a ParserException, but then this would apply to all operations that could throw an IllegalArgumentException

rfc2822 avatar Jan 27 '19 20:01 rfc2822

Perhaps we could use the role that any checked exceptions are wrapper in ParserException and unchecked exceptions (illegal argument, number format, etc) need to be handled in application code.

For this we probably need to document accurately the unchecked exceptions so they can be handled..

benfortuna avatar Jan 27 '19 22:01 benfortuna

+1

Example:

GEO:12.345678\;-1.234587

->

Caused by: java.lang.NumberFormatException: For input string: "12345678\"
        at java.lang.Long.parseLong(Long.java:594)
        at java.lang.Long.parseLong(Long.java:636)
        at java.math.BigDecimal.<init>(BigDecimal.java:344)
        at java.math.BigDecimal.<init>(BigDecimal.java:425)
        at net.fortuna.ical4j.model.property.Geo.setValue(Geo.java:214)

sbechet avatar Mar 15 '20 13:03 sbechet

Maybe unescape string forgotten like here?

aValue.substring(0, aValue.indexOf(';'));
...

sbechet avatar Mar 15 '20 13:03 sbechet