import java.awt.*;
import java.io.File;
import java.util.*;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;


public class LoadTest {

    private final ImageReader reader;
    private final static boolean printTrace = true;

    public LoadTest() throws Exception {
        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("TIFF");
        if (!readers.hasNext()) { throw new RuntimeException("No readers available for TIFF"); }
        reader = readers.next();
    }

    public void Load(String fName) {

        File file = new File(fName);

        if (!file.exists()) {
            throw new IllegalArgumentException(file + " does not exist");
        } else if (!file.isFile()) {
            throw new IllegalArgumentException(file + " is not a regular file");
        } else if (!file.canRead()) {
            throw new IllegalArgumentException(file + " cannot be read");
        }

        ImageInputStream input = null;
        try {
            input = ImageIO.createImageInputStream(file);
        } catch (Throwable e) {
            System.err.println("NOK: createImageInputStream()\t" + e.getMessage());
            if (printTrace) { e.printStackTrace(); }
            return;
        }

        reader.setInput(input);

        Image images[] = null;
        int numImages = 0;

        try {
            numImages = reader.getNumImages(true);
            images = new Image[numImages];
        } catch (Throwable e) {
            System.err.println("NOK: getNumImages()\t" + e.getMessage());
            if (printTrace) { e.printStackTrace(); }
            return;
        }

        for (int i = 0; i < numImages; i++) {
            try {
                images[i] = reader.read(i);
            } catch (Throwable e) {
                System.err.println("NOK: read()\t" + e.getMessage());
                if (printTrace) { e.printStackTrace(); }
                return;
            }
        }
        System.err.println("OK");
    }

    public static void main(String[] args) throws Exception {

        if (args.length != 1) {
            System.err.println("usage: java LoadTest <tiff_file>");
            return;
        }
        String tiffName = args[0];
        System.out.println("== Loading " + tiffName + " ==");
        LoadTest ldr = new LoadTest();
        ldr.Load(tiffName);
    }
}
