/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wcs2_0.response; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import org.geoserver.catalog.CoverageInfo; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.GeoServerResourceLoader; import org.geotools.util.logging.Logging; /** * A mapper specifically thought for formats that do have a corresponding JAI image reader * * @author Andrea Aime - GeoSolutions * */ public class ImgMimeTypeMapper implements CoverageMimeTypeMapper { static final Logger LOGGER = Logging.getLogger(ImgMimeTypeMapper.class); @Override public String getMimeType(CoverageInfo cInfo) throws IOException { // no mapping let's go with the ImageIO reader code GeoServerResourceLoader loader = GeoServerExtensions.bean(GeoServerResourceLoader.class); final File sourceFile = loader.url(cInfo.getStore().getURL()); if (sourceFile == null) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Original source is null"); } return null; } else { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Original source: " + sourceFile.getAbsolutePath()); } } ImageInputStream inStream = null; ImageReader reader = null; try { inStream = ImageIO.createImageInputStream(sourceFile); if (inStream == null) { return null; } Iterator<ImageReader> readers = ImageIO.getImageReaders(inStream); if (readers.hasNext()) { reader = readers.next(); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Found reader for format: " + reader.getFormatName()); } String mime = reader.getOriginatingProvider().getMIMETypes()[0]; // the native format rules says "the range set values can be obtained unaltered", // so we cannot allow lossy compressions (which would alter the range set values) String lcMime = mime.toLowerCase(); if(lcMime.contains("jpeg") || lcMime.contains("mrsid") || lcMime.contains("ecw")) { return null; } } } catch (Exception e) { if (LOGGER.isLoggable(Level.WARNING)) { LOGGER.warning("Unable to map mime type for coverage: " + cInfo.toString()); } } finally { try { if (inStream != null) { inStream.close(); } } catch (Exception e) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, e.getLocalizedMessage(), e); } } try { if (reader != null) { reader.dispose(); } } catch (Exception e) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, e.getLocalizedMessage(), e); } } } return null; } }