1
2
3
4
5 package org.astrogrid.dataservice.service.servlet;
6 import java.io.IOException;
7 import java.net.URISyntaxException;
8 import java.security.Principal;
9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import javax.xml.parsers.ParserConfigurationException;
13 import org.apache.commons.logging.LogFactory;
14 import org.astrogrid.dataservice.service.DataServer;
15 import org.astrogrid.dataservice.service.ServletHelper;
16 import org.astrogrid.query.Query;
17 import org.astrogrid.query.QueryException;
18 import org.astrogrid.query.adql.AdqlQueryMaker;
19 import org.astrogrid.query.sql.SqlParser;
20 import org.astrogrid.slinger.sources.SourceIdentifier;
21 import org.astrogrid.slinger.sources.SourceMaker;
22 import org.astrogrid.webapp.DefaultServlet;
23 import org.xml.sax.SAXException;
24
25 /***
26 * A servlet for submitting a query asynchronously.
27 * The parameters are:
28 * AdqlUrl, AdqlSql or AdqlXml that specify the query to be run.
29 * Target: where the results are to be sent
30 * Format: what format the results should be sent in (eg VOTABLE, CSV - defaults to VOTABLE)
31 *
32 * @author mch
33 */
34 public class SubmitQuery extends DefaultServlet {
35
36 DataServer server = new DataServer();
37
38 public void doGet(HttpServletRequest request,
39 HttpServletResponse response) throws ServletException, IOException {
40
41 Query query = null;
42
43 try {
44 query = makeQuery(request);
45
46 if (query.getTarget() == null) {
47
48 throw new QueryException("Must specify a Target argument for the results to be sent to when submitting Queries (otherwise use AskQuery)", null);
49 }
50
51 response.setContentType("text/plain");
52 String id = server.submitQuery(ServletHelper.getUser(request), query, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via SubmitQuery servlet");
53 response.getWriter().write(id);
54 }
55 catch (Throwable th) {
56 LogFactory.getLog(request.getContextPath()).error(th+" submitting query",th);
57 doError(response, "Submitting "+query+" -> "+ServletHelper.makeReturnSpec(request),th);
58 }
59 }
60
61 /*** Creates a query from the parameters in the given request. Static public so other servlets can use it */
62 public static Query makeQuery(HttpServletRequest request) throws IOException, ParserConfigurationException, QueryException, SAXException, URISyntaxException {
63
64 String adqlUri = request.getParameter("AdqlUri");
65 String adqlSql = request.getParameter("AdqlSql");
66 String adqlXml = request.getParameter("AdqlXml");
67
68 Principal user = ServletHelper.getUser(request);
69
70
71 Query query = null;
72
73
74 if (adqlUri != null) {
75 SourceIdentifier source = SourceMaker.makeSource(adqlUri);
76
77 query = AdqlQueryMaker.makeQuery(source.resolveInputStream(user));
78 }
79 else if (adqlSql != null) {
80 query = SqlParser.makeQuery(adqlSql);
81 }
82 else if (adqlXml != null) {
83 query = AdqlQueryMaker.makeQuery(adqlXml);
84 }
85 else {
86 throw new QueryException("Must specify AdqlUri, AdqlXml or AdqlSql parameter");
87 }
88
89 if (!ServletHelper.isCountReq(request)) {
90 ServletHelper.fillReturnSpec( query.getResultsDef(), request);
91 }
92
93 return query;
94 }
95 }