VOResourceCtrl.java 5.92 KB
/*
 * 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
 * <http://www.gnu.org/licenses/>.
 */

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.votable.VOTableException.CantSendQueryException;
import eu.omp.irap.vespa.votable.utils.Network;
import eu.omp.irap.vespa.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<Resource> getVOResources(ServiceType type, Map<String, String> keywords)
			throws VOResourceException {
		return VOResourceCtrl
				.getVOResourcesFromIvoids(VOResourceCtrl.getIvoidResources(type, keywords));
	}

	public static List<Resource> getVOResources(ServiceType type) throws VOResourceException {
		return VOResourceCtrl.getVOResourcesFromIvoids(VOResourceCtrl.getIvoidResources(type));
	}

	public static List<String> getIvoidResources(ServiceType type) throws VOResourceException {
		return VOResourceCtrl.getIvoidResources(type, new HashMap());
	}

	public static List<String> getIvoidResources(ServiceType type, Map<String, String> keywords)
			throws VOResourceException {
		List<String> ivoidResources;

		keywords.put("datamodel", type.toString());
		// standardid="ivo://ivoa.net/std/TAP" is not necessary

		StringJoiner keywordJoiner = new StringJoiner(" ");
		for (Map.Entry<String, String> keyword : keywords.entrySet()) {
			keywordJoiner.add(keyword.getKey() + ":\"" + keyword.getValue() + "\"");
		}

		Map<String, String> 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<String, String> 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<Resource> getVOResourcesFromIvoids(List<String> ivoidResources)
			throws VOResourceException {
		List<Resource> resources = new ArrayList<>();
		for (String ivoid : ivoidResources) {
			resources.add(VOResourceCtrl.getVOresource(ivoid));
		}
		return resources;
	}

	private static List<String> 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<String> ivoidResources = new ArrayList<>();
		for (JsonElement e : resources) {
			ivoidResources.add(e.getAsJsonObject().get("identifier").getAsString());
		}
		return ivoidResources;
	}
}