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 2015 - Astronomisches Rechen Institut (ARI)
*/
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tap.TAPException;
import uk.ac.starlink.votable.VOSerializer;
/**
* <p>Additional TAP endpoint: <code>/examples</code>. Then, this {@link TAPResource} writes
* a list of TAP examples.</p>
*
* <p>
* The returned document MUST be a RDFa document as requested by the IVOA documents: TAPNote 1.0 or DALI 1.0.
* The syntax used in the returned document is thus expected to be one of those described by the two
* IVOA documents ; for now no particular syntax has been fixed by the IVOA community.
* </p>
*
* <p>
* This TAP endpoint is also a VOSI resource. A capability is then provided thanks to the function
* {@link #getCapability()}. The returned capability is the following:
* </p>
* <pre><capability standardID="ivo://ivoa.net/std/DALI#examples>
* <interface xsi:type="vr:WebBrowser" role="std">
* <accessURL use="full">
* <-- Full URL of the TAP service suffixed by "/examples" -->
* </accessURL>
* </interface>
* </capability></pre>
*
* <p>
* The home page URI is expected to be either relative/absolute path (both related to the Web Application
* directory, NOT the local file system), a <code>file:</code> URI (pointing toward a local file system file)
* or a URL (basically any URI whose the scheme is not <code>file:</code>).
* </p>
*
* <p>
* To read/write the specified file, this class extends {@link ForwardResource} in order to use its function
* {@link ForwardResource#forward(String, String, HttpServletRequest, HttpServletResponse)}.
* </p>
*
* @author Grégory Mantelet (ARI)
* @version 2.1 (11/2015)
* @since 2.1
*/
public class Examples extends ForwardResource implements VOSIResource {
/** Name of this TAP resource. */
public static final String RESOURCE_NAME = "examples";
/** Standard ID of this VOSI resource. */
public static final String STANDARD_ID = "ivo://ivoa.net/std/DALI#examples";
/** MIME type of this resource. */
public static final String MIME_TYPE = "application/xhtml+xml";
/** File containing the <code>/examples</code> endpoint content. */
public final String examplesFile;
/** <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 an <code>/examples</code> endpoint whose the content is provided by the specified file.
*
* @param tap The TAP service whose the logger must be used.
* @param file The file containing the content of this endpoint.
* It must be a URI with no scheme to reference a file inside the Web Application directory,
* with the scheme <code>file:</code> to reference a local system file
* or with another scheme to make an explicit redirection toward the specified URL.
*
* @throws NullPointerException If at least one of the parameters is missing.
*/
public Examples(final TAP tap, final String file) throws NullPointerException {
super(tap.getLogger());
if (file == null)
throw new NullPointerException("Examples content file missing! Impossible to build a /examples endpoint.");
examplesFile = file;
}
@Override
public void init(ServletConfig config) throws ServletException {}
@Override
public void destroy() {}
@Override
public final void setTAPBaseURL(final String baseURL){
accessURL = ((baseURL == null) ? "" : (baseURL + "/")) + getName();
}
@Override
public String getName() {
return RESOURCE_NAME;
}
@Override
public String getCapability() {
return "\t<capability " + VOSerializer.formatAttribute("standardID", getStandardID()) + ">\n" + "\t\t<interface xsi:type=\"vr:WebBrowser\" role=\"std\">\n" + "\t\t\t<accessURL use=\"full\"> " + ((getAccessURL() == null) ? "" : VOSerializer.formatText(getAccessURL())) + " </accessURL>\n" + "\t\t</interface>\n" + "\t</capability>";
}
@Override
public String getAccessURL() {
return accessURL;
}
@Override
public final String getStandardID() {
return STANDARD_ID;
}
@Override
public boolean executeResource(final HttpServletRequest request, final HttpServletResponse response) throws IOException, TAPException {
return forward(examplesFile, MIME_TYPE, request, response);
}
}