/* * 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; } }