/*
* 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;
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 EpnTapConnection implements EpnTapInterface {
/** The logger for the class EpnTapFacade. */
private static final Logger logger = Logger.getLogger(EpnTapConnection.class.getName());
// *** Resource ***
@Override
public Resource getEPNVOresource(String ivoid) throws VOResourceException {
return VOResourceCtrl.getVOresource(ivoid);
}
// *** Resources ***
@Override
public List getEPNVOResources() throws VOResourceException {
return VOResourceCtrl.getVOResources(ServiceCore.EPNCORE);
}
@Override
public List getEPNVOResources(Map 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 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 getEPNServices() throws VOResourceException {
List voTables = new ArrayList<>();
List 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 getEPNServices(List attributes)
throws CantGetVOTableException, VOResourceException {
List voTables = new ArrayList<>();
List 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 getEPNServices(Map keywords, List attributes)
throws CantGetVOTableException, VOResourceException {
List voTables = new ArrayList<>();
List 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 sendADQLQuery(String tapURL, String adqlQuery)
throws CantGetVOTableException {
EpnTapController epnTapCtrl = new EpnTapController();
epnTapCtrl.sendQuery(adqlQuery, tapURL);
VOTableData data = epnTapCtrl.getResultsController().getVOTableData();
List 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 sendQuery(String tapURL, String schemaName, String query) {
// TODO TBC
return null;
}
}