OPeNDAP Hyrax Back End Server (BES)
Updated for version 3.8.3
|
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