/* * 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.util.List; import java.util.logging.Level; import java.util.logging.Logger; import eu.omp.irap.vespa.epntapclient.service.Queries; import eu.omp.irap.vespa.epntapclient.service.ServiceCore; import eu.omp.irap.vespa.votable.Consts; import eu.omp.irap.vespa.votable.controller.VOTableController; import eu.omp.irap.vespa.votable.controller.VOTableException; import eu.omp.irap.vespa.votable.utils.StringJoiner; /** * The main controller which manage views and controllers. * * @author N. Jourdane */ public abstract class EpnTapController { /** The logger for the class EpnTapController. */ private static final Logger LOGGER = Logger.getLogger(EpnTapController.class.getName()); /** The request controller, to manage requests. */ private RequestCtrl requestCtrl; /** The controller of the VOTable displaying the result. */ private VOTableController resultsCtrl; /** The controller of the VOTable displaying the list of services. */ private VOTableController servicesCtrl; /** * The path of the VOTable to parse. Will be affected to a temporary folder if not assigned * through the controller. */ private String voTablePath; /** * Method constructor, which initialize servicesController, resultsController and mainView. */ public EpnTapController() { // TODO: Should not init controllers, because the default ctrl is called by subclasses. String query = String.format(Queries.SELECT_ALL_TAP_SERVICES_WHERE_CORE, ServiceCore.EPNCORE); servicesCtrl = new VOTableController(Consts.DEFAULT_REGISTRY_URL, query); } /** * Display an error with the logger. * * @param message A small error message. * @param e The error. */ @SuppressWarnings("static-method") // Because the method is overrided by a subclass. public void displayError(String message, Exception e) { LOGGER.log(Level.SEVERE, message, e); } /** * @return The request controller. */ public RequestCtrl getRequestCtrl() { return requestCtrl; } /** * @return The controller of the VOTable which displays the result of the query. */ public VOTableController getResultsCtrl() { return resultsCtrl; } /** * @return The controller of the VOTable which displays the list of services. */ public VOTableController getServicesCtrl() { return servicesCtrl; } /** * @return the path of the XML VOTable file. */ public String getVOTablePath() { return voTablePath; } /** * Get the services from the XML path or the targetURL / query. */ public void readServices() { // Here getServicesCtrl() is used instead of class field servicesCtrl to get the // subclass field, since subclasses overrides getServicesCtrl(). try { getServicesCtrl().readTable(); } catch (VOTableException e) { displayError("Can not get services.", e); } } public void sendQuery(List tableNames, List servicesUrls) { // Here getRequestCtrl() and getResultsCtrl() are used instead of class fields requestCtrl // and resultCtrl to get the subclass field, since subclasses overrides getRequestCtrl() and // getResultsCtrl(). try { LOGGER.info("Sending queries on " + StringJoiner.join(servicesUrls)); for (int i = 0; i < tableNames.size(); i++) { String query = getRequestCtrl().getQuery(tableNames.get(i)); getResultsCtrl().updateVOTable(servicesUrls.get(i), query); } } catch (VOTableException e) { displayError("Can not update the VOTable.", e); } } /** * Send the query to the specified service, download the result and update the voTable path. * * @param query An ADQL query to send. * @param tableServiceURL the URL of the service. * @throws VOTableException Can not get the VOTable. */ public void sendQuery(String query, String tableServiceURL) throws VOTableException { resultsCtrl = new VOTableController(tableServiceURL, query); resultsCtrl.readTable(); voTablePath = resultsCtrl.getVOTablePath(); } }