/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012, Geomatys
*
* 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.geotoolkit.coverage.filestore;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.spi.ImageReaderSpi;
import org.apache.sis.storage.DataStoreException;
import org.apache.sis.util.logging.Logging;
import org.geotoolkit.storage.coverage.RecyclingCoverageReference;
import org.geotoolkit.coverage.io.CoverageReader;
import org.geotoolkit.coverage.io.CoverageStoreException;
import org.geotoolkit.coverage.io.GridCoverageReader;
import org.geotoolkit.coverage.io.GridCoverageWriter;
import org.geotoolkit.coverage.io.ImageCoverageReader;
import org.geotoolkit.coverage.io.ImageCoverageWriter;
import org.opengis.util.GenericName;
/**
* Reference to a coverage stored in a single file.
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class FileCoverageReference extends RecyclingCoverageReference{
private static final Logger LOGGER = Logging.getLogger("org.geotoolkit.coverage.filestore");
private final Path file;
private final int imageIndex;
private ImageReaderSpi spi;
@Deprecated
FileCoverageReference(FileCoverageStore store, GenericName name, File file, int imageIndex) {
this(store, name, file.toPath(), imageIndex);
}
FileCoverageReference(FileCoverageStore store, GenericName name, Path file, int imageIndex) {
super(store,name);
this.file = file;
this.imageIndex = imageIndex;
this.spi = store.spi;
}
@Override
public boolean isWritable() throws DataStoreException {
try {
final ImageWriter writer = ((FileCoverageStore)store).createWriter(file);
writer.dispose();
return true;
} catch (IOException ex) {
//no writer found
LOGGER.log(Level.FINER, "No writer found for file : "+file.toAbsolutePath().toString());
}
return false;
}
@Override
protected GridCoverageReader createReader() throws CoverageStoreException {
final ImageCoverageReader reader = new ImageCoverageReader();
try {
final ImageReader ioreader = ((FileCoverageStore)store).createReader(file, spi);
if (spi == null) {
//format was on AUTO. keep the spi for futur reuse.
spi = ioreader.getOriginatingProvider();
}
reader.setInput(ioreader);
} catch (IOException ex) {
throw new CoverageStoreException(ex.getMessage(),ex);
}
return reader;
}
/**
* {@inheritDoc}
*/
@Override
protected void checkReader(CoverageReader reader) throws CoverageStoreException {
final ImageCoverageReader coverageReader = (ImageCoverageReader) reader;
final ImageReader imageReader = (ImageReader) coverageReader.getInput();
if (imageReader == null || imageReader.getInput() == null) {
throw new CoverageStoreException("CoverageReader or ImageReader input is null.");
}
super.checkReader(reader);
}
@Override
public GridCoverageWriter acquireWriter() throws CoverageStoreException {
final ImageCoverageWriter writer = new ImageCoverageWriter();
try {
writer.setOutput( ((FileCoverageStore)store).createWriter(file) );
} catch (IOException ex) {
throw new CoverageStoreException(ex.getMessage(),ex);
}
return writer;
}
@Override
public int getImageIndex() {
return imageIndex;
}
/**
* Get the input image file used for this coverage.
* @return a {@link Path} object which point to he image file of this coverage, or null if the input has not been
* initialized.
*/
public Path getInput() {
return file;
}
public ImageReaderSpi getSpi() {
return spi;
}
public Image getLegend() throws DataStoreException {
return null;
}
}