/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-2008, 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.coverageio.jp2k; import it.geosolutions.imageio.imageioimpl.EnhancedImageReadParam; import it.geosolutions.imageio.stream.input.FileImageInputStreamExt; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.geotools.data.DataSourceException; import org.geotools.data.DataUtilities; import org.geotools.util.Utilities; /** * Sparse utilities for the various classes. I use them to extract * complex code from other places. * * @author Simone Giannecchini, GeoSolutions S.A.S. * @author Daniele Romagnoli, GeoSolutions S.A.S. */ class Utils { final static IOFileFilter FILEFILTER = createFilter(); /** * Logger. */ final static Logger LOGGER = org.geotools.util.logging.Logging .getLogger(Utils.class.toString()); static URL checkSource(Object source) throws MalformedURLException, DataSourceException { URL sourceURL = null; // ///////////////////////////////////////////////////////////////////// // // Check source // // ///////////////////////////////////////////////////////////////////// // if it is a URL or a String let's try to see if we can get a file to // check if we have to build the index if (source instanceof URL) { sourceURL = ((URL) source); source = DataUtilities.urlToFile(sourceURL); } else if (source instanceof String) { // is it a File? final String tempSource = (String) source; File tempFile = new File(tempSource); if (!tempFile.exists()) { // is it a URL try { sourceURL = new URL(tempSource); source = DataUtilities.urlToFile(sourceURL); } catch (MalformedURLException e) { sourceURL = null; source = null; } } else { sourceURL = DataUtilities.fileToURL(tempFile); source = tempFile; } } else if (source instanceof FileImageInputStreamExt) { final File inputFile = ((FileImageInputStreamExt) source).getFile(); source = inputFile; } // at this point we have tried to convert the thing to a File as hard as // we could, let's see what we can do if (source instanceof File) { final File sourceFile = (File) source; if (!sourceFile.isDirectory()) sourceURL = ((File) source).toURI().toURL(); } else sourceURL = null; return sourceURL; } /** * Look for an {@link ImageReader} instance that is able to read the * provided {@link ImageInputStream}, which must be non null. * * <p> * In case no reader is found, <code>null</code> is returned. * * @param inStream * an instance of {@link ImageInputStream} for which we need to * find a suitable {@link ImageReader}. * @return a suitable instance of {@link ImageReader} or <code>null</code> * if one cannot be found. */ static ImageReader getReader(final ImageInputStream inStream) { Utilities.ensureNonNull("inStream", inStream); // get a reader // inStream.mark(); try { if (inStream instanceof FileImageInputStreamExt){ final File file = ((FileImageInputStreamExt)inStream).getFile(); if (FILEFILTER.accept(file)) return JP2KFormatFactory.getCachedSpi().createReaderInstance(); } return null; } catch (IOException e) { if (LOGGER.isLoggable(Level.WARNING)) LOGGER.warning(e.getLocalizedMessage()); return null; } } /** * Retrieves an {@link ImageInputStream} for the provided input {@link File} * . * * @param file * @return * @throws IOException */ static ImageInputStream getInputStream(final File file) throws IOException { final ImageInputStream inStream = ImageIO.createImageInputStream(file); if (inStream == null) return null; return inStream; } /** * Setup a double from an array of bytes. * @param bytes * @param start * @return */ public static double bytes2double (final byte[] bytes, final int start) { int i = 0; final int length = 8; int count = 0; final byte[] tmp = new byte[length]; for (i = start; i < (start + length); i++) { tmp[count] = bytes[i]; count++; } long accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 64; shiftBy += 8 ) { accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy; i++; } return Double.longBitsToDouble(accum); } /** * Setup a long from an array of bytes. * @param bytes * @param start * @return */ public static long bytes2long (final byte[] bytes, final int start) { int i = 0; final int length = 4; int count = 0; final byte[] tmp = new byte[length]; for (i = start; i < (start + length); i++) { tmp[count] = bytes[i]; count++; } long accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) { accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy; i++; } return accum; } private static IOFileFilter createFilter() { IOFileFilter fileFilter = Utils.includeFilters( FileFilterUtils.suffixFileFilter("jp2"), FileFilterUtils.suffixFileFilter("JP2"), FileFilterUtils.suffixFileFilter("j2c"), FileFilterUtils.suffixFileFilter("J2C"), FileFilterUtils.suffixFileFilter("jpx"), FileFilterUtils.suffixFileFilter("JPX"), FileFilterUtils.suffixFileFilter("jp2k"), FileFilterUtils.suffixFileFilter("JP2K"), FileFilterUtils.nameFileFilter("jpeg2000")); return fileFilter; } static IOFileFilter excludeFilters(final IOFileFilter inputFilter, IOFileFilter... filters) { IOFileFilter retFilter = inputFilter; for (IOFileFilter filter : filters) { retFilter = FileFilterUtils.andFileFilter(retFilter, FileFilterUtils.notFileFilter(filter)); } return retFilter; } static IOFileFilter includeFilters(final IOFileFilter inputFilter, IOFileFilter... filters) { IOFileFilter retFilter = inputFilter; for (IOFileFilter filter : filters) { retFilter = FileFilterUtils.orFileFilter(retFilter, filter); } return retFilter; } }