View Javadoc

1   /*
2    * $Id: SubmitCone.java,v 1.8 2006/09/26 15:34:42 clq2 Exp $
3    */
4   
5   package org.astrogrid.dataservice.service.cone;
6   import java.io.IOException;
7   import java.net.URL;
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.metadata.queryable.ConeConfigQueryableResource;
13  import org.astrogrid.dataservice.metadata.queryable.SearchGroup;
14  import org.astrogrid.dataservice.service.DataServer;
15  import org.astrogrid.dataservice.service.ServletHelper;
16  import org.astrogrid.io.mime.MimeTypes;
17  import org.astrogrid.query.Query;
18  import org.astrogrid.query.returns.ReturnSpec;
19  import org.astrogrid.slinger.targets.WriterTarget;
20  import org.astrogrid.webapp.DefaultServlet;
21  import org.astrogrid.tableserver.test.SampleStarsPlugin;
22  import org.astrogrid.cfg.ConfigFactory;
23  import org.astrogrid.dataservice.queriers.DatabaseAccessException;
24  
25  
26  /***
27   * A servlet for processing Cone Queries.
28   * Takes three parameters (RA, DEC and SR) that define the query, and
29   * the standard returns definition parameters (see ???)
30   *
31   * @author M Hill
32   * @author K Andrews
33   */
34  public class SubmitCone extends DefaultServlet {
35     
36     DataServer server = new DataServer();
37   
38     public void doGet(HttpServletRequest request,
39                       HttpServletResponse response) throws ServletException, IOException {
40  
41        // Initialise SampleStars plugin if required (may not be initialised
42        // if admin has not run the self-tests)
43        String plugin = ConfigFactory.getCommonConfig().getString(
44             "datacenter.querier.plugin");
45        if (plugin.equals("org.astrogrid.tableserver.test.SampleStarsPlugin")) {
46           // This has no effect if the plugin is already initialised
47           SampleStarsPlugin.initialise();  // Just in case
48        }
49  
50        // Extract the query parameters
51        double radius = ServletHelper.getRadius(request);
52        double ra = ServletHelper.getRa(request);
53        double dec = ServletHelper.getDec(request);
54        ReturnSpec returnSpec = ServletHelper.makeReturnSpec(request);
55  
56        try {
57           // Create the query
58           Query coneQuery = new Query(ra, dec, radius, returnSpec);
59  
60           if (returnSpec.getTarget() == null) {
61              //if a target is not given, we do an asynchronous (ask) Query 
62              // to the response stream.
63              returnSpec.setTarget(new WriterTarget(response.getWriter(), false));
64              
65              if (ServletHelper.isCountReq(request)) {
66                 long count = server.askCount(ServletHelper.getUser(request), coneQuery, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via SubmitCone servlet");
67                 response.setContentType(MimeTypes.PLAINTEXT);
68                 response.getWriter().write(""+count);
69              }
70              else {
71                 server.askQuery(ServletHelper.getUser(request), coneQuery, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via SubmitCone servlet");
72              }
73           }
74           else {
75              //otherwise we direct the response to the target and put status 
76              //info to the browser
77              response.setContentType(MimeTypes.HTML);
78              response.getWriter().println(
79                 "<html>"+
80                 "<head><title>Submitting Query</title></head>"+
81                 "<body>"+
82                 "<p>Submitting, please wait...</p>");
83              response.getWriter().flush();
84  
85              String id = server.submitQuery(ServletHelper.getUser(request), coneQuery, request.getRemoteHost()+" ("+request.getRemoteAddr()+") via SubmitCone servlet");
86        
87              URL statusUrl = new URL ("http",request.getServerName(),request.getServerPort(), request.getContextPath()+"/queryStatus.jsp");
88              //indicate status
89              response.getWriter().println("Cone Query has been submitted, and assigned ID "+id+"."+
90                                            "<a href='"+statusUrl+"?ID="+id+"'>Query Status Page</a>\n");
91              response.getWriter().flush();
92  
93              //redirect to status
94              response.getWriter().write("<META HTTP-EQUIV='Refresh' CONTENT='0;URL="+statusUrl+"?ID="+id+"'>"+
95                                        "</body></html>");
96              response.getWriter().flush();
97           }
98        }
99        catch (java.lang.IllegalArgumentException ex) {
100         //Typically thrown if a bad table name is given
101         doPotentialConfigError(request, response, ra, dec, radius, ex);
102       } 
103       catch (java.lang.NullPointerException ex) {
104         //Typically thrown if a bad column name is given
105         doPotentialConfigError(request, response, ra, dec, radius, ex);
106       }
107       catch (Throwable th) {
108          LogFactory.getLog(request.getContextPath()).error(th+
109              "Searching Cone with RA= " + Double.toString(ra) + 
110              ", Dec = " + Double.toString(dec) + 
111              ", radius = " + Double.toString(radius),
112              th);
113 
114          doError(response, 
115              "Searching Cone with RA= " + Double.toString(ra) + 
116              ", Dec = " + Double.toString(dec) + 
117              ", radius = " + Double.toString(radius),
118              th);
119       }
120    }
121 
122    private void doPotentialConfigError(
123        HttpServletRequest request, HttpServletResponse response, 
124        double ra, double dec, double radius,
125        Exception ex) throws IOException {
126 
127       String errorResponseString = 
128          "Searching Cone with RA= " + Double.toString(ra) + 
129          ", Dec = " + Double.toString(dec) + ", radius = " + Double.toString(radius) +"</p>" +
130          "<p>An error has occurred (see below); this may be because this datacenter installation is misconfigured.\n" +
131          "<p>Please check that the properties 'conesearch.table', 'conesearch.ra.column', 'conesearch.dec.column' and 'conesearch.columns.units' are correctly configured in your properties file.\n";
132           
133       LogFactory.getLog(request.getContextPath()).error( ex+errorResponseString,ex);
134 
135       doError(response, errorResponseString, ex);
136    }
137 
138 }