opendap.servlet
Class AbstractServlet

java.lang.Object
  extended by javax.servlet.GenericServlet
      extended by javax.servlet.http.HttpServlet
          extended by opendap.servlet.AbstractServlet
All Implemented Interfaces:
java.io.Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig
Direct Known Subclasses:
dts

public abstract class AbstractServlet
extends javax.servlet.http.HttpServlet

AbstractServlet is the base servlet class for an OPeNDAP servers. Default handlers for all of the acceptable OPeNDAP client requests are here.

Each of the request handlers appears as an adjunct method to the doGet() method of the base servlet class. In order to reduce the bulk of this file, many of these methods have been in wrapper classes in this package (opendap.servlet).

This is an abstract class because it is left to the individual server development efforts to write the getDDS() and getServerVersion() methods. The getDDS() method is intended to be where the server specific OPeNDAP server data types are used via their associated class factory.

This code relies on the javax.servlet.ServletConfig interface (in particular the getInitParameter() method) to record detailed configuration information used by the servlet and it's children.

The servlet should be started in the servlet engine with the following initParameters for the tomcat servlet engine:

    <servlet>
        <servlet-name>
            dts
        </servlet-name>
        <servlet-class>
            opendap.servers.test.dts
        </servlet-class>
        <init-param>
            <param-name>INFOcache</param-name>
            <param-value>/home/Datasets/info</param-value>
        </init-param>
        <init-param>
            <param-name>DDScache</param-name>
            <param-value>/home/Datasets/dds</param-value>
        </init-param>
        <init-param>
            <param-name>DAScache</param-name>
            <param-value>/home/Datasets/das</param-value>
        </init-param>
        <init-param>
            <param-name>DDXcache</param-name>
            <param-value>/home/Datasets/ddx</param-value>
        </init-param>
    </servlet>
 

Obviously the actual values of these parameters will depend on your particular file system.

See the file SERVLETS in the top level directory of the software distribution for more detailed information about servlet configuration.

Also, the method processDodsURL() could be overloaded if some kind of special processing of the incoming request is needed to ascertain the OPeNDAP URL information.

Author:
Nathan David Potter, jcaron 2/7/07 merge changes
See Also:
GetAsciiHandler, GetDirHandler, GetHTMLInterfaceHandler, GetInfoHandler, ReqState, ParsedRequest, GuardedDataset, testDataset, Serialized Form

