Uploaded image for project: 'Commons CSV'
  1. Commons CSV
  2. CSV-307

Exception change in CSVParser.getNextRecord() raises minimum Android version

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.10.0
    • None
    • Parser
    • None

    Description

      I have an Android project targeting minSdk 21 (Android 5). Recently, dependabot offered 1.10.0 as an update for commons-csv.

      1.10.0 changes the behaviour of org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord to throw an java.io.UncheckedIOException instead of an IllegalArgumentException or IllegalStateException (I wrote the code long ago and am no longer sure which of the two exceptions has been replaced).

      I use the following input:

              String csvText = "2\n" +
                      "\n" +
                      "_id\n" +
                      "Health\n" +
                      "Food\n" +
                      "Fashion\n" +
                      "\n" +
                      "_id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus\n" +
                      "1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,1,QR_CODE,0,\r\n" +
                      "8,Clothes Store,Note about store,,,0,,a,,-5317,,0,\n" +
                      "2,Department Store,,,1618041729,0,,A,,-9977996,,0,\n" +
                      "3,Grocery Store,\"Multiline note about grocery store\n" +
                      "\n" +
                      "with blank line\",,,150,,dhd,,-9977996,,0,\n" +
                      "4,Pharmacy,,,,0,,dhshsvshs,,-10902850,,1,\n" +
                      "5,Restaurant,Note about restaurant here,,,0,,98765432,23456,-10902850,CODE_128,0,\n" +
                      "6,Shoe Store,,,,12.50,EUR,a,-5317,,AZTEC,0,\n" +
                      "\n" +
                      "cardId,groupId\n" +
                      "8,Fashion\n" +
                      "3,Food\n" +
                      "4,Health\n" +
                      "5,Food\n" +
                      "6,Fashion\n";
      

      (Source: https://github.com/CatimaLoyalty/Android/blob/19f406cd8c5fc0defe0948e8ec7b391514dbb408/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java#L108-L169)

      which gets read line-by-line until whitespace is found. This causes the following invalid CSV to given to the CSVParser on the first pass:

      _id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus
      1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,1,QR_CODE,0,
      8,Clothes Store,Note about store,,,0,,a,,-5317,,0,
      2,Department Store,,,1618041729,0,,A,,-9977996,,0,
      3,Grocery Store,"Multiline note about grocery store
      

      In the following code snippet, this used to first throw an IllegalArgumentException or an IllegalStateException, but now throws and UncheckedIOException:

              final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build());
      
              List<CSVRecord> records = new ArrayList<>();
      
              try {
                  for (CSVRecord record : cardParser) {
                      records.add(record);
      
                      if (Thread.currentThread().isInterrupted()) {
                          throw new InterruptedException();
                      }
                  }
              } catch (IllegalArgumentException | IllegalStateException e) {
                  throw new FormatException("Issue parsing CSV data", e);
              } finally {
                  cardParser.close();
              }
      

      (Source: https://github.com/CatimaLoyalty/Android/blob/19f406cd8c5fc0defe0948e8ec7b391514dbb408/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java#L198-L214)

      Trying to change the catch statement to catch UncheckedIOException instead, gives the following error in Android Studio: "Exception requires API level 24 (current min is 21): java.io.UncheckedIOException".

      Effectively, this means the minimal Android version for some parts of this library is now Android 7.

      Is this bump in minimal Android version for certain parts of the codebase intended? The changelogs on https://commons.apache.org/proper/commons-csv/changes-report.html#a1.10.0 do not seem to suggest any such thing.

      Attachments

        Activity

          People

            Unassigned Unassigned
            thelastproject Sylvia van Os
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: