GranuleCtrl.java 6.66 KB
/*
 * 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
 * <http://www.gnu.org/licenses/>.
 */

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) {
		String res = "";
		try {
			res = (String) data.getCell(rowId, granuleEnum.toString());
		} catch (Exception e) {
			logger.warning(granuleEnum + "not found in the rowId" + rowId + 
					": return an empty string");
		}
		return res;
	}

	private Date parseDate(int rowId, GranuleEnum granuleEnum) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
		Date date = new Date();
		try {
			date = sdf.parse((String) data.getCell(rowId, granuleEnum.toString()));
		} catch (Exception e) {
			logger.warning(granuleEnum + "not found in the rowId" + rowId + 
					": return an empty Date");
		}
		
		return date;
	}

	private Double parseDouble(int rowId, GranuleEnum granuleEnum) {
		Double d = null;
		try {
			d = (Double) data.getCell(rowId, granuleEnum.toString());
		} catch (Exception e) {
			logger.warning(granuleEnum + "not found in the rowId" + rowId + 
					": return a Double.NaN");
		}
		
		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 = parseInteger(rowId);
		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;
	}

	/**
	 * @param rowId
	 * @return
	 */
	public Integer parseInteger(int rowId) {
		Integer val = 0;
		try {
			val = (Integer) data.getCell(rowId, GranuleEnum.PROCESSING_LEVEL.toString());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return val;
	}

	public static boolean isV2(VOTableData data) {
		return !data.isContainingColumnName("index");
	}

	public List<Granule> 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<Granule> granules = new ArrayList<>();

		if (data != null){
			for (int rowId = 0; rowId < data.getNbRows(); rowId++) {
				granules.add(getGranuleFromVOTableRow(rowId));
			}
		}
		return granules;
	}

}