EpnTapFacade.java 7.17 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;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import eu.omp.irap.vespa.epntapclient.granule.Granule;
import eu.omp.irap.vespa.epntapclient.granule.GranuleCtrl;
import eu.omp.irap.vespa.epntapclient.service.Queries;
import eu.omp.irap.vespa.epntapclient.service.Service;
import eu.omp.irap.vespa.epntapclient.service.ServiceCore;
import eu.omp.irap.vespa.epntapclient.service.ServiceCtrl;
import eu.omp.irap.vespa.epntapclient.voresource.VOResourceCtrl;
import eu.omp.irap.vespa.epntapclient.voresource.VOResourceException;
import eu.omp.irap.vespa.epntapclient.voresource.model.Resource;
import eu.omp.irap.vespa.epntapclient.votable.model.VOTABLE;
import eu.omp.irap.vespa.votable.Consts;
import eu.omp.irap.vespa.votable.controller.CantGetVOTableException;
import eu.omp.irap.vespa.votable.controller.VOTableController;
import eu.omp.irap.vespa.votable.utils.StringJoiner;
import eu.omp.irap.vespa.votable.votabledata.VOTableData;

/**
 * @author N. Jourdane
 */
public class EpnTapFacade implements EpnTapInterface {

	/** The logger for the class EpnTapFacade. */
	private static final Logger logger = Logger.getLogger(EpnTapFacade.class.getName());


	// *** Resource ***

	@Override
	public Resource getEPNVOresource(String ivoid) throws VOResourceException {
		return VOResourceCtrl.getVOresource(ivoid);
	}

	// *** Resources ***

	@Override
	public List<Resource> getEPNVOResources() throws VOResourceException {
		return VOResourceCtrl.getVOResources(ServiceCore.EPNCORE);
	}

	@Override
	public List<Resource> getEPNVOResources(Map<String, String> keywords)
			throws VOResourceException {
		return VOResourceCtrl.getVOResources(ServiceCore.EPNCORE, keywords);
	}

	// *** Service ***

	public Service _getEPNService(String ivoid) throws CantGetVOTableException {
		return ServiceCtrl.getServiceFromIvoid(ivoid);
	}

	@Override
	public VOTABLE getEPNService(String ivoid) throws CantGetVOTableException {
		String query = String.format(Queries.GET_TAP_SERVICES_WHERE_IVOID, ivoid);
		VOTableController ctrl = new VOTableController(Consts.DEFAULT_REGISTRY_URL, query);
		ctrl.readTable();
		return ctrl.getVOTable();
	}

	@Override
	public VOTABLE getEPNService(String ivoid, List<String> attributes)
			throws CantGetVOTableException {
		// TODO: optimiser le nombre de requêtes
		String tableName = getEPNCoreTableName(ivoid);
		String query = String.format(Queries.SELECT_FROM, StringJoiner.join(attributes), tableName);
		VOTableController ctrl = new VOTableController(getTAPURL(ivoid), query);
		ctrl.readTable();
		return ctrl.getVOTable();
	}

	// *** Services ***

	@Override
	public List<VOTABLE> getEPNServices() throws VOResourceException {
		List<VOTABLE> voTables = new ArrayList<>();
		List<String> ivoids = VOResourceCtrl.getIvoidResources(ServiceCore.EPNCORE);
		// TODO: optimiser le nombre de requêtes
		for (String ivoid : ivoids) {
			try {
				String query = String.format(Queries.SELECT_ALL, getEPNCoreTableName(ivoid));
				VOTableController ctrl = new VOTableController(getTAPURL(ivoid), query);
				ctrl.readTable();
				voTables.add(ctrl.getVOTable());
			} catch (CantGetVOTableException e) {
				logger.info("Can not get the service " + ivoid + ", skipping...");
			}
		}
		return voTables;
	}

	@Override
	public List<VOTABLE> getEPNServices(List<String> attributes)
			throws CantGetVOTableException, VOResourceException {
		List<VOTABLE> voTables = new ArrayList<>();
		List<String> ivoids = VOResourceCtrl.getIvoidResources(ServiceCore.EPNCORE);
		// TODO: optimiser le nombre de requêtes
		for (String ivoid : ivoids) {
			try {
				String tableName = getEPNCoreTableName(ivoid);
				String query = String.format(Queries.SELECT_FROM, StringJoiner.join(attributes),
						tableName);
				VOTableController ctrl = new VOTableController(getTAPURL(ivoid), query);
				ctrl.readTable();
				voTables.add(ctrl.getVOTable());
			} catch (CantGetVOTableException e) {
				logger.info("Can not get the service " + ivoid + ", skipping...");
			}
		}
		return voTables;
	}

	@Override
	public List<VOTABLE> getEPNServices(Map<String, String> keywords, List<String> attributes)
			throws CantGetVOTableException, VOResourceException {
		List<VOTABLE> voTables = new ArrayList<>();
		List<String> ivoids = VOResourceCtrl.getIvoidResources(ServiceCore.EPNCORE, keywords);
		// TODO: optimiser le nombre de requêtes
		for (String ivoid : ivoids) {
			try {
				String tableName = getEPNCoreTableName(ivoid);
				String query = String.format(Queries.SELECT_FROM, StringJoiner.join(attributes),
						tableName);
				VOTableController ctrl = new VOTableController(getTAPURL(ivoid), query);
				ctrl.readTable();
				voTables.add(ctrl.getVOTable());
			} catch (CantGetVOTableException e) {
				logger.info("Can not get the service " + ivoid + ", skipping...");
			}
		}
		return voTables;
	}

	// *** Getters ***

	@Override
	public String getEPNCoreTableName(String ivoid)
			throws CantGetVOTableException {
		String query = String.format(Queries.GET_TAP_SERVICES_SELECT_WHERE_IVOID, "table_name",
				ivoid);
		VOTableController ctrl = new VOTableController(Consts.DEFAULT_REGISTRY_URL, query);
		ctrl.readTable();
		return (String) ctrl.getVOTableData().getCell(0, 0);
	}

	@Override
	public String getTAPURL(String ivoid)
			throws CantGetVOTableException {
		String query = String.format(Queries.GET_TAP_SERVICES_SELECT_WHERE_IVOID, "access_url",
				ivoid);
		VOTableController ctrl = new VOTableController(Consts.DEFAULT_REGISTRY_URL, query);
		ctrl.readTable();
		return (String) ctrl.getVOTableData().getCell(0, 0);
	}

	// *** Queries ***

	@Override
	public List<Granule> sendADQLQuery(String tapURL, String adqlQuery)
			throws CantGetVOTableException {
		EpnTapController epnTapCtrl = new EpnTapController();
		epnTapCtrl.sendQuery(adqlQuery, tapURL);
		VOTableData data = epnTapCtrl.getResultsController().getVOTableData();
		List<Granule> granules;
		try {
			GranuleCtrl gc = new GranuleCtrl(data);
			granules = gc.getGranulesFromVOTable();
		} catch (ParseException e) {
			throw new CantGetVOTableException("Parsing error on a granule.", e);
		}
		return granules;
	}

	@Override
	public List<Granule> sendQuery(String tapURL, String schemaName, String query) {
		// TODO TBC
		return null;
	}

}