OPeNDAP Hyrax Back End Server (BES) Updated for version 3.8.3
|
00001 // BESDapError.cc 00002 00003 // This file is part of bes, A C++ back-end server implementation framework 00004 // for the OPeNDAP Data Access Protocol. 00005 00006 // Copyright (c) 2004-2009 University Corporation for Atmospheric Research 00007 // Author: Patrick West <pwest@ucar.edu> and Jose Garcia <jgarcia@ucar.edu> 00008 // 00009 // This library is free software; you can redistribute it and/or 00010 // modify it under the terms of the GNU Lesser General Public 00011 // License as published by the Free Software Foundation; either 00012 // version 2.1 of the License, or (at your option) any later version. 00013 // 00014 // This library is distributed in the hope that it will be useful, 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 // Lesser General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU Lesser General Public 00020 // License along with this library; if not, write to the Free Software 00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 // 00023 // You can contact University Corporation for Atmospheric Research at 00024 // 3080 Center Green Drive, Boulder, CO 80301 00025 00026 // (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005 00027 // Please read the full copyright statement in the file COPYRIGHT_UCAR. 00028 // 00029 // Authors: 00030 // pwest Patrick West <pwest@ucar.edu> 00031 // jgarcia Jose Garcia <jgarcia@ucar.edu> 00032 00033 #include <sstream> 00034 #include <iostream> 00035 00036 using std::ostringstream; 00037 00038 #include "BESDapError.h" 00039 #include "BESContextManager.h" 00040 #include "BESDapErrorInfo.h" 00041 00064 int 00065 BESDapError::convert_error_code( int error_code, int current_error_type ) 00066 { 00067 if( current_error_type == BES_INTERNAL_FATAL_ERROR ) 00068 return current_error_type ; 00069 switch( error_code ) 00070 { 00071 case undefined_error: 00072 case unknown_error: 00073 { 00074 return BES_INTERNAL_ERROR ; 00075 break ; 00076 } 00077 case internal_error: 00078 { 00079 return BES_INTERNAL_FATAL_ERROR ; 00080 break ; 00081 } 00082 case no_such_file: 00083 { 00084 return BES_NOT_FOUND_ERROR ; 00085 break ; 00086 } 00087 case no_such_variable: 00088 case malformed_expr: 00089 { 00090 return BES_SYNTAX_USER_ERROR ; 00091 break ; 00092 } 00093 case no_authorization: 00094 case cannot_read_file: 00095 case dummy_message: 00096 { 00097 return BES_FORBIDDEN_ERROR ; 00098 break ; 00099 } 00100 default: 00101 { 00102 return BES_INTERNAL_ERROR ; 00103 break ; 00104 } 00105 } 00106 return BES_INTERNAL_ERROR ; 00107 } 00108 00118 int 00119 BESDapError::handleException( BESError &e, BESDataHandlerInterface &dhi ) 00120 { 00121 // If we are handling errors in a dap2 context, then create a 00122 // DapErrorInfo object to transmit/print the error as a dap2 00123 // response. 00124 bool found = false ; 00125 // I changed 'dap_format' to 'errors' in the following line. jhrg 10/6/08 00126 string context = BESContextManager::TheManager()->get_context( "errors", found ) ; 00127 if( context == "dap2" ) 00128 { 00129 ErrorCode ec = unknown_error ; 00130 BESDapError *de = dynamic_cast<BESDapError*>( &e); 00131 if( de ) 00132 { 00133 ec = de->get_error_code() ; 00134 } 00135 e.set_error_type( convert_error_code( ec, e.get_error_type() ) ) ; 00136 dhi.error_info = new BESDapErrorInfo( ec, e.get_message() ) ; 00137 00138 return e.get_error_type() ; 00139 } 00140 else 00141 { 00142 // If we are not in a dap2 context and the exception is a dap 00143 // handler exception, then convert the error message to include the 00144 // error code. If it is or is not a dap exception, we simply return 00145 // that the exception was not handled. 00146 BESError *e_p = &e ; 00147 BESDapError *de = dynamic_cast<BESDapError*>( e_p ); 00148 if( de ) 00149 { 00150 ostringstream s; 00151 s << "libdap exception building response" 00152 << ": error_code = " << de->get_error_code() 00153 << ": " << de->get_message() ; 00154 e.set_message( s.str() ) ; 00155 e.set_error_type( convert_error_code( de->get_error_code(), 00156 e.get_error_type() ) ) ; 00157 } 00158 } 00159 return 0 ; 00160 } 00161 00168 void 00169 BESDapError::dump( ostream &strm ) const 00170 { 00171 strm << BESIndent::LMarg << "BESDapError::dump - (" 00172 << (void *)this << ")" << endl ; 00173 BESIndent::Indent() ; 00174 strm << BESIndent::LMarg << "error code = " << get_error_code() << endl ; 00175 BESError::dump( strm ) ; 00176 BESIndent::UnIndent() ; 00177 } 00178