/*
* 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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import eu.omp.irap.vespa.votable.utils.CantSendQueryException;
import eu.omp.irap.vespa.votable.utils.Network;
import eu.omp.irap.vespa.votable.utils.StringJoiner;
/**
* @author N. Jourdane
*/
public class RequestCtrl {
/** The URL of the resolver used for the `target name` field. */
private static final String RESOLVER_URL = "http://voparis-registry.obspm.fr/ssodnet/1/autocomplete";
/** The query template to get granules. */
private static final String QUERY = "SELECT TOP %s target_name, target_class FROM %s%s";
/** The parameters fields for the request. */
protected Map parameters = new HashMap<>();
/** The maximum number of rows returned by the query. */
private int nbMaxResult;
/** Constructor of RequestCtrl. */
public RequestCtrl() {
nbMaxResult = 20;
}
/**
* Constructor of RequestCtrl.
*
* @param nbMaxResult The maximum number of rows returned by the query.
*/
public RequestCtrl(int nbMaxResult) {
this.nbMaxResult = nbMaxResult;
}
/**
* Build an ADQL from the table name, the parameter values and the max results.
*
* @param tableName The name of the table, to put in FROM keyword.
* @return The query.
*/
public String buildQuery(String tableName) {
StringJoiner addJoin = new StringJoiner(" AND ");
for (Map.Entry param : parameters.entrySet()) {
if (param.getValue() instanceof ArrayList) {
StringJoiner orJoin = new StringJoiner(" OR ");
@SuppressWarnings("unchecked")
List possibleValues = (List) param.getValue();
for (String possibleValue : possibleValues) {
orJoin.add(param.getKey() + " LIKE '" + possibleValue + "'");
}
addJoin.add("(" + orJoin + ")");
} else if (param.getValue() instanceof String) {
addJoin.add(param.getKey() + " LIKE '" + param.getValue() + "'");
} else {
addJoin.add(param.getKey() + " = " + param.getValue().toString());
}
}
String where = addJoin.isEmpty() ? "" : " WHERE " + addJoin;
return String.format(QUERY, nbMaxResult, tableName, where);
}
/**
* The method used to get target names propositions by asking to the resolver.
*
* @param begining The beginning of the target_name.
* @return An array of Strings corresponding to the target names got.
* @throws CantSendQueryException Can not read the JSON file.
*/
public static String[] getTargetNames(String begining) throws CantSendQueryException {
Map params = new HashMap<>();
params.put("q", "\"" + begining + "\"");
String query = Network.buildQuery(RESOLVER_URL, params);
JsonObject root = Network.readJson(query);
int count = Integer.parseInt(root.get("count").toString());
String[] targetNames = new String[count];
JsonArray hits = root.getAsJsonArray("hits");
for (int i = 0; i < count; i++) {
JsonObject elmt = hits.get(i).getAsJsonObject();
targetNames[i] = elmt.get("name").toString().replace("\"", "");
}
return targetNames;
}
/**
* Update a parameter in the query. If the parameter do not exists yet, create it.
*
* @param paramName The name of the parameter.
* @param paramValue The value of the parameter.
*/
public void updateParameter(String paramName, Object paramValue) {
parameters.put(paramName, paramValue);
}
/**
* Remove a parameter from the query.
*
* @param paramName The name of the parameter to remove.
*/
public void removeParameter(String paramName) {
parameters.remove(paramName);
}
/**
* Get the parameters.
*
* @return A map of couple .
*/
public Map getParameters() {
return parameters;
}
/**
* @return The maximum number of rows returned by the query.
*/
public int getNbMaxResult() {
return nbMaxResult;
}
/**
* Set the maximum number of rows returned by the query.
*
* @param nbRows The number of rows.
*/
public void setNbMaxResult(int nbRows) {
nbMaxResult = nbRows;
}
}