/* (c) 2014 - 2015 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; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader; import org.geotools.coverage.grid.io.AbstractGridFormat; import org.geoserver.importer.job.ProgressMonitor; import org.opengis.referencing.operation.OperationNotFoundException; /** * Base for formats that have a GridFormat implementation. * * @author Justin Deoliveira, OpenGeo * */ public class GridFormat extends RasterFormat { private Class<? extends AbstractGridFormat> gridFormatClass; private transient volatile AbstractGridFormat gridFormat; public GridFormat(Class<? extends AbstractGridFormat> gridFormatClass) { this.gridFormatClass = gridFormatClass; } public GridFormat(AbstractGridFormat gridFormat) { this(gridFormat.getClass()); this.gridFormat = gridFormat; } @Override public String getName() { return gridFormat().getName(); } @Override public boolean canRead(ImportData data) throws IOException { AbstractGridFormat gridFormat = gridFormat(); File f = file(data); if (f != null) { return gridFormat.accepts(f); } return false; } @Override public CoverageStoreInfo createStore(ImportData data, WorkspaceInfo workspace, Catalog catalog) throws IOException { File f = file(data); if (f == null) { return null; } CatalogBuilder cb = new CatalogBuilder(catalog); cb.setWorkspace(workspace); CoverageStoreInfo store = cb.buildCoverageStore(data.getName()); store.setURL(relativeDataFileURL(f.toURI().toURL().toString(), catalog)); store.setType(gridFormat().getName()); return store; } @Override public List<ImportTask> list(ImportData data, Catalog catalog, ProgressMonitor monitor) throws IOException { AbstractGridCoverage2DReader reader = null; try { reader = gridReader(data); List<ImportTask> tasks = new ArrayList<ImportTask>(); if (reader != null) { CatalogBuilder cb = new CatalogBuilder(catalog); //create a dummy store CoverageStoreInfo store = cb.buildCoverageStore("dummy"); store.setType(gridFormat().getName()); cb.setStore(store); try { CoverageInfo coverage = cb.buildCoverage(reader, null); coverage.setStore(null); coverage.setNamespace(null); cb.setupBounds(coverage, reader); LayerInfo layer = cb.buildLayer((ResourceInfo)coverage); ImportTask task = new ImportTask(data); task.setLayer(layer); tasks.add(task); } catch (OperationNotFoundException onfe) { throw new ValidationException("Unable to process " + " coordinate reference system of data. The specific" + " problem is : " + onfe.getMessage(), onfe); } catch (Exception e) { throw (IOException) new IOException(). initCause(e); } } return tasks; } finally { if(reader != null) { reader.dispose(); } } } public AbstractGridCoverage2DReader gridReader(ImportData data) throws IOException { //try file based File f = null; if (data instanceof SpatialFile) { f = ((SpatialFile) data).getFile(); } if (data instanceof Directory) { f = ((Directory) data).getFile(); } if (f != null) { AbstractGridFormat gridFormat = gridFormat(); return gridFormat.getReader(f); } return null; } File file(ImportData data) { //try file based File f = null; if (data instanceof SpatialFile) { f = ((SpatialFile) data).getFile(); } if (data instanceof Directory) { f = ((Directory) data).getFile(); } return f; } protected AbstractGridFormat gridFormat() { if (gridFormat == null) { synchronized (this) { if (gridFormat == null) { try { gridFormat = gridFormatClass.newInstance(); } catch (Exception e) { throw new RuntimeException("Unable to create instance of: " + gridFormatClass.getSimpleName(), e); } } } } return gridFormat; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((gridFormatClass == null) ? 0 : gridFormatClass.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; GridFormat other = (GridFormat) obj; if (gridFormatClass == null) { if (other.gridFormatClass != null) return false; } else if (!gridFormatClass.equals(other.gridFormatClass)) return false; return true; } }