View Javadoc

1   /*
2    * $Id: SubmitQuery.java,v 1.1.1.1 2005/02/17 18:37:35 mch Exp $
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              //get upset
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           //submit query - and return just the query ID
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        //has the adql been given as a URI to read?
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  }