/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.importer.mosaic; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FilenameUtils; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader; import org.geotools.geometry.Envelope2D; import org.geotools.util.logging.Logging; import org.geoserver.importer.DataFormat; import org.geoserver.importer.Directory; import org.geoserver.importer.FileData; import org.geoserver.importer.GridFormat; import org.geoserver.importer.RasterFormat; import org.geoserver.importer.SpatialFile; import org.geoserver.importer.job.ProgressMonitor; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; public class Mosaic extends Directory { private static final Logger LOGGER = Logging.getLogger(Mosaic.class); TimeMode timeMode; TimeHandler timeHandler; public Mosaic(File file) { super(file, false); setTimeMode(TimeMode.NONE); } public TimeMode getTimeMode() { return timeMode; } public void setTimeMode(TimeMode timeMode) { this.timeMode = timeMode; this.timeHandler = timeMode.createHandler(); } public TimeHandler getTimeHandler() { return timeHandler; } @Override public void prepare(ProgressMonitor m) throws IOException { super.prepare(m); //strip away the shapefile index, properties file, and sample_image file files.removeAll(Collections2.filter(files, new Predicate<FileData>() { @Override public boolean apply(FileData input) { File f = input.getFile(); String basename = FilenameUtils.getBaseName(f.getName()); //is this file part a shapefile or properties file? if (new File(f.getParentFile(), basename+".shp").exists() || new File(f.getParentFile(), basename+".properties").exists()) { return true; } if ("sample_image".equals(basename)) { return true; } return false; } })); if (!files.isEmpty()) { DataFormat format = format(); if (format == null) { throw new IllegalArgumentException("Unable to determine format for mosaic files"); } if (!(format instanceof RasterFormat)) { throw new IllegalArgumentException("Mosaic directory must contain only raster files"); } } setFormat(new MosaicFormat()); } @Override protected SpatialFile newSpatialFile(File f, DataFormat format) { if (format instanceof GridFormat) { Granule g = new Granule(super.newSpatialFile(f, format)); //process the granule try { AbstractGridCoverage2DReader r = ((GridFormat)format).gridReader(g); try { //get the envelope GridCoverage2D cov = r.read(null); g.setEnvelope(cov.getEnvelope2D()); g.setGrid(cov.getGridGeometry()); cov.dispose(false); //compute time stamp g.setTimestamp(timeHandler.computeTimestamp(g)); return g; } finally { if (r != null) { r.dispose(); } } } catch (Exception e) { LOGGER.log(Level.WARNING, "Could not read file " + f + ", unable to get coverage info"); } } return super.newSpatialFile(f, format); } @SuppressWarnings("unchecked") public Collection<Granule> granules() { return (Collection) Collections2.filter(files, new Predicate<FileData>() { @Override public boolean apply(FileData input) { return input instanceof Granule; } }); } }