GranuleCtrl.java 8.32 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.Level;
import java.util.logging.Logger;

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());

	/** The data to parse */
	private VOTableData data;

	/** The error message when the specified row is not found. */
	private static final String ERROR_MSG = "%s not found in the rowId %s: return %s.";


	/**
	 * Constructor of GranuleCtrl
	 *
	 * @param data The VOTable data to parse.
	 */
	public GranuleCtrl(VOTableData data) {
		this.data = data;
	}

	/**
	 * Parse a String value in the VOTable data at the specified row and column.
	 *
	 * @param rowId The row identifier
	 * @param granule The Granule enumeration, representing the column name.
	 * @return The value as String.
	 */
	private String parseString(int rowId, GranuleEnum granule) {
		String res = "";
		try {
			res = (String) data.getCell(rowId, granule.toString());
		} catch (IllegalArgumentException e) {
			LOGGER.log(Level.WARNING, String.format(ERROR_MSG, granule, rowId, "empty string"), e);
		}
		return res;
	}

	/**
	 * Parse a Date value in the VOTable data at the specified row and column.
	 *
	 * @param rowId The row identifier
	 * @param granule The Granule enumeration, representing the column name.
	 * @return The value as Date.
	 * @throws ParseException The date format is not correct.
	 */
	private Date parseDate(int rowId, GranuleEnum granule) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
		Date date = new Date();
		try {
			date = sdf.parse((String) data.getCell(rowId, granule.toString()));
		} catch (IllegalArgumentException e) {
			LOGGER.log(Level.WARNING, String.format(ERROR_MSG, granule, rowId, "empty date"), e);
		}

		return date;
	}

	/**
	 * Parse a Double value in the VOTable data at the specified row and column.
	 *
	 * @param rowId The row identifier
	 * @param granule The Granule enumeration, representing the column name.
	 * @return The value as Double.
	 */
	private Double parseDouble(int rowId, GranuleEnum granule) {
		Double d = null;
		try {
			d = (Double) data.getCell(rowId, granule.toString());
		} catch (IllegalArgumentException e) {
			LOGGER.log(Level.WARNING, String.format(ERROR_MSG, granule, rowId, "double.NaN"), e);
		}

		return d == null ? Double.NaN : d;
	}

	/**
	 * Parse a Double value in the VOTable data at the specified row and column.
	 *
	 * @param rowId The row identifier
	 * @param granule The Granule enumeration, representing the column name.
	 * @return The value as Double.
	 */
	public Integer parseInteger(int rowId, GranuleEnum granule) {
		Integer val = 0;
		try {
			val = (Integer) data.getCell(rowId, granule.toString());
		} catch (IllegalArgumentException e) {
			LOGGER.log(Level.WARNING, String.format(ERROR_MSG, granule, rowId, "0"), e);
		}
		return val;
	}

	/**
	 * Get a Granule object from a VOTable data row.
	 *
	 * @param rowId the row identified
	 * @return the granule at the position rowId in the VOTable data.
	 * @throws ParseException If an element can not be parsed (ie., a date).
	 */
	public Granule getGranuleFromVOTableRow(int rowId) throws ParseException {

		// TODO: Parse column by column, to avoid compare all column name for each line.

		//@noformat
		Granule g = new Granule(parseString(rowId, GranuleEnum.GRANULE_UID));
		g.setGranuleGid(parseString(rowId, GranuleEnum.GRANULE_GID));
		g.setObsId(parseString(rowId, GranuleEnum.OBS_ID));
		g.setDataproductType(parseString(rowId, GranuleEnum.DATAPRODUCT_TYPE));
		g.setTargetName(parseString(rowId, GranuleEnum.TARGET_NAME));
		g.setTargetClass(parseString(rowId, GranuleEnum.TARGET_CLASS));
		g.setTimeMin(parseDouble(rowId, GranuleEnum.TIME_MIN));
		g.setTimeMax(parseDouble(rowId, GranuleEnum.TIME_MAX));
		g.setTimeSamplingStepMin(parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MIN));
		g.setTimeSamplingStepMax(parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MAX));
		g.setTimeExpMin(parseDouble(rowId, GranuleEnum.TIME_EXP_MIN));
		g.setTimeExpMax(parseDouble(rowId, GranuleEnum.TIME_EXP_MAX));
		g.setSpectralRangeMin(parseDouble(rowId, GranuleEnum.SPECTRAL_RANGE_MIN));
		g.setSpectralRangeMax(parseDouble(rowId, GranuleEnum.SPECTRAL_RANGE_MAX));
		g.setTimeSamplingStepMin(parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MIN));
		g.setTimeSamplingStepMax(parseDouble(rowId, GranuleEnum.TIME_SAMPLING_STEP_MAX));
		g.setSpectralResolutionMin(parseDouble(rowId, GranuleEnum.SPECTRAL_RESOLUTION_MIN));
		g.setSpectralResolutionMax(parseDouble(rowId, GranuleEnum.SPECTRAL_RESOLUTION_MAX));
		g.setC1Min(parseDouble(rowId, GranuleEnum.C1MIN));
		g.setC1Max(parseDouble(rowId, GranuleEnum.C1MAX));
		g.setC2Min(parseDouble(rowId, GranuleEnum.C2MIN));
		g.setC2Max(parseDouble(rowId, GranuleEnum.C2MAX));
		g.setC3Min(parseDouble(rowId, GranuleEnum.C3MIN));
		g.setC3Max(parseDouble(rowId, GranuleEnum.C3MAX));
		g.setsRegion(parseString(rowId, GranuleEnum.S_REGION));
		g.setC1ResolMin(parseDouble(rowId, GranuleEnum.C1_RESOL_MIN));
		g.setC1ResolMax(parseDouble(rowId, GranuleEnum.C1_RESOL_MAX));
		g.setC2ResolMin(parseDouble(rowId, GranuleEnum.C2_RESOL_MIN));
		g.setC2ResolMax(parseDouble(rowId, GranuleEnum.C2_RESOL_MAX));
		g.setC3ResolMin(parseDouble(rowId, GranuleEnum.C3_RESOL_MIN));
		g.setC3ResolMax(parseDouble(rowId, GranuleEnum.C3_RESOL_MAX));
		g.setSpatialFrameType(parseString(rowId, GranuleEnum.SPATIAL_FRAME_TYPE));
		g.setIncidenceMin(parseDouble(rowId, GranuleEnum.INCIDENCE_MIN));
		g.setIncidenceMax(parseDouble(rowId, GranuleEnum.INCIDENCE_MAX));
		g.setEmergenceMin(parseDouble(rowId, GranuleEnum.EMERGENCE_MIN));
		g.setEmergenceMax(parseDouble(rowId, GranuleEnum.EMERGENCE_MAX));
		g.setPhaseMin(parseDouble(rowId, GranuleEnum.PHASE_MIN));
		g.setPhaseMax(parseDouble(rowId, GranuleEnum.PHASE_MAX));
		g.setInstrumentHostName(parseString(rowId, GranuleEnum.INSTRUMENT_HOST_NAME));
		g.setInstrumentName(parseString(rowId, GranuleEnum.INSTRUMENT_NAME));
		g.setMeasurementType(parseString(rowId, GranuleEnum.MEASUREMENT_TYPE));
		g.setProcessingLevel(parseInteger(rowId, GranuleEnum.PROCESSING_LEVEL));
		g.setCreationDate(parseDate(rowId, GranuleEnum.CREATION_DATE));
		g.setModificationDate(parseDate(rowId, GranuleEnum.MODIFICATION_DATE) );
		g.setReleaseDate(parseDate(rowId, GranuleEnum.RELEASE_DATE) );
		g.setServiceTitle(parseString(rowId, GranuleEnum.SERVICE_TITLE));
		//@format

		if (!g.isValid()) {
			throw new IllegalArgumentException("One or more EPN parameter is null.");
		}
		return g;
	}

	/**
	 * @return true if the VOTable data implements the EpnCoreV2.
	 */
	public boolean isV2() {
		return !data.isContainingColumnName("index");
	}

	/**
	 * @return A list of Granules from a VOTable, where each Granule is a row of the VOTable data.
	 * @throws ParseException If the granule can not be parsed.
	 */
	public List<Granule> getGranules() throws ParseException {
		if (!isV2()) {
			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;
	}

}