OPeNDAP Hyrax Back End Server (BES)  Updated for version 3.8.3
DapRequestHandler.cc
Go to the documentation of this file.
00001 // DapRequestHandler.cc
00002 
00003 #include "config.h"
00004 
00005 #include "DapRequestHandler.h"
00006 #include "DapResponseNames.h"
00007 
00008 #include <BESResponseHandler.h>
00009 #include <BESResponseNames.h>
00010 #include <BESVersionInfo.h>
00011 #include <BESTextInfo.h>
00012 #include <BESDapNames.h>
00013 #include <BESDataDDSResponse.h>
00014 #include <BESDDSResponse.h>
00015 #include <BESDASResponse.h>
00016 #include <BESConstraintFuncs.h>
00017 #include <BESServiceRegistry.h>
00018 #include <BESUtil.h>
00019 #include <BESDapError.h>
00020 #include <BESInternalFatalError.h>
00021 #include <BESDebug.h>
00022 
00023 #include <BaseTypeFactory.h>
00024 #include <Ancillary.h>
00025 #include <Connect.h>
00026 #include <Response.h>
00027 #include <InternalErr.h>
00028 #include <mime_util.h>
00029 
00030 using namespace libdap ;
00031 
00032 DapRequestHandler::DapRequestHandler( const string &name )
00033     : BESRequestHandler( name )
00034 {
00035     add_handler( DAS_RESPONSE, DapRequestHandler::dap_build_das ) ;
00036     add_handler( DDS_RESPONSE, DapRequestHandler::dap_build_dds ) ;
00037     add_handler( DATA_RESPONSE, DapRequestHandler::dap_build_data ) ;
00038     add_handler( VERS_RESPONSE, DapRequestHandler::dap_build_vers ) ;
00039     add_handler( HELP_RESPONSE, DapRequestHandler::dap_build_help ) ;
00040 }
00041 
00042 DapRequestHandler::~DapRequestHandler()
00043 {
00044 }
00045 
00046 bool
00047 DapRequestHandler::dap_build_das( BESDataHandlerInterface &dhi )
00048 {
00049     BESResponseObject *response = dhi.response_handler->get_response_object() ;
00050     BESDASResponse *bdas = dynamic_cast < BESDASResponse * >(response) ;
00051     if( !bdas )
00052         throw BESInternalError( "cast error", __FILE__, __LINE__ ) ;
00053     try {
00054         bdas->set_container( dhi.container->get_symbolic_name() ) ;
00055         DAS *das = bdas->get_das();
00056         string accessed = dhi.container->access();
00057         das->parse( accessed ) ;
00058         bdas->clear_container( ) ;
00059     }
00060     catch( BESError &e ) {
00061         throw e ;
00062     }
00063     catch(InternalErr & e) {
00064         BESDapError ex( e.get_error_message(), true, e.get_error_code(),
00065                         __FILE__, __LINE__ ) ;
00066         throw ex;
00067     }
00068     catch(Error & e) {
00069         BESDapError ex( e.get_error_message(), false, e.get_error_code(),
00070                         __FILE__, __LINE__ ) ;
00071         throw ex;
00072     }
00073     catch(...) {
00074         string s = "unknown exception caught building DAS";
00075         BESInternalFatalError ex(s, __FILE__, __LINE__);
00076         throw ex;
00077     }
00078 
00079     return true;
00080 }
00081 
00082 bool
00083 DapRequestHandler::dap_build_dds( BESDataHandlerInterface &dhi )
00084 {
00085     BESResponseObject *response = dhi.response_handler->get_response_object();
00086     BESDDSResponse *bdds = dynamic_cast < BESDDSResponse * >(response);
00087     if( !bdds )
00088         throw BESInternalError( "cast error", __FILE__, __LINE__ ) ;
00089     try {
00090         bdds->set_container( dhi.container->get_symbolic_name() ) ;
00091         DDS *dds = bdds->get_dds();
00092         string accessed = dhi.container->access() ;
00093         BaseTypeFactory factory;
00094         dds->set_factory( &factory ) ;
00095         dds->filename( accessed );
00096         dds->set_dataset_name( name_path( accessed ) ) ;
00097         dds->parse( accessed ) ;
00098         dds->set_factory( 0 ) ;
00099 
00100         DAS *das = new DAS ;
00101         BESDASResponse bdas( das ) ;
00102         bdas.set_container( dhi.container->get_symbolic_name() ) ;
00103         Ancillary::read_ancillary_das( *das, accessed ) ;
00104 
00105         dds->transfer_attributes( das ) ;
00106 
00107         bdds->set_constraint( dhi ) ;
00108 
00109         bdds->clear_container( ) ;
00110     }
00111     catch( BESError &e ) {
00112         throw e ;
00113     }
00114     catch(InternalErr & e) {
00115         BESDapError ex( e.get_error_message(), true, e.get_error_code(),
00116                         __FILE__, __LINE__ ) ;
00117         throw ex;
00118     }
00119     catch(Error & e) {
00120         BESDapError ex( e.get_error_message(), false, e.get_error_code(),
00121                         __FILE__, __LINE__ ) ;
00122         throw ex;
00123     }
00124     catch(...) {
00125         string s = "unknown exception caught building DDS";
00126         BESInternalFatalError ex(s, __FILE__, __LINE__);
00127         throw ex;
00128     }
00129 
00130     return true;
00131 }
00132 
00133 bool
00134 DapRequestHandler::dap_build_data( BESDataHandlerInterface &dhi )
00135 {
00136     BESResponseObject *response = dhi.response_handler->get_response_object();
00137     BESDataDDSResponse *bdds = dynamic_cast < BESDataDDSResponse * >(response);
00138     if( !bdds )
00139         throw BESInternalError( "cast error", __FILE__, __LINE__ ) ;
00140 
00141     try {
00142         bdds->set_container( dhi.container->get_symbolic_name() ) ;
00143         DataDDS *dds = bdds->get_dds() ;
00144         string accessed = dhi.container->access() ;
00145         BaseTypeFactory factory;
00146         dds->set_factory( &factory ) ;
00147         dds->filename( accessed ) ;
00148         dds->set_dataset_name( name_path( accessed ) ) ;
00149         Connect *url = new Connect( accessed ) ;
00150         Response *r = new Response( fopen( accessed.c_str(), "r" ), 0 ) ;
00151 
00152         if( !r->get_stream() )
00153             throw Error(string("The input source: ")
00154                         + accessed
00155                         + string(" could not be opened"));
00156 
00157         url->read_data_no_mime( *dds, r ) ;
00158         dds->set_factory( 0 ) ;
00159 
00160         // mark everything as read.
00161         DDS::Vars_iter i = dds->var_begin() ;
00162         DDS::Vars_iter e = dds->var_end() ;
00163         for( ; i != e; i++ )
00164         {
00165             BaseType *b = (*i) ;
00166             b->set_read_p( true ) ;
00167         }
00168 
00169         DAS *das = new DAS ;
00170         BESDASResponse bdas( das ) ;
00171         bdas.set_container( dhi.container->get_symbolic_name() ) ;
00172         Ancillary::read_ancillary_das( *das, accessed ) ;
00173         dds->transfer_attributes( das ) ;
00174 
00175         bdds->set_constraint( dhi ) ;
00176 
00177         bdds->clear_container( ) ;
00178     }
00179     catch( BESError &e ) {
00180         throw e ;
00181     }
00182     catch(InternalErr & e) {
00183         BESDapError ex( e.get_error_message(), true, e.get_error_code(),
00184                         __FILE__, __LINE__ ) ;
00185         throw ex;
00186     }
00187     catch(Error & e) {
00188         BESDapError ex( e.get_error_message(), false, e.get_error_code(),
00189                         __FILE__, __LINE__ ) ;
00190         throw ex;
00191     }
00192     catch(...) {
00193         string s = "unknown exception caught building DAS";
00194         BESInternalFatalError ex(s, __FILE__, __LINE__);
00195         throw ex;
00196     }
00197 
00198     return true;
00199 }
00200 
00201 bool
00202 DapRequestHandler::dap_build_vers( BESDataHandlerInterface &dhi )
00203 {
00204     bool ret = true ;
00205     BESVersionInfo *info = dynamic_cast<BESVersionInfo *>(dhi.response_handler->get_response_object() ) ;
00206     info->add_module( DAPREADER_PACKAGE, DAPREADER_VERSION ) ;
00207     return ret ;
00208 }
00209 
00210 bool
00211 DapRequestHandler::dap_build_help( BESDataHandlerInterface &dhi )
00212 {
00213     bool ret = true ;
00214     BESInfo *info = dynamic_cast<BESInfo *>(dhi.response_handler->get_response_object());
00215 
00216     // This is an example. If you had a help file you could load it like
00217     // this and if your handler handled the following responses.
00218     map<string,string> attrs ;
00219     attrs["name"] = PACKAGE_NAME ;
00220     attrs["version"] = PACKAGE_VERSION ;
00221     list<string> services ;
00222     BESServiceRegistry::TheRegistry()->services_handled( "dapreader", services );
00223     if( services.size() > 0 )
00224     {
00225         string handles = BESUtil::implode( services, ',' ) ;
00226         attrs["handles"] = handles ;
00227     }
00228     info->begin_tag( "module", &attrs ) ;
00229     //info->add_data_from_file( "Dap.Help", "Dap Help" ) ;
00230     info->end_tag( "module" ) ;
00231 
00232     return ret ;
00233 }
00234 
00235 void
00236 DapRequestHandler::dump( ostream &strm ) const
00237 {
00238     strm << BESIndent::LMarg << "DapRequestHandler::dump - ("
00239                              << (void *)this << ")" << endl ;
00240     BESIndent::Indent() ;
00241     BESRequestHandler::dump( strm ) ;
00242     BESIndent::UnIndent() ;
00243 }
00244