/*
* This file is a part of EpnTAPClient.
* This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer.
* See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861
* Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie.
*
* This program is free software: you can
* redistribute it and/or modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or (at your option) any later
* version. This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details. You should have received a copy of
* the GNU General Public License along with this program. If not, see
* .
*/
package eu.omp.irap.vespa.epntapclient.granule;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import eu.omp.irap.vespa.votable.utils.Debug;
import eu.omp.irap.vespa.votable.votabledata.VOTableData;
/**
* @author N. Jourdane
*/
public class GranuleCtrl {
/** The logger for the class GranuleCtrl. */
private static final Logger logger = Logger.getLogger(GranuleCtrl.class.getName());
private VOTableData data;
public GranuleCtrl(VOTableData data) {
this.data = data;
}
private String parseString(int rowId, GranuleEnum granuleEnum) {
return (String) data.getCell(rowId, granuleEnum.toString());
}
private Date parseDate(int rowId, GranuleEnum granuleEnum) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
return sdf.parse((String) data.getCell(rowId, granuleEnum.toString()));
}
private Double parseDouble(int rowId, GranuleEnum granuleEnum) {
Double d = (Double) data.getCell(rowId, granuleEnum.toString());
return d == null ? Double.NaN : d;
}
public Granule getGranuleFromVOTableRow(int rowId) throws ParseException {
// TODO: parser colonne par colonne pour éviter de faire des comparer les noms de colone à
// chaque ligne.
Debug.writeObject("data", data);
//@noformat
Granule g = new Granule(parseString(rowId, GranuleEnum.GRANULE_UID));
g.granuleGid = parseString(rowId, GranuleEnum.GRANULE_GID);
g.obsId = parseString(rowId, GranuleEnum.OBS_ID);
g.dataproductType = parseString(rowId, GranuleEnum.DATAPRODUCT_TYPE);
g.targetName = parseString(rowId, GranuleEnum.TARGET_NAME);
g.targetClass = parseString(rowId, GranuleEnum.TARGET_CLASS);
g.timeMin = parseDouble(rowId, GranuleEnum.TIME_MIN);
g.timeMax = parseDouble(rowId, GranuleEnum.TIME_MAX);
g.timeSamplingStepMin = parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MIN);
g.timeSamplingStepMax = parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MAX);
g.timeExpMin = parseDouble(rowId, GranuleEnum.TIME_EXP_MIN);
g.timeExpMax = parseDouble(rowId, GranuleEnum.TIME_EXP_MAX);
g.spectralRangeMin = parseDouble(rowId, GranuleEnum.SPECTRAL_RANGE_MIN);
g.spectralRangeMax = parseDouble(rowId, GranuleEnum.SPECTRAL_RANGE_MAX);
g.timeSamplingStepMin = parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MIN);
g.timeSamplingStepMax = parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MAX);
g.spectralResolutionMin = parseDouble(rowId, GranuleEnum.SPECTRAL_RESOLUTION_MIN);
g.spectralResolutionMax = parseDouble(rowId, GranuleEnum.SPECTRAL_RESOLUTION_MAX);
g.c1Min = parseDouble(rowId, GranuleEnum.C1MIN);
g.c1Max = parseDouble(rowId, GranuleEnum.C1MAX);
g.c2Min = parseDouble(rowId, GranuleEnum.C2MIN);
g.c2Max = parseDouble(rowId, GranuleEnum.C2MAX);
g.c3Min = parseDouble(rowId, GranuleEnum.C3MIN);
g.c3Max = parseDouble(rowId, GranuleEnum.C3MAX);
g.sRegion = parseString(rowId, GranuleEnum.S_REGION);
g.c1ResolMin = parseDouble(rowId, GranuleEnum.C1_RESOL_MIN);
g.c1ResolMax = parseDouble(rowId, GranuleEnum.C1_RESOL_MAX);
g.c2ResolMin = parseDouble(rowId, GranuleEnum.C2_RESOL_MIN);
g.c2ResolMax = parseDouble(rowId, GranuleEnum.C2_RESOL_MAX);
g.c3ResolMin = parseDouble(rowId, GranuleEnum.C3_RESOL_MIN);
g.c3ResolMax = parseDouble(rowId, GranuleEnum.C3_RESOL_MAX);
g.spatialFrameType = parseString(rowId, GranuleEnum.SPATIAL_FRAME_TYPE);
g.incidenceMin = parseDouble(rowId, GranuleEnum.INCIDENCE_MIN);
g.incidenceMax = parseDouble(rowId, GranuleEnum.INCIDENCE_MAX);
g.emergenceMin = parseDouble(rowId, GranuleEnum.EMERGENCE_MIN);
g.emergenceMax = parseDouble(rowId, GranuleEnum.EMERGENCE_MAX);
g.phaseMin = parseDouble(rowId, GranuleEnum.PHASE_MIN);
g.phaseMax = parseDouble(rowId, GranuleEnum.PHASE_MAX);
g.instrumentHostName = parseString(rowId, GranuleEnum.INSTRUMENT_HOST_NAME);
g.instrumentName = parseString(rowId, GranuleEnum.INSTRUMENT_NAME);
g.measurementType = parseString(rowId, GranuleEnum.MEASUREMENT_TYPE);
g.processingLevel = (Integer) data.getCell(rowId, GranuleEnum.PROCESSING_LEVEL.toString());
g.creationDate = parseDate(rowId, GranuleEnum.CREATION_DATE);
g.modificationDate = parseDate(rowId, GranuleEnum.MODIFICATION_DATE) ;
g.releaseDate = parseDate(rowId, GranuleEnum.RELEASE_DATE) ;
g.serviceTitle = parseString(rowId, GranuleEnum.SERVICE_TITLE);
//@format
if (!g.isValid()) {
throw new IllegalArgumentException("One or more EPN parameter is null.");
}
return g;
}
public static boolean isV2(VOTableData data) {
return !data.isContainingColumnName("index");
}
public List getGranulesFromVOTable() throws ParseException {
Debug.writeObject("data", data);
if (!GranuleCtrl.isV2(data)) {
throw new IllegalArgumentException(
"The EPN-CORE is not v2, which is the only suported version");
}
List granules = new ArrayList<>();
for (int rowId = 0; rowId < data.getNbRows(); rowId++) {
granules.add(getGranuleFromVOTableRow(rowId));
}
return granules;
}
}