diff --git a/pom.xml b/pom.xml index 5502b6cb..e8f74f59 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ org.scijava scijava-common - 2.95.1 + 2.96.0 diff --git a/src/main/java/net/algart/matrices/io/formats/tiff/bridges/scifio/TiffTools.java b/src/main/java/net/algart/matrices/io/formats/tiff/bridges/scifio/TiffTools.java index f8bddd30..7cd86877 100644 --- a/src/main/java/net/algart/matrices/io/formats/tiff/bridges/scifio/TiffTools.java +++ b/src/main/java/net/algart/matrices/io/formats/tiff/bridges/scifio/TiffTools.java @@ -535,27 +535,35 @@ public static DataHandle getExistingFileHandle(Path file) throws FileN throw new FileNotFoundException("File " + file + (Files.exists(file) ? " is not a regular file" : " does not exist")); } - return getFileHandle(file); + DataHandle fileHandle = getFileHandle(file); + fileHandle.set(new BytesLocation(100)); + return fileHandle; } - public static DataHandle getFileHandle(Path file) { + static DataHandle getFileHandle(Path file) { Objects.requireNonNull(file, "Null file"); return getFileHandle(new FileLocation(file.toFile())); } + /** + * Warning: you should never call {@link DataHandle#set(Object)} method of the returned result! + * It can lead to unpredictable ClassCastException. + */ @SuppressWarnings("rawtypes, unchecked") - public static DataHandle getFileHandle(FileLocation fileLocation) { + static DataHandle getFileHandle(FileLocation fileLocation) { Objects.requireNonNull(fileLocation, "Null fileLocation"); - FileHandle fileHandle = new FileHandle(); - fileHandle.set(fileLocation); + FileHandle fileHandle = new FileHandle(fileLocation); return (DataHandle) fileHandle; } + /** + * Warning: you should never call {@link DataHandle#set(Object)} method of the returned result! + * It can lead to unpredictable ClassCastException. + */ @SuppressWarnings("rawtypes, unchecked") - public static DataHandle getBytesHandle(BytesLocation bytesLocation) { + static DataHandle getBytesHandle(BytesLocation bytesLocation) { Objects.requireNonNull(bytesLocation, "Null bytesLocation"); - BytesHandle bytesHandle = new BytesHandle(); - bytesHandle.set(bytesLocation); + BytesHandle bytesHandle = new BytesHandle(bytesLocation); return (DataHandle) bytesHandle; } diff --git a/src/test/java/net/algart/matrices/io/formats/tiff/bridges/scifio/tests/legacy/FileHandleGenericsBug.java b/src/test/java/net/algart/matrices/io/formats/tiff/bridges/scifio/tests/legacy/FileHandleGenericsBug.java new file mode 100644 index 00000000..22b69700 --- /dev/null +++ b/src/test/java/net/algart/matrices/io/formats/tiff/bridges/scifio/tests/legacy/FileHandleGenericsBug.java @@ -0,0 +1,57 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017-2023 Daniel Alievsky, AlgART Laboratory (http://algart.net) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.algart.matrices.io.formats.tiff.bridges.scifio.tests.legacy; + +import io.scif.SCIFIO; +import io.scif.formats.tiff.TiffParser; +import org.scijava.Context; +import org.scijava.io.handle.DataHandle; +import org.scijava.io.location.BytesLocation; +import org.scijava.io.location.FileLocation; +import org.scijava.io.location.Location; + +import java.io.File; + +public class FileHandleGenericsBug { + public static void main(String[] args) { + if (args.length < 1) { + System.out.println("Usage:"); + System.out.println(" " + FileHandleGenericsBug.class.getName() + " some_tiff_file"); + return; + } + final File file = new File(args[0]); + + Context context = new SCIFIO().getContext(); + TiffParser parser = new TiffParser(context, new FileLocation(file)); + DataHandle stream = parser.getStream(); + System.out.println("Successfully opened: " + stream.getLocation()); + + BytesLocation bytesLocation = new BytesLocation(1000); + stream.set(bytesLocation); // - crash!! java.lang.ClassCastException + + System.out.println("This operator will not be performed"); + context.close(); + } +}