/* (c) 2015 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.netcdf.layer;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBException;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Resource;
import org.geotools.coverage.io.netcdf.cf.NetCDFCFParser;
import org.geotools.imageio.netcdf.utilities.NetCDFUtilities;
import org.geotools.util.logging.Logging;
/**
* Bean used for creating a {@link NetCDFCFParser} singleton, parsing the input cf-standard file
*/
public class NetCDFParserBean {
public final static String NETCDF_STANDARD_NAME_TABLE = "NETCDF_STANDARD_TABLE";
public final static String NETCDF_STANDARD_NAME = "cf-standard-name-table.xml";
private static final Logger LOGGER = Logging.getLogger(NetCDFParserBean.class);
private NetCDFCFParser parser;
public static Resource netcdfFile;
static {
// Check if an external file has been defined
String tableName = System.getProperty(NETCDF_STANDARD_NAME_TABLE);
if (tableName != null && !tableName.isEmpty() && tableName.endsWith("xml")) {
File newFile = new File(tableName);
// Check if the file is valid
boolean valid = newFile.exists() && newFile.canRead() && newFile.isFile();
// If the file is valid, use it has standard name table
if (valid) {
netcdfFile = Files.asResource(newFile);
}
}
}
public NetCDFParserBean() {
Resource cfStandardTable = null;
// Check if an external file has been defined
if (netcdfFile != null) {
cfStandardTable = netcdfFile;
}
// Checking if it is contained in the NetCDF Data Directory
if (cfStandardTable == null && NetCDFUtilities.EXTERNAL_DATA_DIR != null) {
// Getting the directory file
File netCDFDir = new File(NetCDFUtilities.EXTERNAL_DATA_DIR);
// Creating a File filter
FileFilter filter = FileFilterUtils.nameFileFilter(NETCDF_STANDARD_NAME,
IOCase.INSENSITIVE);
// Getting the filtered file array
File[] files = netCDFDir.listFiles(filter);
// Getting the file if present
if (files != null && files.length > 0) {
cfStandardTable = Files.asResource(files[0]);
}
}
if (cfStandardTable == null) {
// Getting geoServer data dir
GeoServerDataDirectory datadir = GeoServerExtensions.bean(GeoServerDataDirectory.class);
// Checking if the standard table is present
try {
cfStandardTable = datadir.get(NETCDF_STANDARD_NAME);
} catch (IllegalStateException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
// Check if the file can be parsed
if (cfStandardTable != null && cfStandardTable.getType() != Resource.Type.UNDEFINED) {
NetCDFCFParser parser = null;
try {
parser = NetCDFCFParser.unmarshallXml(cfStandardTable.file());
} catch (JAXBException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (IllegalStateException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
// If so set it as global attribute
if (parser != null) {
this.parser = parser;
}
} else {
LOGGER.log(Level.WARNING, "No CF-Standard File found");
}
}
/**
* @return an instance of {@link NetCDFCFParser} if present, or null if no cf-standard table file is present or badly parsed.
*/
public NetCDFCFParser getParser() {
return parser;
}
}