/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2014, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.coverage.io;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import it.geosolutions.imageio.plugins.tiff.TIFFImageReadParam;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi;
import java.awt.Rectangle;
import java.awt.image.RenderedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import org.apache.commons.io.IOUtils;
import org.geotools.data.DataUtilities;
import org.geotools.factory.GeoTools;
import org.geotools.factory.Hints;
import org.geotools.test.TestData;
import org.junit.BeforeClass;
import org.junit.Test;
/**
*
* @author Nicola Lagomarsini Geosolutions
*
*/
public class ReadTypeTest {
private final static int IMAGE_INDEX = 0;
private final static boolean CLOSE_ELEMENTS = true;
private static URL granuleUrl;
private static Rectangle rasterDimensions;
private static Hints hints = GeoTools.getDefaultHints();
private static ImageReadParam readParameters;
private static Rectangle rasterDimensionsWrong;
@BeforeClass
public static void setup() throws FileNotFoundException {
// Definition of the url
granuleUrl = TestData.url(ReadTypeTest.class, "img.tiff");
// Definition of the parameters
readParameters = new TIFFImageReadParam();
readParameters.setSourceRegion(new Rectangle(0, 0, 40, 20));
// Definition of the rasterDimensions
rasterDimensions = new Rectangle(0, 0, 20, 20);
// Wrong Raster Dimensions
rasterDimensionsWrong = new Rectangle(41, 21, 2, 2);
}
@Test
public void testJAIReadType() throws IOException {
// Definition of the reader
ImageReader reader = new TIFFImageReaderSpi().createReaderInstance();
FileImageInputStream in = new FileImageInputStream(DataUtilities.urlToFile(granuleUrl));
try {
reader.setInput(in);
// Definition of the read type
ReadType jaiImageRead = ReadType.JAI_IMAGEREAD;
// Check if the default read type is JAI
ReadType defaultRead = ReadType.getDefault();
assertEquals(jaiImageRead, defaultRead);
// Test 1 = wrong region
RenderedImage output = jaiImageRead.read(readParameters, IMAGE_INDEX, granuleUrl,
rasterDimensionsWrong, reader, hints, CLOSE_ELEMENTS);
assertNull(output);
// Test 2 = null URL
output = jaiImageRead.read(readParameters, IMAGE_INDEX, null, rasterDimensions, reader,
hints, CLOSE_ELEMENTS);
assertNull(output);
// Test 3 = null Reader
output = jaiImageRead.read(readParameters, IMAGE_INDEX, granuleUrl, rasterDimensions,
null, hints, CLOSE_ELEMENTS);
assertNull(output);
// Test 4 = correct
output = jaiImageRead.read(readParameters, IMAGE_INDEX, granuleUrl, rasterDimensions,
reader, hints, CLOSE_ELEMENTS);
assertNotNull(output);
Rectangle sourceRegion = readParameters.getSourceRegion();
// Calculate the intersection between the raster dimension and the read parameters
Rectangle.intersect(sourceRegion, rasterDimensions, sourceRegion);
// Check dimensions
assertEquals(output.getMinX(), sourceRegion.x);
assertEquals(output.getMinY(), sourceRegion.y);
assertEquals(output.getWidth(), sourceRegion.width);
assertEquals(output.getHeight(), sourceRegion.height);
} finally {
if (in != null) {
in.close();
}
if(reader != null){
reader.dispose();
}
}
}
@Test
public void testDirectReadType() throws IOException {
// Definition of the reader
// Definition of the read type
ReadType directRead = ReadType.DIRECT_READ;
// Test 1 = wrong region
RenderedImage output = testRead(directRead, readParameters, IMAGE_INDEX, granuleUrl,
rasterDimensionsWrong, hints, CLOSE_ELEMENTS, true);
assertNull(output);
// Test 2 = null URL
output = testRead(directRead, readParameters, IMAGE_INDEX, null, rasterDimensions,
hints, CLOSE_ELEMENTS, true);
assertNull(output);
// Test 3 = null Reader
output = testRead(directRead, readParameters, IMAGE_INDEX, granuleUrl, rasterDimensions,
hints, CLOSE_ELEMENTS, false);
assertNull(output);
// Test 4 = correct
output = testRead(directRead, readParameters, IMAGE_INDEX, granuleUrl, rasterDimensions,
hints, CLOSE_ELEMENTS, true);
assertNotNull(output);
Rectangle sourceRegion = readParameters.getSourceRegion();
// Calculate the intersection between the raster dimension and the read parameters
Rectangle.intersect(sourceRegion, rasterDimensions, sourceRegion);
// Check dimensions
assertEquals(output.getMinX(), sourceRegion.x);
assertEquals(output.getMinY(), sourceRegion.y);
assertEquals(output.getWidth(), sourceRegion.width);
assertEquals(output.getHeight(), sourceRegion.height);
}
private RenderedImage testRead(ReadType directRead, ImageReadParam readParameters, int imageIndex,
URL granuleUrl, Rectangle rasterDimensions, Hints hints, boolean closeElements,
boolean getReader) throws IOException {
ImageReader reader = null;
FileImageInputStream in = null;
try {
if (getReader && granuleUrl != null) {
in = new FileImageInputStream(DataUtilities.urlToFile(granuleUrl));
reader = new TIFFImageReaderSpi().createReaderInstance();
reader.setInput(in);
}
return directRead.read(readParameters, imageIndex, granuleUrl,
rasterDimensions, reader, hints, closeElements);
} finally {
if (reader != null) {
try {
reader.dispose();
} catch (Exception e) {
// silent dispose
}
}
IOUtils.closeQuietly(in);
}
}
@Test(expected = UnsupportedOperationException.class)
public void testUnspecifiedReadType() throws IOException {
// Definition of the read type
ReadType directRead = ReadType.UNSPECIFIED;
// Try the read operation
directRead.read(null, 0, null, null, null, null, false);
}
}