Field Summary
protected  boolean allowDeflate
           
 
Constructor Summary
AbstractServlet()
           
 
Method Summary
 void anyExceptionHandler(java.lang.Throwable e, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Sends an error to the client.
 void badURL(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Sends an html document to the client explaining that they have used a poorly formed URL and then the help page...
 void dap2ExceptionHandler(DAP2Exception de, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Sends a OPeNDAP DAP2 error to the client.
 void doDebug(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for debug requests;
protected  boolean doDebugCmd(java.lang.String cmd, java.util.StringTokenizer tz, java.io.PrintStream pw)
           
 void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          *********************************************************************** Handles incoming requests from clients.
 void doGetASC(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for OPeNDAP ascii data requests.
 void doGetBLOB(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's data request.
 void doGetCatalog(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Default handler for OPeNDAP catalog.xml requests.
 void doGetDAP2Data(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's data request.
 void doGetDAS(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's DAS request.
 void doGetDDS(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's DDS request.
 void doGetDDX(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's DDS request.
 void doGetDIR(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for the client's directory request.
 void doGetHELP(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Default handler for the client's help request.
 void doGetHTML(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for OPeNDAP .html requests.
 void doGetINFO(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Default handler for OPeNDAP info requests.
 void doGetStatus(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Default handler for OPeNDAP status requests; not publically available, used only for debugging
 void doGetSystemProps(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Default handler for OPeNDAP status requests; not publically available, used only for debugging
 void doGetVER(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Default handler for the client's version request.
protected abstract  GuardedDataset getDataset(ReqState rs)
          ************************************************************************ This method must be implemented locally for each OPeNDAP server.
 java.lang.String getServerName()
          ************************************************************************

In this (default) implementation of the getServerName() method we just get the name of the servlet and pass it back.

abstract  java.lang.String getServerVersion()
          ************************************************************************ This function must be implemented locally for each OPeNDAP server.
 void init()
          ************************************************************************ Intitializes the servlet.
 void IOExceptionHandler(java.io.IOException e, javax.servlet.http.HttpServletResponse response, ReqState rs)
          ************************************************************************ Sends an error to the client.
 void parseExceptionHandler(ParseException pe, javax.servlet.http.HttpServletResponse response)
          ************************************************************************ Turns a ParseException into a OPeNDAP DAP2 error and sends it to the client.
protected  void printCatalog(javax.servlet.http.HttpServletRequest request, java.io.PrintWriter os)
           
protected  void printStatus(java.io.PrintWriter os)
           
 void probeRequest(java.io.PrintStream ps, javax.servlet.http.HttpServletRequest request)
          ************************************************************************ This is a bit of instrumentation that I kept around to let me look at the state of the incoming HttpServletRequest from the client.
 void sendDODSError(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.String clientMsg, java.lang.String serverMsg)
          ************************************************************************ Sends a OPeNDAP DAP2 error (type UNKNOWN ERROR) to the client and displays a message on the server console.
 
Methods inherited from class javax.servlet.http.HttpServlet
doDelete, doHead, doOptions, doPost, doPut, doTrace, getLastModified, service, service
 
Methods inherited from class javax.servlet.GenericServlet
destroy, getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, log, log
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

allowDeflate

protected boolean allowDeflate
Constructor Detail

AbstractServlet

public AbstractServlet()
Method Detail

getServerVersion

public abstract java.lang.String getServerVersion()
************************************************************************ This function must be implemented locally for each OPeNDAP server. It should return a String containing the OPeNDAP Server Version...

Returns:
The Server Version String

getDataset

protected abstract GuardedDataset getDataset(ReqState rs)
                                      throws DAP2Exception,
                                             java.io.IOException,
                                             ParseException
************************************************************************ This method must be implemented locally for each OPeNDAP server. The local implementation of this method is the key piece for connecting any localized data types that are derived from the opendap.dap.Server types back into the running servlet.

This method should do the following:

Parameters:
rs - The ReqState object for this particular client request.
Returns:
The ServerDDS object all parsed and ready to roll.
Throws:
DAP2Exception
java.io.IOException
ParseException
See Also:
ServerDDS, test_ServerFactory

init

public void init()
          throws javax.servlet.ServletException
************************************************************************ Intitializes the servlet. Init (at this time) basically sets up the object opendap.util.Debug from the debuggery flags in the servlet InitParameters. The Debug object can be referenced (with impunity) from anywhere in the VM.

Overrides:
init in class javax.servlet.GenericServlet
Throws:
javax.servlet.ServletException

parseExceptionHandler

public void parseExceptionHandler(ParseException pe,
                                  javax.servlet.http.HttpServletResponse response)
************************************************************************ Turns a ParseException into a OPeNDAP DAP2 error and sends it to the client.

Parameters:
pe - The ParseException that caused the problem.
response - The HttpServletResponse for the client.

dap2ExceptionHandler

public void dap2ExceptionHandler(DAP2Exception de,
                                 javax.servlet.http.HttpServletResponse response)
************************************************************************ Sends a OPeNDAP DAP2 error to the client.

Parameters:
de - The OPeNDAP DAP2 exception that caused the problem.
response - The HttpServletResponse for the client.

IOExceptionHandler

public void IOExceptionHandler(java.io.IOException e,
                               javax.servlet.http.HttpServletResponse response,
                               ReqState rs)
************************************************************************ Sends an error to the client. LOOK: The problem is that if the message is already committed when the IOException occurs, the headers dont get set.

Parameters:
e - The exception that caused the problem.
response - The HttpServletResponse for the client.

anyExceptionHandler

public void anyExceptionHandler(java.lang.Throwable e,
                                javax.servlet.http.HttpServletResponse response,
                                ReqState rs)
************************************************************************ Sends an error to the client.

Parameters:
e - The exception that caused the problem.
response - The HttpServletResponse for the client.

sendDODSError

public void sendDODSError(javax.servlet.http.HttpServletRequest request,
                          javax.servlet.http.HttpServletResponse response,
                          java.lang.String clientMsg,
                          java.lang.String serverMsg)
                   throws java.io.IOException,
                          javax.servlet.ServletException
************************************************************************ Sends a OPeNDAP DAP2 error (type UNKNOWN ERROR) to the client and displays a message on the server console.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
clientMsg - Error message String to send to the client.
serverMsg - Error message String to display on the server console.
Throws:
java.io.IOException
javax.servlet.ServletException

doGetDAS

public void doGetDAS(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response,
                     ReqState rs)
              throws java.io.IOException,
                     javax.servlet.ServletException
************************************************************************ Default handler for the client's DAS request. Operates on the assumption that the DAS information is cached on a disk local to the server. If you don't like that, then you better override it in your server :)

Once the DAS has been parsed it is sent to the requesting client.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - The ReqState of this client request. Contains all kinds of important stuff.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState

doGetDDS

public void doGetDDS(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response,
                     ReqState rs)
              throws java.io.IOException,
                     javax.servlet.ServletException
************************************************************************ Default handler for the client's DDS request. Requires the getDDS() method implemented by each server localization effort.

Once the DDS has been parsed and constrained it is sent to the requesting client.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - The ReqState of this client request. Contains all kinds of important stuff.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState

doGetDDX

public void doGetDDX(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response,
                     ReqState rs)
              throws java.io.IOException,
                     javax.servlet.ServletException
************************************************************************ Default handler for the client's DDS request. Requires the getDDS() method implemented by each server localization effort.

Once the DDS has been parsed and constrained it is sent to the requesting client.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - The ReqState of this client request. Contains all kinds of important stuff.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState

doGetBLOB

public void doGetBLOB(javax.servlet.http.HttpServletRequest request,
                      javax.servlet.http.HttpServletResponse response,
                      ReqState rs)
               throws java.io.IOException,
                      javax.servlet.ServletException
************************************************************************ Default handler for the client's data request. Requires the getDDS() method implemented by each server localization effort.

Once the DDS has been parsed, the data is read (using the class in the localized server factory etc.), compared to the constraint expression, and then sent to the client.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - The ReqState of this client request. Contains all kinds of important stuff.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState

This class/method is associated with pre-release version of the DDX API. It is experimental and is subject to (significant) change.


doGetDAP2Data

public void doGetDAP2Data(javax.servlet.http.HttpServletRequest request,
                          javax.servlet.http.HttpServletResponse response,
                          ReqState rs)
                   throws java.io.IOException,
                          javax.servlet.ServletException
************************************************************************ Default handler for the client's data request. Requires the getDDS() method implemented by each server localization effort.

Once the DDS has been parsed, the data is read (using the class in the localized server factory etc.), compared to the constraint expression, and then sent to the client.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - The ReqState of this client request. Contains all kinds of important stuff.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState

doGetDIR

public void doGetDIR(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response,
                     ReqState rs)
              throws java.io.IOException,
                     javax.servlet.ServletException
************************************************************************ Default handler for the client's directory request.

Returns an html document to the client showing (a possibly pseudo) listing of the datasets available on the server in a directory listing format.

The bulk of this code resides in the class opendap.servlet.GetDirHandler and documentation may be found there.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetDirHandler

doGetVER

public void doGetVER(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response)
              throws java.io.IOException,
                     javax.servlet.ServletException
************************************************************************ Default handler for the client's version request.

Returns a plain text document with server version and OPeNDAP core version #'s

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException

doGetHELP

public void doGetHELP(javax.servlet.http.HttpServletRequest request,
                      javax.servlet.http.HttpServletResponse response)
               throws java.io.IOException,
                      javax.servlet.ServletException
************************************************************************ Default handler for the client's help request.

Returns an html page of help info for the server

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException

badURL

public void badURL(javax.servlet.http.HttpServletRequest request,
                   javax.servlet.http.HttpServletResponse response)
            throws java.io.IOException,
                   javax.servlet.ServletException
************************************************************************ Sends an html document to the client explaining that they have used a poorly formed URL and then the help page...

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException

doGetASC

public void doGetASC(javax.servlet.http.HttpServletRequest request,
                     javax.servlet.http.HttpServletResponse response,
                     ReqState rs)
              throws java.lang.Exception
************************************************************************ Default handler for OPeNDAP ascii data requests. Returns the request data as a comma delimited ascii file. Note that this means that the more complex OPeNDAP structures such as Grids get flattened...

Modified 2/8/07 jcaron to not make a DConnect call to itself

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
rs - the decoded Request State
Throws:
java.lang.Exception

doGetINFO

public void doGetINFO(javax.servlet.http.HttpServletRequest request,
                      javax.servlet.http.HttpServletResponse response,
                      ReqState rs)
               throws java.io.IOException,
                      javax.servlet.ServletException
************************************************************************ Default handler for OPeNDAP info requests. Returns an HTML document describing the contents of the servers datasets.

The bulk of this code resides in the class opendap.servlet.GetInfoHandler and documentation may be found there.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetInfoHandler

doGetHTML

public void doGetHTML(javax.servlet.http.HttpServletRequest request,
                      javax.servlet.http.HttpServletResponse response,
                      ReqState rs)
               throws java.io.IOException,
                      javax.servlet.ServletException
************************************************************************ Default handler for OPeNDAP .html requests. Returns the OPeNDAP Web Interface (aka The Interface From Hell) to the client.

The bulk of this code resides in the class opendap.servlet.GetHTMLInterfaceHandler and documentation may be found there.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetHTMLInterfaceHandler

doGetCatalog

public void doGetCatalog(javax.servlet.http.HttpServletRequest request,
                         javax.servlet.http.HttpServletResponse response)
                  throws java.io.IOException,
                         javax.servlet.ServletException
************************************************************************ Default handler for OPeNDAP catalog.xml requests.

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetHTMLInterfaceHandler

printCatalog

protected void printCatalog(javax.servlet.http.HttpServletRequest request,
                            java.io.PrintWriter os)
                     throws java.io.IOException
Throws:
java.io.IOException

doDebug

public void doDebug(javax.servlet.http.HttpServletRequest request,
                    javax.servlet.http.HttpServletResponse response,
                    ReqState rs)
             throws java.io.IOException
************************************************************************ Default handler for debug requests;

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException

doDebugCmd

protected boolean doDebugCmd(java.lang.String cmd,
                             java.util.StringTokenizer tz,
                             java.io.PrintStream pw)

doGetSystemProps

public void doGetSystemProps(javax.servlet.http.HttpServletRequest request,
                             javax.servlet.http.HttpServletResponse response)
                      throws java.io.IOException,
                             javax.servlet.ServletException
************************************************************************ Default handler for OPeNDAP status requests; not publically available, used only for debugging

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetHTMLInterfaceHandler

doGetStatus

public void doGetStatus(javax.servlet.http.HttpServletRequest request,
                        javax.servlet.http.HttpServletResponse response)
                 throws java.io.IOException,
                        javax.servlet.ServletException
************************************************************************ Default handler for OPeNDAP status requests; not publically available, used only for debugging

Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
GetHTMLInterfaceHandler

printStatus

protected void printStatus(java.io.PrintWriter os)
                    throws java.io.IOException
Throws:
java.io.IOException

probeRequest

public void probeRequest(java.io.PrintStream ps,
                         javax.servlet.http.HttpServletRequest request)
************************************************************************ This is a bit of instrumentation that I kept around to let me look at the state of the incoming HttpServletRequest from the client. This method calls the get* methods of the request and prints the results to standard out.

Parameters:
request - The HttpServletRequest object to probe.

getServerName

public java.lang.String getServerName()
************************************************************************

In this (default) implementation of the getServerName() method we just get the name of the servlet and pass it back. If something different is required, override this method when implementing the getDDS() and getServerVersion() methods.

This is typically used by the getINFO() method to figure out if there is information specific to this server residing in the info directory that needs to be returned to the client as part of the .info response.

Returns:
A string containing the name of the servlet class that is running.

doGet

public void doGet(javax.servlet.http.HttpServletRequest request,
                  javax.servlet.http.HttpServletResponse response)
           throws java.io.IOException,
                  javax.servlet.ServletException
*********************************************************************** Handles incoming requests from clients. Parses the request and determines what kind of OPeNDAP response the client is requesting. If the request is understood, then the appropriate handler method is called, otherwise an error is returned to the client.

This method is the entry point for AbstractServlet.

Overrides:
doGet in class javax.servlet.http.HttpServlet
Parameters:
request - The client's HttpServletRequest request object.
response - The server's HttpServletResponse response object.
Throws:
java.io.IOException
javax.servlet.ServletException
See Also:
ReqState