Skip to content

Changelog

Mike Angstadt edited this page Jan 7, 2024 · 33 revisions

Regarding backwards-compatibility: Regrettably, I have not been formally adhering to semantic versioning convention when assigning version numbers to each release. Each release may or may not introduce API changes that break builds.

0.6.8

January 7, 2024

  • Fixed a bug with parsing duration strings (Issue 127).
  • Fixed a timezone issue (Issue 126).
  • Improved XML XXE protection for xCards.

0.6.7

February 3, 2023

  • Fixed an issue with recurrence date generation where recurrences that use BYSETPOS where skipping the first date and not including the time component (Issue 122).
  • Added "Automatic-Module-Name" to JAR file manifest (PR 112).
  • Updated dependency libraries to latest versions.

0.6.6

January 10, 2021

  • A default timezone can be specified during parsing via ICalReader.setDefaultTimezone (or using the defaultTimezone method in the chaining API). This allows you to change the timezone that floating date values and date values with invalid timezone definitions are parsed under (by default, the local machine's default timezone is used for such values).
  • TZID values starting with "/mozilla.org/20050126_1" are now recognized.
  • You can now customize the way TZID global IDs are resolved via ICalReader.setGlobalTimezoneIdResolver.
  • Updated dependency libraries to latest versions.

0.6.5

November 8, 2020

  • Fixed an issue where locale-specific digit characters were used in timestamps and other numeric values.

0.6.4

October 7, 2020

  • Fixed an issue where recurrences with UNTIL parameters would not stop iterating at the correct date under certain time zones (PR 63, Issue 67, Issue 74, Issue 99, Issue 101).
  • Fixed an issue where recurrences with BYSETPOS parameters would not iterate correctly (Issue 89).
  • Fixed an issue where the DateIterator.advanceTo() method was skipping dates it wasn't supposed to skip (Issue 69).
  • Updated dependency libraries to latest versions.
  • Increased minimum required Java version from 5 to 6. Java 5 is no longer supported by newer JDKs.

0.6.3

December 23, 2018

  • Updated dependency libraries to latest versions.

0.6.2

April 7, 2018

  • Fixed mutability issue in Recurrence.Builder copy constructor (Issue 68).
  • Added the ability to turn off line folding from the chaining API (foldLines() method).
  • Folded property values encoded in quoted-printable are no longer indented (see this and this issue).
  • Fixed issue where the all() method in the chaining parser API was not considering custom scripts.
  • Fixed a number formatting issue with certain non-English locals (Pull 72).
  • Fixed an issue that prevented a iCalendar file from being parsed if its VTIMEZONE definition contained a DTSTART property that lacked a time component (Issue 77).
  • If the recurrence rule in a timezone definition lacks a FREQ component, default to YEARLY (Issue 84).
  • Updated vinnie dependency to support OSGi.

0.6.1

February 19, 2017

  • Fixed a bug that prevented the Biweekly class from writing iCalendar objects to a file.
  • Exposed the property value string constants of all "enum" property classes (for example, Method.REQUEST).
  • Fixed a bug that prevented duration values beginning with "+" from being parsed.
  • Improved performance of date parsing.
  • Added support for the following timestamp formats:
    • Timestamps that lack the minute component of the UTC offset (e.g. "20161231T131000-05").
    • Timestamps that contain a fraction-of-a-second component (e.g. "20161231T131000.1548").
  • Fixed an issue regarding how characters are escaped in version 1.0 iCalendar objects (see this issue).
  • Parse warnings are now represented by the ParseWarning class, instead of a String. This gives you access to more information about the warning, such as the warning code and line number.

0.6.0

October 8, 2016

  • Refactored plain-text serialization code to use the vinnie library. This library provides generic read/write support for vCard and iCalendar file formats. This causes the following changes in biweekly:
    • biweekly is now aware of differences in how the iCalendar versions handle whitespace at the beginning of folded lines. Version 1.0 allows multiple whitespace characters to be used, while version 2.0 only allows a single whitespace character to be used.
    • Escape sequences are no longer recognized in property names or parameter names (this was never intentional in the first place). For example, previously, the newline escape sequence in the property name "HELLO\nWORLD" would have been replaced with a real newline sequence when parsed.
    • The \n newline escape sequence and \" double quote escape sequence are no longer recognized in parameter values, due to not being spec-compliant. Consider enabling circumflex accent encoding if you want to insert these characters into a parameter value.
    • The individual items in list property values (such as CATEGORIES) are no longer trimmed when parsed. For example, CATEGORIES:one, two, three now yields the list ["one", " two", " three"] (notice the space character at the beginning of the last two strings).
  • Significantly refactored the code that calculates the dates in recurrence rules (originally taken from the google-rfc-2445 project).
    • Removed all serialization code, as it was not used by biweekly.
    • Removed code that was duplicated in biweekly. For example, the RRule class was removed and replaced with biweekly's Recurrence class.
    • Improved the Javadocs.
    • Refactored certain parts of the code and unit tests for readability.

0.5.0

July 13, 2016

  • Added XXE protection when parsing xCals.
  • Fixed some issues regarding iterating over the dates in a recurrence iterator for an all-day event (an event where the start date does not have a time component) (Issue 47).
  • Fixed a bug that prevented an iCalendar object from being read if it didn't have a VERSION property. ICalReader now assumes the iCalendar object being parsed is in 2.0 format until it encounters a VERSION property. This can be changed by calling ICalReader.setDefaultVersion() (Issue 48).
  • Fixed a bug with recurrence rule date iterators that occurred when the DateIterator.advanceTo() method was used (Issue 49).
  • The TzUrlDotOrgGenerator class now returns a copy of the VTIMEZONE component it downloads so that its cached copy cannot get modified.
  • The TzUrlDotOrgGenerator class no longer implements VTimezoneGenerator.
  • Removed the VTimezoneGenerator interface.
  • Improved the way in which timezone definitions are handled:
    • The TimezoneInfo object that used to be associated with the reader/writer classes is now associated with the ICalendar object itself. This is useful for when you want to calculate the dates in a recurrence rule, which needs to know the original timezone the start date was formatted in.
    • Timezone definitions are now stored in a TimezoneAssignment object. This object couples a Java TimeZone object with its equivalent (a) VTIMEZONE component or (b) global ID.
    • The TZID properties of VTIMEZONE components are no longer required to be the same as the ID of their equivalent Java TimeZone objects when writing ICalendar objects.
    • Added a convenience method to the writer classes (setGlobalTimezone()) that lets you set a timezone to format all date/time values in, regardless of each individual ICalendar's timezone definitions.

0.4.6

May 17, 2016

  • Improved this library's multimap implementation (ListMultimap) so that List objects returned by its get() method are backed by the multimap. In other words, any changes that are made to these List objects will update the multimap, and vice versa. This effects the following:
    • List objects returned by the ICalendar class and other component classes, which hold property and component objects.
    • List objects returned by the ICalParameters class, which hold parameter values.
  • In response to the above change, various "add/remove" methods were removed from the property classes that simply added and removed elements from a List (for example RecurrenceDates.addDate()). This was done to remove cruft from the API. Instead, use the getter method to get the List object, and perform your modifications on that.
  • Added support for draft-ietf-calext-extensions.
  • Added helper methods to the Method property class to support the values defined in RFC 5546.
  • Added a getDateIterator() method to certain component classes (such as VEVENT). The iterator returned by this method iterates over all the dates that are defined by the union of the RRULE, RDATE, EXRULE, and EXDATE properties.
  • Fixed some bugs in the way that the RecurrenceRule.getDateIterator() method iterated over the dates in a RRULE.
  • Modified serialization logic to ensure that the VERSION and PRODID properties are the first properties to be written (in that order). This is not required by the specs, but may help with interoperability.
  • Modified serialization logic to ensure that the VTIMEZONE components are the first components to be written. This is not required by the specs, but may help with interoperability.
  • Improved performance when parsing iCalendars that have date property values which reference VTIMEZONE components.
  • Fixed multiple issues with the ATTACH property not handling Content ID values correctly.
  • Fixed an issue with VEVENT validation where it thought CANCELLED was a valid status value under vCal 1.0.
  • Improved jCal (JSON) pretty printing by making use of jackson's pretty printing framework.
  • Added optional support for jackson-databind.
  • Renamed the various indent() methods for jCals to prettyPrint().
  • Fixed an issue with xCals where experimental properties with "unknown" data types were parsed incorrectly under certain circumstances.
  • Fixed a round-tripping issue with xCals and jCals where experimental properties with backslash-escaped characters were double-escaped when parsed.
  • The names of experimental properties in xCals are now converted to upper-case when parsed.
  • Updated the embedded commons-codec code to the latest version (1.10).
  • Removed unnecessary commons-codec source files.
  • Moved the google-rfc2445 source files to a different package to prevent conflicts if the library is already on the classpath.

0.4.5

February 6, 2016

  • Added equals() and hashCode() methods to all component, property, and parameter classes. This allows you to check two ICalendar objects for value equality.
  • Added the ability to make deep copies of component and property objects. For example, to make a copy of an ICalendar object, simply invoke its copy constructor.
  • Added useful toString() methods to all component and property classes.
  • Relaxed the logic that checks property names for validity before writing them to an output stream. Before, it would throw an exception if a property name contained any characters not allowed by the specifications. Now, it only throws an exception if the property name contains a character that breaks the syntax (such as newline sequences and colon characters). Spec-compliant character checks have been moved to the validation framework (see ICalendar#validate()).
  • Parameter values are no longer quietly modified to remove or replace invalid characters. All characters are now allowed, except for the ones that break the syntax (in which case, an exception is thrown). Spec-compliant character checks have been moved to the validation framework (see ICalendar#validate()).
  • Fixed a bug that prevented period date/time values from being parsed according to their assigned timezones.
  • Fixed a bug that prevented ATTENDEE and ORGANIZER properties from being parsed correctly if the value's URI scheme ("mailto") was in upper case.
  • Prevented UTF-16 surrogate pairs from being split up across folded lines.
  • Improved performance by removing some regular expressions.
  • Renamed XCalDocument.add(ICalendar) to addICalendar(ICalendar).
  • Improved the return values of some of the ICalComponent class's getter/setter methods. For example, removeProperty() now returns true if the property was found.
  • Moved exception messages into a resource bundle.

0.4.4

November 15, 2015

  • Fixed an issue where biweekly would consume multiple whitespace characters when reading a folded line under certain circumstances. This was in conflict with the specifications, which state that folded lines must begin with only one whitespace character (see Ticket 12).
  • Fixed problem with outputting dates without time components (see Ticket 13).
  • Added the ability to specify the XML version when writing xCals. Note that most JDKs only support version 1.0 natively, so you'll need to include a library like xalan if you want XML 1.1 support.
  • Added the ability to specify your own, custom JAXP output properties when writing xCals.
  • Made the parsing of folded, quoted-printable properties more robust by refactoring the way biweekly parses input.

0.4.3

September 13, 2015

  • Fixed a bug where the UNTIL component of the RRULE property wasn't being written correctly under certain circumstances (see Ticket 10)
  • Fixed an issue where TZID parameters were not matching the VTIMEZONE component's TZID property for certain timezones (see Ticket 11).
  • UtcOffset class now stores its value in milliseconds instead of hours/minutes.
  • Updated jackson dependency from 2.5.2 to 2.6.1.
  • Javadoc improvements

0.4.2

May 5, 2015

0.4.1

January 15, 2015

  • Fixed a bug with the RecurrenceProperty.getDateIterator() method that caused dates to be returned in the wrong timezone.

0.4.0

November 29, 2014

  • Added much improved time zone support.
    • Date-time values are now parsed according to the VTIMEZONE components in the iCalendar object. Before, the VTIMEZONE components were ignored and the date-time value would be parsed according to the TZID parameter value (it was assumed that the TZID would be an Olsen timezone ID).
    • All timezone information is now stored in a TimezoneInfo object. VTIMEZONE components are removed from the parsed ICalendar object and stored in the TimezoneInfo object.
    • To set the default time zone that all date-time values are formatted in, call ICalWriter.getTimezoneInfo().setDefaultTimeZone().
    • Introduced a new ICalDate object, which is now used in most date/time property values. This class extends java.util.Date and has a hasTime field, which flags the object as either a "date/time" or "date" value. This means that methods like DateStart.hasTime() have been removed, since this information is now stored in the property's ICalDate object.
  • Added support for the older vCalendar standard.
    • vCalendar files are automatically converted to the newer iCalendar data model.
    • ICalendar objects can be written according to either the old vCalendar standard or the new iCalendar standard.
  • RecurrenceDates property class: If a parsed RDATE property only contains periods, then RecurrenceDates.getDates() will be empty (instead of null). Similarly, if the property only contains dates, then RecurrenceDates.getPeriods() will be empty (instead of null).
  • Added a getDateIterator() method to the RecurrenceRule and ExceptionRule property classes. This allows you to iterate over all of the dates as defined by the recurrence rule.
  • Added optional dependency definitions to the OSGi bundle settings.

0.3.3

May 31, 2014

  • Added a streaming API for xCals (XCalReader, XCalWriter).
  • Fixed a bug where <unknown> property values in xCal documents weren't being parsed correctly.
  • Removed a regular expression used in parsing code to improve performance.
  • Renamed all "marshaller" classes to "scribes" (e.g. renamed "DescriptionMarshaller" to "DescriptionScribe"). Also moved the marshaller classes from "biweekly.(property/component).marshaller" to "biweekly.io.scribe.(property/component)".
  • Writer classes now check to make sure a scribe class exists for each property before writing anything to the output stream.
  • Improved unit test coverage.
  • Upgraded jackson dependency from version 2.1.3 to 2.3.3.

0.3.2

January 22, 2014

  • Added OSGi support.
  • Added validation and parser warnings to a resource bundle for internationalization.
  • Fixed a bug that prevented large plain-text iCalendar streams from being read (see: discussion, credit: Jordy)
  • When writing plain-text and JSON-encoded iCalendar objects with the Biweekly class, the stream is now flushed after every iCalendar object is written (see Ticket 4, credit: Romain Gonord).

0.3.1

September 21, 2013

Major changes

  • Improved UTF-8 support: UTF-8 encoding is now used essentially whenever a File or InputStream/OutputStream object is passed into one of biweekly's reader/writer classes. Java Reader/Writer objects are not effected by this change because they are configured to use their own character encoding.
    • If a File or OutputStream object is passed into a writer class, UTF-8 encoding will be used.
    • If a File or InputStream object is passed into a plain-text iCal or jCal reader, UTF-8 encoding will be used.
    • If a File or InputStream object is passed into a xCal reader, the "encoding" attribute in the header portion of the XML document will be properly taken into account. Before, it was ignored and the document was parsed according to the JVM's default character encoding.
  • Added support for the EXRULE property.
  • RRULE now supports non-standard rule parts.
  • "Duration" class improvements: Added the following methods to the Duration class (credit: Caruyer Perrine):
    • toMillis() - Converts the duration to milliseconds
    • add(Date) - Adds the duration to a Date object
    • diff(Date, Date) - Factory method that builds a Duration from the difference between two Dates
    • fromMillis(long) - Factory method that builds a Duration from a milliseconds value

Other changes:

  • Added the ability to append onto existing files when writing plain-text files with the Biweekly class.
  • The Biweekly.parse(File) methods no longer throw a FileNotFoundException.
  • The ICalParameter.getRsvp() method now throws an IllegalStateException when the RSVP parameter value cannot be parsed (i.e. if it's something other than "true" or "false"). Before, it would return "null", which was misleading ("null" typically means that the parameter does not exist). Raw parameter values can still be retrieved using the get() method.
  • A CannotParseException is now consistently thrown during the parsing of xCal properties when the XML element which holds the property's value cannot be found.
  • When marshalling to xCard, if a property's value is null (a rare occurrence), then an empty XML element will be written (before, no element was written). This increases conformance with the xCard schema.
  • Created the ICalMarshallerRegistrar class, which can be used to assign a set of custom marshallers to a reader or writer class.
  • Improved the performance of plain-text iCal marshalling by optimizing string escaping functions.
  • Changed JCalValue.asStructured() and JCalValue.structured() so they properly support multi-valued structured components.
  • Renamed the "Value" class to "ICalDataType" and improved data type abstraction in the data model.
  • Moved ValidationWarnings class from the biweekly.component package to the biweekly package.
  • Renamed the following methods:
    • ICalPropertyMarshaller.Result.getValue --> getProperty
    • ICalPropertyMarshaller.getDataType --> dataType
    • JCalValue.getSingleValued --> asSingle
    • JCalValue.getMultivalued --> asMulti
    • JCalValue.getStructured --> asStructured
  • Added syntax highlighting to the code samples in the Javadocs. :)

0.3.0

August 4 2013

  • Added jCal support (JSON-encoded iCalendar objects).
  • Removed the "commons-codec" dependency.
  • Fixed a bug that prevented non-standard parameter values from being parsed.
  • Fixed a bug that prevented an iCalendar object from being parsed if the parser encountered a value-less parameter. A warning is now also logged if it encounters such a parameter, since value-less parameters are not permitted by the specs (see Ticket 1).
  • Fixed a bug that prevented VJOURNAL components from being read/written correctly (its marshaller class was missing).
  • The TZID parameter is now taken into account when reading/writing the RDATE property.
  • Added setLocalTime(boolean) method to certain date-time classes which instructs the library to format the timestamp according to local time (default timezone) when written.
  • The DTSTART property is now formatted according to local time (default timezone) when part of a STANDARD or DAYLIGHT component (timezone definition).
  • Added getter/setter methods to the VEvent and VTodo classes for VALARM components.
  • The ICalWriter class no longer logs warnings.
  • The ICalWriter class now throws an IllegalArgumentException if it cannot find the marshaller class of a property or component object.
  • Validation changes:
    • Property parameters are now validated when ICalendar.validate() is called. Each parameter is checked to make sure its value is valid (for example, confirming that RSVP is either "true" or "false") (see Ticket 2).
    • The values of the ACTION, CALSCALE, CLASS, STATUS, and TRANSP properties are now checked to ensure they use an acceptable value.
    • Validation warnings are now wrapped in a ValidationWarnings object. The ValidationWarnings object contains a list of WarningsGroup objects. Each WarningsGroup object contains a reference to the property/component that caused the warnings, references to the property/component's parent components, and a list of the validation warnings.
  • Added the ability to get/set the raw components of a date-time value for certain properties (see Ticket 3). This is useful for getting/setting the value of the DTSTART properties that are located within VTIMEZONE components.

0.2.0

July 7 2013

  • Added xCal support (XML-encoded iCalendar objects).
  • Added property cardinality validation to ICalendar.validate().

0.1.0

June 25 2013

  • First release.
Clone this wiki locally