OPeNDAP Hyrax Back End Server (BES)
Updated for version 3.8.3
|
00001 // BESContainerStorageCatalog.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 "BESContainerStorageCatalog.h" 00034 #include "BESContainer.h" 00035 #include "BESCatalogUtils.h" 00036 #include "BESInternalError.h" 00037 #include "BESForbiddenError.h" 00038 #include "BESInfo.h" 00039 #include "BESServiceRegistry.h" 00040 #include "BESRegex.h" 00041 #include "Error.h" 00042 00043 using namespace libdap ; 00044 00066 BESContainerStorageCatalog::BESContainerStorageCatalog( const string &n ) 00067 : BESContainerStorageVolatile( n ) 00068 { 00069 _utils = BESCatalogUtils::Utils( n ) ; 00070 _root_dir = _utils->get_root_dir() ; 00071 _follow_sym_links = _utils->follow_sym_links() ; 00072 } 00073 00074 BESContainerStorageCatalog::~BESContainerStorageCatalog() 00075 { 00076 } 00077 00106 void 00107 BESContainerStorageCatalog::add_container( const string &sym_name, 00108 const string &real_name, 00109 const string &type ) 00110 { 00111 // make sure that the real name passed in is not oon the exclude list 00112 // for the catalog. First, remove any trailing slashes. Then find the 00113 // basename of the remaining real name. The make sure it's not on the 00114 // exclude list. 00115 string::size_type stopat = real_name.length() - 1 ; 00116 while( real_name[stopat] == '/' ) 00117 { 00118 stopat-- ; 00119 } 00120 string new_name = real_name.substr( 0, stopat + 1 ) ; 00121 00122 string basename ; 00123 string::size_type slash = new_name.rfind( "/" ) ; 00124 if( slash != string::npos ) 00125 { 00126 basename = new_name.substr( slash+1, new_name.length() - slash ) ; 00127 } 00128 else 00129 { 00130 basename = new_name ; 00131 } 00132 // BESCatalogUtils::include method already calls exclude, so just 00133 // need to call include 00134 if( !_utils->include( basename ) ) 00135 { 00136 string s = "Attempting to create a container with real name " 00137 + real_name + " which is on the exclude list" ; 00138 throw BESForbiddenError( s, __FILE__, __LINE__ ) ; 00139 } 00140 00141 // If the type is specified, then just pass that on. If not, then match 00142 // it against the types in the type list. 00143 string new_type = type ; 00144 if( new_type == "" ) 00145 { 00146 BESCatalogUtils::match_citer i = _utils->match_list_begin() ; 00147 BESCatalogUtils::match_citer ie = _utils->match_list_end() ; 00148 bool done = false ; 00149 for( ; i != ie && !done; i++ ) 00150 { 00151 BESCatalogUtils::type_reg match = (*i) ; 00152 try 00153 { 00154 BESRegex reg_expr( match.reg.c_str() ) ; 00155 if( reg_expr.match( real_name.c_str(), real_name.length() ) == 00156 static_cast<int>(real_name.length()) ) 00157 { 00158 new_type = match.type ; 00159 done = true ; 00160 } 00161 } 00162 catch( Error &e ) 00163 { 00164 string serr = (string)"Unable to match data type, " 00165 + "malformed Catalog TypeMatch parameter " 00166 + "in bes configuration file around " 00167 + match.reg + ": " + e.get_error_message() ; 00168 throw BESInternalError( serr, __FILE__, __LINE__ ) ; 00169 } 00170 } 00171 } 00172 BESContainerStorageVolatile::add_container( sym_name, real_name, new_type ); 00173 } 00174 00184 bool 00185 BESContainerStorageCatalog::isData( const string &inQuestion, 00186 list<string> &provides ) 00187 { 00188 string node_type = "" ; 00189 BESCatalogUtils::match_citer i = _utils->match_list_begin() ; 00190 BESCatalogUtils::match_citer ie = _utils->match_list_end() ; 00191 bool done = false ; 00192 for( ; i != ie && !done; i++ ) 00193 { 00194 BESCatalogUtils::type_reg match = (*i) ; 00195 try 00196 { 00197 BESRegex reg_expr( match.reg.c_str() ) ; 00198 if( reg_expr.match( inQuestion.c_str(), inQuestion.length() ) == 00199 static_cast<int>(inQuestion.length()) ) 00200 { 00201 node_type = match.type ; 00202 done = true ; 00203 } 00204 } 00205 catch( Error &e ) 00206 { 00207 string serr = (string)"Unable to determine data products (is data), " 00208 + "malformed Catalog TypeMatch parameter " 00209 + "in bes configuration file around " 00210 + match.reg + ": " + e.get_error_message() ; 00211 throw BESInternalError( serr, __FILE__, __LINE__ ) ; 00212 } 00213 } 00214 00215 BESServiceRegistry::TheRegistry()->services_handled( node_type, provides ) ; 00216 00217 return done ; 00218 } 00219 00227 void 00228 BESContainerStorageCatalog::dump( ostream &strm ) const 00229 { 00230 strm << BESIndent::LMarg << "BESContainerStorageCatalog::dump - (" 00231 << (void *)this << ")" << endl ; 00232 BESIndent::Indent() ; 00233 strm << BESIndent::LMarg << "name: " << get_name() << endl ; 00234 strm << BESIndent::LMarg << "utils: " << get_name() << endl ; 00235 BESIndent::Indent() ; 00236 _utils->dump( strm ) ; 00237 BESIndent::UnIndent() ; 00238 BESIndent::UnIndent() ; 00239 } 00240