package com.meteogroup.grib2geotiff.grib;
import ucar.grib.grib2.Grib2Data;
import ucar.grib.grib2.Grib2IdentificationSection;
import ucar.grib.grib2.Grib2Input;
import ucar.grib.grib2.Grib2Record;
import ucar.unidata.io.RandomAccessFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Created by danielt on 14.09.15.
*/
public class GribFileAccess {
private File inputDirectory;
private static final Logger LOGGER = Logger.getLogger(GribFileAccess.class.getName());
/**
* @param inputDirectory
*/
public void setInputDirectory(File inputDirectory) {
this.inputDirectory = inputDirectory;
}
/**
* @param gfsFile
* @param record
* @return
* @throws IOException
*/
public float[] getGfsRecordData(RandomAccessFile gfsFile, Grib2Record record) throws IOException {
Grib2Data gd = new Grib2Data(gfsFile);
Grib2IdentificationSection id = record.getId();
return gd.getData(record.getGdsOffset(), record.getPdsOffset(), id.getRefTime());
}
/**
* @return
* @throws Exception
*/
public List<RandomAccessFile> getRafFiles() throws Exception {
LOGGER.info("start scanning folder " + inputDirectory.getAbsolutePath());
List<RandomAccessFile> validRafFiles = new ArrayList<RandomAccessFile>();
File[] files = inputDirectory.listFiles();
if (files == null || files.length == 0) {
return validRafFiles;
}
for (File file : files) {
RandomAccessFile validRaf = getValidGribfile(file);
if (validRaf != null) {
LOGGER.info("use " + file.getAbsolutePath());
validRafFiles.add(validRaf);
} else {
LOGGER.info("skip " + file.getAbsolutePath());
}
}
return validRafFiles;
}
/**
* @param file
* @return
* @throws Exception
*/
private RandomAccessFile getValidGribfile(File file) throws Exception {
if (!file.exists()
|| file.isDirectory()
|| file.getName().endsWith(".aux.xml")) {
return null;
}
RandomAccessFile raf = new RandomAccessFile(file.getAbsolutePath(), "r");
raf.order(RandomAccessFile.BIG_ENDIAN);
if (Grib2Input.isValidFile(raf)) {
return raf;
} else {
return null;
}
}
/**
* @param gfsFile
* @return
* @throws Exception
*/
public List<Grib2Record> getRecords(RandomAccessFile gfsFile) throws Exception {
Grib2Input g2i = new Grib2Input(gfsFile);
g2i.scan(false, false);
return g2i.getRecords();
}
}