Frédéric Hannes created IO-821:
----------------------------------

             Summary: commons-io 2.15.0 breaks backwards compatibility for 
PathUtils.fileContentEquals
                 Key: IO-821
                 URL: https://issues.apache.org/jira/browse/IO-821
             Project: Commons IO
          Issue Type: Bug
          Components: Utilities
    Affects Versions: 2.15.0
            Reporter: Frédéric Hannes


Version {{2.15.0}} of commons-io features performance improvements by 
[~ggregory]  for PathUtils.fileContextEquals() as listed in the changelog:

_Improve performance of PathUtils.fileContentEquals(Path, Path, LinkOption[], 
OpenOption[]) by about 60%, see PathUtilsContentEqualsBenchmark._

The relevant change occurs in [commit 
{{dd93554b}}|https://github.com/apache/commons-io/commit/dd93554b692cabe884e7a097e431f475397a3b48#diff-4162512d2bb8d032482958d8dabacc1c2398e95597a49fa5b0fc02aabc8717d6R769],
 where the comparison of input streams through {{IOUtils.contentEquals()}} is 
replaced with {{RandomAccessFile.contentEquals()}}.

The issue occurs in {{RandomAccessFileMode.create()}}, where 
[{{Path.toFile()}}|https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#toFile--]
 is called. This method like many in {{Path}}, can throw an 
{{UnsupportedOperationException}} if it is not implemented by the filesystem 
provider.

In our particular case, we compare files from a zip archive with files on disk 
using the [zip filesystem provider that was introduced in Java 
7|https://docs.oracle.com/javase/8/docs/technotes/guides/io/fsp/zipfilesystemprovider.html].
 The class {{jdk.nio.zipfs.ZipPath}} does not implement {{Path.toFile()}} and 
therefore throws an {{UnsupportedOperationException}}.

Though it does not seem unreasonable to limit the functionality of this method 
to a specific subset of {{Path}} implementations, this does seem to be a 
substantial breaking change in behavior of an existing method, which I am not 
sure was intentional.

As a workaround to resolve the issue without downgrading, we now call 
{{IOUtils.contentEquals()}} directly.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to