/*
* 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.resource;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
import eu.omp.irap.vespa.epntapclient.resource.VOResourceException.CantGetVOResourceException;
import eu.omp.irap.vespa.epntapclient.resource.VOResourceException.CantReadVOResourceException;
import eu.omp.irap.vespa.epntapclient.resource.VOResourceException.VOResourceIsNotValidException;
import eu.omp.irap.vespa.epntapclient.service.Service.ServiceType;
import eu.omp.irap.vespa.epntapclient.voresource.model.Resource;
import eu.omp.irap.vespa.epntapclient.votable.VOTableException.CantSendQueryException;
import eu.omp.irap.vespa.epntapclient.votable.utils.Network;
import eu.omp.irap.vespa.epntapclient.votable.utils.StringJoiner;
/**
* @author N. Jourdane
*/
public class VOResourceCtrl {
/** The logger for the class VOResourceController. */
private static final Logger logger = Logger.getLogger(VOResourceCtrl.class.getName());
private static final String VORESOURCE_MODEL_PACKAGE = "eu.omp.irap.vespa.epntapclient.voresource.model";
private static final String GET_VORESOURCE_URL = "http://voparis-registry.obspm.fr/vo/ivoa/1/voresources.xml";
private static final String GET_IVOID_RESOURCES_URL = "http://voparis-registry.obspm.fr/vo/ivoa/1/voresources/search";
private static final int MAX_VORESOURCES = 100;
public static List getVOResources(ServiceType type, Map keywords)
throws VOResourceException {
return VOResourceCtrl
.getVOResourcesFromIvoids(VOResourceCtrl.getIvoidResources(type, keywords));
}
public static List getVOResources(ServiceType type) throws VOResourceException {
return VOResourceCtrl.getVOResourcesFromIvoids(VOResourceCtrl.getIvoidResources(type));
}
public static List getIvoidResources(ServiceType type) throws VOResourceException {
return VOResourceCtrl.getIvoidResources(type, new HashMap());
}
public static List getIvoidResources(ServiceType type, Map keywords)
throws VOResourceException {
List ivoidResources;
keywords.put("datamodel", type.toString());
// standardid="ivo://ivoa.net/std/TAP" is not necessary
StringJoiner keywordJoiner = new StringJoiner(" ");
for (Map.Entry keyword : keywords.entrySet()) {
keywordJoiner.add(keyword.getKey() + ":\"" + keyword.getValue() + "\"");
}
Map parameters = new HashMap();
parameters.put("keywords", keywordJoiner.toString());
parameters.put("max", String.valueOf(VOResourceCtrl.MAX_VORESOURCES));
try {
String ivoidResourcesPath = Network.saveQuery(VOResourceCtrl.GET_VORESOURCE_URL,
parameters);
ivoidResources = VOResourceCtrl.parseIvoidResources(ivoidResourcesPath);
} catch (CantSendQueryException e1) {
throw new CantGetVOResourceException(VOResourceCtrl.GET_VORESOURCE_URL, e1);
// TODO: pass the entire request.
}
return ivoidResources;
}
public static Resource getVOresource(String identifier) throws VOResourceException {
Map parameters = new HashMap();
parameters.put("identifier", identifier);
String voResourcePath;
try {
voResourcePath = Network.saveQuery(VOResourceCtrl.GET_VORESOURCE_URL, parameters);
} catch (CantSendQueryException e1) {
throw new CantGetVOResourceException(VOResourceCtrl.GET_VORESOURCE_URL, e1);
}
Resource voResource;
JAXBContext jc;
try {
jc = JAXBContext.newInstance(VOResourceCtrl.VORESOURCE_MODEL_PACKAGE);
Unmarshaller unmarshaller = jc.createUnmarshaller();
voResource = (Resource) unmarshaller.unmarshal(new File(voResourcePath));
} catch (JAXBException e) {
throw new VOResourceIsNotValidException(voResourcePath, e);
}
return voResource;
}
public static List getVOResourcesFromIvoids(List ivoidResources)
throws VOResourceException {
List resources = new ArrayList<>();
for (String ivoid : ivoidResources) {
resources.add(VOResourceCtrl.getVOresource(ivoid));
}
return resources;
}
private static List parseIvoidResources(String ivoidResourcesPath)
throws CantReadVOResourceException {
JsonReader reader;
try {
reader = new JsonReader(new FileReader(ivoidResourcesPath));
} catch (FileNotFoundException e) {
throw new CantReadVOResourceException(ivoidResourcesPath, e);
}
JsonObject root = new JsonParser().parse(reader).getAsJsonObject();
JsonArray resources = root.get("resources").getAsJsonArray();
List ivoidResources = new ArrayList<>();
for (JsonElement e : resources) {
ivoidResources.add(e.getAsJsonObject().get("identifier").getAsString());
}
return ivoidResources;
}
}