package tap.resource; /* * This file is part of TAPLibrary. * * TAPLibrary is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * TAPLibrary 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with TAPLibrary. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2012-2015 - UDS/Centre de DonnĂ©es astronomiques de Strasbourg (CDS), * Astronomisches Rechen Institut (ARI) */ import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import tap.ServiceConnection; import tap.TAPException; import uk.ac.starlink.votable.VOSerializer; import uws.UWSToolBox; /** * <p>TAP resource describing the availability of a TAP service.</p> * * @author Grégory Mantelet (CDS;ARI) * @version 2.0 (04/2015) */ public class Availability implements TAPResource, VOSIResource { /** Name of this TAP resource. */ public static final String RESOURCE_NAME = "availability"; /** Description of the TAP service owning this resource. */ protected final ServiceConnection service; /** <p>URL toward this TAP resource. * This URL is particularly important for its declaration in the capabilities of the TAP service.</p> * * <p><i>Note: By default, it is just the name of this resource. It is updated after initialization of the service * when the TAP service base URL is communicated to its resources. Then, it is: baseTAPURL + "/" + RESOURCE_NAME.</i></p> */ protected String accessURL = getName(); /** * Build a "availability" resource. * * @param service Description of the TAP service which will own this resource. */ protected Availability(final ServiceConnection service){ this.service = service; } @Override public final void setTAPBaseURL(final String baseURL){ accessURL = ((baseURL == null) ? "" : (baseURL + "/")) + getName(); } @Override public final String getName(){ return RESOURCE_NAME; } @Override public final String getStandardID(){ return "ivo://ivoa.net/std/VOSI#availability"; } @Override public final String getAccessURL(){ return accessURL; } @Override public String getCapability(){ return Capabilities.getDefaultCapability(this); } @Override public void init(final ServletConfig config) throws ServletException{ ; } @Override public void destroy(){ ; } @Override public boolean executeResource(final HttpServletRequest request, final HttpServletResponse response) throws IOException, TAPException{ /* "In the REST binding, the support interfaces shall have distinct URLs in the HTTP scheme and shall be accessible by the GET operation in the HTTP protocol. * The response to an HTTP POST, PUT or DELETE to these resources is not defined by this specification. However, if an implementation has no special action * to perform for these requests, the normal response would be a 405 "Method not allowed" error." * (Extract of the VOSI definition: http://www.ivoa.net/documents/VOSI/20100311/PR-VOSI-1.0-20100311.html#sec2) */ if (!request.getMethod().equalsIgnoreCase("GET")) throw new TAPException("The AVAILABILITY resource is only accessible in HTTP-GET! No special action can be perfomed with another HTTP method.", HttpServletResponse.SC_METHOD_NOT_ALLOWED); // Set the response MIME type (XML): response.setContentType("text/xml"); // Set the character encoding: response.setCharacterEncoding(UWSToolBox.DEFAULT_CHAR_ENCODING); // Get the output stream: PrintWriter pw = response.getWriter(); // ...And write the XML document describing the availability of the TAP service: pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); pw.println("<availability xmlns=\"http://www.ivoa.net/xml/VOSIAvailability/v1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ivoa.net/xml/VOSIAvailability/v1.0 http://www.ivoa.net/xml/VOSIAvailability/v1.0\">"); // available ? (true or false) pw.print("\t<available>"); pw.print(service.isAvailable()); pw.println("</available>"); // reason/description of the (non-)availability: pw.print("\t<note>"); if (service.getAvailability() != null) pw.print(VOSerializer.formatText(service.getAvailability())); pw.println("</note>"); pw.println("</availability>"); pw.flush(); return true; } }