ecological-engine-geospatia.../src/main/java/org/gcube/dataanalysis/geo/utils/ThreddsExplorer.java

103 lines
3.5 KiB
Java

package org.gcube.dataanalysis.geo.utils;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.gcube.contentmanagement.graphtools.utils.HttpRequest;
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import ucar.nc2.constants.FeatureType;
import ucar.nc2.ft.FeatureDataset;
import ucar.nc2.ft.FeatureDatasetFactoryManager;
/**
* Explores the contents of a Thredds instance
* Guesses the nature of a file hosted on the server
* @author coro
*
*/
public class ThreddsExplorer {
// http://thredds.research-infrastructures.eu:8080/thredds/catalog/public/netcdf/catalog.xml
public static String timePrefix = "time:";
public static List<String> getFiles(String catalogURL) throws Exception {
String xml = HttpRequest.sendGetRequest(catalogURL, null);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression xPathExpression = xpath.compile("//child::*[local-name()='catalog']/child::*[local-name()='dataset']/child::*[local-name()='dataset']");
InputSource inputSource = new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8")));
NodeList nodes = (NodeList) xPathExpression.evaluate(inputSource, XPathConstants.NODESET);
List<String> fileNames = new ArrayList<String>();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
String name = node.getAttributes().getNamedItem("name").getNodeValue();
if (name != null)
fileNames.add(name);
}
return fileNames;
}
// A GridDatatype is like a specialized Variable that explicitly handles X,Y,Z,T dimensions
public static boolean isGridDataset(String filename) {
try {
AnalysisLogger.getLogger().debug("Analyzing file " + filename);
Formatter errlog = new Formatter();
FeatureDataset fdataset = FeatureDatasetFactoryManager.open(FeatureType.GRID, filename, null, errlog);
if (fdataset == null) {
// System.out.printf("GRID Parse failed --> %s\n", errlog);
AnalysisLogger.getLogger().debug("ThreddsDataExplorer-> NOT GRID");
return false;
} else
return true;
} catch (Throwable e) {
return false;
}
}
// A GridDatatype is like a specialized Variable that explicitly handles X,Y,Z,T dimensions
public static boolean isPointDataset(String filename) {
try {
Formatter errlog = new Formatter();
FeatureDataset fdataset = FeatureDatasetFactoryManager.open(FeatureType.POINT, filename, null, errlog);
if (fdataset == null) {
AnalysisLogger.getLogger().debug("ThreddsDataExplorer-> NOT POINT");
return false;
} else
return true;
} catch (Exception e) {
return false;
}
}
public static boolean isDataset(String filename) throws Exception {
boolean isdataset = false;
try {
Formatter errlog = new Formatter();
FeatureType[] fts = FeatureType.values();
for (int i = 0; i < fts.length; i++) {
FeatureDataset fdataset = FeatureDatasetFactoryManager.open(fts[i], filename, null, errlog);
if (fdataset == null) {
// System.out.printf(fts[i]+": Parse failed --> %s\n",errlog);
} else {
AnalysisLogger.getLogger().debug("ThreddsDataExplorer-> " + fts[i] + " OK!");
isdataset = true;
}
}
} catch (Exception e) {
}
return isdataset;
}
}