org.geoserver.web.netcdf.layer.NetCDFParserBean.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.netcdf.layer.NetCDFParserBean.java

Source

/* (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;
    }
}