View Javadoc

1   /*
2    * $Id: BrowserAskQuery.java,v 1.3 2005/03/31 15:06:16 mch Exp $
3    */
4   
5   package org.astrogrid.dataservice.service.servlet;
6   import java.io.IOException;
7   import java.security.Principal;
8   import javax.servlet.ServletException;
9   import javax.servlet.http.HttpServletRequest;
10  import javax.servlet.http.HttpServletResponse;
11  import org.apache.commons.logging.LogFactory;
12  import org.astrogrid.dataservice.service.DataServer;
13  import org.astrogrid.dataservice.service.ServletHelper;
14  import org.astrogrid.query.Query;
15  import org.astrogrid.slinger.mime.MimeTypes;
16  import org.astrogrid.slinger.targets.TargetMaker;
17  import org.astrogrid.webapp.DefaultServlet;
18  
19  /***
20   * A servlet for asking a query synchronously.  Just like AskQuery except that
21   * it forwards the browser to the status page if a target is given.
22   * The parameters are:
23   * AdqlUrl, AdqlSql or AdqlXml that specify the query to be run.
24   * Target: where the results are to be sent (empty=return to response)
25   * Format: what format the results should be sent in (eg VOTABLE, CSV - defaults to VOTABLE)
26   *
27   * @author mch
28   */
29  public class BrowserAskQuery extends DefaultServlet {
30     
31     DataServer server = new DataServer();
32     
33     public void doGet(HttpServletRequest request,
34                       HttpServletResponse response) throws ServletException, IOException {
35  
36        Query query = null;
37        
38        try {
39           query = SubmitQuery.makeQuery(request);
40           Principal user = ServletHelper.getUser(request);
41           
42           if (ServletHelper.isCountReq(request)) {
43              long count = server.askCount(user, query, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via BrowserAskQuery servlet");
44              response.setContentType(MimeTypes.PLAINTEXT);
45              response.getWriter().write(""+count);
46           }
47           else {
48              if (query.getTarget() == null) {
49                 //no target, return results to browser with the first mime type requested (will assume it can be done...)
50                 //the table writer should do this: response.setContentType(query.getResultsDef().getFormat());
51                 query.getResultsDef().setTarget(TargetMaker.makeTarget(response.getWriter(), false));
52                 server.askQuery(user, query, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via BrowserAskQuery servlet");
53              }
54              else {
55                 //target given, so ask query, returning status when complete
56                 String id = server.submitQuery(user, query, request.getRemoteAddr()+" via BrowserAskQuery servlet");
57                 response.sendRedirect("queryStatus.jsp?ID="+id);
58              }
59           }
60        }
61        catch (Throwable th) {
62           LogFactory.getLog(request.getContextPath()).error(th+" submitting query",th);
63           doError(response, "Submitting "+query+" -> "+ServletHelper.makeReturnSpec(request),th);
64        }
65     }
66     
67  }